ip_slice_test.go 5.7 KB

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