From d699ef44a9ded5d419a470a4f6715ecff7f0fcd1 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Tue, 19 May 2026 09:36:51 +0300 Subject: t6 address family recording review --- internal/tui/eventstream/export.go | 4 ++-- internal/tui/eventstream/export_test.go | 39 +++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) (limited to 'internal/tui') diff --git a/internal/tui/eventstream/export.go b/internal/tui/eventstream/export.go index accec8a..73bc1fa 100644 --- a/internal/tui/eventstream/export.go +++ b/internal/tui/eventstream/export.go @@ -182,7 +182,7 @@ func exportRowsToCSV(rows []StreamEvent, exportDir, filename string) (string, er // writeStreamCSV writes the CSV header and all event rows to w, calling fail // on the first write error to close the underlying file before returning. func writeStreamCSV(w *csv.Writer, rows []StreamEvent, fail func(error) (string, error)) error { - header := []string{"seq", "time_ns", "gap_ns", "latency_ns", "comm", "pid", "tid", "syscall", "family", "fd", "ret", "bytes", "file", "error"} + header := []string{"seq", "time_ns", "gap_ns", "latency_ns", "comm", "pid", "tid", "syscall", "fd", "ret", "bytes", "file", "error", "family"} if err := w.Write(header); err != nil { _, err = fail(err) return err @@ -198,12 +198,12 @@ func writeStreamCSV(w *csv.Writer, rows []StreamEvent, fail func(error) (string, fmt.Sprintf("%d", ev.PID), fmt.Sprintf("%d", ev.TID), ev.Syscall, - ev.Family, fmt.Sprintf("%d", ev.FD), fmt.Sprintf("%d", ev.RetVal), fmt.Sprintf("%d", ev.Bytes), ev.FileName, fmt.Sprintf("%t", ev.IsError), + ev.Family, } if err := w.Write(record); err != nil { _, err = fail(err) diff --git a/internal/tui/eventstream/export_test.go b/internal/tui/eventstream/export_test.go index f398fce..6cea2b1 100644 --- a/internal/tui/eventstream/export_test.go +++ b/internal/tui/eventstream/export_test.go @@ -1,6 +1,8 @@ package eventstream import ( + "bytes" + "encoding/csv" "os" "path/filepath" "reflect" @@ -196,6 +198,43 @@ func TestExportRowsToCSVPathTraversal(t *testing.T) { _ = traversal // silence unused-variable warning } +func TestWriteStreamCSVAppendsFamilyColumn(t *testing.T) { + var buf bytes.Buffer + rows := []StreamEvent{{ + Seq: 7, + TimeNs: 100, + GapNs: 3, + DurationNs: 5, + Comm: "worker", + PID: 10, + TID: 11, + Syscall: "socketpair", + FD: 4, + RetVal: 0, + Bytes: 0, + FileName: "/tmp/sock", + IsError: false, + Family: "Network", + }} + fail := func(err error) (string, error) { return "", err } + + if err := writeStreamCSV(csv.NewWriter(&buf), rows, fail); err != nil { + t.Fatalf("writeStreamCSV() error = %v", err) + } + + records, err := csv.NewReader(bytes.NewReader(buf.Bytes())).ReadAll() + if err != nil { + t.Fatalf("read CSV: %v", err) + } + wantHeader := []string{"seq", "time_ns", "gap_ns", "latency_ns", "comm", "pid", "tid", "syscall", "fd", "ret", "bytes", "file", "error", "family"} + if !reflect.DeepEqual(records[0], wantHeader) { + t.Fatalf("header = %#v, want %#v", records[0], wantHeader) + } + if records[1][8] != "4" || records[1][12] != "false" || records[1][13] != "Network" { + t.Fatalf("family should be appended without shifting legacy columns, got %#v", records[1]) + } +} + // TestShellSplitVariousCases covers the tokenizer with a table-driven approach. func TestShellSplitVariousCases(t *testing.T) { cases := []struct { -- cgit v1.2.3