ipcalc_test.go 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // Copyright 2018-present the CoreDHCP Authors. All rights reserved
  2. // This source code is licensed under the MIT license found in the
  3. // LICENSE file in the root directory of this source tree.
  4. package allocators
  5. import (
  6. "fmt"
  7. "net"
  8. "testing"
  9. "math/rand"
  10. )
  11. func ExampleOffset() {
  12. fmt.Println(Offset(net.ParseIP("2001:db8:0:aabb::"), net.ParseIP("2001:db8:ff::34"), 0))
  13. fmt.Println(Offset(net.ParseIP("2001:db8:0:aabb::"), net.ParseIP("2001:db8:ff::34"), 16))
  14. fmt.Println(Offset(net.ParseIP("2001:db8:0:aabb::"), net.ParseIP("2001:db8:ff::34"), 32))
  15. fmt.Println(Offset(net.ParseIP("2001:db8:0:aabb::"), net.ParseIP("2001:db8:ff::34"), 48))
  16. fmt.Println(Offset(net.ParseIP("2001:db8:0:aabb::"), net.ParseIP("2001:db8:ff::34"), 64))
  17. fmt.Println(Offset(net.ParseIP("2001:db8:0:aabb::"), net.ParseIP("2001:db8:ff::34"), 73))
  18. fmt.Println(Offset(net.ParseIP("2001:db8:0:aabb::"), net.ParseIP("2001:db8:ff::34"), 80))
  19. fmt.Println(Offset(net.ParseIP("2001:db8:0:aabb::"), net.ParseIP("2001:db8:ff::34"), 96))
  20. fmt.Println(Offset(net.ParseIP("2001:db8:0:aabb::"), net.ParseIP("2001:db8:ff::34"), 112))
  21. fmt.Println(Offset(net.ParseIP("2001:db8:0:aabb::"), net.ParseIP("2001:db8:ff::34"), 128))
  22. // Output:
  23. // 0 <nil>
  24. // 0 <nil>
  25. // 0 <nil>
  26. // 254 <nil>
  27. // 16667973 <nil>
  28. // 8534002176 <nil>
  29. // 1092352278528 <nil>
  30. // 71588398925611008 <nil>
  31. // 0 Operation overflows
  32. // 0 Operation overflows
  33. }
  34. func ExampleAddPrefixes() {
  35. fmt.Println(AddPrefixes(net.ParseIP("2001:db8::"), 0xff, 64))
  36. fmt.Println(AddPrefixes(net.ParseIP("2001:db8::"), 0x1, 128))
  37. fmt.Println(AddPrefixes(net.ParseIP("2001:db8::"), 0xff, 32))
  38. fmt.Println(AddPrefixes(net.ParseIP("2001:db8::"), 0x1, 16))
  39. fmt.Println(AddPrefixes(net.ParseIP("2001:db8::"), 0xff, 65))
  40. // Error cases
  41. fmt.Println(AddPrefixes(net.ParseIP("2001:db8::"), 0xff, 8))
  42. fmt.Println(AddPrefixes(net.IP{10, 0, 0, 1}, 64, 32))
  43. // Output:
  44. // 2001:db8:0:ff:: <nil>
  45. // 2001:db8::1 <nil>
  46. // 2001:eb7:: <nil>
  47. // 2002:db8:: <nil>
  48. // 2001:db8:0:7f:8000:: <nil>
  49. // <nil> Operation overflows
  50. // <nil> AddPrefixes needs 128-bit IPs
  51. }
  52. // Offset is used as a hash function, so it needs to be reasonably fast
  53. func BenchmarkOffset(b *testing.B) {
  54. // Need predictable randomness for benchmark reproducibility
  55. rng := rand.New(rand.NewSource(0))
  56. addresses := make([]byte, b.N*net.IPv6len*2)
  57. _, err := rng.Read(addresses)
  58. if err != nil {
  59. b.Fatalf("Could not generate random addresses: %v", err)
  60. }
  61. b.ResetTimer()
  62. for i := 0; i < b.N; i++ {
  63. // The arrays will be in cache, so this should amortize to measure mostly just the offset
  64. // computation itself
  65. _, _ = Offset(
  66. addresses[i*2*net.IPv6len:(i*2+1)*net.IPv6len],
  67. addresses[(i*2+1)*net.IPv6len:(i+1)*2*net.IPv6len],
  68. (i*4)%128,
  69. )
  70. }
  71. }