summaryrefslogtreecommitdiff
path: root/internal/generate/classify_test.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-20 22:25:40 +0300
committerPaul Buetow <paul@buetow.org>2026-05-20 22:25:40 +0300
commit7a9839917461b12c810329ccb8fd3c6de06902d2 (patch)
tree7e68d52cec796d8a4d7b5110ba87cdce48a0fcb9 /internal/generate/classify_test.go
parent271af607921ceabc640271c475a66e45b9460d3f (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.go119
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",