OSDN Git Service

Merge branch 'dev' into backup
[bytom/bytom.git] / asset / asset_test.go
1 package asset
2
3 import (
4         "context"
5         "io/ioutil"
6         "os"
7         "reflect"
8         "strings"
9         "testing"
10
11         dbm "github.com/tendermint/tmlibs/db"
12
13         "github.com/bytom/consensus"
14         "github.com/bytom/crypto/ed25519/chainkd"
15         "github.com/bytom/database/leveldb"
16         "github.com/bytom/protocol"
17         "github.com/bytom/testutil"
18 )
19
20 func TestDefineAssetWithLowercase(t *testing.T) {
21         reg := mockNewRegistry(t)
22         alias := "lower"
23         asset, err := reg.Define([]chainkd.XPub{testutil.TestXPub}, 1, nil, alias)
24         if err != nil {
25                 t.Fatal(err)
26         }
27         if *asset.Alias != strings.ToUpper(alias) {
28                 t.Fatal("created asset alias should be uppercase")
29         }
30 }
31
32 func TestDefineAssetWithSpaceTrimed(t *testing.T) {
33         reg := mockNewRegistry(t)
34         alias := " WITH SPACE "
35         asset, err := reg.Define([]chainkd.XPub{testutil.TestXPub}, 1, nil, alias)
36         if err != nil {
37                 t.Fatal(err)
38         }
39         if *asset.Alias != strings.TrimSpace(alias) {
40                 t.Fatal("created asset alias should be uppercase")
41         }
42 }
43
44 func TestDefineAsset(t *testing.T) {
45         ctx := context.Background()
46         reg := mockNewRegistry(t)
47         asset, err := reg.Define([]chainkd.XPub{testutil.TestXPub}, 1, nil, "asset-alias")
48         if err != nil {
49                 testutil.FatalErr(t, err)
50         }
51
52         found, err := reg.FindByID(ctx, &asset.AssetID)
53         if err != nil {
54                 t.Errorf("unexpected error %v", err)
55         }
56
57         if !testutil.DeepEqual(asset, found) {
58                 t.Errorf("expected asset %v to be recorded as %v", asset, found)
59         }
60 }
61
62 func TestDefineBtmAsset(t *testing.T) {
63         reg := mockNewRegistry(t)
64         _, err := reg.Define([]chainkd.XPub{testutil.TestXPub}, 1, nil, consensus.BTMAlias)
65         if err == nil {
66                 testutil.FatalErr(t, err)
67         }
68 }
69
70 func TestFindAssetByID(t *testing.T) {
71         ctx := context.Background()
72         reg := mockNewRegistry(t)
73         keys := []chainkd.XPub{testutil.TestXPub}
74         asset, err := reg.Define(keys, 1, nil, "TESTASSET")
75         if err != nil {
76                 testutil.FatalErr(t, err)
77
78         }
79         found, err := reg.FindByID(ctx, &asset.AssetID)
80         if err != nil {
81                 testutil.FatalErr(t, err)
82         }
83
84         if !testutil.DeepEqual(asset, found) {
85                 t.Errorf("expected %v and %v to match", asset, found)
86         }
87 }
88
89 func TestUpdateAssetAlias(t *testing.T) {
90         ctx := context.Background()
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)
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(ctx, 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 func TestListAssets(t *testing.T) {
117         reg := mockNewRegistry(t)
118
119         firstAlias := "FIRST_ALIAS"
120         secondAlias := "SECOND_ALIAS"
121
122         firstAsset, err := reg.Define([]chainkd.XPub{testutil.TestXPub}, 1, nil, firstAlias)
123         if err != nil {
124                 testutil.FatalErr(t, err)
125         }
126
127         secondAsset, err := reg.Define([]chainkd.XPub{testutil.TestXPub}, 1, nil, secondAlias)
128         if err != nil {
129                 testutil.FatalErr(t, err)
130         }
131
132         wantAssets := []*Asset{DefaultNativeAsset, firstAsset, secondAsset}
133
134         gotAssets, err := reg.ListAssets()
135         if err != nil {
136                 testutil.FatalErr(t, err)
137         }
138
139         if !testutil.DeepEqual(gotAssets, wantAssets) {
140                 t.Fatalf("got:\ngot:  %v\nwant: %v", gotAssets, wantAssets)
141         }
142 }
143
144 func mockChain(testDB dbm.DB) (*protocol.Chain, error) {
145         store := leveldb.NewStore(testDB)
146         txPool := protocol.NewTxPool()
147         chain, err := protocol.NewChain(store, txPool)
148         if err != nil {
149                 return nil, err
150         }
151         return chain, nil
152 }
153
154 func mockNewRegistry(t *testing.T) *Registry {
155         dirPath, err := ioutil.TempDir(".", "")
156         if err != nil {
157                 t.Fatal(err)
158         }
159         defer os.RemoveAll(dirPath)
160
161         testDB := dbm.NewDB("testdb", "leveldb", "temp")
162         defer os.RemoveAll("temp")
163
164         chain, err := mockChain(testDB)
165         if err != nil {
166                 t.Fatal(err)
167         }
168
169         return NewRegistry(testDB, chain)
170 }