OSDN Git Service

Add initial value
[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         reg := mockNewRegistry(t)
91
92         oldAlias := "OLD_ALIAS"
93         newAlias := "NEW_ALIAS"
94
95         asset, err := reg.Define([]chainkd.XPub{testutil.TestXPub}, 1, nil, oldAlias)
96         if err != nil {
97                 testutil.FatalErr(t, err)
98         }
99
100         if reg.UpdateAssetAlias(asset.AssetID.String(), newAlias) != nil {
101                 testutil.FatalErr(t, err)
102         }
103
104         asset1, err := reg.FindByAlias(newAlias)
105         if err != nil {
106                 testutil.FatalErr(t, err)
107         }
108
109         gotAlias := *asset1.Alias
110         if !reflect.DeepEqual(gotAlias, newAlias) {
111                 t.Fatalf("alias:\ngot:  %v\nwant: %v", gotAlias, newAlias)
112         }
113 }
114
115 func TestListAssets(t *testing.T) {
116         reg := mockNewRegistry(t)
117
118         firstAlias := "FIRST_ALIAS"
119         secondAlias := "SECOND_ALIAS"
120
121         firstAsset, err := reg.Define([]chainkd.XPub{testutil.TestXPub}, 1, nil, firstAlias)
122         if err != nil {
123                 testutil.FatalErr(t, err)
124         }
125
126         secondAsset, err := reg.Define([]chainkd.XPub{testutil.TestXPub}, 1, nil, secondAlias)
127         if err != nil {
128                 testutil.FatalErr(t, err)
129         }
130
131         wantAssets := []*Asset{DefaultNativeAsset, firstAsset, secondAsset}
132
133         gotAssets, err := reg.ListAssets("")
134         if err != nil {
135                 testutil.FatalErr(t, err)
136         }
137
138         if !testutil.DeepEqual(gotAssets, wantAssets) {
139                 t.Fatalf("got:\ngot:  %v\nwant: %v", gotAssets, wantAssets)
140         }
141 }
142
143 func mockChain(testDB dbm.DB) (*protocol.Chain, error) {
144         store := leveldb.NewStore(testDB)
145         txPool := protocol.NewTxPool()
146         chain, err := protocol.NewChain(store, txPool)
147         if err != nil {
148                 return nil, err
149         }
150         return chain, nil
151 }
152
153 func mockNewRegistry(t *testing.T) *Registry {
154         dirPath, err := ioutil.TempDir(".", "")
155         if err != nil {
156                 t.Fatal(err)
157         }
158         defer os.RemoveAll(dirPath)
159
160         testDB := dbm.NewDB("testdb", "leveldb", "temp")
161         defer os.RemoveAll("temp")
162
163         chain, err := mockChain(testDB)
164         if err != nil {
165                 t.Fatal(err)
166         }
167
168         return NewRegistry(testDB, chain)
169 }