OSDN Git Service

new repo
[bytom/vapor.git] / asset / asset_test.go
1 package asset
2
3 import (
4         "context"
5         "io/ioutil"
6         "os"
7         "reflect"
8         "sort"
9         "strings"
10         "testing"
11
12         dbm "github.com/tendermint/tmlibs/db"
13
14         "github.com/vapor/consensus"
15         "github.com/vapor/crypto/ed25519/chainkd"
16         "github.com/vapor/database/leveldb"
17         "github.com/vapor/protocol"
18         "github.com/vapor/testutil"
19 )
20
21 func TestDefineAssetWithLowercase(t *testing.T) {
22         reg := mockNewRegistry(t)
23         alias := "lower"
24         asset, err := reg.Define([]chainkd.XPub{testutil.TestXPub}, 1, nil, alias, nil)
25         if err != nil {
26                 t.Fatal(err)
27         }
28         if *asset.Alias != strings.ToUpper(alias) {
29                 t.Fatal("created asset alias should be uppercase")
30         }
31 }
32
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, alias, nil)
37         if err != nil {
38                 t.Fatal(err)
39         }
40         if *asset.Alias != strings.TrimSpace(alias) {
41                 t.Fatal("created asset alias should be uppercase")
42         }
43 }
44
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, "asset-alias", nil)
49         if err != nil {
50                 testutil.FatalErr(t, err)
51         }
52
53         found, err := reg.FindByID(ctx, &asset.AssetID)
54         if err != nil {
55                 t.Errorf("unexpected error %v", err)
56         }
57
58         if !testutil.DeepEqual(asset, found) {
59                 t.Errorf("expected asset %v to be recorded as %v", asset, found)
60         }
61 }
62
63 func TestDefineBtmAsset(t *testing.T) {
64         reg := mockNewRegistry(t)
65         _, err := reg.Define([]chainkd.XPub{testutil.TestXPub}, 1, nil, consensus.BTMAlias, nil)
66         if err == nil {
67                 testutil.FatalErr(t, err)
68         }
69 }
70
71 func TestFindAssetByID(t *testing.T) {
72         ctx := context.Background()
73         reg := mockNewRegistry(t)
74         keys := []chainkd.XPub{testutil.TestXPub}
75         asset, err := reg.Define(keys, 1, nil, "TESTASSET", nil)
76         if err != nil {
77                 testutil.FatalErr(t, err)
78
79         }
80         found, err := reg.FindByID(ctx, &asset.AssetID)
81         if err != nil {
82                 testutil.FatalErr(t, err)
83         }
84
85         if !testutil.DeepEqual(asset, found) {
86                 t.Errorf("expected %v and %v to match", asset, found)
87         }
88 }
89
90 func TestUpdateAssetAlias(t *testing.T) {
91         reg := mockNewRegistry(t)
92
93         oldAlias := "OLD_ALIAS"
94         newAlias := "NEW_ALIAS"
95
96         asset, err := reg.Define([]chainkd.XPub{testutil.TestXPub}, 1, nil, oldAlias, nil)
97         if err != nil {
98                 testutil.FatalErr(t, err)
99         }
100
101         if reg.UpdateAssetAlias(asset.AssetID.String(), newAlias) != nil {
102                 testutil.FatalErr(t, err)
103         }
104
105         asset1, err := reg.FindByAlias(newAlias)
106         if err != nil {
107                 testutil.FatalErr(t, err)
108         }
109
110         gotAlias := *asset1.Alias
111         if !reflect.DeepEqual(gotAlias, newAlias) {
112                 t.Fatalf("alias:\ngot:  %v\nwant: %v", gotAlias, newAlias)
113         }
114 }
115
116 type SortByAssetsAlias []*Asset
117
118 func (a SortByAssetsAlias) Len() int { return len(a) }
119 func (a SortByAssetsAlias) Less(i, j int) bool {
120         return strings.Compare(*a[i].Alias, *a[j].Alias) <= 0
121 }
122 func (a SortByAssetsAlias) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
123
124 func TestListAssets(t *testing.T) {
125         reg := mockNewRegistry(t)
126
127         firstAlias := "FIRST_ALIAS"
128         secondAlias := "SECOND_ALIAS"
129
130         firstAsset, err := reg.Define([]chainkd.XPub{testutil.TestXPub}, 1, nil, firstAlias, nil)
131         if err != nil {
132                 testutil.FatalErr(t, err)
133         }
134
135         secondAsset, err := reg.Define([]chainkd.XPub{testutil.TestXPub}, 1, nil, secondAlias, nil)
136         if err != nil {
137                 testutil.FatalErr(t, err)
138         }
139
140         wantAssets := []*Asset{DefaultNativeAsset, firstAsset, secondAsset}
141
142         gotAssets, err := reg.ListAssets("")
143         if err != nil {
144                 testutil.FatalErr(t, err)
145         }
146         sort.Sort(SortByAssetsAlias(wantAssets))
147         sort.Sort(SortByAssetsAlias(gotAssets))
148         if !testutil.DeepEqual(gotAssets, wantAssets) {
149                 t.Fatalf("got:\ngot:  %v\nwant: %v", gotAssets, wantAssets)
150         }
151 }
152
153 func mockChain(testDB dbm.DB) (*protocol.Chain, error) {
154         store := leveldb.NewStore(testDB)
155         txPool := protocol.NewTxPool(store)
156         chain, err := protocol.NewChain(store, txPool)
157         if err != nil {
158                 return nil, err
159         }
160         return chain, nil
161 }
162
163 func mockNewRegistry(t *testing.T) *Registry {
164         dirPath, err := ioutil.TempDir(".", "")
165         if err != nil {
166                 t.Fatal(err)
167         }
168         defer os.RemoveAll(dirPath)
169
170         testDB := dbm.NewDB("testdb", "leveldb", "temp")
171         defer os.RemoveAll("temp")
172
173         chain, err := mockChain(testDB)
174         if err != nil {
175                 t.Fatal(err)
176         }
177
178         return NewRegistry(testDB, chain)
179 }