diff options
| author | Paul Buetow <paul@buetow.org> | 2026-05-20 22:25:40 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-05-20 22:25:40 +0300 |
| commit | 7a9839917461b12c810329ccb8fd3c6de06902d2 (patch) | |
| tree | 7e68d52cec796d8a4d7b5110ba87cdce48a0fcb9 /internal/generate/classify_test.go | |
| parent | 271af607921ceabc640271c475a66e45b9460d3f (diff) | |
d7: add POSIX mq syscall kind/classification and coverage
Diffstat (limited to 'internal/generate/classify_test.go')
| -rw-r--r-- | internal/generate/classify_test.go | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/internal/generate/classify_test.go b/internal/generate/classify_test.go index b853994..5eef40f 100644 --- a/internal/generate/classify_test.go +++ b/internal/generate/classify_test.go @@ -453,6 +453,59 @@ func TestClassifyClockNanosleep(t *testing.T) { } } +func TestClassifyMqOpen(t *testing.T) { + r := ClassifyFormat(&Format{ + Name: "sys_enter_mq_open", + ExternalFields: []Field{ + {Type: "long", Name: "__syscall_nr"}, + {Type: "const char *", Name: "u_name"}, + {Type: "int", Name: "oflag"}, + }, + }) + if r.Kind != KindMqOpen { + t.Errorf("mq_open: got kind %d, want KindMqOpen", r.Kind) + } +} + +func TestClassifyMqUnlink(t *testing.T) { + r := ClassifyFormat(&Format{ + Name: "sys_enter_mq_unlink", + ExternalFields: []Field{ + {Type: "long", Name: "__syscall_nr"}, + {Type: "const char *", Name: "u_name"}, + }, + }) + if r.Kind != KindPathname { + t.Errorf("mq_unlink: got kind %d, want KindPathname", r.Kind) + } + if r.PathnameField != "u_name" { + t.Errorf("mq_unlink: PathnameField = %q, want u_name", r.PathnameField) + } +} + +func TestClassifyMqFdSyscallsByName(t *testing.T) { + tests := []string{ + "mq_timedsend", + "mq_timedreceive", + "mq_notify", + "mq_getsetattr", + } + for _, name := range tests { + t.Run(name, func(t *testing.T) { + r := ClassifyFormat(&Format{ + Name: "sys_enter_" + name, + ExternalFields: []Field{ + {Type: "long", Name: "__syscall_nr"}, + {Type: "mqd_t", Name: "mqdes"}, + }, + }) + if r.Kind != KindFd { + t.Errorf("%s: got kind %d, want KindFd", name, r.Kind) + } + }) + } +} + func TestClassifyMount(t *testing.T) { r := classifyFromData(t, FormatMount) if r.Kind != KindPathname { @@ -746,6 +799,36 @@ func TestBatchMessageSyscallPairsDeferByteClassification(t *testing.T) { } } +func TestClassifyMqSyscallPairsAcceptedAndClassified(t *testing.T) { + tests := []struct { + name string + enterKindText string + exitClassification string + }{ + {"mq_open", "struct open_event", "UNCLASSIFIED"}, + {"mq_unlink", "struct path_event", "UNCLASSIFIED"}, + {"mq_timedsend", "struct fd_event", "WRITE_CLASSIFIED"}, + {"mq_timedreceive", "struct fd_event", "READ_CLASSIFIED"}, + {"mq_notify", "struct fd_event", "UNCLASSIFIED"}, + {"mq_getsetattr", "struct fd_event", "UNCLASSIFIED"}, + } + + for i, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + output := GenerateTracepointsC(mqFormats(tt.name, 9200+i*2)) + if strings.Contains(output, "Ignoring") || strings.Contains(output, "Skipping") { + t.Fatalf("syscall %s was not accepted:\n%s", tt.name, output) + } + if !strings.Contains(output, "/// sys_enter_"+tt.name+" is a "+tt.enterKindText) { + t.Fatalf("sys_enter_%s did not use %s:\n%s", tt.name, tt.enterKindText, output) + } + if !strings.Contains(output, "/// sys_exit_"+tt.name+" is a struct ret_event ("+tt.exitClassification+")") { + t.Fatalf("sys_exit_%s did not use %s:\n%s", tt.name, tt.exitClassification, output) + } + }) + } +} + func phaseAFormats(name string, enterID int) []Format { enterFields := []Field{ {Type: "long", Name: "__syscall_nr"}, @@ -774,6 +857,42 @@ func phaseAFormats(name string, enterID int) []Format { } } +func mqFormats(name string, enterID int) []Format { + enterFields := []Field{ + {Type: "long", Name: "__syscall_nr"}, + } + switch name { + case "mq_open": + enterFields = append(enterFields, + Field{Type: "const char *", Name: "u_name"}, + Field{Type: "int", Name: "oflag"}, + Field{Type: "umode_t", Name: "mode"}, + ) + case "mq_unlink": + enterFields = append(enterFields, Field{Type: "const char *", Name: "u_name"}) + default: + enterFields = append(enterFields, Field{Type: "mqd_t", Name: "mqdes"}) + } + + return []Format{ + { + Name: "sys_enter_" + name, + ID: enterID, + Family: ClassifySyscallFamily("sys_enter_" + name), + ExternalFields: enterFields, + }, + { + Name: "sys_exit_" + name, + ID: enterID - 1, + Family: ClassifySyscallFamily("sys_exit_" + name), + ExternalFields: []Field{ + {Type: "long", Name: "__syscall_nr"}, + {Type: "long", Name: "ret"}, + }, + }, + } +} + func TestClassifyFormatNoExternalFields(t *testing.T) { f := &Format{ Name: "sys_enter_test", |
