// +build !js package websocket import ( "io" "math" "strings" "testing" "nhooyr.io/websocket/internal/test/assert" ) func TestCloseError(t *testing.T) { t.Parallel() testCases := []struct { name string ce CloseError success bool }{ { name: "normal", ce: CloseError{ Code: StatusNormalClosure, Reason: strings.Repeat("x", maxCloseReason), }, success: true, }, { name: "bigReason", ce: CloseError{ Code: StatusNormalClosure, Reason: strings.Repeat("x", maxCloseReason+1), }, success: false, }, { name: "bigCode", ce: CloseError{ Code: math.MaxUint16, Reason: strings.Repeat("x", maxCloseReason), }, success: false, }, } for _, tc := range testCases { tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() _, err := tc.ce.bytesErr() if tc.success { assert.Success(t, err) } else { assert.Error(t, err) } }) } t.Run("Error", func(t *testing.T) { exp := `status = StatusInternalError and reason = "meow"` act := CloseError{ Code: StatusInternalError, Reason: "meow", }.Error() assert.Equal(t, "CloseError.Error()", exp, act) }) } func Test_parseClosePayload(t *testing.T) { t.Parallel() testCases := []struct { name string p []byte success bool ce CloseError }{ { name: "normal", p: append([]byte{0x3, 0xE8}, []byte("hello")...), success: true, ce: CloseError{ Code: StatusNormalClosure, Reason: "hello", }, }, { name: "nothing", success: true, ce: CloseError{ Code: StatusNoStatusRcvd, }, }, { name: "oneByte", p: []byte{0}, success: false, }, { name: "badStatusCode", p: []byte{0x17, 0x70}, success: false, }, } for _, tc := range testCases { tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() ce, err := parseClosePayload(tc.p) if tc.success { assert.Success(t, err) assert.Equal(t, "close payload", tc.ce, ce) } else { assert.Error(t, err) } }) } } func Test_validWireCloseCode(t *testing.T) { t.Parallel() testCases := []struct { name string code StatusCode valid bool }{ { name: "normal", code: StatusNormalClosure, valid: true, }, { name: "noStatus", code: StatusNoStatusRcvd, valid: false, }, { name: "3000", code: 3000, valid: true, }, { name: "4999", code: 4999, valid: true, }, { name: "unknown", code: 5000, valid: false, }, } for _, tc := range testCases { tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() act := validWireCloseCode(tc.code) assert.Equal(t, "wire close code", tc.valid, act) }) } } func TestCloseStatus(t *testing.T) { t.Parallel() testCases := []struct { name string in error exp StatusCode }{ { name: "nil", in: nil, exp: -1, }, { name: "io.EOF", in: io.EOF, exp: -1, }, { name: "StatusInternalError", in: CloseError{ Code: StatusInternalError, }, exp: StatusInternalError, }, } for _, tc := range testCases { tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() act := CloseStatus(tc.in) assert.Equal(t, "close status", tc.exp, act) }) } }