blob: fd3ac190a7421d76228531e3ffaea2e1785c8650 [file] [log] [blame]
Jiri Simsad7616c92015-03-24 23:44:30 -07001// Copyright 2015 The Vanadium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
Cosmos Nicolaoubdc917c2014-10-24 12:41:47 -07005package flags_test
6
7import (
8 "flag"
Cosmos Nicolaou4e213d72014-10-26 22:21:52 -07009 "io/ioutil"
Cosmos Nicolaoud811b072014-10-28 17:46:27 -070010 "os"
11 "reflect"
Cosmos Nicolaoubdc917c2014-10-24 12:41:47 -070012 "testing"
13
Todd Wang8123b5e2015-05-14 18:44:43 -070014 "v.io/x/ref"
Jiri Simsaffceefa2015-02-28 11:03:34 -080015 "v.io/x/ref/lib/flags"
Cosmos Nicolaoubdc917c2014-10-24 12:41:47 -070016)
17
18func TestFlags(t *testing.T) {
Cosmos Nicolaoue5b41502014-10-29 22:55:09 -070019 fs := flag.NewFlagSet("test", flag.ContinueOnError)
20 if flags.CreateAndRegister(fs) != nil {
Cosmos Nicolaou78237372014-11-04 18:19:09 -080021 t.Fatalf("should have returned a nil value")
Cosmos Nicolaoue5b41502014-10-29 22:55:09 -070022 }
23 fl := flags.CreateAndRegister(fs, flags.Runtime)
24 if fl == nil {
Bogdan Capritabf356d72015-01-08 17:28:48 -080025 t.Errorf("should have succeeded")
Cosmos Nicolaoue5b41502014-10-29 22:55:09 -070026 }
Cosmos Nicolaoud811b072014-10-28 17:46:27 -070027 creds := "creddir"
28 roots := []string{"ab:cd:ef"}
Asim Shankarf32d24d2015-04-01 16:34:26 -070029 args := []string{"--v23.credentials=" + creds, "--v23.namespace.root=" + roots[0]}
Bogdan Capritabf356d72015-01-08 17:28:48 -080030 fl.Parse(args, nil)
Cosmos Nicolaoue5b41502014-10-29 22:55:09 -070031 rtf := fl.RuntimeFlags()
32 if got, want := rtf.NamespaceRoots, roots; !reflect.DeepEqual(got, want) {
Cosmos Nicolaoud811b072014-10-28 17:46:27 -070033 t.Errorf("got %v, want %v", got, want)
Cosmos Nicolaoubdc917c2014-10-24 12:41:47 -070034 }
Cosmos Nicolaoue5b41502014-10-29 22:55:09 -070035 if got, want := rtf.Credentials, creds; !reflect.DeepEqual(got, want) {
Cosmos Nicolaoud811b072014-10-28 17:46:27 -070036 t.Errorf("got %v, want %v", got, want)
Cosmos Nicolaoubdc917c2014-10-24 12:41:47 -070037 }
Cosmos Nicolaoud811b072014-10-28 17:46:27 -070038 if got, want := fl.HasGroup(flags.Listen), false; got != want {
39 t.Errorf("got %t, want %t", got, want)
40 }
41 // Make sure we have a deep copy.
Cosmos Nicolaoue5b41502014-10-29 22:55:09 -070042 rtf.NamespaceRoots[0] = "oooh"
43 rtf = fl.RuntimeFlags()
44 if got, want := rtf.NamespaceRoots, roots; !reflect.DeepEqual(got, want) {
Cosmos Nicolaoud811b072014-10-28 17:46:27 -070045 t.Errorf("got %v, want %v", got, want)
Cosmos Nicolaou4e213d72014-10-26 22:21:52 -070046 }
47}
48
Adam Sadovskya4d4a692015-04-20 11:36:49 -070049func TestPermissionsFlags(t *testing.T) {
Cosmos Nicolaou78237372014-11-04 18:19:09 -080050 fs := flag.NewFlagSet("test", flag.ContinueOnError)
Adam Sadovskya4d4a692015-04-20 11:36:49 -070051 fl := flags.CreateAndRegister(fs, flags.Runtime, flags.Permissions)
Asim Shankarf32d24d2015-04-01 16:34:26 -070052 args := []string{"--v23.permissions.file=runtime:foo.json", "--v23.permissions.file=bar:bar.json", "--v23.permissions.file=baz:bar:baz.json"}
Bogdan Capritabf356d72015-01-08 17:28:48 -080053 fl.Parse(args, nil)
Adam Sadovskya4d4a692015-04-20 11:36:49 -070054 permsf := fl.PermissionsFlags()
Robert Kroeger5096c4b2014-12-10 15:08:45 -080055
Adam Sadovskya4d4a692015-04-20 11:36:49 -070056 if got, want := permsf.PermissionsFile("runtime"), "foo.json"; got != want {
Asim Shankara036a0f2015-05-08 11:22:54 -070057 t.Errorf("got %q, want %q", got, want)
Cosmos Nicolaou78237372014-11-04 18:19:09 -080058 }
Adam Sadovskya4d4a692015-04-20 11:36:49 -070059 if got, want := permsf.PermissionsFile("bar"), "bar.json"; got != want {
Asim Shankara036a0f2015-05-08 11:22:54 -070060 t.Errorf("got %q, want %q", got, want)
Cosmos Nicolaou78237372014-11-04 18:19:09 -080061 }
Adam Sadovskya4d4a692015-04-20 11:36:49 -070062 if got, want := permsf.PermissionsFile("wombat"), ""; got != want {
Asim Shankara036a0f2015-05-08 11:22:54 -070063 t.Errorf("got %q, want %q", got, want)
Cosmos Nicolaou78237372014-11-04 18:19:09 -080064 }
Adam Sadovskya4d4a692015-04-20 11:36:49 -070065 if got, want := permsf.PermissionsFile("baz"), "bar:baz.json"; got != want {
Asim Shankara036a0f2015-05-08 11:22:54 -070066 t.Errorf("got %q, want %q", got, want)
Cosmos Nicolaou78237372014-11-04 18:19:09 -080067 }
68}
69
Adam Sadovskya4d4a692015-04-20 11:36:49 -070070func TestPermissionsLiteralFlags(t *testing.T) {
Robert Kroeger5096c4b2014-12-10 15:08:45 -080071 fs := flag.NewFlagSet("test", flag.ContinueOnError)
Adam Sadovskya4d4a692015-04-20 11:36:49 -070072 fl := flags.CreateAndRegister(fs, flags.Runtime, flags.Permissions)
Asim Shankarf32d24d2015-04-01 16:34:26 -070073 args := []string{"--v23.permissions.literal=hedgehog"}
Bogdan Capritabf356d72015-01-08 17:28:48 -080074 fl.Parse(args, nil)
Adam Sadovskya4d4a692015-04-20 11:36:49 -070075 permsf := fl.PermissionsFlags()
Robert Kroeger5096c4b2014-12-10 15:08:45 -080076
Adam Sadovskya4d4a692015-04-20 11:36:49 -070077 if got, want := permsf.PermissionsFile("runtime"), ""; got != want {
Asim Shankara036a0f2015-05-08 11:22:54 -070078 t.Errorf("got %q, want %q", got, want)
Robert Kroeger5096c4b2014-12-10 15:08:45 -080079 }
Adam Sadovskya4d4a692015-04-20 11:36:49 -070080 if got, want := permsf.PermissionsLiteral(), "hedgehog"; got != want {
Asim Shankara036a0f2015-05-08 11:22:54 -070081 t.Errorf("got %q, want %q", got, want)
Robert Kroeger5096c4b2014-12-10 15:08:45 -080082 }
83}
84
Adam Sadovskya4d4a692015-04-20 11:36:49 -070085func TestPermissionsLiteralBoth(t *testing.T) {
Robert Kroeger5096c4b2014-12-10 15:08:45 -080086 fs := flag.NewFlagSet("test", flag.ContinueOnError)
Adam Sadovskya4d4a692015-04-20 11:36:49 -070087 fl := flags.CreateAndRegister(fs, flags.Runtime, flags.Permissions)
Asim Shankarf32d24d2015-04-01 16:34:26 -070088 args := []string{"--v23.permissions.file=runtime:foo.json", "--v23.permissions.literal=hedgehog"}
Bogdan Capritabf356d72015-01-08 17:28:48 -080089 fl.Parse(args, nil)
Adam Sadovskya4d4a692015-04-20 11:36:49 -070090 permsf := fl.PermissionsFlags()
Robert Kroeger5096c4b2014-12-10 15:08:45 -080091
Adam Sadovskya4d4a692015-04-20 11:36:49 -070092 if got, want := permsf.PermissionsFile("runtime"), "foo.json"; got != want {
Asim Shankara036a0f2015-05-08 11:22:54 -070093 t.Errorf("got %q, want %q", got, want)
Robert Kroeger5096c4b2014-12-10 15:08:45 -080094 }
Adam Sadovskya4d4a692015-04-20 11:36:49 -070095 if got, want := permsf.PermissionsLiteral(), "hedgehog"; got != want {
Asim Shankara036a0f2015-05-08 11:22:54 -070096 t.Errorf("got %q, want %q", got, want)
Robert Kroeger5096c4b2014-12-10 15:08:45 -080097 }
98}
99
Cosmos Nicolaou4e213d72014-10-26 22:21:52 -0700100func TestFlagError(t *testing.T) {
101 fs := flag.NewFlagSet("test", flag.ContinueOnError)
102 fs.SetOutput(ioutil.Discard)
Cosmos Nicolaoue5b41502014-10-29 22:55:09 -0700103 fl := flags.CreateAndRegister(fs, flags.Runtime)
Cosmos Nicolaou4e213d72014-10-26 22:21:52 -0700104 addr := "192.168.10.1:0"
Asim Shankarf32d24d2015-04-01 16:34:26 -0700105 args := []string{"--xxxv23.tcp.address=" + addr, "not an arg"}
Bogdan Capritabf356d72015-01-08 17:28:48 -0800106 err := fl.Parse(args, nil)
Cosmos Nicolaou4e213d72014-10-26 22:21:52 -0700107 if err == nil {
108 t.Fatalf("expected this to fail!")
109 }
110 if got, want := len(fl.Args()), 1; got != want {
111 t.Errorf("got %d, want %d [args: %v]", got, want, fl.Args())
112 }
Cosmos Nicolaou78237372014-11-04 18:19:09 -0800113
114 fs = flag.NewFlagSet("test", flag.ContinueOnError)
Adam Sadovskya4d4a692015-04-20 11:36:49 -0700115 fl = flags.CreateAndRegister(fs, flags.Permissions)
Asim Shankarf32d24d2015-04-01 16:34:26 -0700116 args = []string{"--v23.permissions.file=noname"}
Bogdan Capritabf356d72015-01-08 17:28:48 -0800117 err = fl.Parse(args, nil)
Cosmos Nicolaou78237372014-11-04 18:19:09 -0800118 if err == nil {
119 t.Fatalf("expected this to fail!")
120 }
Cosmos Nicolaoud811b072014-10-28 17:46:27 -0700121}
122
123func TestFlagsGroups(t *testing.T) {
Cosmos Nicolaoue5b41502014-10-29 22:55:09 -0700124 fl := flags.CreateAndRegister(flag.NewFlagSet("test", flag.ContinueOnError), flags.Runtime, flags.Listen)
Cosmos Nicolaoud811b072014-10-28 17:46:27 -0700125 if got, want := fl.HasGroup(flags.Listen), true; got != want {
126 t.Errorf("got %t, want %t", got, want)
127 }
128 addr := "192.168.10.1:0"
129 roots := []string{"ab:cd:ef"}
Asim Shankarf32d24d2015-04-01 16:34:26 -0700130 args := []string{"--v23.tcp.address=" + addr, "--v23.namespace.root=" + roots[0]}
Bogdan Capritabf356d72015-01-08 17:28:48 -0800131 fl.Parse(args, nil)
Cosmos Nicolaoud811b072014-10-28 17:46:27 -0700132 lf := fl.ListenFlags()
Cosmos Nicolaoue5b41502014-10-29 22:55:09 -0700133 if got, want := fl.RuntimeFlags().NamespaceRoots, roots; !reflect.DeepEqual(got, want) {
Cosmos Nicolaoud811b072014-10-28 17:46:27 -0700134 t.Errorf("got %v, want %v", got, want)
135 }
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -0800136 if got, want := lf.Addrs[0].Address, addr; got != want {
Cosmos Nicolaoud811b072014-10-28 17:46:27 -0700137 t.Errorf("got %q, want %q", got, want)
138 }
139}
140
Asim Shankar95910b62014-10-31 22:02:29 -0700141const (
Todd Wang8123b5e2015-05-14 18:44:43 -0700142 rootEnvVar = ref.EnvNamespacePrefix
143 rootEnvVar0 = ref.EnvNamespacePrefix + "0"
Asim Shankar95910b62014-10-31 22:02:29 -0700144)
Cosmos Nicolaoud811b072014-10-28 17:46:27 -0700145
146func TestEnvVars(t *testing.T) {
Todd Wang8123b5e2015-05-14 18:44:43 -0700147 oldcreds := os.Getenv(ref.EnvCredentials)
148 defer os.Setenv(ref.EnvCredentials, oldcreds)
Cosmos Nicolaoud811b072014-10-28 17:46:27 -0700149
150 oldroot := os.Getenv(rootEnvVar)
151 oldroot0 := os.Getenv(rootEnvVar0)
152 defer os.Setenv(rootEnvVar, oldroot)
153 defer os.Setenv(rootEnvVar0, oldroot0)
154
Todd Wang8123b5e2015-05-14 18:44:43 -0700155 os.Setenv(ref.EnvCredentials, "bar")
Cosmos Nicolaoue5b41502014-10-29 22:55:09 -0700156 fl := flags.CreateAndRegister(flag.NewFlagSet("test", flag.ContinueOnError), flags.Runtime)
Bogdan Capritabf356d72015-01-08 17:28:48 -0800157 if err := fl.Parse([]string{}, nil); err != nil {
Cosmos Nicolaoud811b072014-10-28 17:46:27 -0700158 t.Fatalf("unexpected error: %s", err)
159 }
Cosmos Nicolaoue5b41502014-10-29 22:55:09 -0700160 rtf := fl.RuntimeFlags()
161 if got, want := rtf.Credentials, "bar"; got != want {
Cosmos Nicolaoud811b072014-10-28 17:46:27 -0700162 t.Errorf("got %q, want %q", got, want)
163 }
164
Asim Shankarf32d24d2015-04-01 16:34:26 -0700165 if err := fl.Parse([]string{"--v23.credentials=baz"}, nil); err != nil {
Cosmos Nicolaoud811b072014-10-28 17:46:27 -0700166 t.Fatalf("unexpected error: %s", err)
167 }
Cosmos Nicolaoue5b41502014-10-29 22:55:09 -0700168 rtf = fl.RuntimeFlags()
169 if got, want := rtf.Credentials, "baz"; got != want {
Cosmos Nicolaoud811b072014-10-28 17:46:27 -0700170 t.Errorf("got %q, want %q", got, want)
171 }
172
173 os.Setenv(rootEnvVar, "a:1")
174 os.Setenv(rootEnvVar0, "a:2")
Cosmos Nicolaoue5b41502014-10-29 22:55:09 -0700175 fl = flags.CreateAndRegister(flag.NewFlagSet("test", flag.ContinueOnError), flags.Runtime)
Bogdan Capritabf356d72015-01-08 17:28:48 -0800176 if err := fl.Parse([]string{}, nil); err != nil {
Cosmos Nicolaoud811b072014-10-28 17:46:27 -0700177 t.Fatalf("unexpected error: %s", err)
178 }
Cosmos Nicolaoue5b41502014-10-29 22:55:09 -0700179 rtf = fl.RuntimeFlags()
180 if got, want := rtf.NamespaceRoots, []string{"a:1", "a:2"}; !reflect.DeepEqual(got, want) {
Cosmos Nicolaoud811b072014-10-28 17:46:27 -0700181 t.Errorf("got %q, want %q", got, want)
182 }
Asim Shankarf32d24d2015-04-01 16:34:26 -0700183 if err := fl.Parse([]string{"--v23.namespace.root=b:1", "--v23.namespace.root=b:2", "--v23.namespace.root=b:3", "--v23.credentials=b:4"}, nil); err != nil {
Cosmos Nicolaoud811b072014-10-28 17:46:27 -0700184 t.Fatalf("unexpected error: %s", err)
185 }
Cosmos Nicolaoue5b41502014-10-29 22:55:09 -0700186 rtf = fl.RuntimeFlags()
187 if got, want := rtf.NamespaceRoots, []string{"b:1", "b:2", "b:3"}; !reflect.DeepEqual(got, want) {
Cosmos Nicolaoud811b072014-10-28 17:46:27 -0700188 t.Errorf("got %q, want %q", got, want)
189 }
Cosmos Nicolaoue5b41502014-10-29 22:55:09 -0700190 if got, want := rtf.Credentials, "b:4"; got != want {
191 t.Errorf("got %q, want %q", got, want)
192 }
Cosmos Nicolaoubdc917c2014-10-24 12:41:47 -0700193}
Cosmos Nicolaou98960042014-10-31 00:05:51 -0700194
195func TestDefaults(t *testing.T) {
196 oldroot := os.Getenv(rootEnvVar)
197 oldroot0 := os.Getenv(rootEnvVar0)
198 defer os.Setenv(rootEnvVar, oldroot)
199 defer os.Setenv(rootEnvVar0, oldroot0)
200
201 os.Setenv(rootEnvVar, "")
202 os.Setenv(rootEnvVar0, "")
203
Adam Sadovskya4d4a692015-04-20 11:36:49 -0700204 fl := flags.CreateAndRegister(flag.NewFlagSet("test", flag.ContinueOnError), flags.Runtime, flags.Permissions)
Bogdan Capritabf356d72015-01-08 17:28:48 -0800205 if err := fl.Parse([]string{}, nil); err != nil {
Cosmos Nicolaou98960042014-10-31 00:05:51 -0700206 t.Fatalf("unexpected error: %s", err)
207 }
208 rtf := fl.RuntimeFlags()
Asim Shankar8196c1e2015-04-08 22:42:18 -0700209 if got, want := rtf.NamespaceRoots, []string{"/(dev.v.io/role/vprod/service/mounttabled)@ns.dev.v.io:8101"}; !reflect.DeepEqual(got, want) {
Cosmos Nicolaou98960042014-10-31 00:05:51 -0700210 t.Errorf("got %q, want %q", got, want)
211 }
Adam Sadovskya4d4a692015-04-20 11:36:49 -0700212 permsf := fl.PermissionsFlags()
213 if got, want := permsf.PermissionsFile(""), ""; got != want {
Cosmos Nicolaou78237372014-11-04 18:19:09 -0800214 t.Errorf("got %q, want %q", got, want)
215 }
Cosmos Nicolaou98960042014-10-31 00:05:51 -0700216}
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -0800217
218func TestListenFlags(t *testing.T) {
219 fl := flags.CreateAndRegister(flag.NewFlagSet("test", flag.ContinueOnError), flags.Listen)
Bogdan Capritabf356d72015-01-08 17:28:48 -0800220 if err := fl.Parse([]string{}, nil); err != nil {
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -0800221 t.Fatalf("unexpected error: %s", err)
222 }
223 lf := fl.ListenFlags()
224 if got, want := len(lf.Addrs), 1; got != want {
225 t.Errorf("got %d, want %d", got, want)
226 }
Nicolas LaCasse29d1d3a2015-01-22 10:48:18 -0800227
228 // Test the default protocol and address is "wsh" and ":0".
229 def := struct{ Protocol, Address string }{"wsh", ":0"}
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -0800230 if got, want := lf.Addrs[0], def; !reflect.DeepEqual(got, want) {
231 t.Errorf("got %v, want %v", got, want)
232 }
233
234 fl = flags.CreateAndRegister(flag.NewFlagSet("test", flag.ContinueOnError), flags.Listen)
235 if err := fl.Parse([]string{
Asim Shankarf32d24d2015-04-01 16:34:26 -0700236 "--v23.tcp.address=172.0.0.1:10", // Will default to protocol "wsh".
237 "--v23.tcp.protocol=tcp", "--v23.tcp.address=127.0.0.10:34",
238 "--v23.tcp.protocol=ws4", "--v23.tcp.address=127.0.0.10:44",
239 "--v23.tcp.protocol=tcp6", "--v23.tcp.address=172.0.0.100:100"}, nil); err != nil {
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -0800240 t.Fatalf("unexpected error: %s", err)
241 }
242 lf = fl.ListenFlags()
Nicolas LaCasse29d1d3a2015-01-22 10:48:18 -0800243 if got, want := len(lf.Addrs), 4; got != want {
Cosmos Nicolaou036c30c2015-03-24 10:05:20 -0700244 t.Fatalf("got %d, want %d", got, want)
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -0800245 }
Nicolas LaCasse29d1d3a2015-01-22 10:48:18 -0800246 for i, p := range []string{"wsh", "tcp", "ws4", "tcp6"} {
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -0800247 if got, want := lf.Addrs[i].Protocol, p; got != want {
248 t.Errorf("got %q, want %q", got, want)
249 }
250 }
Nicolas LaCasse29d1d3a2015-01-22 10:48:18 -0800251 for i, p := range []string{"172.0.0.1:10", "127.0.0.10:34", "127.0.0.10:44", "172.0.0.100:100"} {
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -0800252 if got, want := lf.Addrs[i].Address, p; got != want {
253 t.Errorf("got %q, want %q", got, want)
254 }
255 }
256}
Cosmos Nicolaou96fa9172014-12-16 12:57:18 -0800257
258func TestDuplicateFlags(t *testing.T) {
259 fl := flags.CreateAndRegister(flag.NewFlagSet("test", flag.ContinueOnError), flags.Listen)
260 if err := fl.Parse([]string{
Asim Shankarf32d24d2015-04-01 16:34:26 -0700261 "--v23.tcp.address=172.0.0.1:10", "--v23.tcp.address=172.0.0.1:10", "--v23.tcp.address=172.0.0.1:34",
262 "--v23.tcp.protocol=tcp", "--v23.tcp.address=172.0.0.1:10", "--v23.tcp.address=172.0.0.1:10", "--v23.tcp.address=172.0.0.1:34",
263 "--v23.tcp.protocol=ws", "--v23.tcp.address=172.0.0.1:10", "--v23.tcp.address=172.0.0.1:34", "--v23.tcp.address=172.0.0.1:34"}, nil); err != nil {
Cosmos Nicolaou96fa9172014-12-16 12:57:18 -0800264 t.Fatalf("unexpected error: %s", err)
265 }
266 lf := fl.ListenFlags()
Nicolas LaCasse29d1d3a2015-01-22 10:48:18 -0800267 if got, want := len(lf.Addrs), 6; got != want {
Cosmos Nicolaou96fa9172014-12-16 12:57:18 -0800268 t.Errorf("got %d, want %d", got, want)
269 }
270 expected := flags.ListenAddrs{
Nicolas LaCasse29d1d3a2015-01-22 10:48:18 -0800271 {"wsh", "172.0.0.1:10"},
272 {"wsh", "172.0.0.1:34"},
Cosmos Nicolaou96fa9172014-12-16 12:57:18 -0800273 {"tcp", "172.0.0.1:10"},
274 {"tcp", "172.0.0.1:34"},
275 {"ws", "172.0.0.1:10"},
276 {"ws", "172.0.0.1:34"},
277 }
278 if got, want := lf.Addrs, expected; !reflect.DeepEqual(got, want) {
279 t.Fatalf("got %#v, want %#v", got, want)
280 }
281 if err := fl.Parse([]string{
Asim Shankarf32d24d2015-04-01 16:34:26 -0700282 "--v23.tcp.address=172.0.0.1:10", "--v23.tcp.address=172.0.0.1:10", "--v23.tcp.address=172.0.0.1:34",
283 "--v23.tcp.protocol=tcp", "--v23.tcp.address=172.0.0.1:10", "--v23.tcp.address=127.0.0.1:34", "--v23.tcp.address=127.0.0.1:34",
284 "--v23.tcp.protocol=ws", "--v23.tcp.address=172.0.0.1:10", "--v23.tcp.address=127.0.0.1:34", "--v23.tcp.address=127.0.0.1:34"}, nil); err != nil {
Cosmos Nicolaou96fa9172014-12-16 12:57:18 -0800285 t.Fatalf("unexpected error: %s", err)
286 }
Nicolas LaCasse29d1d3a2015-01-22 10:48:18 -0800287 if got, want := len(lf.Addrs), 6; got != want {
Cosmos Nicolaou96fa9172014-12-16 12:57:18 -0800288 t.Errorf("got %d, want %d", got, want)
289 }
290 if got, want := lf.Addrs, expected; !reflect.DeepEqual(got, want) {
291 t.Fatalf("got %#v, want %#v", got, want)
292 }
293
294 fl = flags.CreateAndRegister(flag.NewFlagSet("test", flag.ContinueOnError), flags.Runtime)
295
Asim Shankarf32d24d2015-04-01 16:34:26 -0700296 if err := fl.Parse([]string{"--v23.namespace.root=ab", "--v23.namespace.root=xy", "--v23.namespace.root=ab"}, nil); err != nil {
Cosmos Nicolaou96fa9172014-12-16 12:57:18 -0800297 t.Fatalf("unexpected error: %s", err)
298 }
299
300 rf := fl.RuntimeFlags()
301 if got, want := len(rf.NamespaceRoots), 2; got != want {
302 t.Errorf("got %d, want %d", got, want)
303 }
304 if got, want := rf.NamespaceRoots, []string{"ab", "xy"}; !reflect.DeepEqual(got, want) {
305 t.Fatalf("got %#v, want %#v", got, want)
306 }
307}
Bogdan Capritabf356d72015-01-08 17:28:48 -0800308
309func TestConfig(t *testing.T) {
310 fs := flag.NewFlagSet("test", flag.ContinueOnError)
311 var testFlag1, testFlag2 string
312 fs.StringVar(&testFlag1, "test_flag1", "default1", "")
313 fs.StringVar(&testFlag2, "test_flag2", "default2", "")
314 fl := flags.CreateAndRegister(fs, flags.Runtime)
315 args := []string{
Asim Shankarf32d24d2015-04-01 16:34:26 -0700316 "--v23.namespace.root=argRoot1",
317 "--v23.namespace.root=argRoot2",
318 "--v23.vtrace.cache-size=1234",
Bogdan Capritabf356d72015-01-08 17:28:48 -0800319 }
320 config := map[string]string{
Asim Shankarf32d24d2015-04-01 16:34:26 -0700321 "v23.namespace.root": "configRoot",
322 "v23.credentials": "configCreds",
323 "v23.vtrace.cache-size": "4321",
Bogdan Capritabf356d72015-01-08 17:28:48 -0800324 "test_flag1": "test value",
325 "flag.that.does.not.exist": "some value",
326 }
327 if err := fl.Parse(args, config); err != nil {
328 t.Errorf("Parse(%v, %v) failed: %v", args, config, err)
329 }
330 rtf := fl.RuntimeFlags()
331 if got, want := rtf.NamespaceRoots, []string{"argRoot1", "argRoot2", "configRoot"}; !reflect.DeepEqual(got, want) {
332 t.Errorf("Namespace roots: got %v, want %v", got, want)
333 }
334 if got, want := rtf.Credentials, "configCreds"; got != want {
335 t.Errorf("Credentials: got %v, want %v", got, want)
336 }
337 if got, want := testFlag1, "test value"; got != want {
338 t.Errorf("Test flag 1: got %v, want %v", got, want)
339 }
340 if got, want := testFlag2, "default2"; got != want {
341 t.Errorf("Test flag 2: got %v, want %v", got, want)
342 }
343 if got, want := rtf.Vtrace.CacheSize, 4321; got != want {
344 t.Errorf("Test flag 2: got %v, want %v", got, want)
345 }
346}
Cosmos Nicolaou036c30c2015-03-24 10:05:20 -0700347
348func TestRefreshDefaults(t *testing.T) {
Asim Shankar8196c1e2015-04-08 22:42:18 -0700349 orig := flags.DefaultNamespaceRoot()
350 defer flags.SetDefaultNamespaceRoot(orig)
Cosmos Nicolaou036c30c2015-03-24 10:05:20 -0700351 defer flags.SetDefaultHostPort(":0")
352 defer flags.SetDefaultProtocol("wsh")
353
354 nsRoot := "/127.0.0.1:8101"
355 hostPort := "128.0.0.1:11"
356 fs := flag.NewFlagSet("test", flag.ContinueOnError)
357 fl := flags.CreateAndRegister(fs, flags.Runtime, flags.Listen)
358 // It's possible to set defaults after CreateAndRegister, but before Parse.
359 flags.SetDefaultNamespaceRoot(nsRoot)
360 flags.SetDefaultHostPort(hostPort)
361 flags.SetDefaultProtocol("tcp6")
362 fl.Parse([]string{}, nil)
363 rtf := fl.RuntimeFlags()
364 if got, want := rtf.NamespaceRoots, []string{nsRoot}; !reflect.DeepEqual(got, want) {
365 t.Errorf("got %v, want %v", got, want)
366 }
367 lf := fl.ListenFlags()
368 want := flags.ListenAddrs{struct{ Protocol, Address string }{"tcp6", hostPort}}
369 if got := lf.Addrs; !reflect.DeepEqual(got, want) {
370 t.Errorf("got %v, want %v", got, want)
371 }
372 changed := "/128.1.1.1:1"
373 flags.SetDefaultNamespaceRoot(changed)
374 fl.Parse([]string{}, nil)
375 rtf = fl.RuntimeFlags()
376 if got, want := rtf.NamespaceRoots, []string{changed}; !reflect.DeepEqual(got, want) {
377 t.Errorf("got %v, want %v", got, want)
378 }
379}
380
381func TestRefreshAlreadySetDefaults(t *testing.T) {
Asim Shankar8196c1e2015-04-08 22:42:18 -0700382 orig := flags.DefaultNamespaceRoot()
383 defer flags.SetDefaultNamespaceRoot(orig)
Cosmos Nicolaou036c30c2015-03-24 10:05:20 -0700384 defer flags.SetDefaultHostPort(":0")
385 defer flags.SetDefaultProtocol("wsh")
386
387 fs := flag.NewFlagSet("test", flag.ContinueOnError)
388 fl := flags.CreateAndRegister(fs, flags.Runtime, flags.Listen)
389 nsRoot := "/127.0.1.1:10"
390 hostPort := "127.0.0.1:10"
Asim Shankarf32d24d2015-04-01 16:34:26 -0700391 fl.Parse([]string{"--v23.namespace.root", nsRoot, "--v23.tcp.address", hostPort}, nil)
Cosmos Nicolaou036c30c2015-03-24 10:05:20 -0700392 rtf := fl.RuntimeFlags()
393 if got, want := rtf.NamespaceRoots, []string{nsRoot}; !reflect.DeepEqual(got, want) {
394 t.Errorf("got %v, want %v", got, want)
395 }
396 flags.SetDefaultNamespaceRoot("/128.1.1.1:2")
397 flags.SetDefaultHostPort("128.0.0.1:11")
398 fl.Parse([]string{}, nil)
399 rtf = fl.RuntimeFlags()
400 if got, want := rtf.NamespaceRoots, []string{nsRoot}; !reflect.DeepEqual(got, want) {
401 t.Errorf("got %v, want %v", got, want)
402 }
403 lf := fl.ListenFlags()
404 want := flags.ListenAddrs{struct{ Protocol, Address string }{"wsh", hostPort}}
405 if got := lf.Addrs; !reflect.DeepEqual(got, want) {
406 t.Errorf("got %v, want %v", got, want)
407 }
408}