6 "github.com/stretchr/testify/assert"
7 "github.com/stretchr/testify/require"
12 func TestTrackerRegistration_Payload(t *testing.T) {
26 name: "returns expected payload bytes",
28 Port: [2]byte{0x00, 0x10},
30 PassID: [4]byte{0x00, 0x00, 0x00, 0x01},
39 0x00, 0x00, 0x00, 0x01,
41 0x54, 0x65, 0x73, 0x74, 0x20, 0x53, 0x65, 0x72, 0x76,
43 0x46, 0x6f, 0x6f, 0x7a,
48 for _, tt := range tests {
49 t.Run(tt.name, func(t *testing.T) {
50 tr := &TrackerRegistration{
52 UserCount: tt.fields.UserCount,
53 PassID: tt.fields.PassID,
55 Description: tt.fields.Description,
58 if got, _ := io.ReadAll(tr); !assert.Equal(t, tt.want, got) {
59 t.Errorf("Read() = %v, want %v", got, tt.want)
65 func Test_serverScanner(t *testing.T) {
75 wantErr assert.ErrorAssertionFunc
78 name: "when a full server entry is provided",
81 0x18, 0x05, 0x30, 0x63, // IP Addr
83 0x00, 0x02, // UserCount
86 0x54, 0x68, 0x65, // Name
88 0x54, 0x54, 0x54, // Description
94 0x18, 0x05, 0x30, 0x63, // IP Addr
96 0x00, 0x02, // UserCount
99 0x54, 0x68, 0x65, // Name
101 0x54, 0x54, 0x54, // Description
103 wantErr: assert.NoError,
106 name: "when extra bytes are provided",
109 0x18, 0x05, 0x30, 0x63, // IP Addr
111 0x00, 0x02, // UserCount
114 0x54, 0x68, 0x65, // Name
116 0x54, 0x54, 0x54, // Description
117 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54,
123 0x18, 0x05, 0x30, 0x63, // IP Addr
125 0x00, 0x02, // UserCount
128 0x54, 0x68, 0x65, // Name
130 0x54, 0x54, 0x54, // Description
132 wantErr: assert.NoError,
135 name: "when insufficient bytes are provided",
143 wantToken: []byte(nil),
144 wantErr: assert.NoError,
147 name: "when nameLen exceeds provided data",
150 0x18, 0x05, 0x30, 0x63, // IP Addr
152 0x00, 0x02, // UserCount
155 0x54, 0x68, 0x65, // Name
157 0x54, 0x54, 0x54, // Description
162 wantToken: []byte(nil),
163 wantErr: assert.NoError,
166 name: "when description len exceeds provided data",
169 0x18, 0x05, 0x30, 0x63, // IP Addr
171 0x00, 0x02, // UserCount
174 0x54, 0x68, 0x65, // Name
176 0x54, 0x54, 0x54, // Description
181 wantToken: []byte(nil),
182 wantErr: assert.NoError,
185 for _, tt := range tests {
186 t.Run(tt.name, func(t *testing.T) {
187 gotAdvance, gotToken, err := serverScanner(tt.args.data, tt.args.atEOF)
188 if !tt.wantErr(t, err, fmt.Sprintf("serverScanner(%v, %v)", tt.args.data, tt.args.atEOF)) {
191 assert.Equalf(t, tt.wantAdvance, gotAdvance, "serverScanner(%v, %v)", tt.args.data, tt.args.atEOF)
192 assert.Equalf(t, tt.wantToken, gotToken, "serverScanner(%v, %v)", tt.args.data, tt.args.atEOF)
197 type mockConn struct {
198 readBuffer *bytes.Buffer
199 writeBuffer *bytes.Buffer
203 func (m *mockConn) Read(b []byte) (n int, err error) {
204 return m.readBuffer.Read(b)
207 func (m *mockConn) Write(b []byte) (n int, err error) {
208 return m.writeBuffer.Write(b)
211 func (m *mockConn) Close() error {
216 func TestGetListing(t *testing.T) {
221 wantResult []ServerRecord
224 name: "Successful retrieval",
226 readBuffer: bytes.NewBuffer([]byte{
228 0x48, 0x54, 0x52, 0x4B, // Protocol "HTRK"
229 0x00, 0x01, // Version 1
231 0x00, 0x01, // MsgType (1)
232 0x00, 0x14, // MsgDataSize (20)
233 0x00, 0x02, // SrvCount (2)
234 0x00, 0x02, // SrvCountDup (2)
236 192, 168, 1, 1, // IP address
237 0x1F, 0x90, // Port 8080
238 0x00, 0x10, // NumUsers 16
239 0x00, 0x00, // Unused
241 'S', 'e', 'r', 'v', // Name
242 0x0B, // DescriptionSize
243 'M', 'y', ' ', 'S', 'e', 'r', 'v', 'e', 'r', ' ', '1', // Description
245 10, 0, 0, 1, // IP address
246 0x1F, 0x91, // Port 8081
247 0x00, 0x05, // NumUsers 5
248 0x00, 0x00, // Unused
250 'S', 'e', 'r', 'v', // Name
251 0x0B, // DescriptionSize
252 'M', 'y', ' ', 'S', 'e', 'r', 'v', 'e', 'r', ' ', '2', // Description
254 writeBuffer: &bytes.Buffer{},
257 wantResult: []ServerRecord{
259 IPAddr: [4]byte{192, 168, 1, 1},
260 Port: [2]byte{0x1F, 0x90},
261 NumUsers: [2]byte{0x00, 0x10},
262 Unused: [2]byte{0x00, 0x00},
264 Name: []byte("Serv"),
266 Description: []byte("My Server 1"),
269 IPAddr: [4]byte{10, 0, 0, 1},
270 Port: [2]byte{0x1F, 0x91},
271 NumUsers: [2]byte{0x00, 0x05},
272 Unused: [2]byte{0x00, 0x00},
274 Name: []byte("Serv"),
276 Description: []byte("My Server 2"),
283 readBuffer: &bytes.Buffer{},
284 writeBuffer: &bytes.Buffer{},
290 name: "Read error on TrackerHeader",
292 readBuffer: bytes.NewBuffer([]byte{
293 // incomplete data to cause read error
296 writeBuffer: &bytes.Buffer{},
302 name: "Read error on ServerInfoHeader",
304 readBuffer: bytes.NewBuffer([]byte{
306 0x48, 0x54, 0x52, 0x4B, // Protocol "HTRK"
307 0x00, 0x01, // Version 1
308 // incomplete ServerInfoHeader
311 writeBuffer: &bytes.Buffer{},
317 name: "Scanner error",
319 readBuffer: bytes.NewBuffer([]byte{
321 0x48, 0x54, 0x52, 0x4B, // Protocol "HTRK"
322 0x00, 0x01, // Version 1
324 0x00, 0x01, // MsgType (1)
325 0x00, 0x14, // MsgDataSize (20)
326 0x00, 0x01, // SrvCount (1)
327 0x00, 0x01, // SrvCountDup (1)
328 // incomplete ServerRecord to cause scanner error
331 writeBuffer: &bytes.Buffer{},
338 for _, tt := range tests {
339 t.Run(tt.name, func(t *testing.T) {
340 got, err := GetListing(tt.mockConn)
342 require.Error(t, err)
344 require.NoError(t, err)
345 assert.Equal(t, tt.wantResult, got)