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