package account
import (
- "context"
"io/ioutil"
"os"
+ "reflect"
"strings"
"testing"
- dbm "github.com/tendermint/tmlibs/db"
-
+ "github.com/bytom/blockchain/pseudohsm"
+ "github.com/bytom/blockchain/signers"
"github.com/bytom/crypto/ed25519/chainkd"
- "github.com/bytom/database/leveldb"
+ "github.com/bytom/database"
"github.com/bytom/errors"
+ "github.com/bytom/event"
"github.com/bytom/protocol"
"github.com/bytom/testutil"
+ dbm "github.com/bytom/database/leveldb"
)
func TestCreateAccountWithUppercase(t *testing.T) {
m := mockAccountManager(t)
alias := "UPPER"
- account, err := m.Create(nil, []chainkd.XPub{testutil.TestXPub}, 1, alias)
+ account, err := m.Create([]chainkd.XPub{testutil.TestXPub}, 1, alias, signers.BIP0044)
if err != nil {
t.Fatal(err)
func TestCreateAccountWithSpaceTrimed(t *testing.T) {
m := mockAccountManager(t)
alias := " with space "
- account, err := m.Create(nil, []chainkd.XPub{testutil.TestXPub}, 1, alias)
+ account, err := m.Create([]chainkd.XPub{testutil.TestXPub}, 1, alias, signers.BIP0044)
if err != nil {
t.Fatal(err)
t.Fatal("created account alias should be lowercase")
}
- nilAccount, err := m.FindByAlias(nil, alias)
+ nilAccount, err := m.FindByAlias(alias)
if nilAccount != nil {
t.Fatal("expected nil")
}
- target, err := m.FindByAlias(nil, strings.ToLower(strings.TrimSpace(alias)))
+ target, err := m.FindByAlias(strings.ToLower(strings.TrimSpace(alias)))
if target == nil {
t.Fatal("expected Account, but got nil")
}
func TestCreateAccount(t *testing.T) {
m := mockAccountManager(t)
- ctx := context.Background()
-
- account, err := m.Create(ctx, []chainkd.XPub{testutil.TestXPub}, 1, "test-alias")
+ account, err := m.Create([]chainkd.XPub{testutil.TestXPub}, 1, "test-alias", signers.BIP0044)
if err != nil {
testutil.FatalErr(t, err)
}
- found, err := m.FindByID(ctx, account.ID)
+ found, err := m.FindByID(account.ID)
if err != nil {
t.Errorf("unexpected error %v", err)
}
func TestCreateAccountReusedAlias(t *testing.T) {
m := mockAccountManager(t)
- ctx := context.Background()
- m.createTestAccount(ctx, t, "test-alias", nil)
+ m.createTestAccount(t, "test-alias", nil)
- _, err := m.Create(ctx, []chainkd.XPub{testutil.TestXPub}, 1, "test-alias")
+ _, err := m.Create([]chainkd.XPub{testutil.TestXPub}, 1, "test-alias", signers.BIP0044)
if errors.Root(err) != ErrDuplicateAlias {
t.Errorf("expected %s when reusing an alias, got %v", ErrDuplicateAlias, err)
}
}
-func TestDeleteAccount(t *testing.T) {
+func TestUpdateAccountAlias(t *testing.T) {
+ oldAlias := "test-alias"
+ newAlias := "my-alias"
+
m := mockAccountManager(t)
- ctx := context.Background()
+ account := m.createTestAccount(t, oldAlias, nil)
+ if err := m.UpdateAccountAlias("testID", newAlias); err == nil {
+ t.Fatal("expected error when using an invalid account id")
+ }
- account1, err := m.Create(ctx, []chainkd.XPub{testutil.TestXPub}, 1, "test-alias1")
+ err := m.UpdateAccountAlias(account.ID, oldAlias)
+ if errors.Root(err) != ErrDuplicateAlias {
+ t.Errorf("expected %s when using a duplicate alias, got %v", ErrDuplicateAlias, err)
+ }
+
+ if err := m.UpdateAccountAlias(account.ID, newAlias); err != nil {
+ t.Errorf("expected account %v alias should be update", account)
+ }
+
+ updatedAccount, err := m.FindByID(account.ID)
if err != nil {
- testutil.FatalErr(t, err)
+ t.Errorf("unexpected error %v", err)
+ }
+
+ if updatedAccount.Alias != newAlias {
+ t.Fatalf("alias:\ngot: %v\nwant: %v", updatedAccount.Alias, newAlias)
}
- account2, err := m.Create(ctx, []chainkd.XPub{testutil.TestXPub}, 1, "test-alias2")
+ if _, err = m.FindByAlias(oldAlias); errors.Root(err) != ErrFindAccount {
+ t.Errorf("expected %s when using a old alias, got %v", ErrFindAccount, err)
+ }
+}
+
+func TestDeleteAccount(t *testing.T) {
+ m := mockAccountManager(t)
+
+ account1, err := m.Create([]chainkd.XPub{testutil.TestXPub}, 1, "test-alias1", signers.BIP0044)
if err != nil {
testutil.FatalErr(t, err)
}
- if err = m.DeleteAccount(account1.Alias); err != nil {
+ account2, err := m.Create([]chainkd.XPub{testutil.TestXPub}, 1, "test-alias2", signers.BIP0044)
+ if err != nil {
testutil.FatalErr(t, err)
}
- found, err := m.FindByID(ctx, account1.ID)
+ found, err := m.FindByID(account1.ID)
if err != nil {
t.Errorf("expected account %v should be deleted", found)
}
testutil.FatalErr(t, err)
}
- found, err = m.FindByID(ctx, account2.ID)
+ found, err = m.FindByID(account2.ID)
if err != nil {
t.Errorf("expected account %v should be deleted", found)
}
func TestFindByID(t *testing.T) {
m := mockAccountManager(t)
- ctx := context.Background()
- account := m.createTestAccount(ctx, t, "", nil)
+ account := m.createTestAccount(t, "", nil)
- found, err := m.FindByID(ctx, account.ID)
+ found, err := m.FindByID(account.ID)
if err != nil {
testutil.FatalErr(t, err)
}
func TestFindByAlias(t *testing.T) {
m := mockAccountManager(t)
- ctx := context.Background()
- account := m.createTestAccount(ctx, t, "some-alias", nil)
+ account := m.createTestAccount(t, "some-alias", nil)
- found, err := m.FindByAlias(ctx, "some-alias")
+ found, err := m.FindByAlias("some-alias")
if err != nil {
testutil.FatalErr(t, err)
}
}
}
+func TestGetAccountIndexKey(t *testing.T) {
+ dirPath, err := ioutil.TempDir(".", "TestAccount")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(dirPath)
+
+ hsm, err := pseudohsm.New(dirPath)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ xpub1, _, err := hsm.XCreate("TestAccountIndex1", "password", "en")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ xpub2, _, err := hsm.XCreate("TestAccountIndex2", "password", "en")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ xpubs1 := []chainkd.XPub{xpub1.XPub, xpub2.XPub}
+ xpubs2 := []chainkd.XPub{xpub2.XPub, xpub1.XPub}
+ if !reflect.DeepEqual(GetAccountIndexKey(xpubs1), GetAccountIndexKey(xpubs2)) {
+ t.Fatal("GetAccountIndexKey test err")
+ }
+
+ if reflect.DeepEqual(xpubs1, xpubs2) {
+ t.Fatal("GetAccountIndexKey test err")
+ }
+}
+
func mockAccountManager(t *testing.T) *Manager {
dirPath, err := ioutil.TempDir(".", "")
if err != nil {
}
defer os.RemoveAll(dirPath)
- testDB := dbm.NewDB("testdb", "leveldb", "temp")
- defer os.RemoveAll("temp")
+ testDB := dbm.NewDB("testdb", "memdb", dirPath)
+ dispatcher := event.NewDispatcher()
- store := leveldb.NewStore(testDB)
- txPool := protocol.NewTxPool()
+ store := database.NewStore(testDB)
+ txPool := protocol.NewTxPool(store, dispatcher)
chain, err := protocol.NewChain(store, txPool)
if err != nil {
t.Fatal(err)
return NewManager(testDB, chain)
}
-func (m *Manager) createTestAccount(ctx context.Context, t testing.TB, alias string, tags map[string]interface{}) *Account {
- account, err := m.Create(ctx, []chainkd.XPub{testutil.TestXPub}, 1, alias)
+func (m *Manager) createTestAccount(t testing.TB, alias string, tags map[string]interface{}) *Account {
+ account, err := m.Create([]chainkd.XPub{testutil.TestXPub}, 1, alias, signers.BIP0044)
if err != nil {
testutil.FatalErr(t, err)
}