You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
2.8 KiB

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)
}
}
}