blob: 8425beced17081c4d4716796c10ce6d017bd4bc8 [file] [log] [blame]
package main
import (
"bytes"
"fmt"
"reflect"
"strings"
"testing"
"v.io/core/veyron2/naming"
"v.io/core/veyron2/rt"
"v.io/core/veyron2/services/mgmt/device"
verror "v.io/core/veyron2/verror2"
)
func init() {
runtime, err := rt.New()
if err != nil {
panic(err)
}
gctx = runtime.NewContext()
}
func TestListCommand(t *testing.T) {
tape := NewTape()
server, endpoint, err := startServer(t, gctx, tape)
if err != nil {
return
}
defer stopServer(t, server)
// Setup the command-line.
cmd := root()
var stdout, stderr bytes.Buffer
cmd.Init(nil, &stdout, &stderr)
deviceName := naming.JoinAddressName(endpoint.String(), "")
// Test the 'list' command.
tape.SetResponses([]interface{}{ListAssociationResponse{
na: []device.Association{
{
"root/self",
"alice_self_account",
},
{
"root/other",
"alice_other_account",
},
},
err: nil,
}})
if err := cmd.Execute([]string{"associate", "list", deviceName}); err != nil {
t.Fatalf("%v", err)
}
if expected, got := "root/self alice_self_account\nroot/other alice_other_account", strings.TrimSpace(stdout.String()); got != expected {
t.Fatalf("Unexpected output from list. Got %q, expected %q", got, expected)
}
if got, expected := tape.Play(), []interface{}{"ListAssociations"}; !reflect.DeepEqual(expected, got) {
t.Errorf("invalid call sequence. Got %v, want %v", got, expected)
}
tape.Rewind()
stdout.Reset()
// Test list with bad parameters.
if err := cmd.Execute([]string{"associate", "list", deviceName, "hello"}); err == nil {
t.Fatalf("wrongly failed to receive a non-nil error.")
}
if got, expected := len(tape.Play()), 0; got != expected {
t.Errorf("invalid call sequence. Got %v, want %v", got, expected)
}
tape.Rewind()
stdout.Reset()
}
func TestAddCommand(t *testing.T) {
tape := NewTape()
server, endpoint, err := startServer(t, gctx, tape)
if err != nil {
return
}
defer stopServer(t, server)
// Setup the command-line.
cmd := root()
var stdout, stderr bytes.Buffer
cmd.Init(nil, &stdout, &stderr)
deviceName := naming.JoinAddressName(endpoint.String(), "/myapp/1")
if err := cmd.Execute([]string{"add", "one"}); err == nil {
t.Fatalf("wrongly failed to receive a non-nil error.")
}
if got, expected := len(tape.Play()), 0; got != expected {
t.Errorf("invalid call sequence. Got %v, want %v", got, expected)
}
tape.Rewind()
stdout.Reset()
tape.SetResponses([]interface{}{nil})
if err := cmd.Execute([]string{"associate", "add", deviceName, "alice", "root/self"}); err != nil {
t.Fatalf("%v", err)
}
expected := []interface{}{
AddAssociationStimulus{"AssociateAccount", []string{"root/self"}, "alice"},
}
if got := tape.Play(); !reflect.DeepEqual(expected, got) {
t.Errorf("unexpected result. Got %v want %v", got, expected)
}
tape.Rewind()
stdout.Reset()
tape.SetResponses([]interface{}{nil})
if err := cmd.Execute([]string{"associate", "add", deviceName, "alice", "root/other", "root/self"}); err != nil {
t.Fatalf("%v", err)
}
expected = []interface{}{
AddAssociationStimulus{"AssociateAccount", []string{"root/other", "root/self"}, "alice"},
}
if got := tape.Play(); !reflect.DeepEqual(expected, got) {
t.Errorf("unexpected result. Got %v want %v", got, expected)
}
tape.Rewind()
stdout.Reset()
}
func TestRemoveCommand(t *testing.T) {
tape := NewTape()
server, endpoint, err := startServer(t, gctx, tape)
if err != nil {
return
}
defer stopServer(t, server)
// Setup the command-line.
cmd := root()
var stdout, stderr bytes.Buffer
cmd.Init(nil, &stdout, &stderr)
deviceName := naming.JoinAddressName(endpoint.String(), "")
if err := cmd.Execute([]string{"remove", "one"}); err == nil {
t.Fatalf("wrongly failed to receive a non-nil error.")
}
if got, expected := len(tape.Play()), 0; got != expected {
t.Errorf("invalid call sequence. Got %v, want %v", got, expected)
}
tape.Rewind()
stdout.Reset()
tape.SetResponses([]interface{}{nil})
if err := cmd.Execute([]string{"associate", "remove", deviceName, "root/self"}); err != nil {
t.Fatalf("%v", err)
}
expected := []interface{}{
AddAssociationStimulus{"AssociateAccount", []string{"root/self"}, ""},
}
if got := tape.Play(); !reflect.DeepEqual(expected, got) {
t.Errorf("unexpected result. Got %v want %v", got, expected)
}
tape.Rewind()
stdout.Reset()
}
func TestInstallCommand(t *testing.T) {
tape := NewTape()
server, endpoint, err := startServer(t, gctx, tape)
if err != nil {
return
}
defer stopServer(t, server)
// Setup the command-line.
cmd := root()
var stdout, stderr bytes.Buffer
cmd.Init(nil, &stdout, &stderr)
deviceName := naming.JoinAddressName(endpoint.String(), "")
if err := cmd.Execute([]string{"install", "blech"}); err == nil {
t.Fatalf("wrongly failed to receive a non-nil error.")
}
if got, expected := len(tape.Play()), 0; got != expected {
t.Errorf("invalid call sequence. Got %v, want %v", got, expected)
}
tape.Rewind()
stdout.Reset()
if err := cmd.Execute([]string{"install", "blech1", "blech2", "blech3"}); err == nil {
t.Fatalf("wrongly failed to receive a non-nil error.")
}
if got, expected := len(tape.Play()), 0; got != expected {
t.Errorf("invalid call sequence. Got %v, want %v", got, expected)
}
tape.Rewind()
stdout.Reset()
appId := "myBestAppID"
tape.SetResponses([]interface{}{InstallResponse{
appId: appId,
err: nil,
}})
if err := cmd.Execute([]string{"install", deviceName, "myBestApp"}); err != nil {
t.Fatalf("%v", err)
}
eb := new(bytes.Buffer)
fmt.Fprintf(eb, "Successfully installed: %q", naming.Join(deviceName, appId))
if expected, got := eb.String(), strings.TrimSpace(stdout.String()); got != expected {
t.Fatalf("Unexpected output from Install. Got %q, expected %q", got, expected)
}
expected := []interface{}{
InstallStimulus{"Install", "myBestApp"},
}
if got := tape.Play(); !reflect.DeepEqual(expected, got) {
t.Errorf("unexpected result. Got %v want %v", got, expected)
}
tape.Rewind()
stdout.Reset()
}
func TestClaimCommand(t *testing.T) {
tape := NewTape()
server, endpoint, err := startServer(t, gctx, tape)
if err != nil {
return
}
defer stopServer(t, server)
// Setup the command-line.
cmd := root()
var stdout, stderr bytes.Buffer
cmd.Init(nil, &stdout, &stderr)
deviceName := naming.JoinAddressName(endpoint.String(), "")
// Confirm that we correctly enforce the number of arguments.
if err := cmd.Execute([]string{"claim", "nope"}); err == nil {
t.Fatalf("wrongly failed to receive a non-nil error.")
}
if expected, got := "ERROR: claim: incorrect number of arguments, expected 2, got 1", strings.TrimSpace(stderr.String()); !strings.HasPrefix(got, expected) {
t.Fatalf("Unexpected output from claim. Got %q, expected prefix %q", got, expected)
}
stdout.Reset()
stderr.Reset()
tape.Rewind()
if err := cmd.Execute([]string{"claim", "nope", "nope", "nope"}); err == nil {
t.Fatalf("wrongly failed to receive a non-nil error.")
}
if expected, got := "ERROR: claim: incorrect number of arguments, expected 2, got 3", strings.TrimSpace(stderr.String()); !strings.HasPrefix(got, expected) {
t.Fatalf("Unexpected output from claim. Got %q, expected prefix %q", got, expected)
}
stdout.Reset()
stderr.Reset()
tape.Rewind()
// Correct operation.
tape.SetResponses([]interface{}{
nil,
})
if err := cmd.Execute([]string{"claim", deviceName, "grant"}); err != nil {
t.Fatalf("Claim(%s, %s) failed: %v", deviceName, "grant", err)
}
if got, expected := len(tape.Play()), 1; got != expected {
t.Errorf("invalid call sequence. Got %v, want %v", got, expected)
}
if expected, got := "Successfully claimed.", strings.TrimSpace(stdout.String()); !strings.HasPrefix(got, expected) {
t.Fatalf("Unexpected output from claim. Got %q, expected prefix %q", got, expected)
}
expected := []interface{}{
"Claim",
}
if got := tape.Play(); !reflect.DeepEqual(expected, got) {
t.Errorf("unexpected result. Got %v want %v", got, expected)
}
tape.Rewind()
stdout.Reset()
stderr.Reset()
// Error operation.
tape.SetResponses([]interface{}{
verror.Make(errOops, nil),
})
if err := cmd.Execute([]string{"claim", deviceName, "grant"}); err == nil {
t.Fatalf("claim() failed to detect error", err)
}
expected = []interface{}{
"Claim",
}
if got := tape.Play(); !reflect.DeepEqual(expected, got) {
t.Errorf("unexpected result. Got %v want %v", got, expected)
}
tape.Rewind()
stdout.Reset()
stderr.Reset()
}
func TestStartCommand(t *testing.T) {
tape := NewTape()
server, endpoint, err := startServer(t, gctx, tape)
if err != nil {
return
}
defer stopServer(t, server)
// Setup the command-line.
cmd := root()
var stdout, stderr bytes.Buffer
cmd.Init(nil, &stdout, &stderr)
appName := naming.JoinAddressName(endpoint.String(), "")
// Confirm that we correctly enforce the number of arguments.
if err := cmd.Execute([]string{"start", "nope"}); err == nil {
t.Fatalf("wrongly failed to receive a non-nil error.")
}
if expected, got := "ERROR: start: incorrect number of arguments, expected 2, got 1", strings.TrimSpace(stderr.String()); !strings.HasPrefix(got, expected) {
t.Fatalf("Unexpected output from start. Got %q, expected prefix %q", got, expected)
}
stdout.Reset()
stderr.Reset()
tape.Rewind()
if err := cmd.Execute([]string{"start", "nope", "nope", "nope"}); err == nil {
t.Fatalf("wrongly failed to receive a non-nil error.")
}
if expected, got := "ERROR: start: incorrect number of arguments, expected 2, got 3", strings.TrimSpace(stderr.String()); !strings.HasPrefix(got, expected) {
t.Fatalf("Unexpected output from start. Got %q, expected prefix %q", got, expected)
}
stdout.Reset()
stderr.Reset()
tape.Rewind()
// Correct operation.
tape.SetResponses([]interface{}{StartResponse{
appIds: []string{"app1", "app2"},
err: nil,
},
})
if err := cmd.Execute([]string{"start", appName, "grant"}); err != nil {
t.Fatalf("Start(%s, %s) failed: %v", appName, "grant", err)
}
b := new(bytes.Buffer)
fmt.Fprintf(b, "Successfully started: %q\nSuccessfully started: %q", appName+"/app1", appName+"/app2")
if expected, got := b.String(), strings.TrimSpace(stdout.String()); !strings.HasPrefix(got, expected) {
t.Fatalf("Unexpected output from start. Got %q, expected prefix %q", got, expected)
}
expected := []interface{}{
"Start",
}
if got := tape.Play(); !reflect.DeepEqual(expected, got) {
t.Errorf("unexpected result. Got %v want %v", got, expected)
}
tape.Rewind()
stdout.Reset()
stderr.Reset()
// Error operation.
tape.SetResponses([]interface{}{StartResponse{
[]string{},
verror.Make(errOops, nil),
},
})
if err := cmd.Execute([]string{"start", appName, "grant"}); err == nil {
t.Fatalf("start failed to detect error")
}
expected = []interface{}{
"Start",
}
if got := tape.Play(); !reflect.DeepEqual(expected, got) {
t.Errorf("unexpected result. Got %v want %v", got, expected)
}
tape.Rewind()
stdout.Reset()
stderr.Reset()
}