10 "github.com/stretchr/testify/require"
12 "github.com/bytom/vapor/application/mov/common"
13 "github.com/bytom/vapor/database/leveldb"
14 dbm "github.com/bytom/vapor/database/leveldb"
15 "github.com/bytom/vapor/protocol/bc"
16 "github.com/bytom/vapor/protocol/bc/types"
17 "github.com/bytom/vapor/testutil"
21 assetID1 = &bc.AssetID{V0: 1}
22 assetID2 = &bc.AssetID{V0: 2}
23 assetID3 = &bc.AssetID{V0: 3}
24 assetID4 = &bc.AssetID{V0: 4}
25 assetID5 = &bc.AssetID{V0: 5}
26 assetID6 = &bc.AssetID{V0: 6}
27 assetID7 = &bc.AssetID{V0: 7}
28 assetID8 = &bc.AssetID{V0: 8}
30 mockOrders = []*common.Order{
32 FromAssetID: assetID1,
34 RatioNumerator: 100090,
35 RatioDenominator: 100000,
36 Utxo: &common.MovUtxo{
37 SourceID: &bc.Hash{V0: 21},
40 ControlProgram: []byte("aa"),
44 FromAssetID: assetID1,
47 RatioDenominator: 100000,
48 Utxo: &common.MovUtxo{
49 SourceID: &bc.Hash{V0: 22},
52 ControlProgram: []byte("aa"),
56 FromAssetID: assetID1,
59 RatioDenominator: 100000,
60 Utxo: &common.MovUtxo{
61 SourceID: &bc.Hash{V0: 23},
64 ControlProgram: []byte("aa"),
68 FromAssetID: assetID1,
71 RatioDenominator: 100000,
72 Utxo: &common.MovUtxo{
73 SourceID: &bc.Hash{V0: 13},
76 ControlProgram: []byte("aa"),
80 FromAssetID: assetID1,
83 RatioDenominator: 100000,
84 Utxo: &common.MovUtxo{
85 SourceID: &bc.Hash{V0: 24},
88 ControlProgram: []byte("aa"),
92 FromAssetID: assetID1,
95 RatioDenominator: 100000,
96 Utxo: &common.MovUtxo{
97 SourceID: &bc.Hash{V0: 24},
100 ControlProgram: []byte("aa"),
104 FromAssetID: assetID1,
107 RatioDenominator: 100000,
108 Utxo: &common.MovUtxo{
109 SourceID: &bc.Hash{V0: 25},
112 ControlProgram: []byte("aa"),
116 FromAssetID: assetID1,
119 RatioDenominator: 100000,
120 Utxo: &common.MovUtxo{
121 SourceID: &bc.Hash{V0: 26},
124 ControlProgram: []byte("aa"),
128 FromAssetID: assetID1,
131 RatioDenominator: 100000,
132 Utxo: &common.MovUtxo{
133 SourceID: &bc.Hash{V0: 1},
136 ControlProgram: []byte("aa"),
140 FromAssetID: assetID1,
143 RatioDenominator: 100000,
144 Utxo: &common.MovUtxo{
145 SourceID: &bc.Hash{V0: 2},
148 ControlProgram: []byte("aa"),
152 FromAssetID: assetID3,
155 RatioDenominator: 100000,
156 Utxo: &common.MovUtxo{
157 SourceID: &bc.Hash{V0: 33},
160 ControlProgram: []byte("aa"),
164 FromAssetID: assetID4,
167 RatioDenominator: 100000,
168 Utxo: &common.MovUtxo{
169 SourceID: &bc.Hash{V0: 34},
172 ControlProgram: []byte("aa"),
176 FromAssetID: assetID4,
179 RatioDenominator: 100000,
180 Utxo: &common.MovUtxo{
181 SourceID: &bc.Hash{V0: 36},
184 ControlProgram: []byte("aa"),
188 FromAssetID: assetID5,
191 RatioDenominator: 100000,
192 Utxo: &common.MovUtxo{
193 SourceID: &bc.Hash{V0: 37},
196 ControlProgram: []byte("aa"),
200 FromAssetID: assetID6,
203 RatioDenominator: 100000,
204 Utxo: &common.MovUtxo{
205 SourceID: &bc.Hash{V0: 38},
208 ControlProgram: []byte("aa"),
214 func TestGetAssetIDFromTradePairKey(t *testing.T) {
215 b := calcTradePairKey(assetID1, assetID2)
216 gotA := getAssetIDFromTradePairKey(b, fromAssetIDPos)
217 gotB := getAssetIDFromTradePairKey(b, toAssetIDPos)
219 if *gotA != *assetID1 {
220 t.Fatalf("got wrong from asset id got %s, want %s", gotA.String(), assetID1.String())
223 if *gotB != *assetID2 {
224 t.Fatalf("got wrong to asset id got %s, want %s", gotB.String(), assetID2.String())
228 func TestSortOrderKey(t *testing.T) {
229 dirname, err := ioutil.TempDir("", "db_common_test")
232 db, err := leveldb.NewGoLevelDB("testdb", dirname)
239 os.RemoveAll(dirname)
242 type expectedData struct {
248 orders []*common.Order
252 orders: []*common.Order{
254 FromAssetID: &bc.AssetID{V0: 1},
255 ToAssetID: &bc.AssetID{V0: 0},
256 RatioNumerator: 100090,
257 RatioDenominator: 100000,
258 Utxo: &common.MovUtxo{
259 SourceID: &bc.Hash{V0: 21},
262 ControlProgram: []byte("aa"),
266 FromAssetID: &bc.AssetID{V0: 1},
267 ToAssetID: &bc.AssetID{V0: 0},
269 RatioDenominator: 100000,
270 Utxo: &common.MovUtxo{
271 SourceID: &bc.Hash{V0: 22},
274 ControlProgram: []byte("aa"),
278 FromAssetID: &bc.AssetID{V0: 1},
279 ToAssetID: &bc.AssetID{V0: 0},
281 RatioDenominator: 100000,
282 Utxo: &common.MovUtxo{
283 SourceID: &bc.Hash{V0: 23},
286 ControlProgram: []byte("aa"),
290 FromAssetID: &bc.AssetID{V0: 1},
291 ToAssetID: &bc.AssetID{V0: 0},
293 RatioDenominator: 100000,
294 Utxo: &common.MovUtxo{
295 SourceID: &bc.Hash{V0: 13},
298 ControlProgram: []byte("aa"),
302 FromAssetID: &bc.AssetID{V0: 1},
303 ToAssetID: &bc.AssetID{V0: 0},
305 RatioDenominator: 100000,
306 Utxo: &common.MovUtxo{
307 SourceID: &bc.Hash{V0: 24},
310 ControlProgram: []byte("aa"),
314 FromAssetID: &bc.AssetID{V0: 1},
315 ToAssetID: &bc.AssetID{V0: 0},
317 RatioDenominator: 100000,
318 Utxo: &common.MovUtxo{
319 SourceID: &bc.Hash{V0: 25},
322 ControlProgram: []byte("aa"),
326 FromAssetID: &bc.AssetID{V0: 1},
327 ToAssetID: &bc.AssetID{V0: 0},
329 RatioDenominator: 100000,
330 Utxo: &common.MovUtxo{
331 SourceID: &bc.Hash{V0: 26},
334 ControlProgram: []byte("aa"),
338 FromAssetID: &bc.AssetID{V0: 1},
339 ToAssetID: &bc.AssetID{V0: 0},
341 RatioDenominator: 100000,
342 Utxo: &common.MovUtxo{
343 SourceID: &bc.Hash{V0: 27},
346 ControlProgram: []byte("aa"),
350 FromAssetID: &bc.AssetID{V0: 1},
351 ToAssetID: &bc.AssetID{V0: 0},
353 RatioDenominator: 100000,
354 Utxo: &common.MovUtxo{
355 SourceID: &bc.Hash{V0: 24},
358 ControlProgram: []byte("aa"),
362 FromAssetID: &bc.AssetID{V0: 1},
363 ToAssetID: &bc.AssetID{V0: 0},
365 RatioDenominator: 100000,
366 Utxo: &common.MovUtxo{
367 SourceID: &bc.Hash{V0: 25},
370 ControlProgram: []byte("aa"),
374 FromAssetID: &bc.AssetID{V0: 1},
375 ToAssetID: &bc.AssetID{V0: 0},
377 RatioDenominator: 100000,
378 Utxo: &common.MovUtxo{
379 SourceID: &bc.Hash{V0: 26},
382 ControlProgram: []byte("aa"),
386 FromAssetID: &bc.AssetID{V0: 1},
387 ToAssetID: &bc.AssetID{V0: 0},
389 RatioDenominator: 100000,
390 Utxo: &common.MovUtxo{
391 SourceID: &bc.Hash{V0: 26},
394 ControlProgram: []byte("aa"),
398 FromAssetID: &bc.AssetID{V0: 1},
399 ToAssetID: &bc.AssetID{V0: 0},
401 RatioDenominator: 100000,
402 Utxo: &common.MovUtxo{
403 SourceID: &bc.Hash{V0: 27},
406 ControlProgram: []byte("aa"),
410 FromAssetID: &bc.AssetID{V0: 1},
411 ToAssetID: &bc.AssetID{V0: 0},
413 RatioDenominator: 100000,
414 Utxo: &common.MovUtxo{
415 SourceID: &bc.Hash{V0: 28},
418 ControlProgram: []byte("aa"),
422 FromAssetID: &bc.AssetID{V0: 1},
423 ToAssetID: &bc.AssetID{V0: 0},
425 RatioDenominator: 100000,
426 Utxo: &common.MovUtxo{
427 SourceID: &bc.Hash{V0: 29},
430 ControlProgram: []byte("aa"),
434 FromAssetID: &bc.AssetID{V0: 1},
435 ToAssetID: &bc.AssetID{V0: 0},
437 RatioDenominator: 100000,
438 Utxo: &common.MovUtxo{
439 SourceID: &bc.Hash{V0: 30},
442 ControlProgram: []byte("aa"),
446 FromAssetID: &bc.AssetID{V0: 1},
447 ToAssetID: &bc.AssetID{V0: 0},
449 RatioDenominator: 100000,
450 Utxo: &common.MovUtxo{
451 SourceID: &bc.Hash{V0: 31},
454 ControlProgram: []byte("aa"),
458 FromAssetID: &bc.AssetID{V0: 1},
459 ToAssetID: &bc.AssetID{V0: 0},
460 RatioNumerator: 9999999521,
461 RatioDenominator: 10000,
462 Utxo: &common.MovUtxo{
463 SourceID: &bc.Hash{V0: 32},
466 ControlProgram: []byte("aa"),
470 FromAssetID: &bc.AssetID{V0: 1},
471 ToAssetID: &bc.AssetID{V0: 0},
472 RatioNumerator: 8888887954,
473 RatioDenominator: 10000,
474 Utxo: &common.MovUtxo{
475 SourceID: &bc.Hash{V0: 33},
478 ControlProgram: []byte("aa"),
482 want: []expectedData{
485 utxoHash: "f1b85307cf1f4eb6b193b6fc289413fdbb12bc362ced399762589b016e54dd02",
489 utxoHash: "49ef60af0f24962ed129a73142048ed0cb589041c629353932e3c3e0a4e822ba",
493 utxoHash: "67b2ac6ea71b271e72836e162811866f291ed2fab106c43519ca0c94ef8a5dce",
497 utxoHash: "47ff45b7b530512142981c2cee82faad63d6c9e7ffed0e72c3e42668f13b296f",
501 utxoHash: "b750d0b95f38043362c8335f242f97cfd3e1cada8fd171b914471a16cc0f14c6",
505 utxoHash: "04386ef57f0ca1be0a9be46c413900adbc0ab1e90e773959924aa73ca62edf64",
509 utxoHash: "c0fe6227c50da350a5e7b4ff85c18e9c901c323521067b9142acd128cf13ae82",
513 utxoHash: "47ff45b7b530512142981c2cee82faad63d6c9e7ffed0e72c3e42668f13b296f",
517 utxoHash: "bc92df1cbd20c98b0d18c9d93422a770849235867522a08e492196d16ed0a422",
521 utxoHash: "0cc0ded6fb337a3c5e6e4d008d6167dc58bdede43713898e914d65cda3b8499a",
525 utxoHash: "14b51a6103f75d9cacdf0f9551467588c687ed3b029e25c646d276720569e227",
529 utxoHash: "1fa9fae83d0a5401a4e92f80636966486e763eecca588aa11dff02b415320602",
533 utxoHash: "6687d18ddbe4e7381a844e393ca3032a412285c9da6988eff182106e28ba09ca",
537 utxoHash: "841b1de7c871dfe6e2d1886809d9ae12ec45e570233b03879305232b096fda43",
541 utxoHash: "a4bc534c267d35a9eafc25cd66e0cb270a2537a51186605b7f7591bc567ab4c6",
545 utxoHash: "fdedf4117def659e07cc8a8ca318d21ae577a05e1a0197844b54d493bdae5854",
549 utxoHash: "20be3bd2d406bb7fe6627b32768fb2073e997b962a4badfa4384210fed2ab9c6",
553 utxoHash: "72192f56b9525c74c6a9f0419563bc0da76b0f3d6e89d9decdb6e67786ac3909",
557 utxoHash: "7886844334659b4feffc41528cf81192925d3aa4a5ccb3652200b9073b7d47c3",
563 for i, c := range cases {
564 for _, order := range c.orders {
565 key := calcOrderKey(order.FromAssetID, order.ToAssetID, order.UTXOHash(), order.Rate())
566 data, err := json.Marshal(order.Utxo)
571 db.SetSync(key, data)
574 got := []expectedData{}
575 itr := db.IteratorPrefixWithStart(nil, nil, false)
578 pos := len(ordersPrefix) + assetIDLen*2
580 copy(b[:], key[pos+8:])
581 utxoHash := bc.NewHash(b)
583 got = append(got, expectedData{
584 rate: getRateFromOrderKey(key),
585 utxoHash: utxoHash.String(),
590 if !testutil.DeepEqual(c.want, got) {
591 t.Errorf("case %v: got recovery status, got: %v, want: %v.", i, got, c.want)
596 func TestMovStore(t *testing.T) {
599 beforeOrders []*common.Order
600 beforeTradePairs []*common.TradePair
601 beforeDBStatus *common.MovDatabaseState
602 addOrders []*common.Order
603 delOrders []*common.Order
604 blockHeader *types.BlockHeader
605 wantOrders []*common.Order
606 wantTradePairs []*common.TradePair
607 wantDBState *common.MovDatabaseState
611 addOrders: []*common.Order{
621 blockHeader: &types.BlockHeader{Height: 1, PreviousBlockHash: bc.Hash{V0: 524821139490765641, V1: 2484214155808702787, V2: 9108473449351508820, V3: 7972721253564512122}},
622 wantOrders: []*common.Order{
632 wantTradePairs: []*common.TradePair{
633 &common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2, Count: 8},
635 wantDBState: &common.MovDatabaseState{Height: 1, Hash: &bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
638 desc: "del some order",
639 beforeOrders: []*common.Order{
649 beforeTradePairs: []*common.TradePair{
651 FromAssetID: assetID1,
656 beforeDBStatus: &common.MovDatabaseState{Height: 1, Hash: &bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
657 delOrders: []*common.Order{
662 blockHeader: &types.BlockHeader{Height: 2, PreviousBlockHash: bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
663 wantOrders: []*common.Order{
670 wantTradePairs: []*common.TradePair{
671 &common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2, Count: 5},
673 wantDBState: &common.MovDatabaseState{Height: 2, Hash: &bc.Hash{V0: 3724755213446347384, V1: 158878632373345042, V2: 18283800951484248781, V3: 7520797730449067221}},
676 desc: "del all order",
677 beforeOrders: []*common.Order{
687 beforeTradePairs: []*common.TradePair{
689 FromAssetID: assetID1,
694 beforeDBStatus: &common.MovDatabaseState{Height: 1, Hash: &bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
695 delOrders: []*common.Order{
705 blockHeader: &types.BlockHeader{Height: 2, PreviousBlockHash: bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
706 wantOrders: []*common.Order{},
707 wantTradePairs: []*common.TradePair{},
708 wantDBState: &common.MovDatabaseState{Height: 2, Hash: &bc.Hash{V0: 3724755213446347384, V1: 158878632373345042, V2: 18283800951484248781, V3: 7520797730449067221}},
711 desc: "Add and delete the same trade pair", // Add and delete different transaction pairs
712 beforeOrders: []*common.Order{
722 beforeTradePairs: []*common.TradePair{
724 FromAssetID: assetID1,
729 beforeDBStatus: &common.MovDatabaseState{Height: 1, Hash: &bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
730 addOrders: []*common.Order{
734 delOrders: []*common.Order{
744 blockHeader: &types.BlockHeader{Height: 2, PreviousBlockHash: bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
745 wantOrders: []*common.Order{
749 wantTradePairs: []*common.TradePair{
750 &common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2, Count: 2},
752 wantDBState: &common.MovDatabaseState{Height: 2, Hash: &bc.Hash{V0: 3724755213446347384, V1: 158878632373345042, V2: 18283800951484248781, V3: 7520797730449067221}},
755 desc: "Add and delete different transaction pairs",
756 beforeOrders: []*common.Order{
768 beforeTradePairs: []*common.TradePair{
770 FromAssetID: assetID1,
775 FromAssetID: assetID3,
780 FromAssetID: assetID4,
785 beforeDBStatus: &common.MovDatabaseState{Height: 1, Hash: &bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
786 addOrders: []*common.Order{
791 delOrders: []*common.Order{
802 blockHeader: &types.BlockHeader{Height: 2, PreviousBlockHash: bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
803 wantOrders: []*common.Order{
809 wantTradePairs: []*common.TradePair{
810 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID2, Count: 2},
811 &common.TradePair{FromAssetID: assetID5, ToAssetID: assetID2, Count: 1},
812 &common.TradePair{FromAssetID: assetID6, ToAssetID: assetID2, Count: 1},
814 wantDBState: &common.MovDatabaseState{Height: 2, Hash: &bc.Hash{V0: 3724755213446347384, V1: 158878632373345042, V2: 18283800951484248781, V3: 7520797730449067221}},
818 initBlockHeader := &types.BlockHeader{
823 height := initBlockHeader.Height
824 hash := initBlockHeader.Hash()
826 defer os.RemoveAll("temp")
827 for i, c := range cases {
828 testDB := dbm.NewDB("testdb", "leveldb", "temp")
829 movStore := NewLevelDBMovStore(testDB)
830 if err := movStore.InitDBState(height, &hash); err != nil {
831 t.Fatalf("case %d: InitDBState error %v.", i, err)
834 batch := movStore.db.NewBatch()
835 tradePairsCnt := make(map[string]*common.TradePair)
836 movStore.addOrders(batch, c.beforeOrders, tradePairsCnt)
837 if len(c.beforeOrders) > 0 {
838 tradePairsCnt = make(map[string]*common.TradePair)
839 for _, tradePair := range c.beforeTradePairs {
840 tradePairsCnt[tradePair.Key()] = tradePair
842 movStore.updateTradePairs(batch, tradePairsCnt)
843 movStore.saveMovDatabaseState(batch, c.beforeDBStatus)
847 if err := movStore.ProcessOrders(c.addOrders, c.delOrders, c.blockHeader); err != nil {
848 t.Fatalf("case %d: ProcessOrders error %v.", i, err)
851 var gotOrders []*common.Order
853 tmp, err := movStore.ListOrders(&common.Order{FromAssetID: assetID1, ToAssetID: assetID2, RatioNumerator: 0, RatioDenominator: 1})
855 t.Fatalf("case %d: ListOrders(assetID1 and assetID2) error %v.", i, err)
858 gotOrders = append(gotOrders, tmp...)
860 tmp, err = movStore.ListOrders(&common.Order{FromAssetID: assetID3, ToAssetID: assetID2, RatioNumerator: 0, RatioDenominator: 1})
862 t.Fatalf("case %d: ListOrders(assetID3 and assetID2) error %v.", i, err)
865 gotOrders = append(gotOrders, tmp...)
867 tmp, err = movStore.ListOrders(&common.Order{FromAssetID: assetID4, ToAssetID: assetID2, RatioNumerator: 0, RatioDenominator: 1})
869 t.Fatalf("case %d: ListOrders(assetID4 and assetID2) error %v.", i, err)
872 gotOrders = append(gotOrders, tmp...)
874 tmp, err = movStore.ListOrders(&common.Order{FromAssetID: assetID5, ToAssetID: assetID2, RatioNumerator: 0, RatioDenominator: 1})
876 t.Fatalf("case %d: ListOrders(assetID5 and assetID2) error %v.", i, err)
879 gotOrders = append(gotOrders, tmp...)
881 tmp, err = movStore.ListOrders(&common.Order{FromAssetID: assetID6, ToAssetID: assetID2, RatioNumerator: 0, RatioDenominator: 1})
883 t.Fatalf("case %d: ListOrders(assetID6 and assetID2) error %v.", i, err)
886 gotOrders = append(gotOrders, tmp...)
888 if !testutil.DeepEqual(gotOrders, c.wantOrders) {
889 t.Fatalf("case %d: got orders , gotOrders: %v, wantOrders: %v.", i, gotOrders, c.wantOrders)
892 gotTradePairs, err := movStore.ListTradePairsWithStart(nil, nil)
894 t.Fatalf("case %d: ListTradePairsWithStart error %v.", i, err)
897 if !testutil.DeepEqual(gotTradePairs, c.wantTradePairs) {
898 t.Fatalf("case %d: got tradePairs, gotTradePairs: %v, wantTradePairs: %v.", i, gotTradePairs, c.wantTradePairs)
901 gotDBState, err := movStore.GetMovDatabaseState()
903 t.Fatalf("case %d: GetMovDatabaseState error %v.", i, err)
906 if !testutil.DeepEqual(gotDBState, c.wantDBState) {
907 t.Fatalf("case %d: got tradePairs, gotDBState: %v, wantDBStatus: %v.", i, gotDBState, c.wantDBState)
915 func TestListOrders(t *testing.T) {
918 storeOrders []*common.Order
920 wantOrders []*common.Order
924 query: &common.Order{FromAssetID: assetID1, ToAssetID: assetID2},
925 wantOrders: []*common.Order{},
928 desc: "query from first",
929 storeOrders: []*common.Order{
940 query: &common.Order{FromAssetID: assetID1, ToAssetID: assetID2},
941 wantOrders: []*common.Order{
953 desc: "query from middle",
954 storeOrders: []*common.Order{
964 query: mockOrders[3],
965 wantOrders: []*common.Order{
973 initBlockHeader := &types.BlockHeader{
978 height := initBlockHeader.Height
979 hash := initBlockHeader.Hash()
981 defer os.RemoveAll("temp")
982 for i, c := range cases {
983 testDB := dbm.NewDB("testdb", "leveldb", "temp")
984 movStore := NewLevelDBMovStore(testDB)
985 if err := movStore.InitDBState(height, &hash); err != nil {
986 t.Fatalf("case %d: InitDBState error %v.", i, err)
989 batch := movStore.db.NewBatch()
990 tradePairsCnt := make(map[string]*common.TradePair)
991 movStore.addOrders(batch, c.storeOrders, tradePairsCnt)
992 movStore.updateTradePairs(batch, tradePairsCnt)
995 gotOrders, err := movStore.ListOrders(c.query)
997 t.Fatalf("case %d: ListOrders error %v.", i, err)
1000 if !testutil.DeepEqual(gotOrders, c.wantOrders) {
1001 t.Fatalf("case %d: got orders , gotOrders: %v, wantOrders: %v.", i, gotOrders, c.wantOrders)
1005 os.RemoveAll("temp")
1009 func TestAddOrders(t *testing.T) {
1012 beforeOrders []*common.Order
1013 addOrders []*common.Order
1014 wantOrders []*common.Order
1018 addOrders: []*common.Order{
1028 wantOrders: []*common.Order{
1040 desc: "Stored data already exists",
1041 beforeOrders: []*common.Order{
1047 addOrders: []*common.Order{
1053 wantOrders: []*common.Order{
1066 initBlockHeader := &types.BlockHeader{
1071 height := initBlockHeader.Height
1072 hash := initBlockHeader.Hash()
1074 defer os.RemoveAll("temp")
1075 for i, c := range cases {
1076 testDB := dbm.NewDB("testdb", "leveldb", "temp")
1077 movStore := NewLevelDBMovStore(testDB)
1078 if err := movStore.InitDBState(height, &hash); err != nil {
1079 t.Fatalf("case %d: InitDBState error %v.", i, err)
1082 batch := movStore.db.NewBatch()
1083 tradePairsCnt := make(map[string]*common.TradePair)
1084 movStore.addOrders(batch, c.beforeOrders, tradePairsCnt)
1085 movStore.updateTradePairs(batch, tradePairsCnt)
1088 tradePairsCnt = make(map[string]*common.TradePair)
1089 movStore.addOrders(batch, c.addOrders, tradePairsCnt)
1092 gotOrders, err := movStore.ListOrders(&common.Order{FromAssetID: assetID1, ToAssetID: assetID2})
1094 t.Fatalf("case %d: ListOrders error %v.", i, err)
1097 if !testutil.DeepEqual(gotOrders, c.wantOrders) {
1098 t.Fatalf("case %d: got orders , gotOrders: %v, wantOrders: %v.", i, gotOrders, c.wantOrders)
1102 os.RemoveAll("temp")
1106 func TestDelOrders(t *testing.T) {
1109 beforeOrders []*common.Order
1110 delOrders []*common.Order
1111 wantOrders []*common.Order
1116 delOrders: []*common.Order{
1120 wantOrders: []*common.Order{},
1121 err: errors.New("don't find trade pair"),
1124 desc: "Delete existing data",
1125 beforeOrders: []*common.Order{
1135 delOrders: []*common.Order{
1141 wantOrders: []*common.Order{
1150 desc: "Delete all data",
1151 beforeOrders: []*common.Order{
1156 delOrders: []*common.Order{
1161 wantOrders: []*common.Order{},
1166 initBlockHeader := &types.BlockHeader{
1171 height := initBlockHeader.Height
1172 hash := initBlockHeader.Hash()
1174 defer os.RemoveAll("temp")
1175 for i, c := range cases {
1176 testDB := dbm.NewDB("testdb", "leveldb", "temp")
1177 movStore := NewLevelDBMovStore(testDB)
1178 if err := movStore.InitDBState(height, &hash); err != nil {
1179 t.Fatalf("case %d: InitDBState error %v.", i, err)
1182 batch := movStore.db.NewBatch()
1183 tradePairsCnt := make(map[string]*common.TradePair)
1184 movStore.addOrders(batch, c.beforeOrders, tradePairsCnt)
1185 movStore.updateTradePairs(batch, tradePairsCnt)
1188 tradePairsCnt = make(map[string]*common.TradePair)
1189 movStore.deleteOrders(batch, c.delOrders, tradePairsCnt)
1190 movStore.updateTradePairs(batch, tradePairsCnt)
1193 gotOrders, err := movStore.ListOrders(&common.Order{FromAssetID: assetID1, ToAssetID: assetID2})
1195 t.Fatalf("case %d: ListOrders error %v.", i, err)
1198 if !testutil.DeepEqual(gotOrders, c.wantOrders) {
1199 t.Fatalf("case %d: got orders , gotOrders: %v, wantOrders: %v.", i, gotOrders, c.wantOrders)
1203 os.RemoveAll("temp")
1207 func TestListTradePairsWithStart(t *testing.T) {
1210 storeTradePairs map[string]*common.TradePair
1211 query *common.TradePair
1212 wantTradePairs []*common.TradePair
1216 query: &common.TradePair{},
1217 wantTradePairs: []*common.TradePair{},
1220 desc: "query from first",
1221 storeTradePairs: map[string]*common.TradePair{
1222 (&common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}).Key(): {FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
1223 (&common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}).Key(): {FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},
1224 (&common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}).Key(): {FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
1225 (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}).Key(): {FromAssetID: assetID4, ToAssetID: assetID5, Count: 4},
1226 (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}).Key(): {FromAssetID: assetID4, ToAssetID: assetID6, Count: 5},
1227 (&common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}).Key(): {FromAssetID: assetID5, ToAssetID: assetID7, Count: 6},
1229 query: &common.TradePair{},
1230 wantTradePairs: []*common.TradePair{
1231 &common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
1232 &common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},
1233 &common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
1234 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5, Count: 4},
1235 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6, Count: 5},
1236 &common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7, Count: 6},
1240 desc: "query from middle",
1241 storeTradePairs: map[string]*common.TradePair{
1242 (&common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}).Key(): {FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
1243 (&common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}).Key(): {FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},
1244 (&common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}).Key(): {FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
1245 (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}).Key(): {FromAssetID: assetID4, ToAssetID: assetID5, Count: 4},
1246 (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}).Key(): {FromAssetID: assetID4, ToAssetID: assetID6, Count: 5},
1247 (&common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}).Key(): {FromAssetID: assetID5, ToAssetID: assetID7, Count: 6},
1248 (&common.TradePair{FromAssetID: assetID6, ToAssetID: assetID8}).Key(): {FromAssetID: assetID6, ToAssetID: assetID8, Count: 7},
1250 query: &common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
1251 wantTradePairs: []*common.TradePair{
1252 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5, Count: 4},
1253 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6, Count: 5},
1254 &common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7, Count: 6},
1255 &common.TradePair{FromAssetID: assetID6, ToAssetID: assetID8, Count: 7},
1260 initBlockHeader := &types.BlockHeader{
1265 height := initBlockHeader.Height
1266 hash := initBlockHeader.Hash()
1268 defer os.RemoveAll("temp")
1269 for i, c := range cases {
1270 testDB := dbm.NewDB("testdb", "leveldb", "temp")
1271 movStore := NewLevelDBMovStore(testDB)
1272 if err := movStore.InitDBState(height, &hash); err != nil {
1273 t.Fatalf("case %d: InitDBState error %v.", i, err)
1276 batch := movStore.db.NewBatch()
1277 movStore.updateTradePairs(batch, c.storeTradePairs)
1280 gotTradePairs, err := movStore.ListTradePairsWithStart(c.query.FromAssetID, c.query.ToAssetID)
1282 t.Fatalf("case %d: ListTradePairsWithStart error %v.", i, err)
1285 if !testutil.DeepEqual(gotTradePairs, c.wantTradePairs) {
1286 t.Fatalf("case %d: got TradePairs , gotTradePairs: %v, wantTradePairs: %v.", i, gotTradePairs, c.wantTradePairs)
1290 os.RemoveAll("temp")
1294 func TestUpdateTradePairs(t *testing.T) {
1297 beforeTradePairs map[string]*common.TradePair
1298 addTradePairs map[string]*common.TradePair
1299 delTradePairs map[string]*common.TradePair
1300 wantTradePairs []*common.TradePair
1304 addTradePairs: map[string]*common.TradePair{
1305 (&common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}).Key(): {FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
1306 (&common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}).Key(): {FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},
1307 (&common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}).Key(): {FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
1308 (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}).Key(): {FromAssetID: assetID4, ToAssetID: assetID5, Count: 4},
1309 (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}).Key(): {FromAssetID: assetID4, ToAssetID: assetID6, Count: 5},
1310 (&common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}).Key(): {FromAssetID: assetID5, ToAssetID: assetID7, Count: 6},
1312 wantTradePairs: []*common.TradePair{
1313 &common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
1314 &common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},
1315 &common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
1316 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5, Count: 4},
1317 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6, Count: 5},
1318 &common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7, Count: 6},
1322 desc: "Stored data already exists",
1323 beforeTradePairs: map[string]*common.TradePair{
1324 (&common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}).Key(): {FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
1325 (&common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}).Key(): {FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},
1326 (&common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}).Key(): {FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
1328 addTradePairs: map[string]*common.TradePair{
1329 (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}).Key(): {FromAssetID: assetID4, ToAssetID: assetID5, Count: 4},
1330 (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}).Key(): {FromAssetID: assetID4, ToAssetID: assetID6, Count: 5},
1331 (&common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}).Key(): {FromAssetID: assetID5, ToAssetID: assetID7, Count: 6},
1333 wantTradePairs: []*common.TradePair{
1334 &common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
1335 &common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},
1336 &common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
1337 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5, Count: 4},
1338 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6, Count: 5},
1339 &common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7, Count: 6},
1343 desc: "delete some data",
1344 beforeTradePairs: map[string]*common.TradePair{
1345 (&common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}).Key(): {FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
1346 (&common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}).Key(): {FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},
1347 (&common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}).Key(): {FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
1348 (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}).Key(): {FromAssetID: assetID4, ToAssetID: assetID5, Count: 4},
1349 (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}).Key(): {FromAssetID: assetID4, ToAssetID: assetID6, Count: 5},
1350 (&common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}).Key(): {FromAssetID: assetID5, ToAssetID: assetID7, Count: 6},
1352 delTradePairs: map[string]*common.TradePair{
1353 (&common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}).Key(): {FromAssetID: assetID1, ToAssetID: assetID2, Count: -1},
1354 (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}).Key(): {FromAssetID: assetID4, ToAssetID: assetID5, Count: -4},
1355 (&common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}).Key(): {FromAssetID: assetID4, ToAssetID: assetID6, Count: -2},
1356 (&common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}).Key(): {FromAssetID: assetID5, ToAssetID: assetID7, Count: -4},
1358 wantTradePairs: []*common.TradePair{
1359 &common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},
1360 &common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
1361 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6, Count: 3},
1362 &common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7, Count: 2},
1367 initBlockHeader := &types.BlockHeader{
1372 height := initBlockHeader.Height
1373 hash := initBlockHeader.Hash()
1375 defer os.RemoveAll("temp")
1376 for i, c := range cases {
1377 testDB := dbm.NewDB("testdb", "leveldb", "temp")
1378 movStore := NewLevelDBMovStore(testDB)
1379 if err := movStore.InitDBState(height, &hash); err != nil {
1380 t.Fatalf("case %d: InitDBState error %v.", i, err)
1383 batch := movStore.db.NewBatch()
1384 movStore.updateTradePairs(batch, c.beforeTradePairs)
1387 movStore.updateTradePairs(batch, c.addTradePairs)
1388 movStore.updateTradePairs(batch, c.delTradePairs)
1391 gotTradePairs, err := movStore.ListTradePairsWithStart(nil, nil)
1393 t.Fatalf("case %d: ListTradePairsWithStart error %v.", i, err)
1396 if !testutil.DeepEqual(gotTradePairs, c.wantTradePairs) {
1397 t.Fatalf("case %d: got TradePairs , gotTradePairs: %v, wantTradePairs: %v.", i, gotTradePairs, c.wantTradePairs)
1401 os.RemoveAll("temp")
1405 func TestCheckMovDatabaseState(t *testing.T) {
1408 beforeDBStatus *common.MovDatabaseState
1409 blockHeader *types.BlockHeader
1413 desc: "attach Block",
1414 beforeDBStatus: &common.MovDatabaseState{Height: 1, Hash: &bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
1415 blockHeader: &types.BlockHeader{Height: 2, PreviousBlockHash: bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
1419 desc: "error attach Block",
1420 beforeDBStatus: &common.MovDatabaseState{Height: 1, Hash: &bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
1421 blockHeader: &types.BlockHeader{Height: 2, PreviousBlockHash: bc.Hash{}},
1422 err: errors.New("the status of the block is inconsistent with that of mov-database"),
1426 desc: "detach Block",
1427 beforeDBStatus: &common.MovDatabaseState{Height: 5, Hash: &bc.Hash{V0: 3724755213446347384, V1: 158878632373345042, V2: 18283800951484248781, V3: 7520797730449067221}},
1428 blockHeader: &types.BlockHeader{Height: 4},
1432 desc: "error detach Block",
1433 beforeDBStatus: &common.MovDatabaseState{Height: 5, Hash: &bc.Hash{V0: 3724755213446347384, V1: 158878632373345042, V2: 18283800951484248781, V3: 7520797730449067221}},
1434 blockHeader: &types.BlockHeader{Height: 3},
1435 err: errors.New("the status of the block is inconsistent with that of mov-database"),
1439 initBlockHeader := &types.BlockHeader{
1444 height := initBlockHeader.Height
1445 hash := initBlockHeader.Hash()
1447 defer os.RemoveAll("temp")
1448 for i, c := range cases {
1449 testDB := dbm.NewDB("testdb", "leveldb", "temp")
1450 movStore := NewLevelDBMovStore(testDB)
1451 if err := movStore.InitDBState(height, &hash); err != nil {
1452 t.Fatalf("case %d: InitDBState error %v.", i, err)
1455 batch := movStore.db.NewBatch()
1456 movStore.saveMovDatabaseState(batch, c.beforeDBStatus)
1459 if err := movStore.checkMovDatabaseState(c.blockHeader); c.err != nil && c.err.Error() != err.Error() {
1460 t.Fatalf("case %d: checkMovDatabaseState error %v.", i, err)
1464 os.RemoveAll("temp")