Files
Piik/native/client/internal/loopback/protocol_test.go
T
AAA 5781d6bbfa feat(client): complete native source and release boundary
Complete the Native Client source/audio boundary, strict v5 loopback contract, Browser media lifecycle handling, and non-blocking release checks. Keep unverified platform/physical gates explicit; do not rewrite the Go Server.
2026-09-04 03:42:54 +08:00

69 lines
2.2 KiB
Go

package loopback
import (
"testing"
)
func TestDecodeRequestAcceptsOnlyTheCurrentShape(t *testing.T) {
valid := []string{
`{"version":5,"id":"request_hello","type":"hello"}`,
`{"version":5,"id":"request_ping","type":"ping"}`,
}
for _, payload := range valid {
if _, err := decodeRequest([]byte(payload)); err != nil {
t.Fatalf("decodeRequest(%s) = %v", payload, err)
}
}
invalid := []string{
`{"version":3,"id":"request_ping","type":"ping"}`,
`{"version":5,"id":"short","type":"ping"}`,
`{"version":5,"id":"request_ping","type":"ping","extra":true}`,
`{"version":5,"id":"request_hello","type":"hello","nonce":"obsolete"}`,
`{"version":5,"id":"request_ping","type":"ping"} trailing`,
}
for _, payload := range invalid {
if _, err := decodeRequest([]byte(payload)); err == nil {
t.Fatalf("decodeRequest accepted %s", payload)
}
}
}
func TestValidateMessagesRequireTheExpectedPhase(t *testing.T) {
hello := controlMessage{Version: ProtocolVersion, ID: "request_hello", Type: "hello"}
if err := validateHello(hello); err != nil {
t.Fatalf("validateHello = %v", err)
}
ping := controlMessage{Version: ProtocolVersion, ID: "request_ping", Type: "ping"}
if err := validatePing(ping); err != nil {
t.Fatal(err)
}
if err := validatePing(hello); err == nil {
t.Fatal("validatePing accepted hello")
}
if err := validateHello(ping); err == nil {
t.Fatal("validateHello accepted ping")
}
}
func TestEnvelopeAllowsAnExtensionToOwnItsStrictShape(t *testing.T) {
payload := []byte(`{"version":5,"id":"request_extension","type":"extension","value":1}`)
message, err := decodeEnvelope(payload)
if err != nil || message.Type != "extension" {
t.Fatalf("extension envelope = %+v, %v", message, err)
}
if _, err = decodeRequest(payload); err == nil {
t.Fatal("base message decoder accepted extension fields")
}
}
func TestNormalizePortRangeUsesTheBoundedDefaults(t *testing.T) {
start, end := normalizePortRange(0, 0)
if start != DefaultPortStart || end != DefaultPortEnd {
t.Fatalf("default range = %d-%d", start, end)
}
start, end = normalizePortRange(0, 40000)
if start != 40000 || end != 40000 {
t.Fatalf("single-port range = %d-%d", start, end)
}
}