driverapi_test.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package driverapi
  2. import (
  3. "encoding/json"
  4. "net"
  5. "testing"
  6. "github.com/docker/docker/libnetwork/types"
  7. )
  8. func TestIPDataMarshalling(t *testing.T) {
  9. i := &IPAMData{
  10. AddressSpace: "giallo",
  11. Pool: &net.IPNet{IP: net.IP{10, 10, 10, 8}, Mask: net.IPMask{255, 255, 255, 0}},
  12. Gateway: &net.IPNet{IP: net.IP{10, 10, 10, 254}, Mask: net.IPMask{255, 255, 255, 0}},
  13. AuxAddresses: map[string]*net.IPNet{
  14. "ip1": {IP: net.IP{10, 10, 10, 1}, Mask: net.IPMask{255, 255, 255, 0}},
  15. "ip2": {IP: net.IP{10, 10, 10, 2}, Mask: net.IPMask{255, 255, 255, 0}},
  16. },
  17. }
  18. b, err := json.Marshal(i)
  19. if err != nil {
  20. t.Fatal(err)
  21. }
  22. ii := &IPAMData{}
  23. err = json.Unmarshal(b, &ii)
  24. if err != nil {
  25. t.Fatal(err)
  26. }
  27. if i.AddressSpace != ii.AddressSpace || !types.CompareIPNet(i.Pool, ii.Pool) ||
  28. !types.CompareIPNet(i.Gateway, ii.Gateway) ||
  29. !compareAddresses(i.AuxAddresses, ii.AuxAddresses) {
  30. t.Fatalf("JSON marsh/unmarsh failed.\nOriginal:\n%s\nDecoded:\n%s", i, ii)
  31. }
  32. }
  33. func compareAddresses(a, b map[string]*net.IPNet) bool {
  34. if len(a) != len(b) {
  35. return false
  36. }
  37. if len(a) > 0 {
  38. for k := range a {
  39. if !types.CompareIPNet(a[k], b[k]) {
  40. return false
  41. }
  42. }
  43. }
  44. return true
  45. }
  46. func TestValidateAndIsV6(t *testing.T) {
  47. var err error
  48. i := &IPAMData{
  49. Pool: &net.IPNet{IP: net.IP{10, 10, 10, 8}, Mask: net.IPMask{255, 255, 255, 0}},
  50. Gateway: &net.IPNet{IP: net.IP{10, 10, 10, 254}, Mask: net.IPMask{255, 255, 255, 0}},
  51. AuxAddresses: map[string]*net.IPNet{
  52. "ip1": {IP: net.IP{10, 10, 10, 1}, Mask: net.IPMask{255, 255, 255, 0}},
  53. "ip2": {IP: net.IP{10, 10, 10, 2}, Mask: net.IPMask{255, 255, 255, 0}},
  54. },
  55. }
  56. // Check ip version
  57. if i.IsV6() {
  58. t.Fatal("incorrect ip version returned")
  59. }
  60. orig := i.Pool
  61. if i.Pool, err = types.ParseCIDR("2001:db8::33/64"); err != nil {
  62. t.Fatal(err)
  63. }
  64. if !i.IsV6() {
  65. t.Fatal("incorrect ip version returned")
  66. }
  67. i.Pool = orig
  68. // valid ip data
  69. if err = i.Validate(); err != nil {
  70. t.Fatal(err)
  71. }
  72. // incongruent gw ver
  73. if i.Gateway, err = types.ParseCIDR("2001:db8::45/65"); err != nil {
  74. t.Fatal(err)
  75. }
  76. if err = i.Validate(); err == nil {
  77. t.Fatal("expected error but succeeded")
  78. }
  79. i.Gateway = nil
  80. // incongruent secondary ip ver
  81. if i.AuxAddresses["ip2"], err = types.ParseCIDR("2001:db8::44/80"); err != nil {
  82. t.Fatal(err)
  83. }
  84. if err = i.Validate(); err == nil {
  85. t.Fatal("expected error but succeeded")
  86. }
  87. delete(i.AuxAddresses, "ip2")
  88. // gw outside pool
  89. if i.Gateway, err = types.ParseCIDR("10.10.15.254/24"); err != nil {
  90. t.Fatal(err)
  91. }
  92. if err = i.Validate(); err == nil {
  93. t.Fatal("expected error but succeeded")
  94. }
  95. i.Gateway = nil
  96. // sec ip outside of pool
  97. if i.AuxAddresses["ip1"], err = types.ParseCIDR("10.10.2.1/24"); err != nil {
  98. t.Fatal(err)
  99. }
  100. if err = i.Validate(); err == nil {
  101. t.Fatal("expected error but succeeded")
  102. }
  103. }