cat / 012
clone

a spreadsheet for the terminal: lotus 1-2-3 looks, google sheets keys and formulas, one go binary

cat/module-path
012 / internal / serve / spans_test.go
spans_test.go 1.9K
1package serve23import (4 "encoding/json"5 "io"6 "os"7 "path/filepath"8 "strings"9 "testing"1011 "src.rest/cat/012/internal/telemetry"12)1314// Each session's commands nest under its own span, in a trace of its15// own, though the sessions run in one process at once.16func TestSessionSpans(t *testing.T) {17 path := filepath.Join(t.TempDir(), "log.jsonl")18 stop, err := telemetry.Setup(telemetry.Config{LogPath: path})19 if err != nil {20 t.Fatal(err)21 }22 defer stop()23 key := newKey(t)24 srv, addr, _ := testServer(t, nil, key)25 c, err := dial(addr, key, srv.HostKey())26 if err != nil {27 t.Fatal(err)28 }29 defer c.Close()30 a, b := openTerm(t, c, 80, 24), openTerm(t, c, 80, 24)31 a.waitFor(t, "READY")32 b.waitFor(t, "READY")33 for range 3 {34 io.WriteString(a.stdin, "\x02") // Ctrl+B: format.bold35 io.WriteString(b.stdin, "\x02")36 }37 for _, tm := range []*term{a, b} {38 io.WriteString(tm.stdin, "\x11") // Ctrl+Q, then discard the bold39 tm.waitFor(t, "unsaved changes")40 io.WriteString(tm.stdin, "d")41 tm.waitClosed(t)42 }43 srv.Close()44 stop()4546 data, err := os.ReadFile(path)47 if err != nil {48 t.Fatal(err)49 }50 sessions := map[string]string{} // span id -> trace id51 var commands []map[string]any52 for _, l := range strings.Split(strings.TrimSpace(string(data)), "\n") {53 var ev map[string]any54 if err := json.Unmarshal([]byte(l), &ev); err != nil {55 t.Fatal(err)56 }57 switch ev["event"] {58 case "serve.session":59 sessions[ev["span_id"].(string)] = ev["trace_id"].(string)60 case "command":61 commands = append(commands, ev)62 }63 }64 if len(sessions) != 2 {65 t.Fatalf("%d session spans: %s", len(sessions), data)66 }67 per := map[string]int{}68 for _, cmd := range commands {69 parent, _ := cmd["parent_id"].(string)70 trace, ok := sessions[parent]71 if !ok || cmd["trace_id"] != trace {72 t.Errorf("command %v is not under a session", cmd)73 }74 per[parent]++75 }76 for id := range sessions {77 if per[id] == 0 {78 t.Errorf("session %s ran no commands: %v", id, per)79 }80 }81}