veyron/tools/identity: Bugfix for "identity bless - <name>".
Also, added tests.
Change-Id: I6e1af6f78b2abe7df40bf01b32cf74cec969ff81
diff --git a/tools/identity/main.go b/tools/identity/main.go
index bb314c1..861d85f 100644
--- a/tools/identity/main.go
+++ b/tools/identity/main.go
@@ -144,9 +144,13 @@
name := args[1]
var blessee security.PublicID
var private security.PrivateID
- if err := decode(args[0], &blessee); err != nil {
- if err := decode(args[0], &private); err != nil {
- return fmt.Errorf("failed to extract security.PublicID or security.PrivateID: %v", err)
+ encoded, err := read(args[0])
+ if err != nil {
+ return err
+ }
+ if util.Base64VomDecode(encoded, &blessee); err != nil || blessee == nil {
+ if err := util.Base64VomDecode(encoded, &private); err != nil || private == nil {
+ return fmt.Errorf("failed to extract security.PublicID or security.PrivateID: (%v, %v)", private, err)
}
blessee = private.PublicID()
}
@@ -260,23 +264,31 @@
}).Main()
}
-func decode(fname string, val interface{}) error {
+func read(fname string) (string, error) {
if len(fname) == 0 {
- return nil
+ return "", nil
}
- var f *os.File
- var err error
- if fname == "-" {
- f = os.Stdin
- } else if f, err = os.Open(fname); err != nil {
- return fmt.Errorf("failed to open %q: %v", fname, err)
+ f := os.Stdin
+ if fname != "-" {
+ var err error
+ if f, err = os.Open(fname); err != nil {
+ return "", fmt.Errorf("failed to open %q: %v", fname, err)
+ }
}
defer f.Close()
var buf bytes.Buffer
if _, err := io.Copy(&buf, f); err != nil {
- return fmt.Errorf("failed to read %q: %v", fname, err)
+ return "", fmt.Errorf("failed to read %q: %v", fname, err)
}
- if err := util.Base64VomDecode(buf.String(), val); err != nil || val == nil {
+ return buf.String(), nil
+}
+
+func decode(fname string, val interface{}) error {
+ str, err := read(fname)
+ if err != nil {
+ return err
+ }
+ if err := util.Base64VomDecode(str, val); err != nil || val == nil {
return fmt.Errorf("failed to decode %q: %v", fname, err)
}
return nil
diff --git a/tools/identity/test.sh b/tools/identity/test.sh
new file mode 100755
index 0000000..d23bfa8
--- /dev/null
+++ b/tools/identity/test.sh
@@ -0,0 +1,59 @@
+#!/bin/sh
+
+# Test the identity command-line tool.
+#
+# This tests most operations of the identity command-line tool.
+# Not the "seekblessing" command yet, since that requires
+# starting a separate server.
+
+toplevel=$(git rev-parse --show-toplevel)
+go=${toplevel}/scripts/build/go
+thisscript=$0
+
+
+workdir=$(mktemp -d ${toplevel}/go/tmp.XXXXXXXXXX)
+export TMPDIR=$workdir
+trap onexit EXIT
+
+onexit() {
+ cd /
+ exec 2> /dev/null
+ rm -rf $workdir
+}
+
+FAIL() {
+ [ $# -gt 0 ] && echo "$thisscript $*"
+ echo FAIL
+ exit 1
+}
+
+PASS() {
+ echo PASS
+ exit 0
+}
+
+# Build binaries.
+cd $workdir
+$go build veyron/tools/identity || FAIL "line $LINENO: failed to build identity"
+
+./identity print >/dev/null || FAIL "line $LINENO: print failed"
+./identity generate >/dev/null || FAIL "line $LINENO: generate failed"
+./identity generate root >root || FAIL "line $LINENO: generate root failed"
+
+export VEYRON_IDENTITY="root"
+
+# Generate an identity and get it blessed by root using "identity bless"
+got=$(./identity generate ignoreme | ./identity bless - child | ./identity print - | awk '/Name/ {print $3}')
+want="root/child"
+if [ "$got" != "$want" ]; then
+ FAIL "line $LINENO: Got $got, want $want"
+fi
+
+# Generate an identity and get it blessed by root using "identity bless --with"
+./identity generate other >other || FAIL
+got=$(./identity generate ignoreme | ./identity bless --with=other - child | ./identity print - | awk '/Name/ {print $3}')
+want="unknown/other/child"
+if [ "$got" != "$want" ]; then
+ FAIL "line $LINENO: Got $got, want $want"
+fi
+PASS