| package driverapi |
| |
| import ( |
| "encoding/json" |
| "net" |
| "testing" |
| |
| "github.com/docker/docker/libnetwork/types" |
| ) |
| |
| func TestIPDataMarshalling(t *testing.T) { |
| i := &IPAMData{ |
| AddressSpace: "giallo", |
| Pool: &net.IPNet{IP: net.IP{10, 10, 10, 8}, Mask: net.IPMask{255, 255, 255, 0}}, |
| Gateway: &net.IPNet{IP: net.IP{10, 10, 10, 254}, Mask: net.IPMask{255, 255, 255, 0}}, |
| AuxAddresses: map[string]*net.IPNet{ |
| "ip1": {IP: net.IP{10, 10, 10, 1}, Mask: net.IPMask{255, 255, 255, 0}}, |
| "ip2": {IP: net.IP{10, 10, 10, 2}, Mask: net.IPMask{255, 255, 255, 0}}, |
| }, |
| } |
| |
| b, err := json.Marshal(i) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| ii := &IPAMData{} |
| err = json.Unmarshal(b, &ii) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| if i.AddressSpace != ii.AddressSpace || !types.CompareIPNet(i.Pool, ii.Pool) || |
| !types.CompareIPNet(i.Gateway, ii.Gateway) || |
| !compareAddresses(i.AuxAddresses, ii.AuxAddresses) { |
| t.Fatalf("JSON marsh/unmarsh failed.\nOriginal:\n%s\nDecoded:\n%s", i, ii) |
| } |
| } |
| |
| func compareAddresses(a, b map[string]*net.IPNet) bool { |
| if len(a) != len(b) { |
| return false |
| } |
| if len(a) > 0 { |
| for k := range a { |
| if !types.CompareIPNet(a[k], b[k]) { |
| return false |
| } |
| } |
| } |
| return true |
| } |
| |
| func TestValidateAndIsV6(t *testing.T) { |
| var err error |
| |
| i := &IPAMData{ |
| Pool: &net.IPNet{IP: net.IP{10, 10, 10, 8}, Mask: net.IPMask{255, 255, 255, 0}}, |
| Gateway: &net.IPNet{IP: net.IP{10, 10, 10, 254}, Mask: net.IPMask{255, 255, 255, 0}}, |
| AuxAddresses: map[string]*net.IPNet{ |
| "ip1": {IP: net.IP{10, 10, 10, 1}, Mask: net.IPMask{255, 255, 255, 0}}, |
| "ip2": {IP: net.IP{10, 10, 10, 2}, Mask: net.IPMask{255, 255, 255, 0}}, |
| }, |
| } |
| |
| // Check ip version |
| if i.IsV6() { |
| t.Fatal("incorrect ip version returned") |
| } |
| orig := i.Pool |
| if i.Pool, err = types.ParseCIDR("2001:db8::33/64"); err != nil { |
| t.Fatal(err) |
| } |
| if !i.IsV6() { |
| t.Fatal("incorrect ip version returned") |
| } |
| i.Pool = orig |
| |
| // valid ip data |
| if err = i.Validate(); err != nil { |
| t.Fatal(err) |
| } |
| |
| // incongruent gw ver |
| if i.Gateway, err = types.ParseCIDR("2001:db8::45/65"); err != nil { |
| t.Fatal(err) |
| } |
| if err = i.Validate(); err == nil { |
| t.Fatal("expected error but succeeded") |
| } |
| i.Gateway = nil |
| |
| // incongruent secondary ip ver |
| if i.AuxAddresses["ip2"], err = types.ParseCIDR("2001:db8::44/80"); err != nil { |
| t.Fatal(err) |
| } |
| if err = i.Validate(); err == nil { |
| t.Fatal("expected error but succeeded") |
| } |
| delete(i.AuxAddresses, "ip2") |
| |
| // gw outside pool |
| if i.Gateway, err = types.ParseCIDR("10.10.15.254/24"); err != nil { |
| t.Fatal(err) |
| } |
| if err = i.Validate(); err == nil { |
| t.Fatal("expected error but succeeded") |
| } |
| i.Gateway = nil |
| |
| // sec ip outside of pool |
| if i.AuxAddresses["ip1"], err = types.ParseCIDR("10.10.2.1/24"); err != nil { |
| t.Fatal(err) |
| } |
| if err = i.Validate(); err == nil { |
| t.Fatal("expected error but succeeded") |
| } |
| } |