12 "github.com/vapor/consensus"
13 "github.com/vapor/crypto/ed25519/chainkd"
14 "github.com/vapor/database"
15 dbm "github.com/vapor/database/leveldb"
16 "github.com/vapor/event"
17 "github.com/vapor/protocol"
18 "github.com/vapor/testutil"
21 func TestDefineAssetWithLowercase(t *testing.T) {
22 reg := mockNewRegistry(t)
24 asset, err := reg.Define([]chainkd.XPub{testutil.TestXPub}, 1, nil, 0, alias, nil)
28 if *asset.Alias != strings.ToUpper(alias) {
29 t.Fatal("created asset alias should be uppercase")
33 func TestDefineAssetWithSpaceTrimed(t *testing.T) {
34 reg := mockNewRegistry(t)
35 alias := " WITH SPACE "
36 asset, err := reg.Define([]chainkd.XPub{testutil.TestXPub}, 1, nil, 0, alias, nil)
40 if *asset.Alias != strings.TrimSpace(alias) {
41 t.Fatal("created asset alias should be uppercase")
45 func TestDefineAsset(t *testing.T) {
46 ctx := context.Background()
47 reg := mockNewRegistry(t)
48 asset, err := reg.Define([]chainkd.XPub{testutil.TestXPub}, 1, nil, 0, "asset-alias", nil)
50 testutil.FatalErr(t, err)
53 limitAsset, err := reg.Define([]chainkd.XPub{testutil.TestXPub}, 1, nil, 100, "limit-asset", nil)
55 testutil.FatalErr(t, err)
58 assets := []*Asset{asset, limitAsset}
59 for _, ass := range assets {
60 found, err := reg.FindByID(ctx, &ass.AssetID)
62 t.Errorf("unexpected error %v", err)
65 if !testutil.DeepEqual(ass, found) {
66 t.Errorf("expected asset %v to be recorded as %v", ass, found)
71 func TestDefineBtmAsset(t *testing.T) {
72 reg := mockNewRegistry(t)
73 _, err := reg.Define([]chainkd.XPub{testutil.TestXPub}, 1, nil, 0, consensus.BTMAlias, nil)
75 testutil.FatalErr(t, err)
79 func TestFindAssetByID(t *testing.T) {
80 ctx := context.Background()
81 reg := mockNewRegistry(t)
82 keys := []chainkd.XPub{testutil.TestXPub}
83 asset, err := reg.Define(keys, 1, nil, 0, "TESTASSET", nil)
85 testutil.FatalErr(t, err)
88 found, err := reg.FindByID(ctx, &asset.AssetID)
90 testutil.FatalErr(t, err)
93 if !testutil.DeepEqual(asset, found) {
94 t.Errorf("expected %v and %v to match", asset, found)
98 func TestUpdateAssetAlias(t *testing.T) {
99 reg := mockNewRegistry(t)
101 oldAlias := "OLD_ALIAS"
102 newAlias := "NEW_ALIAS"
104 asset, err := reg.Define([]chainkd.XPub{testutil.TestXPub}, 1, nil, 0, oldAlias, nil)
106 testutil.FatalErr(t, err)
109 if reg.UpdateAssetAlias(asset.AssetID.String(), newAlias) != nil {
110 testutil.FatalErr(t, err)
113 asset1, err := reg.FindByAlias(newAlias)
115 testutil.FatalErr(t, err)
118 gotAlias := *asset1.Alias
119 if !reflect.DeepEqual(gotAlias, newAlias) {
120 t.Fatalf("alias:\ngot: %v\nwant: %v", gotAlias, newAlias)
124 type SortByAssetsAlias []*Asset
126 func (a SortByAssetsAlias) Len() int { return len(a) }
127 func (a SortByAssetsAlias) Less(i, j int) bool {
128 return strings.Compare(*a[i].Alias, *a[j].Alias) <= 0
130 func (a SortByAssetsAlias) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
132 func TestListAssets(t *testing.T) {
133 reg := mockNewRegistry(t)
135 firstAlias := "FIRST_ALIAS"
136 secondAlias := "SECOND_ALIAS"
138 firstAsset, err := reg.Define([]chainkd.XPub{testutil.TestXPub}, 1, nil, 0, firstAlias, nil)
140 testutil.FatalErr(t, err)
143 secondAsset, err := reg.Define([]chainkd.XPub{testutil.TestXPub}, 1, nil, 0, secondAlias, nil)
145 testutil.FatalErr(t, err)
148 wantAssets := []*Asset{DefaultNativeAsset, firstAsset, secondAsset}
150 gotAssets, err := reg.ListAssets("")
152 testutil.FatalErr(t, err)
154 sort.Sort(SortByAssetsAlias(wantAssets))
155 sort.Sort(SortByAssetsAlias(gotAssets))
156 if !testutil.DeepEqual(gotAssets, wantAssets) {
157 t.Fatalf("got:\ngot: %v\nwant: %v", gotAssets, wantAssets)
161 func mockChain(testDB dbm.DB) (*protocol.Chain, error) {
162 store := database.NewStore(testDB)
163 dispatcher := event.NewDispatcher()
164 txPool := protocol.NewTxPool(store, dispatcher)
165 chain, err := protocol.NewChain(store, txPool)
172 func mockNewRegistry(t *testing.T) *Registry {
173 dirPath, err := ioutil.TempDir(".", "")
177 defer os.RemoveAll(dirPath)
179 testDB := dbm.NewDB("testdb", "leveldb", "temp")
180 defer os.RemoveAll("temp")
182 chain, err := mockChain(testDB)
187 return NewRegistry(testDB, chain)