diff options
| author | Ophestra <cat@gensokyo.uk> | 2025-11-23 16:20:35 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2025-11-23 16:20:35 +0900 |
| commit | 3e87187c4c4eb43ed1c9dc1c0c6613e5bed1dc6c (patch) | |
| tree | da6d0ef3c767482d1bf757478375625b583585a6 /internal/pipewire/header_test.go | |
| parent | b651d95e77c8bfe5c27f2d571fab6e706ef652d2 (diff) | |
internal/pipewire: implement message header
Test cases are from interactions between pw-container and PipeWire. Results are validated against corresponding body.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/pipewire/header_test.go')
| -rw-r--r-- | internal/pipewire/header_test.go | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/internal/pipewire/header_test.go b/internal/pipewire/header_test.go new file mode 100644 index 00000000..d933598f --- /dev/null +++ b/internal/pipewire/header_test.go @@ -0,0 +1,89 @@ +package pipewire_test + +import ( + "reflect" + "testing" + + "hakurei.app/internal/pipewire" +) + +func TestHeader(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + data []byte + want pipewire.Header + }{ + {"PW_SECURITY_CONTEXT_METHOD_CREATE", []byte{ + // Id + 3, 0, 0, 0, + // size + 0xd8, 0, 0, + // opcode + 1, + // seq + 5, 0, 0, 0, + // n_fds + 2, 0, 0, 0, + }, pipewire.Header{ID: 3, Opcode: pipewire.PW_SECURITY_CONTEXT_METHOD_CREATE, + Size: 0xd8, Sequence: 5, FileCount: 2}}, + + {"PW_SECURITY_CONTEXT_METHOD_NUM", []byte{ + // Id + 0, 0, 0, 0, + // size + 0x28, 0, 0, + // opcode + 2, + // seq + 6, 0, 0, 0, + // n_fds + 0, 0, 0, 0, + }, pipewire.Header{ID: 0, Opcode: pipewire.PW_SECURITY_CONTEXT_METHOD_NUM, + Size: 0x28, Sequence: 6, FileCount: 0}}, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + t.Run("decode", func(t *testing.T) { + t.Parallel() + + var got pipewire.Header + if err := got.UnmarshalBinary(tc.data); err != nil { + t.Fatalf("UnmarshalBinary: error = %v", err) + } + if got != tc.want { + t.Fatalf("UnmarshalBinary: %#v, want %#v", got, tc.want) + } + }) + + t.Run("encode", func(t *testing.T) { + t.Parallel() + + if got, err := tc.want.MarshalBinary(); err != nil { + t.Fatalf("MarshalBinary: error = %v", err) + } else if string(got) != string(tc.data) { + t.Fatalf("MarshalBinary: %#v, want %#v", got, tc.data) + } + }) + }) + } + + t.Run("size range", func(t *testing.T) { + t.Parallel() + + if _, err := (&pipewire.Header{Size: 0xff000000}).MarshalBinary(); !reflect.DeepEqual(err, pipewire.ErrSizeRange) { + t.Errorf("UnmarshalBinary: error = %v", err) + } + }) + + t.Run("header size", func(t *testing.T) { + t.Parallel() + + if err := (*pipewire.Header)(nil).UnmarshalBinary(nil); !reflect.DeepEqual(err, pipewire.ErrBadHeader) { + t.Errorf("UnmarshalBinary: error = %v", err) + } + }) +} |
