blob: 3ef5137329af83e5e36e3ca26905d50d7311fddc [file] [log] [blame]
Serge Bazanskid4438d62021-05-23 13:37:30 +02001package ident
2
3import (
4 "testing"
5
6 "github.com/go-test/deep"
7)
8
9// TestResponseDecode exercises the response decode implementation.
10func TestResponseDecode(t *testing.T) {
11 for i, te := range []struct {
12 data string
13 want *Response
14 }{
15 // 0: Everything okay, server returned error.
16 {"123, 234 : ERROR : INVALID-PORT", &Response{
17 ServerPort: 123,
18 ClientPort: 234,
19 Error: InvalidPort,
20 }},
21 // 1: Everything okay, server returned error but also added some weird
22 // whitespace.
23 {" 123\t ,234 :ERROR: NO-USER ", &Response{
24 ServerPort: 123,
25 ClientPort: 234,
26 Error: NoUser,
27 }},
28 // 2: Everything okay, server returned a simple ident response.
29 {"123,234 : USERID : UNIX :q3k", &Response{
30 ServerPort: 123,
31 ClientPort: 234,
32 Ident: &IdentResponse{
33 OperatingSystem: "UNIX",
34 CharacterSet: "US-ASCII",
35 UserID: "q3k",
36 },
37 }},
38 // 3: Everything okay, server returned an ident response with a
39 // charset.
40 {"123,234 : USERID : UNIX, PETSCII :q3k", &Response{
41 ServerPort: 123,
42 ClientPort: 234,
43 Ident: &IdentResponse{
44 OperatingSystem: "UNIX",
45 CharacterSet: "PETSCII",
46 UserID: "q3k",
47 },
48 }},
49 } {
50 res, err := decodeResponse([]byte(te.data))
51 if err != nil {
52 if te.want != nil {
53 t.Errorf("%d: wanted result, got err %v", i, err)
54 }
55 } else {
56 if diff := deep.Equal(te.want, res); diff != nil {
57 t.Errorf("%d: %s", i, diff)
58 }
59 }
60 }
61}
Serge Bazanskice2737f2021-05-23 17:15:29 +020062
63// TestResponseEncode exercises the encode method of Response.
64func TestResponseEncode(t *testing.T) {
65 for i, te := range []struct {
66 r *Response
67 want string
68 }{
69 /// Standard features
70 // 0: simple error
71 {&Response{
72 ServerPort: 123,
73 ClientPort: 234,
74 Error: InvalidPort,
75 }, "123,234:ERROR:INVALID-PORT\r\n"},
76 // 1: simple response, stripped US-ASCII
77 {&Response{
78 ServerPort: 123,
79 ClientPort: 234,
80 Ident: &IdentResponse{
81 OperatingSystem: "UNIX",
82 UserID: "q3k",
83 },
84 }, "123,234:USERID:UNIX:q3k\r\n"},
85 // 2: simple response, stripped US-ASCII
86 {&Response{
87 ServerPort: 123,
88 ClientPort: 234,
89 Ident: &IdentResponse{
90 OperatingSystem: "UNIX",
91 CharacterSet: "US-ASCII",
92 UserID: "q3k",
93 },
94 }, "123,234:USERID:UNIX:q3k\r\n"},
95
96 /// Unusual features
97 // 3: unusual response
98 {&Response{
99 ServerPort: 123,
100 ClientPort: 234,
101 Ident: &IdentResponse{
102 OperatingSystem: "SUN",
103 CharacterSet: "PETSCII",
104 UserID: "q3k",
105 },
106 }, "123,234:USERID:SUN,PETSCII:q3k\r\n"},
107 // 4: non-standard error code
108 {&Response{
109 ServerPort: 123,
110 ClientPort: 234,
111 Error: ErrorResponse("XNOMANA"),
112 }, "123,234:ERROR:XNOMANA\r\n"},
113
114 /// Errors
115 // 5: invalid error code (should return nil)
116 {&Response{
117 ServerPort: 123,
118 ClientPort: 234,
119 Error: ErrorResponse("NOT ENOUGH MANA"),
120 }, ""},
121 // 6: no error/ident set (should return nil)
122 {&Response{
123 ServerPort: 123,
124 ClientPort: 234,
125 }, ""},
126 // 7: both error and ident set (should return nil)
127 {&Response{
128 ServerPort: 123,
129 ClientPort: 234,
130 Ident: &IdentResponse{
131 OperatingSystem: "UNIX",
132 CharacterSet: "US-ASCII",
133 UserID: "q3k",
134 },
135 Error: InvalidPort,
136 }, ""},
137 } {
138 if want, got := te.want, string(te.r.encode()); want != got {
139 t.Errorf("%d: wanted %q, got %q", i, want, got)
140 }
141 }
142}