diff --git a/internal/pipewire/client_test.go b/internal/pipewire/client_test.go index 3eb8962..5ba2ff9 100644 --- a/internal/pipewire/client_test.go +++ b/internal/pipewire/client_test.go @@ -10,7 +10,7 @@ func TestClientInfo(t *testing.T) { t.Parallel() encodingTestCases[pipewire.ClientInfo, *pipewire.ClientInfo]{ - {"sample", []byte(c1r2pod), pipewire.ClientInfo{ + {"sample", samplePWContainer[1][2][1], pipewire.ClientInfo{ ID: 34, ChangeMask: pipewire.PW_CLIENT_CHANGE_MASK_PROPS, Props: &pipewire.SPADict{NItems: 9, Items: []pipewire.SPADictItem{ @@ -25,7 +25,7 @@ func TestClientInfo(t *testing.T) { {Key: "object.serial", Value: "34"}, }}}, nil}, - {"sample*", []byte(c1r3pod), pipewire.ClientInfo{ + {"sample*", samplePWContainer[1][3][1], pipewire.ClientInfo{ ID: 34, ChangeMask: pipewire.PW_CLIENT_CHANGE_MASK_PROPS, Props: &pipewire.SPADict{NItems: 38, Items: []pipewire.SPADictItem{ @@ -69,7 +69,7 @@ func TestClientInfo(t *testing.T) { {Key: "core.version", Value: "1.4.7"}, }}}, nil}, - {"sample**", []byte(c1r4pod), pipewire.ClientInfo{ + {"sample**", samplePWContainer[1][4][1], pipewire.ClientInfo{ ID: 34, ChangeMask: pipewire.PW_CLIENT_CHANGE_MASK_PROPS, Props: &pipewire.SPADict{NItems: 39, Items: []pipewire.SPADictItem{ @@ -120,7 +120,7 @@ func TestClientUpdateProperties(t *testing.T) { t.Parallel() encodingTestCases[pipewire.ClientUpdateProperties, *pipewire.ClientUpdateProperties]{ - {"sample", []byte(c0s1pod), pipewire.ClientUpdateProperties{Props: &pipewire.SPADict{NItems: 0x1e, Items: []pipewire.SPADictItem{ + {"sample", samplePWContainer[0][1][1], pipewire.ClientUpdateProperties{Props: &pipewire.SPADict{NItems: 0x1e, Items: []pipewire.SPADictItem{ {Key: "remote.intention", Value: "manager"}, {Key: "application.name", Value: "pw-container"}, {Key: "application.process.binary", Value: "pw-container"}, diff --git a/internal/pipewire/core_test.go b/internal/pipewire/core_test.go index a08d454..5b2f6c2 100644 --- a/internal/pipewire/core_test.go +++ b/internal/pipewire/core_test.go @@ -10,12 +10,12 @@ func TestFooterCoreGeneration(t *testing.T) { t.Parallel() encodingTestCases[pipewire.Footer[pipewire.FooterCoreGeneration], *pipewire.Footer[pipewire.FooterCoreGeneration]]{ - {"sample", []byte(c1r0footer), pipewire.Footer[pipewire.FooterCoreGeneration]{ + {"sample", samplePWContainer[1][0][2], pipewire.Footer[pipewire.FooterCoreGeneration]{ Opcode: pipewire.FOOTER_CORE_OPCODE_GENERATION, Payload: pipewire.FooterCoreGeneration{RegistryGeneration: 0x22}, }, nil}, - {"sample*", []byte(c1r5footer), pipewire.Footer[pipewire.FooterCoreGeneration]{ + {"sample*", samplePWContainer[1][5][2], pipewire.Footer[pipewire.FooterCoreGeneration]{ Opcode: pipewire.FOOTER_CORE_OPCODE_GENERATION, Payload: pipewire.FooterCoreGeneration{RegistryGeneration: 0x23}, }, nil}, @@ -26,7 +26,7 @@ func TestCoreInfo(t *testing.T) { t.Parallel() encodingTestCases[pipewire.CoreInfo, *pipewire.CoreInfo]{ - {"sample", []byte(c1r0pod), pipewire.CoreInfo{ + {"sample", samplePWContainer[1][0][1], pipewire.CoreInfo{ ID: 0, Cookie: -2069267610, UserName: "alice", @@ -74,7 +74,7 @@ func TestCoreDone(t *testing.T) { t.Parallel() encodingTestCases[pipewire.CoreDone, *pipewire.CoreDone]{ - {"sample", []byte(c1r5pod), pipewire.CoreDone{ + {"sample", samplePWContainer[1][5][1], pipewire.CoreDone{ ID: -1, Sequence: 0, }, nil}, @@ -85,7 +85,7 @@ func TestCoreBoundProps(t *testing.T) { t.Parallel() encodingTestCases[pipewire.CoreBoundProps, *pipewire.CoreBoundProps]{ - {"sample", []byte(c1r1pod), pipewire.CoreBoundProps{ + {"sample", samplePWContainer[1][1][1], pipewire.CoreBoundProps{ ID: pipewire.PW_ID_CLIENT, GlobalID: 34, Props: &pipewire.SPADict{NItems: 7, Items: []pipewire.SPADictItem{ @@ -104,7 +104,7 @@ func TestCoreHello(t *testing.T) { t.Parallel() encodingTestCases[pipewire.CoreHello, *pipewire.CoreHello]{ - {"sample", []byte(c0s0pod), pipewire.CoreHello{ + {"sample", samplePWContainer[0][0][1], pipewire.CoreHello{ Version: pipewire.PW_VERSION_CORE, }, nil}, }.run(t) @@ -114,7 +114,7 @@ func TestCoreSync(t *testing.T) { t.Parallel() encodingTestCases[pipewire.CoreSync, *pipewire.CoreSync]{ - {"sample", []byte(c0s3pod), pipewire.CoreSync{ + {"sample", samplePWContainer[0][3][1], pipewire.CoreSync{ ID: pipewire.PW_ID_CORE, Sequence: pipewire.CoreSyncSequenceOffset + 3, }, nil}, @@ -125,7 +125,7 @@ func TestCoreGetRegistry(t *testing.T) { t.Parallel() encodingTestCases[pipewire.CoreGetRegistry, *pipewire.CoreGetRegistry]{ - {"sample", []byte(c0s2pod), pipewire.CoreGetRegistry{ + {"sample", samplePWContainer[0][2][1], pipewire.CoreGetRegistry{ Version: pipewire.PW_VERSION_REGISTRY, NewID: 2, }, nil}, diff --git a/internal/pipewire/header_test.go b/internal/pipewire/header_test.go index a555ab2..b7b1065 100644 --- a/internal/pipewire/header_test.go +++ b/internal/pipewire/header_test.go @@ -11,61 +11,61 @@ func TestHeader(t *testing.T) { t.Parallel() encodingTestCases[pipewire.Header, *pipewire.Header]{ - {"PW_CORE_METHOD_HELLO", []byte(c0s0header), pipewire.Header{ + {"PW_CORE_METHOD_HELLO", samplePWContainer[0][0][0], pipewire.Header{ ID: pipewire.PW_ID_CORE, Opcode: pipewire.PW_CORE_METHOD_HELLO, Size: 0x18, Sequence: 0, FileCount: 0, }, nil}, - {"PW_CLIENT_METHOD_UPDATE_PROPERTIES", []byte(c0s1header), pipewire.Header{ + {"PW_CLIENT_METHOD_UPDATE_PROPERTIES", samplePWContainer[0][1][0], pipewire.Header{ ID: pipewire.PW_ID_CLIENT, Opcode: pipewire.PW_CLIENT_METHOD_UPDATE_PROPERTIES, Size: 0x600, Sequence: 1, FileCount: 0, }, nil}, - {"PW_CORE_METHOD_GET_REGISTRY", []byte(c0s2header), pipewire.Header{ + {"PW_CORE_METHOD_GET_REGISTRY", samplePWContainer[0][2][0], pipewire.Header{ ID: pipewire.PW_ID_CORE, Opcode: pipewire.PW_CORE_METHOD_GET_REGISTRY, Size: 0x28, Sequence: 2, FileCount: 0, }, nil}, - {"PW_CORE_METHOD_SYNC", []byte(c0s3header), pipewire.Header{ + {"PW_CORE_METHOD_SYNC", samplePWContainer[0][3][0], pipewire.Header{ ID: pipewire.PW_ID_CORE, Opcode: pipewire.PW_CORE_METHOD_SYNC, Size: 0x28, Sequence: 3, FileCount: 0, }, nil}, - {"PW_CORE_EVENT_INFO", []byte(c1r0header), pipewire.Header{ + {"PW_CORE_EVENT_INFO", samplePWContainer[1][0][0], pipewire.Header{ ID: pipewire.PW_ID_CORE, Opcode: pipewire.PW_CORE_EVENT_INFO, Size: 0x6b8, Sequence: 0, FileCount: 0, }, nil}, - {"PW_CORE_EVENT_BOUND_PROPS", []byte(c1r1header), pipewire.Header{ + {"PW_CORE_EVENT_BOUND_PROPS", samplePWContainer[1][1][0], pipewire.Header{ ID: pipewire.PW_ID_CORE, Opcode: pipewire.PW_CORE_EVENT_BOUND_PROPS, Size: 0x198, Sequence: 1, FileCount: 0, }, nil}, - {"PW_CLIENT_EVENT_INFO", []byte(c1r2header), pipewire.Header{ + {"PW_CLIENT_EVENT_INFO", samplePWContainer[1][2][0], pipewire.Header{ ID: pipewire.PW_ID_CLIENT, Opcode: pipewire.PW_CLIENT_EVENT_INFO, Size: 0x1f0, Sequence: 2, FileCount: 0, }, nil}, - {"PW_CLIENT_EVENT_INFO*", []byte(c1r3header), pipewire.Header{ + {"PW_CLIENT_EVENT_INFO*", samplePWContainer[1][3][0], pipewire.Header{ ID: pipewire.PW_ID_CLIENT, Opcode: pipewire.PW_CLIENT_EVENT_INFO, Size: 0x7a0, Sequence: 3, FileCount: 0, }, nil}, - {"PW_CLIENT_EVENT_INFO**", []byte(c1r4header), pipewire.Header{ + {"PW_CLIENT_EVENT_INFO**", samplePWContainer[1][4][0], pipewire.Header{ ID: pipewire.PW_ID_CLIENT, Opcode: pipewire.PW_CLIENT_EVENT_INFO, Size: 0x7d0, Sequence: 4, FileCount: 0, }, nil}, - {"PW_CORE_EVENT_DONE", []byte(c1r5header), pipewire.Header{ + {"PW_CORE_EVENT_DONE", samplePWContainer[1][5][0], pipewire.Header{ ID: pipewire.PW_ID_CORE, Opcode: pipewire.PW_CORE_EVENT_DONE, Size: 0x58, Sequence: 5, FileCount: 0, diff --git a/internal/pipewire/pipewire_test.go b/internal/pipewire/pipewire_test.go index 586e5f6..63b5f4f 100644 --- a/internal/pipewire/pipewire_test.go +++ b/internal/pipewire/pipewire_test.go @@ -2,60 +2,58 @@ package pipewire_test import ( _ "embed" + "encoding/binary" + + "hakurei.app/internal/pipewire" ) var ( - //go:embed testdata/c0s0p0 - c0s0header string - //go:embed testdata/c0s0p1 - c0s0pod string + //go:embed testdata/pw-container-00-sendmsg + samplePWContainer00 string + //go:embed testdata/pw-container-01-recvmsg + samplePWContainer01 string + //go:embed testdata/pw-container-03-sendmsg + samplePWContainer03 string + //go:embed testdata/pw-container-04-recvmsg + samplePWContainer04 string + //go:embed testdata/pw-container-06-sendmsg + samplePWContainer06 string + //go:embed testdata/pw-container-07-recvmsg + samplePWContainer07 string - //go:embed testdata/c0s1p0 - c0s1header string - //go:embed testdata/c0s1p1 - c0s1pod string - - //go:embed testdata/c0s2p0 - c0s2header string - //go:embed testdata/c0s2p1 - c0s2pod string - - //go:embed testdata/c0s3p0 - c0s3header string - //go:embed testdata/c0s3p1 - c0s3pod string - - //go:embed testdata/c1r0p0 - c1r0header string - //go:embed testdata/c1r0p1 - c1r0pod string - //go:embed testdata/c1r0p2 - c1r0footer string - - //go:embed testdata/c1r1p0 - c1r1header string - //go:embed testdata/c1r1p1 - c1r1pod string - - //go:embed testdata/c1r2p0 - c1r2header string - //go:embed testdata/c1r2p1 - c1r2pod string - - //go:embed testdata/c1r3p0 - c1r3header string - //go:embed testdata/c1r3p1 - c1r3pod string - - //go:embed testdata/c1r4p0 - c1r4header string - //go:embed testdata/c1r4p1 - c1r4pod string - - //go:embed testdata/c1r5p0 - c1r5header string - //go:embed testdata/c1r5p1 - c1r5pod string - //go:embed testdata/c1r5p2 - c1r5footer string + // samplePWContainer is a collection of messages from the pw-container sample. + samplePWContainer = [...][][3][]byte{ + splitMessages(samplePWContainer00), + splitMessages(samplePWContainer01), + nil, + splitMessages(samplePWContainer03), + splitMessages(samplePWContainer04), + nil, + splitMessages(samplePWContainer06), + splitMessages(samplePWContainer07), + nil, + } ) + +// splitMessages splits concatenated messages into groups of +// header, payload, footer of each individual message. +// splitMessages panics on any decoding error. +func splitMessages(iovec string) (messages [][3][]byte) { + data := []byte(iovec) + messages = make([][3][]byte, 0, 1<<7) + + var header pipewire.Header + for len(data) != 0 { + if err := header.UnmarshalBinary(data[:pipewire.SizeHeader]); err != nil { + panic(err) + } + size := pipewire.SizePrefix + binary.NativeEndian.Uint32(data[pipewire.SizeHeader:]) + messages = append(messages, [3][]byte{ + data[:pipewire.SizeHeader], + data[pipewire.SizeHeader : pipewire.SizeHeader+size], + data[pipewire.SizeHeader+size : pipewire.SizeHeader+header.Size], + }) + data = data[pipewire.SizeHeader+header.Size:] + } + return +} diff --git a/internal/pipewire/testdata/c0s0p0 b/internal/pipewire/testdata/c0s0p0 deleted file mode 100644 index 601b8fe..0000000 Binary files a/internal/pipewire/testdata/c0s0p0 and /dev/null differ diff --git a/internal/pipewire/testdata/c0s0p1 b/internal/pipewire/testdata/c0s0p1 deleted file mode 100644 index c02874b..0000000 Binary files a/internal/pipewire/testdata/c0s0p1 and /dev/null differ diff --git a/internal/pipewire/testdata/c0s1p0 b/internal/pipewire/testdata/c0s1p0 deleted file mode 100644 index 0a298db..0000000 Binary files a/internal/pipewire/testdata/c0s1p0 and /dev/null differ diff --git a/internal/pipewire/testdata/c0s2p0 b/internal/pipewire/testdata/c0s2p0 deleted file mode 100644 index c10de62..0000000 Binary files a/internal/pipewire/testdata/c0s2p0 and /dev/null differ diff --git a/internal/pipewire/testdata/c0s2p1 b/internal/pipewire/testdata/c0s2p1 deleted file mode 100644 index 647038e..0000000 Binary files a/internal/pipewire/testdata/c0s2p1 and /dev/null differ diff --git a/internal/pipewire/testdata/c0s3p0 b/internal/pipewire/testdata/c0s3p0 deleted file mode 100644 index 4ee0558..0000000 Binary files a/internal/pipewire/testdata/c0s3p0 and /dev/null differ diff --git a/internal/pipewire/testdata/c0s3p1 b/internal/pipewire/testdata/c0s3p1 deleted file mode 100644 index e54dc27..0000000 Binary files a/internal/pipewire/testdata/c0s3p1 and /dev/null differ diff --git a/internal/pipewire/testdata/c1r0p0 b/internal/pipewire/testdata/c1r0p0 deleted file mode 100644 index 60b6f0b..0000000 Binary files a/internal/pipewire/testdata/c1r0p0 and /dev/null differ diff --git a/internal/pipewire/testdata/c1r0p1 b/internal/pipewire/testdata/c1r0p1 deleted file mode 100644 index b0fa528..0000000 Binary files a/internal/pipewire/testdata/c1r0p1 and /dev/null differ diff --git a/internal/pipewire/testdata/c1r0p2 b/internal/pipewire/testdata/c1r0p2 deleted file mode 100644 index a897629..0000000 Binary files a/internal/pipewire/testdata/c1r0p2 and /dev/null differ diff --git a/internal/pipewire/testdata/c1r1p0 b/internal/pipewire/testdata/c1r1p0 deleted file mode 100644 index ba89297..0000000 Binary files a/internal/pipewire/testdata/c1r1p0 and /dev/null differ diff --git a/internal/pipewire/testdata/c1r1p1 b/internal/pipewire/testdata/c1r1p1 deleted file mode 100644 index 60d1d53..0000000 Binary files a/internal/pipewire/testdata/c1r1p1 and /dev/null differ diff --git a/internal/pipewire/testdata/c1r2p0 b/internal/pipewire/testdata/c1r2p0 deleted file mode 100644 index d83c686..0000000 Binary files a/internal/pipewire/testdata/c1r2p0 and /dev/null differ diff --git a/internal/pipewire/testdata/c1r2p1 b/internal/pipewire/testdata/c1r2p1 deleted file mode 100644 index 8bb8ebb..0000000 Binary files a/internal/pipewire/testdata/c1r2p1 and /dev/null differ diff --git a/internal/pipewire/testdata/c1r3p0 b/internal/pipewire/testdata/c1r3p0 deleted file mode 100644 index 0964c8a..0000000 Binary files a/internal/pipewire/testdata/c1r3p0 and /dev/null differ diff --git a/internal/pipewire/testdata/c1r3p1 b/internal/pipewire/testdata/c1r3p1 deleted file mode 100644 index be7157c..0000000 Binary files a/internal/pipewire/testdata/c1r3p1 and /dev/null differ diff --git a/internal/pipewire/testdata/c1r4p0 b/internal/pipewire/testdata/c1r4p0 deleted file mode 100644 index 4c4b0f7..0000000 Binary files a/internal/pipewire/testdata/c1r4p0 and /dev/null differ diff --git a/internal/pipewire/testdata/c1r4p1 b/internal/pipewire/testdata/c1r4p1 deleted file mode 100644 index bb28d82..0000000 Binary files a/internal/pipewire/testdata/c1r4p1 and /dev/null differ diff --git a/internal/pipewire/testdata/c1r5p0 b/internal/pipewire/testdata/c1r5p0 deleted file mode 100644 index 41c8aa7..0000000 Binary files a/internal/pipewire/testdata/c1r5p0 and /dev/null differ diff --git a/internal/pipewire/testdata/c1r5p1 b/internal/pipewire/testdata/c1r5p1 deleted file mode 100644 index bc14f3c..0000000 Binary files a/internal/pipewire/testdata/c1r5p1 and /dev/null differ diff --git a/internal/pipewire/testdata/c1r5p2 b/internal/pipewire/testdata/c1r5p2 deleted file mode 100644 index 92ab10b..0000000 Binary files a/internal/pipewire/testdata/c1r5p2 and /dev/null differ diff --git a/internal/pipewire/testdata/c0s1p1 b/internal/pipewire/testdata/pw-container-00-sendmsg similarity index 53% rename from internal/pipewire/testdata/c0s1p1 rename to internal/pipewire/testdata/pw-container-00-sendmsg index f98da21..650d097 100644 Binary files a/internal/pipewire/testdata/c0s1p1 and b/internal/pipewire/testdata/pw-container-00-sendmsg differ diff --git a/internal/pipewire/testdata/pw-container-01-recvmsg b/internal/pipewire/testdata/pw-container-01-recvmsg new file mode 100644 index 0000000..fca410d Binary files /dev/null and b/internal/pipewire/testdata/pw-container-01-recvmsg differ diff --git a/internal/pipewire/testdata/pw-container-03-sendmsg b/internal/pipewire/testdata/pw-container-03-sendmsg new file mode 100644 index 0000000..f25feb0 Binary files /dev/null and b/internal/pipewire/testdata/pw-container-03-sendmsg differ diff --git a/internal/pipewire/testdata/pw-container-04-recvmsg b/internal/pipewire/testdata/pw-container-04-recvmsg new file mode 100644 index 0000000..299da9a Binary files /dev/null and b/internal/pipewire/testdata/pw-container-04-recvmsg differ diff --git a/internal/pipewire/testdata/pw-container-06-sendmsg b/internal/pipewire/testdata/pw-container-06-sendmsg new file mode 100644 index 0000000..edd70e3 Binary files /dev/null and b/internal/pipewire/testdata/pw-container-06-sendmsg differ diff --git a/internal/pipewire/testdata/pw-container-07-recvmsg b/internal/pipewire/testdata/pw-container-07-recvmsg new file mode 100644 index 0000000..5aad566 Binary files /dev/null and b/internal/pipewire/testdata/pw-container-07-recvmsg differ