services/device/device: globify debug
Change-Id: I86ebb01b856eb00c6c579bc357e2032d99d2c912
diff --git a/services/device/device/debug.go b/services/device/device/debug.go
index fcfab9e..1ba6fc4 100644
--- a/services/device/device/debug.go
+++ b/services/device/device/debug.go
@@ -6,32 +6,30 @@
import (
"fmt"
+ "io"
+ "strings"
"v.io/v23/context"
"v.io/v23/services/device"
"v.io/x/lib/cmdline"
- "v.io/x/ref/lib/v23cmd"
)
var cmdDebug = &cmdline.Command{
- Runner: v23cmd.RunnerFunc(runDebug),
+ Runner: globRunner(runDebug),
Name: "debug",
Short: "Debug the device.",
- Long: "Debug the device.",
- ArgsName: "<app name>",
+ Long: "Get internal debug information about application installations and instances.",
+ ArgsName: "<app name patterns...>",
ArgsLong: `
-<app name> is the vanadium object name of an app installation or instance.`,
+<app name patterns...> are vanadium object names or glob name patterns corresponding to application installations and instances.`,
}
-func runDebug(ctx *context.T, env *cmdline.Env, args []string) error {
- if expected, got := 1, len(args); expected != got {
- return env.UsageErrorf("debug: incorrect number of arguments, expected %d, got %d", expected, got)
- }
- appName := args[0]
- if description, err := device.DeviceClient(appName).Debug(ctx); err != nil {
+func runDebug(entry globResult, ctx *context.T, stdout, _ io.Writer) error {
+ if description, err := device.DeviceClient(entry.name).Debug(ctx); err != nil {
return fmt.Errorf("Debug failed: %v", err)
} else {
- fmt.Fprintf(env.Stdout, "%v\n", description)
+ line := strings.Repeat("*", len(entry.name)+4)
+ fmt.Fprintf(stdout, "%s\n* %s *\n%s\n%v\n", line, entry.name, line, description)
}
return nil
}
diff --git a/services/device/device/debug_test.go b/services/device/device/debug_test.go
index f09af00..32a7678 100644
--- a/services/device/device/debug_test.go
+++ b/services/device/device/debug_test.go
@@ -6,6 +6,7 @@
import (
"bytes"
+ "fmt"
"reflect"
"strings"
"testing"
@@ -27,22 +28,27 @@
return
}
defer stopServer(t, server)
- // Setup the command-line.
+
cmd := cmd_device.CmdRoot
+ globName := naming.JoinAddressName(endpoint.String(), "glob")
+ appName := naming.JoinAddressName(endpoint.String(), "app")
+ rootTape, appTape := tapes.forSuffix(""), tapes.forSuffix("app")
+ rootTape.SetResponses(GlobResponse{[]string{"app"}})
+
var stdout, stderr bytes.Buffer
env := &cmdline.Env{Stdout: &stdout, Stderr: &stderr}
- appName := naming.JoinAddressName(endpoint.String(), "")
debugMessage := "the secrets of the universe, revealed"
- rootTape := tapes.forSuffix("")
- rootTape.SetResponses(debugMessage)
- if err := v23cmd.ParseAndRunForTest(cmd, ctx, env, []string{"debug", appName}); err != nil {
+ appTape.SetResponses(instanceRunning, debugMessage)
+ if err := v23cmd.ParseAndRunForTest(cmd, ctx, env, []string{"debug", globName}); err != nil {
t.Fatalf("%v", err)
}
- if expected, got := debugMessage, strings.TrimSpace(stdout.String()); got != expected {
- t.Fatalf("Unexpected output from debug. Got %q, expected %q", got, expected)
+ line := strings.Repeat("*", len(appName)+4)
+ expected := fmt.Sprintf("%s\n* %s *\n%s\n%s", line, appName, line, debugMessage)
+ if got := strings.TrimSpace(stdout.String()); got != expected {
+ t.Fatalf("Unexpected output from debug. Got:\n%v\nExpected:\n%v", got, expected)
}
- if got, expected := rootTape.Play(), []interface{}{"Debug"}; !reflect.DeepEqual(expected, got) {
+ if got, expected := appTape.Play(), []interface{}{"Status", "Debug"}; !reflect.DeepEqual(expected, got) {
t.Errorf("invalid call sequence. Got %v, want %v", got, expected)
}
}
diff --git a/services/device/device/doc.go b/services/device/device/doc.go
index 57612c3..2799149 100644
--- a/services/device/device/doc.go
+++ b/services/device/device/doc.go
@@ -314,12 +314,13 @@
Device debug
-Debug the device.
+Get internal debug information about application installations and instances.
Usage:
- device debug <app name>
+ device debug <app name patterns...>
-<app name> is the vanadium object name of an app installation or instance.
+<app name patterns...> are vanadium object names or glob name patterns
+corresponding to application installations and instances.
Device acl