forked from hswaw/hscloud
143 lines
3.3 KiB
Go
143 lines
3.3 KiB
Go
package ident
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/go-test/deep"
|
|
)
|
|
|
|
// TestResponseDecode exercises the response decode implementation.
|
|
func TestResponseDecode(t *testing.T) {
|
|
for i, te := range []struct {
|
|
data string
|
|
want *Response
|
|
}{
|
|
// 0: Everything okay, server returned error.
|
|
{"123, 234 : ERROR : INVALID-PORT", &Response{
|
|
ServerPort: 123,
|
|
ClientPort: 234,
|
|
Error: InvalidPort,
|
|
}},
|
|
// 1: Everything okay, server returned error but also added some weird
|
|
// whitespace.
|
|
{" 123\t ,234 :ERROR: NO-USER ", &Response{
|
|
ServerPort: 123,
|
|
ClientPort: 234,
|
|
Error: NoUser,
|
|
}},
|
|
// 2: Everything okay, server returned a simple ident response.
|
|
{"123,234 : USERID : UNIX :q3k", &Response{
|
|
ServerPort: 123,
|
|
ClientPort: 234,
|
|
Ident: &IdentResponse{
|
|
OperatingSystem: "UNIX",
|
|
CharacterSet: "US-ASCII",
|
|
UserID: "q3k",
|
|
},
|
|
}},
|
|
// 3: Everything okay, server returned an ident response with a
|
|
// charset.
|
|
{"123,234 : USERID : UNIX, PETSCII :q3k", &Response{
|
|
ServerPort: 123,
|
|
ClientPort: 234,
|
|
Ident: &IdentResponse{
|
|
OperatingSystem: "UNIX",
|
|
CharacterSet: "PETSCII",
|
|
UserID: "q3k",
|
|
},
|
|
}},
|
|
} {
|
|
res, err := decodeResponse([]byte(te.data))
|
|
if err != nil {
|
|
if te.want != nil {
|
|
t.Errorf("%d: wanted result, got err %v", i, err)
|
|
}
|
|
} else {
|
|
if diff := deep.Equal(te.want, res); diff != nil {
|
|
t.Errorf("%d: %s", i, diff)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// TestResponseEncode exercises the encode method of Response.
|
|
func TestResponseEncode(t *testing.T) {
|
|
for i, te := range []struct {
|
|
r *Response
|
|
want string
|
|
}{
|
|
/// Standard features
|
|
// 0: simple error
|
|
{&Response{
|
|
ServerPort: 123,
|
|
ClientPort: 234,
|
|
Error: InvalidPort,
|
|
}, "123,234:ERROR:INVALID-PORT\r\n"},
|
|
// 1: simple response, stripped US-ASCII
|
|
{&Response{
|
|
ServerPort: 123,
|
|
ClientPort: 234,
|
|
Ident: &IdentResponse{
|
|
OperatingSystem: "UNIX",
|
|
UserID: "q3k",
|
|
},
|
|
}, "123,234:USERID:UNIX:q3k\r\n"},
|
|
// 2: simple response, stripped US-ASCII
|
|
{&Response{
|
|
ServerPort: 123,
|
|
ClientPort: 234,
|
|
Ident: &IdentResponse{
|
|
OperatingSystem: "UNIX",
|
|
CharacterSet: "US-ASCII",
|
|
UserID: "q3k",
|
|
},
|
|
}, "123,234:USERID:UNIX:q3k\r\n"},
|
|
|
|
/// Unusual features
|
|
// 3: unusual response
|
|
{&Response{
|
|
ServerPort: 123,
|
|
ClientPort: 234,
|
|
Ident: &IdentResponse{
|
|
OperatingSystem: "SUN",
|
|
CharacterSet: "PETSCII",
|
|
UserID: "q3k",
|
|
},
|
|
}, "123,234:USERID:SUN,PETSCII:q3k\r\n"},
|
|
// 4: non-standard error code
|
|
{&Response{
|
|
ServerPort: 123,
|
|
ClientPort: 234,
|
|
Error: ErrorResponse("XNOMANA"),
|
|
}, "123,234:ERROR:XNOMANA\r\n"},
|
|
|
|
/// Errors
|
|
// 5: invalid error code (should return nil)
|
|
{&Response{
|
|
ServerPort: 123,
|
|
ClientPort: 234,
|
|
Error: ErrorResponse("NOT ENOUGH MANA"),
|
|
}, ""},
|
|
// 6: no error/ident set (should return nil)
|
|
{&Response{
|
|
ServerPort: 123,
|
|
ClientPort: 234,
|
|
}, ""},
|
|
// 7: both error and ident set (should return nil)
|
|
{&Response{
|
|
ServerPort: 123,
|
|
ClientPort: 234,
|
|
Ident: &IdentResponse{
|
|
OperatingSystem: "UNIX",
|
|
CharacterSet: "US-ASCII",
|
|
UserID: "q3k",
|
|
},
|
|
Error: InvalidPort,
|
|
}, ""},
|
|
} {
|
|
if want, got := te.want, string(te.r.encode()); want != got {
|
|
t.Errorf("%d: wanted %q, got %q", i, want, got)
|
|
}
|
|
}
|
|
}
|