...

Source file src/github.com/spf13/pflag/ip_slice_test.go

Documentation: github.com/spf13/pflag

     1  package pflag
     2  
     3  import (
     4  	"fmt"
     5  	"net"
     6  	"strings"
     7  	"testing"
     8  )
     9  
    10  func setUpIPSFlagSet(ipsp *[]net.IP) *FlagSet {
    11  	f := NewFlagSet("test", ContinueOnError)
    12  	f.IPSliceVar(ipsp, "ips", []net.IP{}, "Command separated list!")
    13  	return f
    14  }
    15  
    16  func setUpIPSFlagSetWithDefault(ipsp *[]net.IP) *FlagSet {
    17  	f := NewFlagSet("test", ContinueOnError)
    18  	f.IPSliceVar(ipsp, "ips",
    19  		[]net.IP{
    20  			net.ParseIP("192.168.1.1"),
    21  			net.ParseIP("0:0:0:0:0:0:0:1"),
    22  		},
    23  		"Command separated list!")
    24  	return f
    25  }
    26  
    27  func TestEmptyIP(t *testing.T) {
    28  	var ips []net.IP
    29  	f := setUpIPSFlagSet(&ips)
    30  	err := f.Parse([]string{})
    31  	if err != nil {
    32  		t.Fatal("expected no error; got", err)
    33  	}
    34  
    35  	getIPS, err := f.GetIPSlice("ips")
    36  	if err != nil {
    37  		t.Fatal("got an error from GetIPSlice():", err)
    38  	}
    39  	if len(getIPS) != 0 {
    40  		t.Fatalf("got ips %v with len=%d but expected length=0", getIPS, len(getIPS))
    41  	}
    42  }
    43  
    44  func TestIPS(t *testing.T) {
    45  	var ips []net.IP
    46  	f := setUpIPSFlagSet(&ips)
    47  
    48  	vals := []string{"192.168.1.1", "10.0.0.1", "0:0:0:0:0:0:0:2"}
    49  	arg := fmt.Sprintf("--ips=%s", strings.Join(vals, ","))
    50  	err := f.Parse([]string{arg})
    51  	if err != nil {
    52  		t.Fatal("expected no error; got", err)
    53  	}
    54  	for i, v := range ips {
    55  		if ip := net.ParseIP(vals[i]); ip == nil {
    56  			t.Fatalf("invalid string being converted to IP address: %s", vals[i])
    57  		} else if !ip.Equal(v) {
    58  			t.Fatalf("expected ips[%d] to be %s but got: %s from GetIPSlice", i, vals[i], v)
    59  		}
    60  	}
    61  }
    62  
    63  func TestIPSDefault(t *testing.T) {
    64  	var ips []net.IP
    65  	f := setUpIPSFlagSetWithDefault(&ips)
    66  
    67  	vals := []string{"192.168.1.1", "0:0:0:0:0:0:0:1"}
    68  	err := f.Parse([]string{})
    69  	if err != nil {
    70  		t.Fatal("expected no error; got", err)
    71  	}
    72  	for i, v := range ips {
    73  		if ip := net.ParseIP(vals[i]); ip == nil {
    74  			t.Fatalf("invalid string being converted to IP address: %s", vals[i])
    75  		} else if !ip.Equal(v) {
    76  			t.Fatalf("expected ips[%d] to be %s but got: %s", i, vals[i], v)
    77  		}
    78  	}
    79  
    80  	getIPS, err := f.GetIPSlice("ips")
    81  	if err != nil {
    82  		t.Fatal("got an error from GetIPSlice")
    83  	}
    84  	for i, v := range getIPS {
    85  		if ip := net.ParseIP(vals[i]); ip == nil {
    86  			t.Fatalf("invalid string being converted to IP address: %s", vals[i])
    87  		} else if !ip.Equal(v) {
    88  			t.Fatalf("expected ips[%d] to be %s but got: %s", i, vals[i], v)
    89  		}
    90  	}
    91  }
    92  
    93  func TestIPSWithDefault(t *testing.T) {
    94  	var ips []net.IP
    95  	f := setUpIPSFlagSetWithDefault(&ips)
    96  
    97  	vals := []string{"192.168.1.1", "0:0:0:0:0:0:0:1"}
    98  	arg := fmt.Sprintf("--ips=%s", strings.Join(vals, ","))
    99  	err := f.Parse([]string{arg})
   100  	if err != nil {
   101  		t.Fatal("expected no error; got", err)
   102  	}
   103  	for i, v := range ips {
   104  		if ip := net.ParseIP(vals[i]); ip == nil {
   105  			t.Fatalf("invalid string being converted to IP address: %s", vals[i])
   106  		} else if !ip.Equal(v) {
   107  			t.Fatalf("expected ips[%d] to be %s but got: %s", i, vals[i], v)
   108  		}
   109  	}
   110  
   111  	getIPS, err := f.GetIPSlice("ips")
   112  	if err != nil {
   113  		t.Fatal("got an error from GetIPSlice")
   114  	}
   115  	for i, v := range getIPS {
   116  		if ip := net.ParseIP(vals[i]); ip == nil {
   117  			t.Fatalf("invalid string being converted to IP address: %s", vals[i])
   118  		} else if !ip.Equal(v) {
   119  			t.Fatalf("expected ips[%d] to be %s but got: %s", i, vals[i], v)
   120  		}
   121  	}
   122  }
   123  
   124  func TestIPSCalledTwice(t *testing.T) {
   125  	var ips []net.IP
   126  	f := setUpIPSFlagSet(&ips)
   127  
   128  	in := []string{"192.168.1.2,0:0:0:0:0:0:0:1", "10.0.0.1"}
   129  	expected := []net.IP{net.ParseIP("192.168.1.2"), net.ParseIP("0:0:0:0:0:0:0:1"), net.ParseIP("10.0.0.1")}
   130  	argfmt := "ips=%s"
   131  	arg1 := fmt.Sprintf(argfmt, in[0])
   132  	arg2 := fmt.Sprintf(argfmt, in[1])
   133  	err := f.Parse([]string{arg1, arg2})
   134  	if err != nil {
   135  		t.Fatal("expected no error; got", err)
   136  	}
   137  	for i, v := range ips {
   138  		if !expected[i].Equal(v) {
   139  			t.Fatalf("expected ips[%d] to be %s but got: %s", i, expected[i], v)
   140  		}
   141  	}
   142  }
   143  
   144  func TestIPSAsSliceValue(t *testing.T) {
   145  	var ips []net.IP
   146  	f := setUpIPSFlagSet(&ips)
   147  
   148  	in := []string{"192.168.1.1", "0:0:0:0:0:0:0:1"}
   149  	argfmt := "--ips=%s"
   150  	arg1 := fmt.Sprintf(argfmt, in[0])
   151  	arg2 := fmt.Sprintf(argfmt, in[1])
   152  	err := f.Parse([]string{arg1, arg2})
   153  	if err != nil {
   154  		t.Fatal("expected no error; got", err)
   155  	}
   156  
   157  	f.VisitAll(func(f *Flag) {
   158  		if val, ok := f.Value.(SliceValue); ok {
   159  			_ = val.Replace([]string{"192.168.1.2"})
   160  		}
   161  	})
   162  	if len(ips) != 1 || !ips[0].Equal(net.ParseIP("192.168.1.2")) {
   163  		t.Fatalf("Expected ss to be overwritten with '192.168.1.2', but got: %v", ips)
   164  	}
   165  }
   166  
   167  func TestIPSBadQuoting(t *testing.T) {
   168  
   169  	tests := []struct {
   170  		Want    []net.IP
   171  		FlagArg []string
   172  	}{
   173  		{
   174  			Want: []net.IP{
   175  				net.ParseIP("a4ab:61d:f03e:5d7d:fad7:d4c2:a1a5:568"),
   176  				net.ParseIP("203.107.49.208"),
   177  				net.ParseIP("14.57.204.90"),
   178  			},
   179  			FlagArg: []string{
   180  				"a4ab:61d:f03e:5d7d:fad7:d4c2:a1a5:568",
   181  				"203.107.49.208",
   182  				"14.57.204.90",
   183  			},
   184  		},
   185  		{
   186  			Want: []net.IP{
   187  				net.ParseIP("204.228.73.195"),
   188  				net.ParseIP("86.141.15.94"),
   189  			},
   190  			FlagArg: []string{
   191  				"204.228.73.195",
   192  				"86.141.15.94",
   193  			},
   194  		},
   195  		{
   196  			Want: []net.IP{
   197  				net.ParseIP("c70c:db36:3001:890f:c6ea:3f9b:7a39:cc3f"),
   198  				net.ParseIP("4d17:1d6e:e699:bd7a:88c5:5e7e:ac6a:4472"),
   199  			},
   200  			FlagArg: []string{
   201  				"c70c:db36:3001:890f:c6ea:3f9b:7a39:cc3f",
   202  				"4d17:1d6e:e699:bd7a:88c5:5e7e:ac6a:4472",
   203  			},
   204  		},
   205  		{
   206  			Want: []net.IP{
   207  				net.ParseIP("5170:f971:cfac:7be3:512a:af37:952c:bc33"),
   208  				net.ParseIP("93.21.145.140"),
   209  				net.ParseIP("2cac:61d3:c5ff:6caf:73e0:1b1a:c336:c1ca"),
   210  			},
   211  			FlagArg: []string{
   212  				" 5170:f971:cfac:7be3:512a:af37:952c:bc33  , 93.21.145.140     ",
   213  				"2cac:61d3:c5ff:6caf:73e0:1b1a:c336:c1ca",
   214  			},
   215  		},
   216  		{
   217  			Want: []net.IP{
   218  				net.ParseIP("2e5e:66b2:6441:848:5b74:76ea:574c:3a7b"),
   219  				net.ParseIP("2e5e:66b2:6441:848:5b74:76ea:574c:3a7b"),
   220  				net.ParseIP("2e5e:66b2:6441:848:5b74:76ea:574c:3a7b"),
   221  				net.ParseIP("2e5e:66b2:6441:848:5b74:76ea:574c:3a7b"),
   222  			},
   223  			FlagArg: []string{
   224  				`"2e5e:66b2:6441:848:5b74:76ea:574c:3a7b,        2e5e:66b2:6441:848:5b74:76ea:574c:3a7b,2e5e:66b2:6441:848:5b74:76ea:574c:3a7b     "`,
   225  				" 2e5e:66b2:6441:848:5b74:76ea:574c:3a7b"},
   226  		},
   227  	}
   228  
   229  	for i, test := range tests {
   230  
   231  		var ips []net.IP
   232  		f := setUpIPSFlagSet(&ips)
   233  
   234  		if err := f.Parse([]string{fmt.Sprintf("--ips=%s", strings.Join(test.FlagArg, ","))}); err != nil {
   235  			t.Fatalf("flag parsing failed with error: %s\nparsing:\t%#v\nwant:\t\t%s",
   236  				err, test.FlagArg, test.Want[i])
   237  		}
   238  
   239  		for j, b := range ips {
   240  			if !b.Equal(test.Want[j]) {
   241  				t.Fatalf("bad value parsed for test %d on net.IP %d:\nwant:\t%s\ngot:\t%s", i, j, test.Want[j], b)
   242  			}
   243  		}
   244  	}
   245  }
   246  

View as plain text