blob: 065574c86bb45999690fffb1155c83c55cd4db04 [file] [log] [blame]
Robert Kroegerddcace02014-09-29 14:02:08 -07001package main
2
3import (
4 "bytes"
Bogdan Caprita858ec162015-01-21 15:09:22 -08005 "encoding/json"
Robert Kroegerff300892014-11-10 17:59:41 -08006 "fmt"
Robert Kroegerddcace02014-09-29 14:02:08 -07007 "reflect"
8 "strings"
9 "testing"
10
Ankur0003fdc2015-01-22 10:59:41 -080011 tsecurity "v.io/core/veyron/lib/testutil/security"
12
13 "v.io/core/veyron2"
Jiri Simsa764efb72014-12-25 20:57:03 -080014 "v.io/core/veyron2/naming"
Jiri Simsa764efb72014-12-25 20:57:03 -080015 "v.io/core/veyron2/services/mgmt/device"
16 verror "v.io/core/veyron2/verror2"
Robert Kroegerddcace02014-09-29 14:02:08 -070017)
18
Suharsh Sivakumar19fbf992015-01-23 11:02:27 -080019func initTest() (shutdown veyron2.Shutdown) {
20 var err error
21 gctx, shutdown = veyron2.Init()
Ankur0003fdc2015-01-22 10:59:41 -080022 if gctx, err = veyron2.SetPrincipal(gctx, tsecurity.NewPrincipal("test-blessing")); err != nil {
23 panic(err)
24 }
Suharsh Sivakumar19fbf992015-01-23 11:02:27 -080025 return shutdown
Matt Rosencrantz5180d162014-12-03 13:48:40 -080026}
27
Robert Kroegerddcace02014-09-29 14:02:08 -070028func TestListCommand(t *testing.T) {
Suharsh Sivakumar19fbf992015-01-23 11:02:27 -080029 shutdown := initTest()
30 defer shutdown()
31
Robert Kroegerddcace02014-09-29 14:02:08 -070032 tape := NewTape()
Matt Rosencrantzf1c3b442015-01-12 17:53:08 -080033 server, endpoint, err := startServer(t, gctx, tape)
Robert Kroegerddcace02014-09-29 14:02:08 -070034 if err != nil {
35 return
36 }
37 defer stopServer(t, server)
38
39 // Setup the command-line.
40 cmd := root()
41 var stdout, stderr bytes.Buffer
42 cmd.Init(nil, &stdout, &stderr)
Bogdan Caprita2b219362014-12-09 17:03:33 -080043 deviceName := naming.JoinAddressName(endpoint.String(), "")
Robert Kroegerddcace02014-09-29 14:02:08 -070044
45 // Test the 'list' command.
46 tape.SetResponses([]interface{}{ListAssociationResponse{
Bogdan Capritaa456f472014-12-10 10:18:03 -080047 na: []device.Association{
Robert Kroegerddcace02014-09-29 14:02:08 -070048 {
49 "root/self",
50 "alice_self_account",
51 },
52 {
53 "root/other",
54 "alice_other_account",
55 },
56 },
57 err: nil,
58 }})
59
Bogdan Caprita2b219362014-12-09 17:03:33 -080060 if err := cmd.Execute([]string{"associate", "list", deviceName}); err != nil {
Robert Kroegerddcace02014-09-29 14:02:08 -070061 t.Fatalf("%v", err)
62 }
63 if expected, got := "root/self alice_self_account\nroot/other alice_other_account", strings.TrimSpace(stdout.String()); got != expected {
64 t.Fatalf("Unexpected output from list. Got %q, expected %q", got, expected)
65 }
66 if got, expected := tape.Play(), []interface{}{"ListAssociations"}; !reflect.DeepEqual(expected, got) {
67 t.Errorf("invalid call sequence. Got %v, want %v", got, expected)
68 }
69 tape.Rewind()
70 stdout.Reset()
71
72 // Test list with bad parameters.
Bogdan Caprita2b219362014-12-09 17:03:33 -080073 if err := cmd.Execute([]string{"associate", "list", deviceName, "hello"}); err == nil {
Robert Kroegerddcace02014-09-29 14:02:08 -070074 t.Fatalf("wrongly failed to receive a non-nil error.")
75 }
76 if got, expected := len(tape.Play()), 0; got != expected {
77 t.Errorf("invalid call sequence. Got %v, want %v", got, expected)
78 }
79 tape.Rewind()
80 stdout.Reset()
81}
82
83func TestAddCommand(t *testing.T) {
Suharsh Sivakumar19fbf992015-01-23 11:02:27 -080084 shutdown := initTest()
85 defer shutdown()
86
Robert Kroegerddcace02014-09-29 14:02:08 -070087 tape := NewTape()
Matt Rosencrantzf1c3b442015-01-12 17:53:08 -080088 server, endpoint, err := startServer(t, gctx, tape)
Robert Kroegerddcace02014-09-29 14:02:08 -070089 if err != nil {
90 return
91 }
92 defer stopServer(t, server)
93
94 // Setup the command-line.
95 cmd := root()
96 var stdout, stderr bytes.Buffer
97 cmd.Init(nil, &stdout, &stderr)
Bogdan Caprita2b219362014-12-09 17:03:33 -080098 deviceName := naming.JoinAddressName(endpoint.String(), "/myapp/1")
Robert Kroegerddcace02014-09-29 14:02:08 -070099
100 if err := cmd.Execute([]string{"add", "one"}); err == nil {
101 t.Fatalf("wrongly failed to receive a non-nil error.")
102 }
103 if got, expected := len(tape.Play()), 0; got != expected {
104 t.Errorf("invalid call sequence. Got %v, want %v", got, expected)
105 }
106 tape.Rewind()
107 stdout.Reset()
108
109 tape.SetResponses([]interface{}{nil})
Bogdan Caprita2b219362014-12-09 17:03:33 -0800110 if err := cmd.Execute([]string{"associate", "add", deviceName, "alice", "root/self"}); err != nil {
Robert Kroegerddcace02014-09-29 14:02:08 -0700111 t.Fatalf("%v", err)
112 }
113 expected := []interface{}{
114 AddAssociationStimulus{"AssociateAccount", []string{"root/self"}, "alice"},
115 }
116 if got := tape.Play(); !reflect.DeepEqual(expected, got) {
117 t.Errorf("unexpected result. Got %v want %v", got, expected)
118 }
119 tape.Rewind()
120 stdout.Reset()
121
122 tape.SetResponses([]interface{}{nil})
Bogdan Caprita2b219362014-12-09 17:03:33 -0800123 if err := cmd.Execute([]string{"associate", "add", deviceName, "alice", "root/other", "root/self"}); err != nil {
Robert Kroegerddcace02014-09-29 14:02:08 -0700124 t.Fatalf("%v", err)
125 }
126 expected = []interface{}{
127 AddAssociationStimulus{"AssociateAccount", []string{"root/other", "root/self"}, "alice"},
128 }
129 if got := tape.Play(); !reflect.DeepEqual(expected, got) {
130 t.Errorf("unexpected result. Got %v want %v", got, expected)
131 }
132 tape.Rewind()
133 stdout.Reset()
134}
135
136func TestRemoveCommand(t *testing.T) {
Suharsh Sivakumar19fbf992015-01-23 11:02:27 -0800137 shutdown := initTest()
138 defer shutdown()
139
Robert Kroegerddcace02014-09-29 14:02:08 -0700140 tape := NewTape()
Matt Rosencrantzf1c3b442015-01-12 17:53:08 -0800141 server, endpoint, err := startServer(t, gctx, tape)
Robert Kroegerddcace02014-09-29 14:02:08 -0700142 if err != nil {
143 return
144 }
145 defer stopServer(t, server)
146
147 // Setup the command-line.
148 cmd := root()
149 var stdout, stderr bytes.Buffer
150 cmd.Init(nil, &stdout, &stderr)
Bogdan Caprita2b219362014-12-09 17:03:33 -0800151 deviceName := naming.JoinAddressName(endpoint.String(), "")
Robert Kroegerddcace02014-09-29 14:02:08 -0700152
153 if err := cmd.Execute([]string{"remove", "one"}); err == nil {
154 t.Fatalf("wrongly failed to receive a non-nil error.")
155 }
156 if got, expected := len(tape.Play()), 0; got != expected {
157 t.Errorf("invalid call sequence. Got %v, want %v", got, expected)
158 }
159 tape.Rewind()
160 stdout.Reset()
161
162 tape.SetResponses([]interface{}{nil})
Bogdan Caprita2b219362014-12-09 17:03:33 -0800163 if err := cmd.Execute([]string{"associate", "remove", deviceName, "root/self"}); err != nil {
Robert Kroegerddcace02014-09-29 14:02:08 -0700164 t.Fatalf("%v", err)
165 }
166 expected := []interface{}{
167 AddAssociationStimulus{"AssociateAccount", []string{"root/self"}, ""},
168 }
169 if got := tape.Play(); !reflect.DeepEqual(expected, got) {
170 t.Errorf("unexpected result. Got %v want %v", got, expected)
171 }
172 tape.Rewind()
173 stdout.Reset()
174}
Robert Kroegerff300892014-11-10 17:59:41 -0800175
176func TestInstallCommand(t *testing.T) {
Suharsh Sivakumar19fbf992015-01-23 11:02:27 -0800177 shutdown := initTest()
178 defer shutdown()
179
Robert Kroegerff300892014-11-10 17:59:41 -0800180 tape := NewTape()
Matt Rosencrantzf1c3b442015-01-12 17:53:08 -0800181 server, endpoint, err := startServer(t, gctx, tape)
Robert Kroegerff300892014-11-10 17:59:41 -0800182 if err != nil {
183 return
184 }
185 defer stopServer(t, server)
186
187 // Setup the command-line.
188 cmd := root()
189 var stdout, stderr bytes.Buffer
190 cmd.Init(nil, &stdout, &stderr)
Bogdan Caprita2b219362014-12-09 17:03:33 -0800191 deviceName := naming.JoinAddressName(endpoint.String(), "")
Robert Kroegerff300892014-11-10 17:59:41 -0800192 appId := "myBestAppID"
Bogdan Caprita858ec162015-01-21 15:09:22 -0800193 cfg := device.Config{"someflag": "somevalue"}
194 for i, c := range []struct {
195 args []string
196 config device.Config
197 shouldErr bool
198 tapeResponse interface{}
199 expectedTape interface{}
200 }{
201 {
202 []string{"install", "blech"},
203 nil,
204 true,
205 nil,
206 nil,
207 },
208 {
209 []string{"install", "blech1", "blech2", "blech3", "blech4"},
210 nil,
211 true,
212 nil,
213 nil,
214 },
215 {
216 []string{"install", deviceName, "myBestApp", "not-valid-json"},
217 nil,
218 true,
219 nil,
220 nil,
221 },
222 {
223 []string{"install", deviceName, "myBestApp"},
224 nil,
225 false,
226 InstallResponse{appId, nil},
227 InstallStimulus{"Install", "myBestApp", nil},
228 },
229 {
230 []string{"install", deviceName, "myBestApp"},
231 cfg,
232 false,
233 InstallResponse{appId, nil},
234 InstallStimulus{"Install", "myBestApp", cfg},
235 },
236 } {
237 tape.SetResponses([]interface{}{c.tapeResponse})
238 if c.config != nil {
239 jsonConfig, err := json.Marshal(c.config)
240 if err != nil {
241 t.Fatalf("test case %d: Marshal(%v) failed: %v", i, c.config, err)
242 }
243 c.args = append(c.args, string(jsonConfig))
244 }
245 err := cmd.Execute(c.args)
246 if c.shouldErr {
247 if err == nil {
248 t.Fatalf("test case %d: wrongly failed to receive a non-nil error.", i)
249 }
250 if got, expected := len(tape.Play()), 0; got != expected {
251 t.Errorf("test case %d: invalid call sequence. Got %v, want %v", got, expected)
252 }
253 } else {
254 if err != nil {
255 t.Fatalf("test case %d: %v", i, err)
256 }
257 if expected, got := fmt.Sprintf("Successfully installed: %q", naming.Join(deviceName, appId)), strings.TrimSpace(stdout.String()); got != expected {
258 t.Fatalf("test case %d: Unexpected output from Install. Got %q, expected %q", i, got, expected)
259 }
260 if got, expected := tape.Play(), []interface{}{c.expectedTape}; !reflect.DeepEqual(expected, got) {
261 t.Errorf("test case %d: invalid call sequence. Got %v, want %v", i, got, expected)
262 }
263 }
264 tape.Rewind()
265 stdout.Reset()
Robert Kroegerff300892014-11-10 17:59:41 -0800266 }
Robert Kroegerff300892014-11-10 17:59:41 -0800267}
Robert Kroeger745a7222014-11-19 18:20:55 -0800268
269func TestClaimCommand(t *testing.T) {
Suharsh Sivakumar19fbf992015-01-23 11:02:27 -0800270 shutdown := initTest()
271 defer shutdown()
272
Robert Kroeger745a7222014-11-19 18:20:55 -0800273 tape := NewTape()
Matt Rosencrantzf1c3b442015-01-12 17:53:08 -0800274 server, endpoint, err := startServer(t, gctx, tape)
Robert Kroeger745a7222014-11-19 18:20:55 -0800275 if err != nil {
276 return
277 }
278 defer stopServer(t, server)
279
280 // Setup the command-line.
281 cmd := root()
282 var stdout, stderr bytes.Buffer
283 cmd.Init(nil, &stdout, &stderr)
Bogdan Caprita2b219362014-12-09 17:03:33 -0800284 deviceName := naming.JoinAddressName(endpoint.String(), "")
Robert Kroeger745a7222014-11-19 18:20:55 -0800285
286 // Confirm that we correctly enforce the number of arguments.
287 if err := cmd.Execute([]string{"claim", "nope"}); err == nil {
288 t.Fatalf("wrongly failed to receive a non-nil error.")
289 }
290 if expected, got := "ERROR: claim: incorrect number of arguments, expected 2, got 1", strings.TrimSpace(stderr.String()); !strings.HasPrefix(got, expected) {
291 t.Fatalf("Unexpected output from claim. Got %q, expected prefix %q", got, expected)
292 }
293 stdout.Reset()
294 stderr.Reset()
295 tape.Rewind()
296
297 if err := cmd.Execute([]string{"claim", "nope", "nope", "nope"}); err == nil {
298 t.Fatalf("wrongly failed to receive a non-nil error.")
299 }
300 if expected, got := "ERROR: claim: incorrect number of arguments, expected 2, got 3", strings.TrimSpace(stderr.String()); !strings.HasPrefix(got, expected) {
301 t.Fatalf("Unexpected output from claim. Got %q, expected prefix %q", got, expected)
302 }
303 stdout.Reset()
304 stderr.Reset()
305 tape.Rewind()
306
307 // Correct operation.
308 tape.SetResponses([]interface{}{
309 nil,
310 })
Bogdan Caprita2b219362014-12-09 17:03:33 -0800311 if err := cmd.Execute([]string{"claim", deviceName, "grant"}); err != nil {
312 t.Fatalf("Claim(%s, %s) failed: %v", deviceName, "grant", err)
Robert Kroeger745a7222014-11-19 18:20:55 -0800313 }
314 if got, expected := len(tape.Play()), 1; got != expected {
315 t.Errorf("invalid call sequence. Got %v, want %v", got, expected)
316 }
317 if expected, got := "Successfully claimed.", strings.TrimSpace(stdout.String()); !strings.HasPrefix(got, expected) {
318 t.Fatalf("Unexpected output from claim. Got %q, expected prefix %q", got, expected)
319 }
320 expected := []interface{}{
321 "Claim",
322 }
323 if got := tape.Play(); !reflect.DeepEqual(expected, got) {
324 t.Errorf("unexpected result. Got %v want %v", got, expected)
325 }
326 tape.Rewind()
327 stdout.Reset()
328 stderr.Reset()
329
330 // Error operation.
331 tape.SetResponses([]interface{}{
Mike Burrows28518472014-12-08 17:15:38 -0800332 verror.Make(errOops, nil),
Robert Kroeger745a7222014-11-19 18:20:55 -0800333 })
Bogdan Caprita2b219362014-12-09 17:03:33 -0800334 if err := cmd.Execute([]string{"claim", deviceName, "grant"}); err == nil {
Robert Kroeger745a7222014-11-19 18:20:55 -0800335 t.Fatalf("claim() failed to detect error", err)
336 }
337 expected = []interface{}{
338 "Claim",
339 }
340 if got := tape.Play(); !reflect.DeepEqual(expected, got) {
341 t.Errorf("unexpected result. Got %v want %v", got, expected)
342 }
343 tape.Rewind()
344 stdout.Reset()
345 stderr.Reset()
346
347}
348
349func TestStartCommand(t *testing.T) {
Suharsh Sivakumar19fbf992015-01-23 11:02:27 -0800350 shutdown := initTest()
351 defer shutdown()
352
Robert Kroeger745a7222014-11-19 18:20:55 -0800353 tape := NewTape()
Matt Rosencrantzf1c3b442015-01-12 17:53:08 -0800354 server, endpoint, err := startServer(t, gctx, tape)
Robert Kroeger745a7222014-11-19 18:20:55 -0800355 if err != nil {
356 return
357 }
358 defer stopServer(t, server)
359
360 // Setup the command-line.
361 cmd := root()
362 var stdout, stderr bytes.Buffer
363 cmd.Init(nil, &stdout, &stderr)
364 appName := naming.JoinAddressName(endpoint.String(), "")
365
366 // Confirm that we correctly enforce the number of arguments.
367 if err := cmd.Execute([]string{"start", "nope"}); err == nil {
368 t.Fatalf("wrongly failed to receive a non-nil error.")
369 }
370 if expected, got := "ERROR: start: incorrect number of arguments, expected 2, got 1", strings.TrimSpace(stderr.String()); !strings.HasPrefix(got, expected) {
371 t.Fatalf("Unexpected output from start. Got %q, expected prefix %q", got, expected)
372 }
373 stdout.Reset()
374 stderr.Reset()
375 tape.Rewind()
376
377 if err := cmd.Execute([]string{"start", "nope", "nope", "nope"}); err == nil {
378 t.Fatalf("wrongly failed to receive a non-nil error.")
379 }
380 if expected, got := "ERROR: start: incorrect number of arguments, expected 2, got 3", strings.TrimSpace(stderr.String()); !strings.HasPrefix(got, expected) {
381 t.Fatalf("Unexpected output from start. Got %q, expected prefix %q", got, expected)
382 }
383 stdout.Reset()
384 stderr.Reset()
385 tape.Rewind()
386
387 // Correct operation.
388 tape.SetResponses([]interface{}{StartResponse{
389 appIds: []string{"app1", "app2"},
390 err: nil,
391 },
392 })
393 if err := cmd.Execute([]string{"start", appName, "grant"}); err != nil {
394 t.Fatalf("Start(%s, %s) failed: %v", appName, "grant", err)
395 }
396
397 b := new(bytes.Buffer)
398 fmt.Fprintf(b, "Successfully started: %q\nSuccessfully started: %q", appName+"/app1", appName+"/app2")
399 if expected, got := b.String(), strings.TrimSpace(stdout.String()); !strings.HasPrefix(got, expected) {
400 t.Fatalf("Unexpected output from start. Got %q, expected prefix %q", got, expected)
401 }
402 expected := []interface{}{
403 "Start",
404 }
405 if got := tape.Play(); !reflect.DeepEqual(expected, got) {
406 t.Errorf("unexpected result. Got %v want %v", got, expected)
407 }
408 tape.Rewind()
409 stdout.Reset()
410 stderr.Reset()
411
412 // Error operation.
413 tape.SetResponses([]interface{}{StartResponse{
414 []string{},
Mike Burrows28518472014-12-08 17:15:38 -0800415 verror.Make(errOops, nil),
Robert Kroeger745a7222014-11-19 18:20:55 -0800416 },
417 })
418 if err := cmd.Execute([]string{"start", appName, "grant"}); err == nil {
419 t.Fatalf("start failed to detect error")
420 }
421 expected = []interface{}{
422 "Start",
423 }
424 if got := tape.Play(); !reflect.DeepEqual(expected, got) {
425 t.Errorf("unexpected result. Got %v want %v", got, expected)
426 }
427 tape.Rewind()
428 stdout.Reset()
429 stderr.Reset()
430}