netaddr_test.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  1. /*
  2. * This Source Code Form is subject to the terms of the Mozilla Public
  3. * License, v. 2.0. If a copy of the MPL was not distributed with this
  4. * file, You can obtain one at https://mozilla.org/MPL/2.0/.
  5. */
  6. package netaddr_test
  7. import (
  8. "bytes"
  9. "sort"
  10. "testing"
  11. . "idiolink/go/netaddr"
  12. )
  13. func TestIPParsesCIDR(t *testing.T) {
  14. actual, _ := IP("192.0.2.0/24")
  15. expected :=
  16. &NetAddr{Address: []byte{192, 0, 2, 0}, Length: byte(24)}
  17. if !IsEqual(actual, expected) {
  18. t.Errorf("Expected %+v but got %+v", expected, actual)
  19. }
  20. }
  21. func TestIPParsesTruncatedPrefix(t *testing.T) {
  22. actual, err := IP("192.0.2/24")
  23. if err != nil {
  24. t.Errorf("failed to parse input: %v", err)
  25. return
  26. }
  27. expected :=
  28. &NetAddr{Address: []byte{192, 0, 2, 0}, Length: byte(24)}
  29. if !IsEqual(actual, expected) {
  30. t.Errorf("Expected %+v but got %+v", expected, actual)
  31. }
  32. }
  33. func TestIPParsesOtherTruncatedPrefix(t *testing.T) {
  34. actual, err := IP("0/0")
  35. if err != nil {
  36. t.Errorf("failed to parse input: %v", err)
  37. return
  38. }
  39. expected :=
  40. &NetAddr{Address: []byte{0, 0, 0, 0}, Length: byte(0)}
  41. if !IsEqual(actual, expected) {
  42. t.Errorf("Expected %+v but got %+v", expected, actual)
  43. }
  44. }
  45. func TestIPParsesAnotherTruncatedPrefix(t *testing.T) {
  46. actual, err := IP("0/8")
  47. if err != nil {
  48. t.Errorf("failed to parse input: %v", err)
  49. return
  50. }
  51. expected :=
  52. &NetAddr{Address: []byte{0, 0, 0, 0}, Length: byte(8)}
  53. if !IsEqual(actual, expected) {
  54. t.Errorf("Expected %+v but got %+v", expected, actual)
  55. }
  56. }
  57. func TestIPParsesYetAnotherTruncatedPrefix(t *testing.T) {
  58. actual, err := IP("0/32")
  59. if err != nil {
  60. t.Errorf("failed to parse input: %v", err)
  61. return
  62. }
  63. expected :=
  64. &NetAddr{Address: []byte{0, 0, 0, 0}, Length: byte(32)}
  65. if !IsEqual(actual, expected) {
  66. t.Errorf("Expected %+v but got %+v", expected, actual)
  67. }
  68. }
  69. func TestIPParsesStillAnotherTruncatedPrefix(t *testing.T) {
  70. actual, err := IP("10/8")
  71. if err != nil {
  72. t.Errorf("failed to parse input: %v", err)
  73. return
  74. }
  75. expected :=
  76. &NetAddr{Address: []byte{10, 0, 0, 0}, Length: byte(8)}
  77. if !IsEqual(actual, expected) {
  78. t.Errorf("Expected %+v but got %+v", expected, actual)
  79. }
  80. }
  81. func TestIPParsesIPv4AddressWithContext(t *testing.T) {
  82. actual, _ := IP("192.0.2.1/24")
  83. expected :=
  84. &NetAddr{Address: []byte{192, 0, 2, 1}, Length: byte(24)}
  85. if !IsEqual(actual, expected) {
  86. t.Errorf("Expected %+v but got %+v", expected, actual)
  87. }
  88. }
  89. func TestIPParsesIPv4AddressWithoutContext(t *testing.T) {
  90. actual, _ := IP("192.0.2.1")
  91. expected :=
  92. &NetAddr{Address: []byte{192, 0, 2, 1}, Length: byte(32)}
  93. if !IsEqual(actual, expected) {
  94. t.Errorf("Expected %+v but got %+v", expected, actual)
  95. }
  96. }
  97. func TestIPParsesOtherIPv4AddressWithoutContext(t *testing.T) {
  98. actual, err := IP("172.31.254.5")
  99. if err != nil {
  100. t.Errorf("got error: %v", err)
  101. return
  102. }
  103. expected :=
  104. &NetAddr{Address: []byte{172, 31, 254, 5}, Length: byte(32)}
  105. if !IsEqual(actual, expected) {
  106. t.Errorf("Expected %+v but got %+v", expected, actual)
  107. }
  108. }
  109. func TestIPParsesIPv6AddressWithContext(t *testing.T) {
  110. actual, _ := IP("2001:db8::1/64")
  111. expected :=
  112. &NetAddr{
  113. Address: []byte{
  114. 0x20, 0x01, 0x0d, 0xb8,
  115. 0x00, 0x00, 0x00, 0x00,
  116. 0x00, 0x00, 0x00, 0x00,
  117. 0x00, 0x00, 0x00, 0x01,
  118. },
  119. Length: byte(64),
  120. }
  121. if !IsEqual(actual, expected) {
  122. t.Errorf("Expected %+v but got %+v", expected, actual)
  123. }
  124. }
  125. func TestIPParsesIPv6AddressWithoutContext(t *testing.T) {
  126. actual, _ := IP("2001:db8::1")
  127. expected :=
  128. &NetAddr{
  129. Address: []byte{
  130. 0x20, 0x01, 0x0d, 0xb8,
  131. 0x00, 0x00, 0x00, 0x00,
  132. 0x00, 0x00, 0x00, 0x00,
  133. 0x00, 0x00, 0x00, 0x01,
  134. },
  135. Length: byte(128),
  136. }
  137. if !IsEqual(actual, expected) {
  138. t.Errorf("Expected %+v but got %+v", expected, actual)
  139. }
  140. }
  141. func TestIPFailsToParseJunk(t *testing.T) {
  142. _, err := IP("256.0.0.0")
  143. if err == nil {
  144. t.Error("Expected error but got nil")
  145. }
  146. }
  147. func TestIPFailsToParseOtherJunk(t *testing.T) {
  148. _, err := IP("255.0.0.0.0")
  149. if err == nil {
  150. t.Error("Expected error but got nil")
  151. }
  152. }
  153. func TestContainsIsNotStrict(t *testing.T) {
  154. na, _ := IP("192.0.2.0/24")
  155. actual := Contains(na, na)
  156. expected := true
  157. if actual != expected {
  158. t.Errorf("Expected %+v but got %+v", expected, actual)
  159. }
  160. }
  161. func TestContainsReturnsTrue(t *testing.T) {
  162. na1, _ := IP("192.0.2.0/24")
  163. na2, _ := IP("192.0.2.0/25")
  164. actual := Contains(na1, na2)
  165. expected := true
  166. if actual != expected {
  167. t.Errorf("Expected %+v but got %+v", expected, actual)
  168. }
  169. }
  170. func TestContainsReturnsFalseOnShorterLen(t *testing.T) {
  171. na1, _ := IP("192.0.2.0/24")
  172. na2, _ := IP("192.0.2.0/25")
  173. actual := Contains(na2, na1)
  174. expected := false
  175. if actual != expected {
  176. t.Errorf("Expected %+v but got %+v", expected, actual)
  177. }
  178. }
  179. func TestContainsReturnsFalseOnAdjacent(t *testing.T) {
  180. na1, _ := IP("192.0.2.0/25")
  181. na2, _ := IP("192.0.2.128/25")
  182. actual := Contains(na1, na2)
  183. expected := false
  184. if actual != expected {
  185. t.Errorf("Expected %+v but got %+v", expected, actual)
  186. }
  187. }
  188. func TestIsSubsetIsNotStrict(t *testing.T) {
  189. na, _ := IP("192.0.2.0/24")
  190. actual := IsSubset(na, na)
  191. expected := true
  192. if actual != expected {
  193. t.Errorf("Expected %+v but got %+v", expected, actual)
  194. }
  195. }
  196. func TestIsSubsetReturnsTrue(t *testing.T) {
  197. na1, _ := IP("192.0.2.0/24")
  198. na2, _ := IP("192.0.2.0/25")
  199. actual := IsSubset(na2, na1)
  200. expected := true
  201. if actual != expected {
  202. t.Errorf("Expected %+v but got %+v", expected, actual)
  203. }
  204. }
  205. func TestIsSubsetReturnsFalseOnShorterLen(t *testing.T) {
  206. na1, _ := IP("192.0.2.0/24")
  207. na2, _ := IP("192.0.2.0/25")
  208. actual := IsSubset(na1, na2)
  209. expected := false
  210. if actual != expected {
  211. t.Errorf("Expected %+v but got %+v", expected, actual)
  212. }
  213. }
  214. func TestIsSubsetReturnsFalseOnAdjacent(t *testing.T) {
  215. na1, _ := IP("192.0.2.0/25")
  216. na2, _ := IP("192.0.2.128/25")
  217. actual := IsSubset(na2, na1)
  218. expected := false
  219. if actual != expected {
  220. t.Errorf("Expected %+v but got %+v", expected, actual)
  221. }
  222. }
  223. func TestFirstAddressWorks(t *testing.T) {
  224. na, _ := IP("192.0.2.127/27")
  225. actual := na.FirstAddress()
  226. expected :=
  227. &NetAddr{
  228. Address: []byte{192, 0, 2, 96},
  229. Length: byte(27),
  230. }
  231. if !IsEqual(actual, expected) {
  232. t.Errorf("Expected %+v but got %+v", expected, actual)
  233. }
  234. }
  235. func TestLastAddressWorks(t *testing.T) {
  236. na, _ := IP("192.0.2.96/27")
  237. actual := na.LastAddress()
  238. expected :=
  239. &NetAddr{
  240. Address: []byte{192, 0, 2, 127},
  241. Length: byte(27),
  242. }
  243. if !IsEqual(actual, expected) {
  244. t.Errorf("Expected %+v but got %+v", expected, actual)
  245. }
  246. }
  247. func TestStringWorksForIPv4(t *testing.T) {
  248. expected := "192.0.2.1/24"
  249. na, _ := IP(expected)
  250. actual := na.String()
  251. if actual != expected {
  252. t.Errorf("Expected %+v but got %v", expected, actual)
  253. }
  254. }
  255. func TestStringWorksForIPv6(t *testing.T) {
  256. expected := "fe80::1/64"
  257. na, _ := IP(expected)
  258. actual := na.String()
  259. if actual != expected {
  260. t.Errorf("Expected %+v but got %v", expected, actual)
  261. }
  262. }
  263. func TestIsRFC1918DetectsPrivate(t *testing.T) {
  264. expected := true
  265. na, _ := IP("10.255.255.255/32")
  266. actual := na.IsRFC1918()
  267. if actual != expected {
  268. t.Errorf("Expected %+v but got %v", expected, actual)
  269. }
  270. }
  271. func TestIsRFC1918DetectsOtherPrivate(t *testing.T) {
  272. expected := true
  273. na, _ := IP("172.31.255.255/32")
  274. actual := na.IsRFC1918()
  275. if actual != expected {
  276. t.Errorf("Expected %+v but got %v", expected, actual)
  277. }
  278. }
  279. func TestIsRFC1918DetectsYetAnotherPrivate(t *testing.T) {
  280. expected := true
  281. na, _ := IP("192.168.255.255/32")
  282. actual := na.IsRFC1918()
  283. if actual != expected {
  284. t.Errorf("Expected %+v but got %v", expected, actual)
  285. }
  286. }
  287. func TestIsRFC1918DetectsNonPrivates(t *testing.T) {
  288. expected := false
  289. na, _ := IP("192.0.2.133/27")
  290. actual := na.IsRFC1918()
  291. if actual != expected {
  292. t.Errorf("Expected %+v but got %v", expected, actual)
  293. }
  294. }
  295. func TestMaskGeneratesCorrectMasks(t *testing.T) {
  296. na, _ := IP("192.0.2.0/24")
  297. expected := []byte{255, 255, 255, 0}
  298. if !bytes.Equal(na.Mask(), expected) {
  299. t.Errorf("Expected %v but got %v", expected, na.Mask())
  300. }
  301. expected = []byte{255, 255, 255, 128}
  302. na = SetLength(na, na.Length+1)
  303. if !bytes.Equal(na.Mask(), expected) {
  304. t.Errorf("Expected %v but got %v", expected, na.Mask())
  305. }
  306. expected = []byte{255, 255, 255, 192}
  307. na = SetLength(na, na.Length+1)
  308. if !bytes.Equal(na.Mask(), expected) {
  309. t.Errorf("Expected %v but got %v", expected, na.Mask())
  310. }
  311. expected = []byte{255, 255, 255, 224}
  312. na = SetLength(na, na.Length+1)
  313. if !bytes.Equal(na.Mask(), expected) {
  314. t.Errorf("Expected %v but got %v", expected, na.Mask())
  315. }
  316. expected = []byte{255, 255, 255, 240}
  317. na = SetLength(na, na.Length+1)
  318. if !bytes.Equal(na.Mask(), expected) {
  319. t.Errorf("Expected %v but got %v", expected, na.Mask())
  320. }
  321. expected = []byte{255, 255, 255, 248}
  322. na = SetLength(na, na.Length+1)
  323. if !bytes.Equal(na.Mask(), expected) {
  324. t.Errorf("Expected %v but got %v", expected, na.Mask())
  325. }
  326. expected = []byte{255, 255, 255, 252}
  327. na = SetLength(na, na.Length+1)
  328. if !bytes.Equal(na.Mask(), expected) {
  329. t.Errorf("Expected %v but got %v", expected, na.Mask())
  330. }
  331. expected = []byte{255, 255, 255, 254}
  332. na = SetLength(na, na.Length+1)
  333. if !bytes.Equal(na.Mask(), expected) {
  334. t.Errorf("Expected %v but got %v", expected, na.Mask())
  335. }
  336. expected = []byte{255, 255, 255, 255}
  337. na = SetLength(na, na.Length+1)
  338. if !bytes.Equal(na.Mask(), expected) {
  339. t.Errorf("Expected %v but got %v", expected, na.Mask())
  340. }
  341. }
  342. func TestLessThanDoesTheObvious(t *testing.T) {
  343. na1, _ := IP("192.0.2.0/24")
  344. na2, _ := IP("192.0.2.0/25")
  345. if LessThan(na1, na2) {
  346. t.Errorf("Expected %s >= %s", na1, na2)
  347. }
  348. if !LessThan(na2, na1) {
  349. t.Errorf("Expected %s < %s", na2, na1)
  350. }
  351. na3, _ := IP("192.0.2.0/24")
  352. na4, _ := IP("198.51.100.0/24")
  353. if !LessThan(na3, na4) {
  354. t.Errorf("Expected %s < %s", na3, na4)
  355. }
  356. }
  357. func TestLessThanSortsIntegersInOrder(t *testing.T) {
  358. cnt := 257
  359. prefixes := make([]*NetAddr, 0, cnt)
  360. for i := 0; i < cnt; i++ {
  361. o2 := i & 255
  362. o1 := (i - o2) >> 8
  363. na := &NetAddr{
  364. Address: []byte{byte(o1), byte(o2)},
  365. Length: byte(16),
  366. }
  367. prefixes = append(prefixes, na)
  368. }
  369. sort.Slice(prefixes, func(i, j int) bool {
  370. return LessThan(prefixes[i], prefixes[j])
  371. })
  372. for i, p := range prefixes {
  373. o2 := i & 255
  374. o1 := (i - o2) >> 8
  375. na := &NetAddr{
  376. Address: []byte{byte(o1), byte(o2)},
  377. Length: byte(16),
  378. }
  379. dec := int(p.Address[0])<<8 + int(p.Address[1])
  380. if i != dec {
  381. t.Errorf("Expected %d (%s) == %d (%s)", i, na, dec, p)
  382. }
  383. }
  384. }
  385. func TestOverlapsDoesTheObvious(t *testing.T) {
  386. na1, _ := IP("192.0.2.0/24")
  387. na2, _ := IP("192.0.2.0/25")
  388. if !Overlaps(na1, na2) {
  389. t.Errorf("Expected %s to overlap %s", na1, na2)
  390. }
  391. if !Overlaps(na2, na1) {
  392. t.Errorf("Expected %s to overlap %s", na2, na1)
  393. }
  394. na3, _ := IP("192.0.2.128/25")
  395. if Overlaps(na2, na3) {
  396. t.Errorf("Expected %s to not overlap %s", na2, na3)
  397. }
  398. if Overlaps(na3, na2) {
  399. t.Errorf("Expected %s to not overlap %s", na3, na2)
  400. }
  401. }