summaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-19 09:36:51 +0300
committerPaul Buetow <paul@buetow.org>2026-05-19 09:36:51 +0300
commitd699ef44a9ded5d419a470a4f6715ecff7f0fcd1 (patch)
tree4a56611a392c7eb17a0a2e4f243b0342f8c3ec6c /internal
parent65599ad9b87b1c61cb6d8232200da88952370e96 (diff)
t6 address family recording review
Diffstat (limited to 'internal')
-rw-r--r--internal/tui/eventstream/export.go4
-rw-r--r--internal/tui/eventstream/export_test.go39
2 files changed, 41 insertions, 2 deletions
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 {