@cryptotaxi247 / kubo / commits / e8b20b928

address comments and add some tests

License: MIT Signed-off-by: Jeromy <why@ipfs.io>

Jeromy committed Dec 6, 2016 at 11:20 UTC e8b20b9283e6d0846a7fb89d0d398318ccc2e8fc
2 files changed +179
keystore/keystore.go
+2
@@ -69,6 +69,8 @@ func (ks *FSKeystore) Put(name string, k ci.PrivKey) error {
69 _, err = os.Stat(kp)
70 if err == nil {
71 return ErrKeyExists
72 + } else if !os.IsNotExist(err) {
73 + return err
74 }
75
76 fi, err := os.Create(kp)
keystore/keystore_test.go new
+177
@@ -0,0 +1,177 @@
1 +package keystore
2 +
3 +import (
4 + "fmt"
5 + "io/ioutil"
6 + "math/rand"
7 + "sort"
8 + "testing"
9 +
10 + ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto"
11 +)
12 +
13 +type rr struct{}
14 +
15 +func (rr rr) Read(b []byte) (int, error) {
16 + return rand.Read(b)
17 +}
18 +
19 +func privKeyOrFatal(t *testing.T) ci.PrivKey {
20 + priv, _, err := ci.GenerateEd25519Key(rr{})
21 + if err != nil {
22 + t.Fatal(err)
23 + }
24 + return priv
25 +}
26 +
27 +func TestKeystoreBasics(t *testing.T) {
28 + tdir, err := ioutil.TempDir("", "keystore-test")
29 + if err != nil {
30 + t.Fatal(err)
31 + }
32 +
33 + ks, err := NewFSKeystore(tdir)
34 + if err != nil {
35 + t.Fatal(err)
36 + }
37 +
38 + l, err := ks.List()
39 + if err != nil {
40 + t.Fatal(err)
41 + }
42 +
43 + if len(l) != 0 {
44 + t.Fatal("expected no keys")
45 + }
46 +
47 + k1 := privKeyOrFatal(t)
48 + k2 := privKeyOrFatal(t)
49 + k3 := privKeyOrFatal(t)
50 + k4 := privKeyOrFatal(t)
51 +
52 + err = ks.Put("foo", k1)
53 + if err != nil {
54 + t.Fatal(err)
55 + }
56 +
57 + err = ks.Put("bar", k2)
58 + if err != nil {
59 + t.Fatal(err)
60 + }
61 +
62 + l, err = ks.List()
63 + if err != nil {
64 + t.Fatal(err)
65 + }
66 +
67 + sort.Strings(l)
68 + if l[0] != "bar" || l[1] != "foo" {
69 + t.Fatal("wrong entries listed")
70 + }
71 +
72 + if err := assertDirContents(tdir, []string{"foo", "bar"}); err != nil {
73 + t.Fatal(err)
74 + }
75 +
76 + err = ks.Put("foo", k3)
77 + if err == nil {
78 + t.Fatal("should not be able to overwrite key")
79 + }
80 +
81 + if err := assertDirContents(tdir, []string{"foo", "bar"}); err != nil {
82 + t.Fatal(err)
83 + }
84 +
85 + if err := ks.Delete("bar"); err != nil {
86 + t.Fatal(err)
87 + }
88 +
89 + if err := assertDirContents(tdir, []string{"foo"}); err != nil {
90 + t.Fatal(err)
91 + }
92 +
93 + if err := ks.Put("beep", k3); err != nil {
94 + t.Fatal(err)
95 + }
96 +
97 + if err := ks.Put("boop", k4); err != nil {
98 + t.Fatal(err)
99 + }
100 +
101 + if err := assertDirContents(tdir, []string{"foo", "beep", "boop"}); err != nil {
102 + t.Fatal(err)
103 + }
104 +
105 + if err := assertGetKey(ks, "foo", k1); err != nil {
106 + t.Fatal(err)
107 + }
108 +
109 + if err := assertGetKey(ks, "beep", k3); err != nil {
110 + t.Fatal(err)
111 + }
112 +
113 + if err := assertGetKey(ks, "boop", k4); err != nil {
114 + t.Fatal(err)
115 + }
116 +
117 + if err := ks.Put("..///foo/", k1); err == nil {
118 + t.Fatal("shouldnt be able to put a poorly named key")
119 + }
120 +
121 + if err := ks.Put("", k1); err == nil {
122 + t.Fatal("shouldnt be able to put a key with no name")
123 + }
124 +
125 + if err := ks.Put(".foo", k1); err == nil {
126 + t.Fatal("shouldnt be able to put a key with a 'hidden' name")
127 + }
128 +}
129 +
130 +func TestMakeKeystoreNoDir(t *testing.T) {
131 + _, err := NewFSKeystore("/this/is/not/a/real/dir")
132 + if err == nil {
133 + t.Fatal("shouldnt be able to make a keystore in a nonexistant directory")
134 + }
135 +}
136 +
137 +func assertGetKey(ks Keystore, name string, exp ci.PrivKey) error {
138 + out_k, err := ks.Get(name)
139 + if err != nil {
140 + return err
141 + }
142 +
143 + if !out_k.Equals(exp) {
144 + return fmt.Errorf("key we got out didnt match expectation")
145 + }
146 +
147 + return nil
148 +}
149 +
150 +func assertDirContents(dir string, exp []string) error {
151 + finfos, err := ioutil.ReadDir(dir)
152 + if err != nil {
153 + return err
154 + }
155 +
156 + if len(finfos) != len(exp) {
157 + return fmt.Errorf("Expected %d directory entries", len(exp))
158 + }
159 +
160 + var names []string
161 + for _, fi := range finfos {
162 + names = append(names, fi.Name())
163 + }
164 +
165 + sort.Strings(names)
166 + sort.Strings(exp)
167 + if len(names) != len(exp) {
168 + return fmt.Errorf("directory had wrong number of entries in it")
169 + }
170 +
171 + for i, v := range names {
172 + if v != exp[i] {
173 + return fmt.Errorf("had wrong entry in directory")
174 + }
175 + }
176 + return nil
177 +}