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