github.com/pwn-term/docker@v0.0.0-20210616085119-6e977cce2565/libnetwork/driverapi/driverapi_test.go (about)

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