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