OSDN Git Service

database struct (#401)
[bytom/vapor.git] / application / dex / database / dex_store_test.go
1 package database
2
3 import (
4         "encoding/binary"
5         "encoding/json"
6         "io/ioutil"
7         "math"
8         "os"
9         "testing"
10
11         "github.com/stretchr/testify/require"
12         "golang.org/x/crypto/sha3"
13
14         "github.com/vapor/application/dex/common"
15         "github.com/vapor/database/leveldb"
16         "github.com/vapor/protocol/bc"
17         "github.com/vapor/testutil"
18 )
19
20 func TestSortOrderKey(t *testing.T) {
21         dirname, err := ioutil.TempDir("", "db_common_test")
22         require.Nil(t, err)
23
24         db, err := leveldb.NewGoLevelDB("testdb", dirname)
25         if err != nil {
26                 t.Fatal(err)
27         }
28
29         defer func() {
30                 db.Close()
31                 os.RemoveAll(dirname)
32         }()
33
34         type expectedData struct {
35                 rate     float64
36                 utxoHash string
37         }
38
39         cases := []struct {
40                 orders []common.Order
41                 want   []expectedData
42         }{
43                 {
44                         orders: []common.Order{
45                                 common.Order{
46                                         FromAssetID: &bc.AssetID{V0: 1},
47                                         ToAssetID:   &bc.AssetID{V0: 0},
48                                         Rate:        1.00090,
49                                         Utxo: &common.DexUtxo{
50                                                 SourceID:       &bc.Hash{V0: 21},
51                                                 Amount:         1,
52                                                 SourcePos:      0,
53                                                 ControlProgram: []byte("aa"),
54                                         },
55                                 },
56                                 common.Order{
57                                         FromAssetID: &bc.AssetID{V0: 1},
58                                         ToAssetID:   &bc.AssetID{V0: 0},
59                                         Rate:        0.00090,
60                                         Utxo: &common.DexUtxo{
61                                                 SourceID:       &bc.Hash{V0: 22},
62                                                 Amount:         1,
63                                                 SourcePos:      0,
64                                                 ControlProgram: []byte("aa"),
65                                         },
66                                 },
67                                 common.Order{
68                                         FromAssetID: &bc.AssetID{V0: 1},
69                                         ToAssetID:   &bc.AssetID{V0: 0},
70                                         Rate:        0.00097,
71                                         Utxo: &common.DexUtxo{
72                                                 SourceID:       &bc.Hash{V0: 23},
73                                                 Amount:         1,
74                                                 SourcePos:      0,
75                                                 ControlProgram: []byte("aa"),
76                                         },
77                                 },
78                                 common.Order{
79                                         FromAssetID: &bc.AssetID{V0: 1},
80                                         ToAssetID:   &bc.AssetID{V0: 0},
81                                         Rate:        0.00098,
82                                         Utxo: &common.DexUtxo{
83                                                 SourceID:       &bc.Hash{V0: 13},
84                                                 Amount:         1,
85                                                 SourcePos:      0,
86                                                 ControlProgram: []byte("aa"),
87                                         },
88                                 },
89                                 common.Order{
90                                         FromAssetID: &bc.AssetID{V0: 1},
91                                         ToAssetID:   &bc.AssetID{V0: 0},
92                                         Rate:        0.00098,
93                                         Utxo: &common.DexUtxo{
94                                                 SourceID:       &bc.Hash{V0: 24},
95                                                 Amount:         10,
96                                                 SourcePos:      1,
97                                                 ControlProgram: []byte("aa"),
98                                         },
99                                 },
100                                 common.Order{
101                                         FromAssetID: &bc.AssetID{V0: 1},
102                                         ToAssetID:   &bc.AssetID{V0: 0},
103                                         Rate:        0.00099,
104                                         Utxo: &common.DexUtxo{
105                                                 SourceID:       &bc.Hash{V0: 24},
106                                                 Amount:         1,
107                                                 SourcePos:      0,
108                                                 ControlProgram: []byte("aa"),
109                                         },
110                                 },
111                                 common.Order{
112                                         FromAssetID: &bc.AssetID{V0: 1},
113                                         ToAssetID:   &bc.AssetID{V0: 0},
114                                         Rate:        0.00096,
115                                         Utxo: &common.DexUtxo{
116                                                 SourceID:       &bc.Hash{V0: 25},
117                                                 Amount:         1,
118                                                 SourcePos:      0,
119                                                 ControlProgram: []byte("aa"),
120                                         },
121                                 },
122                                 common.Order{
123                                         FromAssetID: &bc.AssetID{V0: 1},
124                                         ToAssetID:   &bc.AssetID{V0: 0},
125                                         Rate:        0.00095,
126                                         Utxo: &common.DexUtxo{
127                                                 SourceID:       &bc.Hash{V0: 26},
128                                                 Amount:         1,
129                                                 SourcePos:      0,
130                                                 ControlProgram: []byte("aa"),
131                                         },
132                                 },
133                                 common.Order{
134                                         FromAssetID: &bc.AssetID{V0: 1},
135                                         ToAssetID:   &bc.AssetID{V0: 0},
136                                         Rate:        0.00091,
137                                         Utxo: &common.DexUtxo{
138                                                 SourceID:       &bc.Hash{V0: 26},
139                                                 Amount:         1,
140                                                 SourcePos:      0,
141                                                 ControlProgram: []byte("aa"),
142                                         },
143                                 },
144                                 common.Order{
145                                         FromAssetID: &bc.AssetID{V0: 1},
146                                         ToAssetID:   &bc.AssetID{V0: 0},
147                                         Rate:        0.00092,
148                                         Utxo: &common.DexUtxo{
149                                                 SourceID:       &bc.Hash{V0: 27},
150                                                 Amount:         1,
151                                                 SourcePos:      0,
152                                                 ControlProgram: []byte("aa"),
153                                         },
154                                 },
155                                 common.Order{
156                                         FromAssetID: &bc.AssetID{V0: 1},
157                                         ToAssetID:   &bc.AssetID{V0: 0},
158                                         Rate:        0.00093,
159                                         Utxo: &common.DexUtxo{
160                                                 SourceID:       &bc.Hash{V0: 28},
161                                                 Amount:         1,
162                                                 SourcePos:      0,
163                                                 ControlProgram: []byte("aa"),
164                                         },
165                                 },
166                                 common.Order{
167                                         FromAssetID: &bc.AssetID{V0: 1},
168                                         ToAssetID:   &bc.AssetID{V0: 0},
169                                         Rate:        0.00094,
170                                         Utxo: &common.DexUtxo{
171                                                 SourceID:       &bc.Hash{V0: 29},
172                                                 Amount:         1,
173                                                 SourcePos:      0,
174                                                 ControlProgram: []byte("aa"),
175                                         },
176                                 },
177                                 common.Order{
178                                         FromAssetID: &bc.AssetID{V0: 1},
179                                         ToAssetID:   &bc.AssetID{V0: 0},
180                                         Rate:        0.00077,
181                                         Utxo: &common.DexUtxo{
182                                                 SourceID:       &bc.Hash{V0: 30},
183                                                 Amount:         1,
184                                                 SourcePos:      0,
185                                                 ControlProgram: []byte("aa"),
186                                         },
187                                 },
188                                 common.Order{
189                                         FromAssetID: &bc.AssetID{V0: 1},
190                                         ToAssetID:   &bc.AssetID{V0: 0},
191                                         Rate:        0.00088,
192                                         Utxo: &common.DexUtxo{
193                                                 SourceID:       &bc.Hash{V0: 31},
194                                                 Amount:         1,
195                                                 SourcePos:      0,
196                                                 ControlProgram: []byte("aa"),
197                                         },
198                                 },
199                                 common.Order{
200                                         FromAssetID: &bc.AssetID{V0: 1},
201                                         ToAssetID:   &bc.AssetID{V0: 0},
202                                         Rate:        999999.9521,
203                                         Utxo: &common.DexUtxo{
204                                                 SourceID:       &bc.Hash{V0: 32},
205                                                 Amount:         1,
206                                                 SourcePos:      0,
207                                                 ControlProgram: []byte("aa"),
208                                         },
209                                 },
210                                 common.Order{
211                                         FromAssetID: &bc.AssetID{V0: 1},
212                                         ToAssetID:   &bc.AssetID{V0: 0},
213                                         Rate:        888888.7954,
214                                         Utxo: &common.DexUtxo{
215                                                 SourceID:       &bc.Hash{V0: 33},
216                                                 Amount:         1,
217                                                 SourcePos:      0,
218                                                 ControlProgram: []byte("aa"),
219                                         },
220                                 },
221                         },
222                         want: []expectedData{
223                                 expectedData{
224                                         rate:     0.00077,
225                                         utxoHash: "7967bb8c4cca951749553e9c7787255d35a032d9e1acecefe4011c8095dc8e6f",
226                                 },
227                                 expectedData{
228                                         rate:     0.00088,
229                                         utxoHash: "215a6e7e3a5006151bd0b81c54fcccda0381f3a22e7b6646ed201c35f9fa6c5a",
230                                 },
231                                 expectedData{
232                                         rate:     0.00090,
233                                         utxoHash: "cb373d3a383d30eb2863317ea2cfb5b4b269772fbc0fb8413a2be7d7b69ec2b9",
234                                 },
235                                 expectedData{
236                                         rate:     0.00091,
237                                         utxoHash: "298c39d327cb4b0dcefcf701aa8d1b559f1de0148e9bcbe14da48cfa268c01ea",
238                                 },
239                                 expectedData{
240                                         rate:     0.00092,
241                                         utxoHash: "b2c59190fb0d948c9545c146a69b1f17503b2d280b2f3f45ecc0a7b7e2cd1784",
242                                 },
243                                 expectedData{
244                                         rate:     0.00093,
245                                         utxoHash: "80b44aae2b2cf57bd2cf77cb88f0d8363066f5f16a17a3e85224ecbbc6387d8b",
246                                 },
247                                 expectedData{
248                                         rate:     0.00094,
249                                         utxoHash: "4843adc8c4a50672a022e5f377dfd2ac11119364dc0a547be45b4a5edacef33b",
250                                 },
251                                 expectedData{
252                                         rate:     0.00095,
253                                         utxoHash: "298c39d327cb4b0dcefcf701aa8d1b559f1de0148e9bcbe14da48cfa268c01ea",
254                                 },
255                                 expectedData{
256                                         rate:     0.00096,
257                                         utxoHash: "d8d1a85303e9ac738e675b874b866e5ffbfa10e05201113404dde544055a18b9",
258                                 },
259                                 expectedData{
260                                         rate:     0.00097,
261                                         utxoHash: "2305be66ab9648b713a58e3807fa1cba1f84e5d11359b316e967d98e9a7667da",
262                                 },
263                                 expectedData{
264                                         rate:     0.00098,
265                                         utxoHash: "030dc8a868a3e534799d465ebc8209eb32d9465985dc8c35e731b124bf3ffbcf",
266                                 },
267                                 expectedData{
268                                         rate:     0.00098,
269                                         utxoHash: "8222a9a43b3951f247612ddce2fe36f96cd843bc0dfef86c7d0ef5335331f11f",
270                                 },
271                                 expectedData{
272                                         rate:     0.00099,
273                                         utxoHash: "a40bd183cd2ff2b52faac5ebc2cfc1e36104cbc92bcebac011b45792b39e380e",
274                                 },
275                                 expectedData{
276                                         rate:     1.0009,
277                                         utxoHash: "118b2c40848887614d99b0e7eb6c88a10b47196e6aca3ff2eeab452bfdb9cfcb",
278                                 },
279                                 expectedData{
280                                         rate:     888888.7954,
281                                         utxoHash: "545a5c6f7ff9be19ed07a7246277c67d661f9cc7d8956bb81ce9a4045fba3720",
282                                 },
283                                 expectedData{
284                                         rate:     999999.9521,
285                                         utxoHash: "d9f7725d908510268c7bdecd29cb2031baab93b9bfa69108eb0a926ba7ae18f9",
286                                 },
287                         },
288                 },
289         }
290
291         for i, c := range cases {
292                 for _, order := range c.orders {
293                         data, err := json.Marshal(order.Utxo)
294                         if err != nil {
295                                 t.Fatal(err)
296                         }
297                         utxoHash := bc.NewHash(sha3.Sum256(data))
298                         key := calcOrdersPrefix(order.FromAssetID, order.ToAssetID, &utxoHash, order.Rate)
299                         db.SetSync(key, data)
300                 }
301
302                 got := []expectedData{}
303
304                 itr := db.IteratorPrefixWithStart(nil, nil, false)
305                 for itr.Next() {
306                         key := itr.Key()
307                         pos := len(ordersPreFix) + 32*2
308                         b := [32]byte{}
309                         copy(b[:], key[pos+8:])
310                         utxoHash := bc.NewHash(b)
311                         got = append(got, expectedData{
312                                 rate:     math.Float64frombits(binary.BigEndian.Uint64(key[pos : pos+8])),
313                                 utxoHash: utxoHash.String(),
314                         })
315                 }
316                 itr.Release()
317
318                 if !testutil.DeepEqual(c.want, got) {
319                         t.Errorf("case %v: got recovery status, got: %v, want: %v.", i, got, c.want)
320                 }
321
322         }
323 }