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