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.
75 lines
2.8 KiB
75 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)
|
|
}
|
|
}
|
|
}
|
|
|