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