OSDN Git Service

new repo
[bytom/vapor.git] / account / accounts_test.go
1 package account
2
3 import (
4         "io/ioutil"
5         "os"
6         "reflect"
7         "strings"
8         "testing"
9
10         dbm "github.com/tendermint/tmlibs/db"
11
12         "github.com/vapor/blockchain/pseudohsm"
13         "github.com/vapor/blockchain/signers"
14         "github.com/vapor/crypto/ed25519/chainkd"
15         "github.com/vapor/database/leveldb"
16         "github.com/vapor/errors"
17         "github.com/vapor/protocol"
18         "github.com/vapor/testutil"
19 )
20
21 func TestCreateAccountWithUppercase(t *testing.T) {
22         m := mockAccountManager(t)
23         alias := "UPPER"
24         account, err := m.Create([]chainkd.XPub{testutil.TestXPub}, 1, alias, signers.BIP0044)
25
26         if err != nil {
27                 t.Fatal(err)
28         }
29
30         if account.Alias != strings.ToLower(alias) {
31                 t.Fatal("created account alias should be lowercase")
32         }
33 }
34
35 func TestCreateAccountWithSpaceTrimed(t *testing.T) {
36         m := mockAccountManager(t)
37         alias := " with space "
38         account, err := m.Create([]chainkd.XPub{testutil.TestXPub}, 1, alias, signers.BIP0044)
39
40         if err != nil {
41                 t.Fatal(err)
42         }
43
44         if account.Alias != strings.TrimSpace(alias) {
45                 t.Fatal("created account alias should be lowercase")
46         }
47
48         nilAccount, err := m.FindByAlias(alias)
49         if nilAccount != nil {
50                 t.Fatal("expected nil")
51         }
52
53         target, err := m.FindByAlias(strings.ToLower(strings.TrimSpace(alias)))
54         if target == nil {
55                 t.Fatal("expected Account, but got nil")
56         }
57 }
58
59 func TestCreateAccount(t *testing.T) {
60         m := mockAccountManager(t)
61         account, err := m.Create([]chainkd.XPub{testutil.TestXPub}, 1, "test-alias", signers.BIP0044)
62         if err != nil {
63                 testutil.FatalErr(t, err)
64         }
65
66         found, err := m.FindByID(account.ID)
67         if err != nil {
68                 t.Errorf("unexpected error %v", err)
69         }
70         if !testutil.DeepEqual(account, found) {
71                 t.Errorf("expected account %v to be recorded as %v", account, found)
72         }
73 }
74
75 func TestCreateAccountReusedAlias(t *testing.T) {
76         m := mockAccountManager(t)
77         m.createTestAccount(t, "test-alias", nil)
78
79         _, err := m.Create([]chainkd.XPub{testutil.TestXPub}, 1, "test-alias", signers.BIP0044)
80         if errors.Root(err) != ErrDuplicateAlias {
81                 t.Errorf("expected %s when reusing an alias, got %v", ErrDuplicateAlias, err)
82         }
83 }
84
85 func TestUpdateAccountAlias(t *testing.T) {
86         oldAlias := "test-alias"
87         newAlias := "my-alias"
88
89         m := mockAccountManager(t)
90         account := m.createTestAccount(t, oldAlias, nil)
91         if err := m.UpdateAccountAlias("testID", newAlias); err == nil {
92                 t.Fatal("expected error when using an invalid account id")
93         }
94
95         err := m.UpdateAccountAlias(account.ID, oldAlias)
96         if errors.Root(err) != ErrDuplicateAlias {
97                 t.Errorf("expected %s when using a duplicate alias, got %v", ErrDuplicateAlias, err)
98         }
99
100         if err := m.UpdateAccountAlias(account.ID, newAlias); err != nil {
101                 t.Errorf("expected account %v alias should be update", account)
102         }
103
104         updatedAccount, err := m.FindByID(account.ID)
105         if err != nil {
106                 t.Errorf("unexpected error %v", err)
107         }
108
109         if updatedAccount.Alias != newAlias {
110                 t.Fatalf("alias:\ngot:  %v\nwant: %v", updatedAccount.Alias, newAlias)
111         }
112
113         if _, err = m.FindByAlias(oldAlias); errors.Root(err) != ErrFindAccount {
114                 t.Errorf("expected %s when using a old alias, got %v", ErrFindAccount, err)
115         }
116 }
117
118 func TestDeleteAccount(t *testing.T) {
119         m := mockAccountManager(t)
120
121         account1, err := m.Create([]chainkd.XPub{testutil.TestXPub}, 1, "test-alias1", signers.BIP0044)
122         if err != nil {
123                 testutil.FatalErr(t, err)
124         }
125
126         account2, err := m.Create([]chainkd.XPub{testutil.TestXPub}, 1, "test-alias2", signers.BIP0044)
127         if err != nil {
128                 testutil.FatalErr(t, err)
129         }
130
131         found, err := m.FindByID(account1.ID)
132         if err != nil {
133                 t.Errorf("expected account %v should be deleted", found)
134         }
135
136         if err = m.DeleteAccount(account2.ID); err != nil {
137                 testutil.FatalErr(t, err)
138         }
139
140         found, err = m.FindByID(account2.ID)
141         if err != nil {
142                 t.Errorf("expected account %v should be deleted", found)
143         }
144 }
145
146 func TestFindByID(t *testing.T) {
147         m := mockAccountManager(t)
148         account := m.createTestAccount(t, "", nil)
149
150         found, err := m.FindByID(account.ID)
151         if err != nil {
152                 testutil.FatalErr(t, err)
153         }
154
155         if !testutil.DeepEqual(account, found) {
156                 t.Errorf("expected found account to be %v, instead found %v", account, found)
157         }
158 }
159
160 func TestFindByAlias(t *testing.T) {
161         m := mockAccountManager(t)
162         account := m.createTestAccount(t, "some-alias", nil)
163
164         found, err := m.FindByAlias("some-alias")
165         if err != nil {
166                 testutil.FatalErr(t, err)
167         }
168
169         if !testutil.DeepEqual(account, found) {
170                 t.Errorf("expected found account to be %v, instead found %v", account, found)
171         }
172 }
173
174 func TestGetAccountIndexKey(t *testing.T) {
175         dirPath, err := ioutil.TempDir(".", "TestAccount")
176         if err != nil {
177                 t.Fatal(err)
178         }
179         defer os.RemoveAll(dirPath)
180
181         hsm, err := pseudohsm.New(dirPath)
182         if err != nil {
183                 t.Fatal(err)
184         }
185
186         xpub1, _, err := hsm.XCreate("TestAccountIndex1", "password", "en")
187         if err != nil {
188                 t.Fatal(err)
189         }
190
191         xpub2, _, err := hsm.XCreate("TestAccountIndex2", "password", "en")
192         if err != nil {
193                 t.Fatal(err)
194         }
195
196         xpubs1 := []chainkd.XPub{xpub1.XPub, xpub2.XPub}
197         xpubs2 := []chainkd.XPub{xpub2.XPub, xpub1.XPub}
198         if !reflect.DeepEqual(GetAccountIndexKey(xpubs1), GetAccountIndexKey(xpubs2)) {
199                 t.Fatal("GetAccountIndexKey test err")
200         }
201
202         if reflect.DeepEqual(xpubs1, xpubs2) {
203                 t.Fatal("GetAccountIndexKey test err")
204         }
205 }
206
207 func mockAccountManager(t *testing.T) *Manager {
208         dirPath, err := ioutil.TempDir(".", "")
209         if err != nil {
210                 t.Fatal(err)
211         }
212         defer os.RemoveAll(dirPath)
213
214         testDB := dbm.NewDB("testdb", "memdb", "temp")
215         defer os.RemoveAll("temp")
216
217         store := leveldb.NewStore(testDB)
218         txPool := protocol.NewTxPool(store)
219         chain, err := protocol.NewChain(store, txPool)
220         if err != nil {
221                 t.Fatal(err)
222         }
223
224         return NewManager(testDB, chain)
225 }
226
227 func (m *Manager) createTestAccount(t testing.TB, alias string, tags map[string]interface{}) *Account {
228         account, err := m.Create([]chainkd.XPub{testutil.TestXPub}, 1, alias, signers.BIP0044)
229         if err != nil {
230                 testutil.FatalErr(t, err)
231         }
232
233         return account
234
235 }