package directstream import ( "bytes" "errors" "testing" ) func TestDecodeControlFrame(t *testing.T) { frame, err := DecodeControlFrame([]byte(`{"type":"authenticate","ticket":"ticket-value"}`)) if err != nil { t.Fatalf("DecodeControlFrame() error = %v", err) } if frame.Type != ControlAuthenticate || frame.Ticket != "ticket-value" { t.Fatalf("DecodeControlFrame() = %#v", frame) } } func TestDecodeControlFrameRejectsAmbiguousOrOversizedInput(t *testing.T) { tests := []struct { name string payload []byte }{ {name: "empty", payload: nil}, {name: "unknown field", payload: []byte(`{"type":"writer.request","extra":true}`)}, {name: "multiple values", payload: []byte(`{"type":"writer.request"}{"type":"writer.release"}`)}, {name: "unknown type", payload: []byte(`{"type":"shell.execute"}`)}, {name: "missing ticket", payload: []byte(`{"type":"authenticate"}`)}, {name: "ticket on writer request", payload: []byte(`{"type":"writer.request","ticket":"unexpected"}`)}, {name: "oversized", payload: bytes.Repeat([]byte{'x'}, MaxControlFrameBytes+1)}, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { if _, err := DecodeControlFrame(test.payload); !errors.Is(err, ErrInvalidControlFrame) { t.Fatalf("DecodeControlFrame() error = %v, want ErrInvalidControlFrame", err) } }) } } func TestValidateClientDataRequiresAuthenticatedWriterAndBoundedPayload(t *testing.T) { if err := ValidateClientData(AccessWriter, false, []byte{0x3a}); !errors.Is(err, ErrStreamUnauthenticated) { t.Fatalf("ValidateClientData(unauthenticated) error = %v", err) } if err := ValidateClientData(AccessViewer, true, []byte{0x3a}); !errors.Is(err, ErrWriterRequired) { t.Fatalf("ValidateClientData(viewer) error = %v", err) } if err := ValidateClientData(AccessWriter, true, nil); !errors.Is(err, ErrInvalidDataFrame) { t.Fatalf("ValidateClientData(empty) error = %v", err) } if err := ValidateClientData(AccessWriter, true, bytes.Repeat([]byte{0x3a}, MaxDataFrameBytes+1)); !errors.Is(err, ErrInvalidDataFrame) { t.Fatalf("ValidateClientData(oversized) error = %v", err) } if err := ValidateClientData(AccessWriter, true, []byte{0x00, 0x3a, 0xff}); err != nil { t.Fatalf("ValidateClientData(valid binary) error = %v", err) } } func TestValidateChannelAndAccess(t *testing.T) { for _, channel := range []string{"CH01", "CH24", "CH25", "CH48"} { if err := ValidateChannel(channel); err != nil { t.Fatalf("ValidateChannel(%q) error = %v", channel, err) } } for _, channel := range []string{"", "CH00", "CH49", "ttyWCH4", "ch01"} { if err := ValidateChannel(channel); err == nil { t.Fatalf("ValidateChannel(%q) error = nil", channel) } } for _, access := range []string{AccessViewer, AccessWriter} { if err := ValidateAccess(access); err != nil { t.Fatalf("ValidateAccess(%q) error = %v", access, err) } } }