github.com/rumpl/bof@v23.0.0-rc.2+incompatible/libnetwork/driverapi/driverapi_test.go (about)

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