1// SPDX-License-Identifier: ISC
2// Copyright (c) 2014-2020 Bitmark Inc.
3// Use of this source code is governed by an ISC
4// license that can be found in the LICENSE file.
5
6package domain_test
7
8import (
9	"testing"
10
11	"github.com/bitmark-inc/bitmarkd/announce/domain"
12	"github.com/bitmark-inc/bitmarkd/announce/fixtures"
13	"github.com/bitmark-inc/bitmarkd/fault"
14	"github.com/bitmark-inc/logger"
15)
16
17func TestValidTag(t *testing.T) {
18	fixtures.SetupTestLogger()
19	defer fixtures.TeardownTestLogger()
20
21	type testItem struct {
22		id  int
23		txt string
24		err error
25	}
26
27	testData := []testItem{
28		{
29			id:  1,
30			txt: "bitmark=v3 a=118.163.120.178;2001:b030:2314:0200:4649:583d:0001:0120 r=33566 f=48137A7A76934CAFE7635C9AC05339C20F4C00A724D7FA1DC0DC3875476ED004 c=32136 p=202c14ec485c21d0d18e9dfd096bd760a558d5ee1139f8e4b2e15863433e7d51",
31			err: nil,
32		},
33		{
34			id:  2,
35			txt: "bitmark=v3 a=118.163.120.178;2001:b030:2314:0200:4649:583d:0001:0120 r=33566 f=48137A7A76934CAFE7635C9AC05339C20F4C00A724D7FA1DC0DC3875476ED004 c=32136 p=202c14ec485c21d0d18e9dfd096bd760a558d5ee1139f8e4b2e15863433e7d51",
36			err: nil,
37		},
38		{
39			id:  3,
40			txt: "bitmark=v3 a=118.163.120.178;[2001:b030:2314:0200:4649:583d:0001:0120] r=33566 f=48137A7A76934CAFE7635C9AC05339C20F4C00A724D7FA1DC0DC3875476ED004 c=32136 p=202c14ec485c21d0d18e9dfd096bd760a558d5ee1139f8e4b2e15863433e7d51",
41			err: nil,
42		},
43
44		// corrupt record
45		{
46			id:  4,
47			txt: "bitmark=v3 a=",
48			err: fault.InvalidDnsTxtRecord,
49		},
50		{
51			id:  5,
52			txt: "bitmark=v3 a= p=",
53			err: fault.InvalidDnsTxtRecord,
54		},
55		{
56			id:  6,
57			txt: "bitmark=v3 a",
58			err: fault.InvalidDnsTxtRecord,
59		},
60		{
61			id:  7,
62			txt: "bitmark=v3 a p",
63			err: fault.InvalidDnsTxtRecord,
64		},
65
66		// check for missing items
67		{
68			id:  8,
69			txt: "bitmark=v3 r=33566 f=48137A7A76934CAFE7635C9AC05339C20F4C00A724D7FA1DC0DC3875476ED004 c=32136 p=202c14ec485c21d0d18e9dfd096bd760a558d5ee1139f8e4b2e15863433e7d51",
70			err: fault.InvalidDnsTxtRecord,
71		},
72		{
73			id:  9,
74			txt: "bitmark=v3 a=118.163.120.178;[2001:b030:2314:0200:4649:583d:0001:0120] f=48137A7A76934CAFE7635C9AC05339C20F4C00A724D7FA1DC0DC3875476ED004 c=32136 p=202c14ec485c21d0d18e9dfd096bd760a558d5ee1139f8e4b2e15863433e7d51",
75			err: fault.InvalidDnsTxtRecord,
76		},
77		{
78			id:  10,
79			txt: "bitmark=v3 a=118.163.120.178;[2001:b030:2314:0200:4649:583d:0001:0120] r=33566 c=32136 p=202c14ec485c21d0d18e9dfd096bd760a558d5ee1139f8e4b2e15863433e7d51",
80			err: fault.InvalidDnsTxtRecord,
81		},
82		{
83			id:  11,
84			txt: "bitmark=v3 a=118.163.120.178;[2001:b030:2314:0200:4649:583d:0001:0120] r=33566 f=48137A7A76934CAFE7635C9AC05339C20F4C00A724D7FA1DC0DC3875476ED004 p=202c14ec485c21d0d18e9dfd096bd760a558d5ee1139f8e4b2e15863433e7d51",
85			err: fault.InvalidDnsTxtRecord,
86		},
87		{
88			id:  12,
89			txt: "bitmark=v3 a=118.163.120.178;[2001:b030:2314:0200:4649:583d:0001:0120] r=33566 f=48137A7A76934CAFE7635C9AC05339C20F4C00A724D7FA1DC0DC3875476ED004 c=32136",
90			err: fault.InvalidDnsTxtRecord,
91		},
92
93		// check for incorrect items
94		{
95			id:  13,
96			txt: "bitmark=v3 a=300.163.120.178;2001:b030:2314:0200:4649:583d:0001:0120 r=33566 f=48137A7A76934CAFE7635C9AC05339C20F4C00A724D7FA1DC0DC3875476ED004 c=32136 p=202c14ec485c21d0d18e9dfd096bd760a558d5ee1139f8e4b2e15863433e7d51",
97			err: fault.InvalidIpAddress,
98		},
99		{
100			id:  14,
101			txt: "bitmark=v3 a=118.163.120.178;2001:x030:2314:0200:4649:583d:0001:0120 r=33566 f=48137A7A76934CAFE7635C9AC05339C20F4C00A724D7FA1DC0DC3875476ED004 c=32136 p=202c14ec485c21d0d18e9dfd096bd760a558d5ee1139f8e4b2e15863433e7d51",
102			err: fault.InvalidIpAddress,
103		},
104		{
105			id:  15,
106			txt: "bitmark=v3 a=118.163.120.178;2001:b030:2314:0200:4649:583d:0001:0120 r=335669 f=48137A7A76934CAFE7635C9AC05339C20F4C00A724D7FA1DC0DC3875476ED004 s=32135 c=32136 p=202c14ec485c21d0d18e9dfd096bd760a558d5ee1139f8e4b2e15863433e7d51",
107			err: fault.InvalidPortNumber,
108		},
109		{
110			id:  16,
111			txt: "bitmark=v3 a=118.163.120.178;2001:b030:2314:0200:4649:583d:0001:0120 r=0 f=48137A7A76934CAFE7635C9AC05339C20F4C00A724D7FA1DC0DC3875476ED004 c=32136 p=202c14ec485c21d0d18e9dfd096bd760a558d5ee1139f8e4b2e15863433e7d51",
112			err: fault.InvalidPortNumber,
113		},
114		{
115			id:  17,
116			txt: "bitmark=v3 a=118.163.120.178;2001:b030:2314:0200:4649:583d:0001:0120 r=-12 f=48137A7A76934CAFE7635C9AC05339C20F4C00A724D7FA1DC0DC3875476ED004 c=32136 p=202c14ec485c21d0d18e9dfd096bd760a558d5ee1139f8e4b2e15863433e7d51",
117			err: fault.InvalidPortNumber,
118		},
119		{
120			id:  18,
121			txt: "bitmark=v3 a=118.163.120.178;2001:b030:2314:0200:4649:583d:0001:0120 r=335x669 f=48137A7A76934CAFE7635C9AC05339C20F4C00A724D7FA1DC0DC3875476ED004 c=32136 p=202c14ec485c21d0d18e9dfd096bd760a558d5ee1139f8e4b2e15863433e7d51",
122			err: fault.InvalidPortNumber,
123		},
124		{
125			id:  19,
126			txt: "bitmark=v3 a=118.163.120.178;2001:b030:2314:0200:4649:583d:0001:0120 r=33566 f=48137A7A761934CAFE7635C9AC05339C20F4C00A724D7FA1DC0DC3875476ED004 c=32136 p=202c14ec485c21d0d18e9dfd096bd760a558d5ee1139f8e4b2e15863433e7d51",
127			err: fault.InvalidFingerprint,
128		},
129		{
130			id:  20,
131			txt: "bitmark=v3 a=118.163.120.178;2001:b030:2314:0200:4649:583d:0001:0120 r=33566 f=461934CAFE7635C9AC05339C20F4C00A724D7FA1DC0DC3875476ED04 c=32136 p=202c14ec485c21d0d18e9dfd096bd760a558d5ee1139f8e4b2e15863433e7d51",
132			err: fault.InvalidFingerprint,
133		},
134		{
135			id:  21,
136			txt: "bitmark=v3 a=118.163.120.178;2001:b030:2314:0200:4649:583d:0001:0120 r=33566 f=48137A7A76934CZFE7635C9AC05339C20F4C00A724D7FA1DC0DC3875476ED04 c=32136 p=202c14ec485c21d0d18e9dfd096bd760a558d5ee1139f8e4b2e15863433e7d51",
137			err: fault.InvalidFingerprint,
138		},
139		{
140			id:  22,
141			txt: "bitmark=v3 a=118.163.120.178;2001:b030:2314:0200:4649:583d:0001:0120 r=33566 f=48137A7A76934CAFE7635C9AC05339C20F4C00A724D7FA1DC0DC3875476ED004 c=321369 p=202c14ec485c21d0d18e9dfd096bd760a558d5ee1139f8e4b2e15863433e7d51",
142			err: fault.InvalidPortNumber,
143		},
144		{
145			id:  23,
146			txt: "bitmark=v3 a=118.163.120.178;2001:b030:2314:0200:4649:583d:0001:0120 r=33566 f=48137A7A76934CAFE7635C9AC05339C20F4C00A724D7FA1DC0DC3875476ED004 c=32136 p=1202c14ec485c21d0d18e9dfd096bd760a558d5ee1139f8e4b2e15863433e7d51",
147			err: fault.InvalidPublicKey,
148		},
149		{
150			id:  24,
151			txt: "bitmark=v3 a=118.163.120.178;2001:b030:2314:0200:4649:583d:0001:0120 r=33566 f=48137A7A76934CAFE7635C9AC05339C20F4C00A724D7FA1DC0DC3875476ED004 c=32136 p=202c1pec485c21d0d18e9dfd096bd760a558d5ee1139f8e4b2e15863433e7d51",
152			err: fault.InvalidPublicKey,
153		},
154
155		// old V2 tags still ok
156		{
157			id:  25,
158			txt: "bitmark=v2 a=118.163.120.178;2001:b030:2314:0200:4649:583d:0001:0120 r=33566 f=48137A7A76934CAFE7635C9AC05339C20F4C00A724D7FA1DC0DC3875476ED004 s=32135 c=32136 p=202c14ec485c21d0d18e9dfd096bd760a558d5ee1139f8e4b2e15863433e7d51",
159			err: nil,
160		},
161
162		// invalid tags
163		{
164			id:  26,
165			txt: "bitmark=v0 a=118.163.120.178;2001:b030:2314:0200:4649:583d:0001:0120 r=33566 f=48137A7A76934CAFE7635C9AC05339C20F4C00A724D7FA1DC0DC3875476ED004 s=32135 c=32136 p=202c1pec485c21d0d18e9dfd096bd760a558d5ee1139f8e4b2e15863433e7d51",
166			err: fault.InvalidDnsTxtRecord,
167		},
168		{
169			id:  27,
170			txt: "hello world",
171			err: fault.InvalidDnsTxtRecord,
172		},
173	}
174
175	for _, item := range testData {
176		_, err := domain.Parse(item.txt)
177
178		if nil == item.err && nil != err {
179			t.Errorf("id[%d] error: \"%s\"  expected success", item.id, err)
180		} else if item.err != err {
181			t.Errorf("id[%d] error: \"%s\"  expected: \"%s\"", item.id, err, item.err)
182		}
183
184		f := func(s string) ([]string, error) {
185			return []string{item.txt}, nil
186		}
187		l := domain.NewLookuper(logger.New(fixtures.LogCategory), f)
188
189		r, err := l.Lookup(item.txt)
190
191		if err == item.err && 1 != len(r) {
192			t.Errorf("id[%d] expected 1 record but got: %d", item.id, len(r))
193		} else if err != item.err && 0 != len(r) {
194			t.Errorf("id[%d] expected zero records bu got: %d", item.id, len(r))
195		}
196	}
197}
198