10 "github.com/vapor/blockchain/pseudohsm"
11 "github.com/vapor/blockchain/signers"
12 "github.com/vapor/config"
13 "github.com/vapor/crypto/ed25519/chainkd"
14 "github.com/vapor/database"
15 dbm "github.com/vapor/database/leveldb"
16 "github.com/vapor/errors"
17 "github.com/vapor/event"
18 "github.com/vapor/protocol"
19 "github.com/vapor/testutil"
22 func TestCreateAccountWithUppercase(t *testing.T) {
23 m := mockAccountManager(t)
25 account, err := m.Create([]chainkd.XPub{testutil.TestXPub}, 1, alias, signers.BIP0044)
31 if account.Alias != strings.ToLower(alias) {
32 t.Fatal("created account alias should be lowercase")
36 func TestCreateAccountWithSpaceTrimed(t *testing.T) {
37 m := mockAccountManager(t)
38 alias := " with space "
39 account, err := m.Create([]chainkd.XPub{testutil.TestXPub}, 1, alias, signers.BIP0044)
45 if account.Alias != strings.TrimSpace(alias) {
46 t.Fatal("created account alias should be lowercase")
49 nilAccount, err := m.FindByAlias(alias)
50 if nilAccount != nil {
51 t.Fatal("expected nil")
54 target, err := m.FindByAlias(strings.ToLower(strings.TrimSpace(alias)))
56 t.Fatal("expected Account, but got nil")
60 func TestCreateAccount(t *testing.T) {
61 m := mockAccountManager(t)
62 account, err := m.Create([]chainkd.XPub{testutil.TestXPub}, 1, "test-alias", signers.BIP0044)
64 testutil.FatalErr(t, err)
67 found, err := m.FindByID(account.ID)
69 t.Errorf("unexpected error %v", err)
71 if !testutil.DeepEqual(account, found) {
72 t.Errorf("expected account %v to be recorded as %v", account, found)
76 func TestCreateAccountReusedAlias(t *testing.T) {
77 m := mockAccountManager(t)
78 m.createTestAccount(t, "test-alias", nil)
80 _, err := m.Create([]chainkd.XPub{testutil.TestXPub}, 1, "test-alias", signers.BIP0044)
81 if errors.Root(err) != ErrDuplicateAlias {
82 t.Errorf("expected %s when reusing an alias, got %v", ErrDuplicateAlias, err)
86 func TestUpdateAccountAlias(t *testing.T) {
87 oldAlias := "test-alias"
88 newAlias := "my-alias"
90 m := mockAccountManager(t)
91 account := m.createTestAccount(t, oldAlias, nil)
92 if err := m.UpdateAccountAlias("testID", newAlias); err == nil {
93 t.Fatal("expected error when using an invalid account id")
96 err := m.UpdateAccountAlias(account.ID, oldAlias)
97 if errors.Root(err) != ErrDuplicateAlias {
98 t.Errorf("expected %s when using a duplicate alias, got %v", ErrDuplicateAlias, err)
101 if err := m.UpdateAccountAlias(account.ID, newAlias); err != nil {
102 t.Errorf("expected account %v alias should be update", account)
105 updatedAccount, err := m.FindByID(account.ID)
107 t.Errorf("unexpected error %v", err)
110 if updatedAccount.Alias != newAlias {
111 t.Fatalf("alias:\ngot: %v\nwant: %v", updatedAccount.Alias, newAlias)
114 if _, err = m.FindByAlias(oldAlias); errors.Root(err) != ErrFindAccount {
115 t.Errorf("expected %s when using a old alias, got %v", ErrFindAccount, err)
119 func TestDeleteAccount(t *testing.T) {
120 m := mockAccountManager(t)
122 account1, err := m.Create([]chainkd.XPub{testutil.TestXPub}, 1, "test-alias1", signers.BIP0044)
124 testutil.FatalErr(t, err)
127 account2, err := m.Create([]chainkd.XPub{testutil.TestXPub}, 1, "test-alias2", signers.BIP0044)
129 testutil.FatalErr(t, err)
132 found, err := m.FindByID(account1.ID)
134 t.Errorf("expected account %v should be deleted", found)
137 if err = m.DeleteAccount(account2.ID); err != nil {
138 testutil.FatalErr(t, err)
141 found, err = m.FindByID(account2.ID)
143 t.Errorf("expected account %v should be deleted", found)
147 func TestFindByID(t *testing.T) {
148 m := mockAccountManager(t)
149 account := m.createTestAccount(t, "", nil)
151 found, err := m.FindByID(account.ID)
153 testutil.FatalErr(t, err)
156 if !testutil.DeepEqual(account, found) {
157 t.Errorf("expected found account to be %v, instead found %v", account, found)
161 func TestFindByAlias(t *testing.T) {
162 m := mockAccountManager(t)
163 account := m.createTestAccount(t, "some-alias", nil)
165 found, err := m.FindByAlias("some-alias")
167 testutil.FatalErr(t, err)
170 if !testutil.DeepEqual(account, found) {
171 t.Errorf("expected found account to be %v, instead found %v", account, found)
175 func TestGetAccountIndexKey(t *testing.T) {
176 dirPath, err := ioutil.TempDir(".", "TestAccount")
180 defer os.RemoveAll(dirPath)
182 hsm, err := pseudohsm.New(dirPath)
187 xpub1, _, err := hsm.XCreate("TestAccountIndex1", "password", "en")
192 xpub2, _, err := hsm.XCreate("TestAccountIndex2", "password", "en")
197 xpubs1 := []chainkd.XPub{xpub1.XPub, xpub2.XPub}
198 xpubs2 := []chainkd.XPub{xpub2.XPub, xpub1.XPub}
199 if !reflect.DeepEqual(GetAccountIndexKey(xpubs1), GetAccountIndexKey(xpubs2)) {
200 t.Fatal("GetAccountIndexKey test err")
203 if reflect.DeepEqual(xpubs1, xpubs2) {
204 t.Fatal("GetAccountIndexKey test err")
208 func mockAccountManager(t *testing.T) *Manager {
209 dirPath, err := ioutil.TempDir(".", "")
213 defer os.RemoveAll(dirPath)
215 testDB := dbm.NewDB("testdb", "memdb", dirPath)
216 dispatcher := event.NewDispatcher()
217 store := database.NewStore(testDB)
218 txPool := protocol.NewTxPool(store, dispatcher)
219 config.CommonConfig = config.DefaultConfig()
220 chain, err := protocol.NewChain(store, txPool, dispatcher)
225 return NewManager(testDB, chain)
228 func (m *Manager) createTestAccount(t testing.TB, alias string, tags map[string]interface{}) *Account {
229 account, err := m.Create([]chainkd.XPub{testutil.TestXPub}, 1, alias, signers.BIP0044)
231 testutil.FatalErr(t, err)