10 "github.com/stretchr/testify/require"
12 "github.com/vapor/application/mov/common"
13 "github.com/vapor/consensus"
14 "github.com/vapor/database/leveldb"
15 dbm "github.com/vapor/database/leveldb"
16 chainjson "github.com/vapor/encoding/json"
17 "github.com/vapor/protocol/bc"
18 "github.com/vapor/protocol/bc/types"
19 "github.com/vapor/testutil"
23 assetID1 = &bc.AssetID{V0: 1}
24 assetID2 = &bc.AssetID{V0: 2}
25 assetID3 = &bc.AssetID{V0: 3}
26 assetID4 = &bc.AssetID{V0: 4}
27 assetID5 = &bc.AssetID{V0: 5}
28 assetID6 = &bc.AssetID{V0: 6}
29 assetID7 = &bc.AssetID{V0: 7}
30 assetID8 = &bc.AssetID{V0: 8}
33 func TestCalcUTXOHash(t *testing.T) {
34 wantHash := "7cbaf92f950f2a6bededd6cc5ec08c924505f5365b0a8af963e1d52912c99667"
35 controlProgramStr := "0014ab5acbea076f269bfdc8ededbed7d0a13e6e0b19"
37 var controlProgram chainjson.HexBytes
38 controlProgram.UnmarshalText([]byte(controlProgramStr))
40 sourceID := testutil.MustDecodeHash("ca2faf5fcbf8ee2b43560a32594f608528b12a1fe79cee85252564f886f91060")
41 order := &common.Order{
42 FromAssetID: consensus.BTMAssetID,
43 Utxo: &common.MovUtxo{
47 ControlProgram: controlProgram[:],
51 hash := calcUTXOHash(order)
52 if hash.String() != wantHash {
53 t.Fatal("The function is incorrect")
58 func TestSortOrderKey(t *testing.T) {
59 dirname, err := ioutil.TempDir("", "db_common_test")
62 db, err := leveldb.NewGoLevelDB("testdb", dirname)
72 type expectedData struct {
82 orders: []common.Order{
84 FromAssetID: &bc.AssetID{V0: 1},
85 ToAssetID: &bc.AssetID{V0: 0},
87 Utxo: &common.MovUtxo{
88 SourceID: &bc.Hash{V0: 21},
91 ControlProgram: []byte("aa"),
95 FromAssetID: &bc.AssetID{V0: 1},
96 ToAssetID: &bc.AssetID{V0: 0},
98 Utxo: &common.MovUtxo{
99 SourceID: &bc.Hash{V0: 22},
102 ControlProgram: []byte("aa"),
106 FromAssetID: &bc.AssetID{V0: 1},
107 ToAssetID: &bc.AssetID{V0: 0},
109 Utxo: &common.MovUtxo{
110 SourceID: &bc.Hash{V0: 23},
113 ControlProgram: []byte("aa"),
117 FromAssetID: &bc.AssetID{V0: 1},
118 ToAssetID: &bc.AssetID{V0: 0},
120 Utxo: &common.MovUtxo{
121 SourceID: &bc.Hash{V0: 13},
124 ControlProgram: []byte("aa"),
128 FromAssetID: &bc.AssetID{V0: 1},
129 ToAssetID: &bc.AssetID{V0: 0},
131 Utxo: &common.MovUtxo{
132 SourceID: &bc.Hash{V0: 24},
135 ControlProgram: []byte("aa"),
139 FromAssetID: &bc.AssetID{V0: 1},
140 ToAssetID: &bc.AssetID{V0: 0},
142 Utxo: &common.MovUtxo{
143 SourceID: &bc.Hash{V0: 24},
146 ControlProgram: []byte("aa"),
150 FromAssetID: &bc.AssetID{V0: 1},
151 ToAssetID: &bc.AssetID{V0: 0},
153 Utxo: &common.MovUtxo{
154 SourceID: &bc.Hash{V0: 25},
157 ControlProgram: []byte("aa"),
161 FromAssetID: &bc.AssetID{V0: 1},
162 ToAssetID: &bc.AssetID{V0: 0},
164 Utxo: &common.MovUtxo{
165 SourceID: &bc.Hash{V0: 26},
168 ControlProgram: []byte("aa"),
172 FromAssetID: &bc.AssetID{V0: 1},
173 ToAssetID: &bc.AssetID{V0: 0},
175 Utxo: &common.MovUtxo{
176 SourceID: &bc.Hash{V0: 26},
179 ControlProgram: []byte("aa"),
183 FromAssetID: &bc.AssetID{V0: 1},
184 ToAssetID: &bc.AssetID{V0: 0},
186 Utxo: &common.MovUtxo{
187 SourceID: &bc.Hash{V0: 27},
190 ControlProgram: []byte("aa"),
194 FromAssetID: &bc.AssetID{V0: 1},
195 ToAssetID: &bc.AssetID{V0: 0},
197 Utxo: &common.MovUtxo{
198 SourceID: &bc.Hash{V0: 28},
201 ControlProgram: []byte("aa"),
205 FromAssetID: &bc.AssetID{V0: 1},
206 ToAssetID: &bc.AssetID{V0: 0},
208 Utxo: &common.MovUtxo{
209 SourceID: &bc.Hash{V0: 29},
212 ControlProgram: []byte("aa"),
216 FromAssetID: &bc.AssetID{V0: 1},
217 ToAssetID: &bc.AssetID{V0: 0},
219 Utxo: &common.MovUtxo{
220 SourceID: &bc.Hash{V0: 30},
223 ControlProgram: []byte("aa"),
227 FromAssetID: &bc.AssetID{V0: 1},
228 ToAssetID: &bc.AssetID{V0: 0},
230 Utxo: &common.MovUtxo{
231 SourceID: &bc.Hash{V0: 31},
234 ControlProgram: []byte("aa"),
238 FromAssetID: &bc.AssetID{V0: 1},
239 ToAssetID: &bc.AssetID{V0: 0},
241 Utxo: &common.MovUtxo{
242 SourceID: &bc.Hash{V0: 32},
245 ControlProgram: []byte("aa"),
249 FromAssetID: &bc.AssetID{V0: 1},
250 ToAssetID: &bc.AssetID{V0: 0},
252 Utxo: &common.MovUtxo{
253 SourceID: &bc.Hash{V0: 33},
256 ControlProgram: []byte("aa"),
260 want: []expectedData{
263 utxoHash: "f1b85307cf1f4eb6b193b6fc289413fdbb12bc362ced399762589b016e54dd02",
267 utxoHash: "49ef60af0f24962ed129a73142048ed0cb589041c629353932e3c3e0a4e822ba",
271 utxoHash: "67b2ac6ea71b271e72836e162811866f291ed2fab106c43519ca0c94ef8a5dce",
275 utxoHash: "47ff45b7b530512142981c2cee82faad63d6c9e7ffed0e72c3e42668f13b296f",
279 utxoHash: "b750d0b95f38043362c8335f242f97cfd3e1cada8fd171b914471a16cc0f14c6",
283 utxoHash: "04386ef57f0ca1be0a9be46c413900adbc0ab1e90e773959924aa73ca62edf64",
287 utxoHash: "c0fe6227c50da350a5e7b4ff85c18e9c901c323521067b9142acd128cf13ae82",
291 utxoHash: "47ff45b7b530512142981c2cee82faad63d6c9e7ffed0e72c3e42668f13b296f",
295 utxoHash: "bc92df1cbd20c98b0d18c9d93422a770849235867522a08e492196d16ed0a422",
299 utxoHash: "0cc0ded6fb337a3c5e6e4d008d6167dc58bdede43713898e914d65cda3b8499a",
303 utxoHash: "1fa9fae83d0a5401a4e92f80636966486e763eecca588aa11dff02b415320602",
307 utxoHash: "a4bc534c267d35a9eafc25cd66e0cb270a2537a51186605b7f7591bc567ab4c6",
311 utxoHash: "fdedf4117def659e07cc8a8ca318d21ae577a05e1a0197844b54d493bdae5854",
315 utxoHash: "20be3bd2d406bb7fe6627b32768fb2073e997b962a4badfa4384210fed2ab9c6",
319 utxoHash: "72192f56b9525c74c6a9f0419563bc0da76b0f3d6e89d9decdb6e67786ac3909",
323 utxoHash: "7886844334659b4feffc41528cf81192925d3aa4a5ccb3652200b9073b7d47c3",
329 for i, c := range cases {
330 for _, order := range c.orders {
331 key := calcOrderKey(order.FromAssetID, order.ToAssetID, calcUTXOHash(&order), order.Rate)
332 data, err := json.Marshal(order.Utxo)
337 db.SetSync(key, data)
340 got := []expectedData{}
342 itr := db.IteratorPrefixWithStart(nil, nil, false)
345 pos := len(ordersPrefix) + assetIDLen*2
347 copy(b[:], key[pos+8:])
348 utxoHash := bc.NewHash(b)
350 rate := getRateFromOrderKey(key, ordersPrefix)
351 got = append(got, expectedData{
353 utxoHash: utxoHash.String(),
358 if !testutil.DeepEqual(c.want, got) {
359 t.Errorf("case %v: got recovery status, got: %v, want: %v.", i, got, c.want)
365 func TestMovStore(t *testing.T) {
368 beforeOrders []*common.Order
369 beforeTradePairs []*common.TradePair
370 beforeDBStatus *common.MovDatabaseState
371 addOrders []*common.Order
372 delOrders []*common.Order
373 blockHeader *types.BlockHeader
374 wantOrders []*common.Order
375 wantTradePairs []*common.TradePair
376 wantDBState *common.MovDatabaseState
380 addOrders: []*common.Order{
382 FromAssetID: assetID1,
385 Utxo: &common.MovUtxo{
386 SourceID: &bc.Hash{V0: 21},
389 ControlProgram: []byte("aa"),
393 FromAssetID: assetID1,
396 Utxo: &common.MovUtxo{
397 SourceID: &bc.Hash{V0: 22},
400 ControlProgram: []byte("aa"),
404 FromAssetID: assetID1,
407 Utxo: &common.MovUtxo{
408 SourceID: &bc.Hash{V0: 23},
411 ControlProgram: []byte("aa"),
415 FromAssetID: assetID1,
418 Utxo: &common.MovUtxo{
419 SourceID: &bc.Hash{V0: 13},
422 ControlProgram: []byte("aa"),
426 FromAssetID: assetID1,
429 Utxo: &common.MovUtxo{
430 SourceID: &bc.Hash{V0: 24},
433 ControlProgram: []byte("aa"),
437 FromAssetID: assetID1,
440 Utxo: &common.MovUtxo{
441 SourceID: &bc.Hash{V0: 24},
444 ControlProgram: []byte("aa"),
448 FromAssetID: assetID1,
451 Utxo: &common.MovUtxo{
452 SourceID: &bc.Hash{V0: 25},
455 ControlProgram: []byte("aa"),
459 FromAssetID: assetID1,
462 Utxo: &common.MovUtxo{
463 SourceID: &bc.Hash{V0: 26},
466 ControlProgram: []byte("aa"),
470 blockHeader: &types.BlockHeader{Height: 1, PreviousBlockHash: bc.Hash{V0: 524821139490765641, V1: 2484214155808702787, V2: 9108473449351508820, V3: 7972721253564512122}},
471 wantOrders: []*common.Order{
473 FromAssetID: assetID1,
476 Utxo: &common.MovUtxo{
477 SourceID: &bc.Hash{V0: 22},
480 ControlProgram: []byte("aa"),
484 FromAssetID: assetID1,
487 Utxo: &common.MovUtxo{
488 SourceID: &bc.Hash{V0: 26},
491 ControlProgram: []byte("aa"),
495 FromAssetID: assetID1,
498 Utxo: &common.MovUtxo{
499 SourceID: &bc.Hash{V0: 25},
502 ControlProgram: []byte("aa"),
506 FromAssetID: assetID1,
509 Utxo: &common.MovUtxo{
510 SourceID: &bc.Hash{V0: 23},
513 ControlProgram: []byte("aa"),
517 FromAssetID: assetID1,
520 Utxo: &common.MovUtxo{
521 SourceID: &bc.Hash{V0: 13},
524 ControlProgram: []byte("aa"),
528 FromAssetID: assetID1,
531 Utxo: &common.MovUtxo{
532 SourceID: &bc.Hash{V0: 24},
535 ControlProgram: []byte("aa"),
539 FromAssetID: assetID1,
542 Utxo: &common.MovUtxo{
543 SourceID: &bc.Hash{V0: 24},
546 ControlProgram: []byte("aa"),
550 FromAssetID: assetID1,
553 Utxo: &common.MovUtxo{
554 SourceID: &bc.Hash{V0: 21},
557 ControlProgram: []byte("aa"),
561 wantTradePairs: []*common.TradePair{
562 &common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2, Count: 8},
564 wantDBState: &common.MovDatabaseState{Height: 1, Hash: &bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
567 desc: "del some order",
568 beforeOrders: []*common.Order{
570 FromAssetID: assetID1,
573 Utxo: &common.MovUtxo{
574 SourceID: &bc.Hash{V0: 21},
577 ControlProgram: []byte("aa"),
581 FromAssetID: assetID1,
584 Utxo: &common.MovUtxo{
585 SourceID: &bc.Hash{V0: 22},
588 ControlProgram: []byte("aa"),
592 FromAssetID: assetID1,
595 Utxo: &common.MovUtxo{
596 SourceID: &bc.Hash{V0: 23},
599 ControlProgram: []byte("aa"),
603 FromAssetID: assetID1,
606 Utxo: &common.MovUtxo{
607 SourceID: &bc.Hash{V0: 13},
610 ControlProgram: []byte("aa"),
614 FromAssetID: assetID1,
617 Utxo: &common.MovUtxo{
618 SourceID: &bc.Hash{V0: 24},
621 ControlProgram: []byte("aa"),
625 FromAssetID: assetID1,
628 Utxo: &common.MovUtxo{
629 SourceID: &bc.Hash{V0: 24},
632 ControlProgram: []byte("aa"),
636 FromAssetID: assetID1,
639 Utxo: &common.MovUtxo{
640 SourceID: &bc.Hash{V0: 25},
643 ControlProgram: []byte("aa"),
647 FromAssetID: assetID1,
650 Utxo: &common.MovUtxo{
651 SourceID: &bc.Hash{V0: 26},
654 ControlProgram: []byte("aa"),
658 beforeTradePairs: []*common.TradePair{
660 FromAssetID: assetID1,
665 beforeDBStatus: &common.MovDatabaseState{Height: 1, Hash: &bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
666 delOrders: []*common.Order{
668 FromAssetID: assetID1,
671 Utxo: &common.MovUtxo{
672 SourceID: &bc.Hash{V0: 21},
675 ControlProgram: []byte("aa"),
679 FromAssetID: assetID1,
682 Utxo: &common.MovUtxo{
683 SourceID: &bc.Hash{V0: 22},
686 ControlProgram: []byte("aa"),
690 FromAssetID: assetID1,
693 Utxo: &common.MovUtxo{
694 SourceID: &bc.Hash{V0: 23},
697 ControlProgram: []byte("aa"),
701 blockHeader: &types.BlockHeader{Height: 2, PreviousBlockHash: bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
702 wantOrders: []*common.Order{
704 FromAssetID: assetID1,
707 Utxo: &common.MovUtxo{
708 SourceID: &bc.Hash{V0: 26},
711 ControlProgram: []byte("aa"),
715 FromAssetID: assetID1,
718 Utxo: &common.MovUtxo{
719 SourceID: &bc.Hash{V0: 25},
722 ControlProgram: []byte("aa"),
726 FromAssetID: assetID1,
729 Utxo: &common.MovUtxo{
730 SourceID: &bc.Hash{V0: 13},
733 ControlProgram: []byte("aa"),
737 FromAssetID: assetID1,
740 Utxo: &common.MovUtxo{
741 SourceID: &bc.Hash{V0: 24},
744 ControlProgram: []byte("aa"),
748 FromAssetID: assetID1,
751 Utxo: &common.MovUtxo{
752 SourceID: &bc.Hash{V0: 24},
755 ControlProgram: []byte("aa"),
759 wantTradePairs: []*common.TradePair{
760 &common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2, Count: 5},
762 wantDBState: &common.MovDatabaseState{Height: 2, Hash: &bc.Hash{V0: 3724755213446347384, V1: 158878632373345042, V2: 18283800951484248781, V3: 7520797730449067221}},
765 desc: "del all order",
766 beforeOrders: []*common.Order{
768 FromAssetID: assetID1,
771 Utxo: &common.MovUtxo{
772 SourceID: &bc.Hash{V0: 21},
775 ControlProgram: []byte("aa"),
779 FromAssetID: assetID1,
782 Utxo: &common.MovUtxo{
783 SourceID: &bc.Hash{V0: 22},
786 ControlProgram: []byte("aa"),
790 FromAssetID: assetID1,
793 Utxo: &common.MovUtxo{
794 SourceID: &bc.Hash{V0: 23},
797 ControlProgram: []byte("aa"),
801 FromAssetID: assetID1,
804 Utxo: &common.MovUtxo{
805 SourceID: &bc.Hash{V0: 13},
808 ControlProgram: []byte("aa"),
812 FromAssetID: assetID1,
815 Utxo: &common.MovUtxo{
816 SourceID: &bc.Hash{V0: 24},
819 ControlProgram: []byte("aa"),
823 FromAssetID: assetID1,
826 Utxo: &common.MovUtxo{
827 SourceID: &bc.Hash{V0: 24},
830 ControlProgram: []byte("aa"),
834 FromAssetID: assetID1,
837 Utxo: &common.MovUtxo{
838 SourceID: &bc.Hash{V0: 25},
841 ControlProgram: []byte("aa"),
845 FromAssetID: assetID1,
848 Utxo: &common.MovUtxo{
849 SourceID: &bc.Hash{V0: 26},
852 ControlProgram: []byte("aa"),
856 beforeTradePairs: []*common.TradePair{
858 FromAssetID: assetID1,
863 beforeDBStatus: &common.MovDatabaseState{Height: 1, Hash: &bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
864 delOrders: []*common.Order{
866 FromAssetID: assetID1,
869 Utxo: &common.MovUtxo{
870 SourceID: &bc.Hash{V0: 21},
873 ControlProgram: []byte("aa"),
877 FromAssetID: assetID1,
880 Utxo: &common.MovUtxo{
881 SourceID: &bc.Hash{V0: 22},
884 ControlProgram: []byte("aa"),
888 FromAssetID: assetID1,
891 Utxo: &common.MovUtxo{
892 SourceID: &bc.Hash{V0: 23},
895 ControlProgram: []byte("aa"),
899 FromAssetID: assetID1,
902 Utxo: &common.MovUtxo{
903 SourceID: &bc.Hash{V0: 13},
906 ControlProgram: []byte("aa"),
910 FromAssetID: assetID1,
913 Utxo: &common.MovUtxo{
914 SourceID: &bc.Hash{V0: 24},
917 ControlProgram: []byte("aa"),
921 FromAssetID: assetID1,
924 Utxo: &common.MovUtxo{
925 SourceID: &bc.Hash{V0: 24},
928 ControlProgram: []byte("aa"),
932 FromAssetID: assetID1,
935 Utxo: &common.MovUtxo{
936 SourceID: &bc.Hash{V0: 25},
939 ControlProgram: []byte("aa"),
943 FromAssetID: assetID1,
946 Utxo: &common.MovUtxo{
947 SourceID: &bc.Hash{V0: 26},
950 ControlProgram: []byte("aa"),
954 blockHeader: &types.BlockHeader{Height: 2, PreviousBlockHash: bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
955 wantOrders: []*common.Order{},
956 wantTradePairs: []*common.TradePair{},
957 wantDBState: &common.MovDatabaseState{Height: 2, Hash: &bc.Hash{V0: 3724755213446347384, V1: 158878632373345042, V2: 18283800951484248781, V3: 7520797730449067221}},
960 desc: "Add and delete the same trade pair", //Add and delete different transaction pairs
961 beforeOrders: []*common.Order{
963 FromAssetID: assetID1,
966 Utxo: &common.MovUtxo{
967 SourceID: &bc.Hash{V0: 21},
970 ControlProgram: []byte("aa"),
974 FromAssetID: assetID1,
977 Utxo: &common.MovUtxo{
978 SourceID: &bc.Hash{V0: 22},
981 ControlProgram: []byte("aa"),
985 FromAssetID: assetID1,
988 Utxo: &common.MovUtxo{
989 SourceID: &bc.Hash{V0: 23},
992 ControlProgram: []byte("aa"),
996 FromAssetID: assetID1,
999 Utxo: &common.MovUtxo{
1000 SourceID: &bc.Hash{V0: 13},
1003 ControlProgram: []byte("aa"),
1007 FromAssetID: assetID1,
1008 ToAssetID: assetID2,
1010 Utxo: &common.MovUtxo{
1011 SourceID: &bc.Hash{V0: 24},
1014 ControlProgram: []byte("aa"),
1018 FromAssetID: assetID1,
1019 ToAssetID: assetID2,
1021 Utxo: &common.MovUtxo{
1022 SourceID: &bc.Hash{V0: 24},
1025 ControlProgram: []byte("aa"),
1029 FromAssetID: assetID1,
1030 ToAssetID: assetID2,
1032 Utxo: &common.MovUtxo{
1033 SourceID: &bc.Hash{V0: 25},
1036 ControlProgram: []byte("aa"),
1040 FromAssetID: assetID1,
1041 ToAssetID: assetID2,
1043 Utxo: &common.MovUtxo{
1044 SourceID: &bc.Hash{V0: 26},
1047 ControlProgram: []byte("aa"),
1051 beforeTradePairs: []*common.TradePair{
1053 FromAssetID: assetID1,
1054 ToAssetID: assetID2,
1058 beforeDBStatus: &common.MovDatabaseState{Height: 1, Hash: &bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
1059 addOrders: []*common.Order{
1061 FromAssetID: assetID1,
1062 ToAssetID: assetID2,
1064 Utxo: &common.MovUtxo{
1065 SourceID: &bc.Hash{V0: 1},
1068 ControlProgram: []byte("aa"),
1072 FromAssetID: assetID1,
1073 ToAssetID: assetID2,
1075 Utxo: &common.MovUtxo{
1076 SourceID: &bc.Hash{V0: 2},
1079 ControlProgram: []byte("aa"),
1083 delOrders: []*common.Order{
1085 FromAssetID: assetID1,
1086 ToAssetID: assetID2,
1088 Utxo: &common.MovUtxo{
1089 SourceID: &bc.Hash{V0: 21},
1092 ControlProgram: []byte("aa"),
1096 FromAssetID: assetID1,
1097 ToAssetID: assetID2,
1099 Utxo: &common.MovUtxo{
1100 SourceID: &bc.Hash{V0: 22},
1103 ControlProgram: []byte("aa"),
1107 FromAssetID: assetID1,
1108 ToAssetID: assetID2,
1110 Utxo: &common.MovUtxo{
1111 SourceID: &bc.Hash{V0: 23},
1114 ControlProgram: []byte("aa"),
1118 FromAssetID: assetID1,
1119 ToAssetID: assetID2,
1121 Utxo: &common.MovUtxo{
1122 SourceID: &bc.Hash{V0: 13},
1125 ControlProgram: []byte("aa"),
1129 FromAssetID: assetID1,
1130 ToAssetID: assetID2,
1132 Utxo: &common.MovUtxo{
1133 SourceID: &bc.Hash{V0: 24},
1136 ControlProgram: []byte("aa"),
1140 FromAssetID: assetID1,
1141 ToAssetID: assetID2,
1143 Utxo: &common.MovUtxo{
1144 SourceID: &bc.Hash{V0: 24},
1147 ControlProgram: []byte("aa"),
1151 FromAssetID: assetID1,
1152 ToAssetID: assetID2,
1154 Utxo: &common.MovUtxo{
1155 SourceID: &bc.Hash{V0: 25},
1158 ControlProgram: []byte("aa"),
1162 FromAssetID: assetID1,
1163 ToAssetID: assetID2,
1165 Utxo: &common.MovUtxo{
1166 SourceID: &bc.Hash{V0: 26},
1169 ControlProgram: []byte("aa"),
1173 blockHeader: &types.BlockHeader{Height: 2, PreviousBlockHash: bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
1174 wantOrders: []*common.Order{
1176 FromAssetID: assetID1,
1177 ToAssetID: assetID2,
1179 Utxo: &common.MovUtxo{
1180 SourceID: &bc.Hash{V0: 2},
1183 ControlProgram: []byte("aa"),
1187 FromAssetID: assetID1,
1188 ToAssetID: assetID2,
1190 Utxo: &common.MovUtxo{
1191 SourceID: &bc.Hash{V0: 1},
1194 ControlProgram: []byte("aa"),
1198 wantTradePairs: []*common.TradePair{
1199 &common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2, Count: 2},
1201 wantDBState: &common.MovDatabaseState{Height: 2, Hash: &bc.Hash{V0: 3724755213446347384, V1: 158878632373345042, V2: 18283800951484248781, V3: 7520797730449067221}},
1204 desc: "Add and delete different transaction pairs",
1205 beforeOrders: []*common.Order{
1207 FromAssetID: assetID1,
1208 ToAssetID: assetID2,
1210 Utxo: &common.MovUtxo{
1211 SourceID: &bc.Hash{V0: 21},
1214 ControlProgram: []byte("aa"),
1218 FromAssetID: assetID1,
1219 ToAssetID: assetID2,
1221 Utxo: &common.MovUtxo{
1222 SourceID: &bc.Hash{V0: 22},
1225 ControlProgram: []byte("aa"),
1229 FromAssetID: assetID1,
1230 ToAssetID: assetID2,
1232 Utxo: &common.MovUtxo{
1233 SourceID: &bc.Hash{V0: 23},
1236 ControlProgram: []byte("aa"),
1240 FromAssetID: assetID1,
1241 ToAssetID: assetID2,
1243 Utxo: &common.MovUtxo{
1244 SourceID: &bc.Hash{V0: 13},
1247 ControlProgram: []byte("aa"),
1251 FromAssetID: assetID1,
1252 ToAssetID: assetID2,
1254 Utxo: &common.MovUtxo{
1255 SourceID: &bc.Hash{V0: 24},
1258 ControlProgram: []byte("aa"),
1262 FromAssetID: assetID1,
1263 ToAssetID: assetID2,
1265 Utxo: &common.MovUtxo{
1266 SourceID: &bc.Hash{V0: 24},
1269 ControlProgram: []byte("aa"),
1273 FromAssetID: assetID1,
1274 ToAssetID: assetID2,
1276 Utxo: &common.MovUtxo{
1277 SourceID: &bc.Hash{V0: 25},
1280 ControlProgram: []byte("aa"),
1284 FromAssetID: assetID1,
1285 ToAssetID: assetID2,
1287 Utxo: &common.MovUtxo{
1288 SourceID: &bc.Hash{V0: 26},
1291 ControlProgram: []byte("aa"),
1295 FromAssetID: assetID3,
1296 ToAssetID: assetID2,
1298 Utxo: &common.MovUtxo{
1299 SourceID: &bc.Hash{V0: 33},
1302 ControlProgram: []byte("aa"),
1306 FromAssetID: assetID4,
1307 ToAssetID: assetID2,
1309 Utxo: &common.MovUtxo{
1310 SourceID: &bc.Hash{V0: 34},
1313 ControlProgram: []byte("aa"),
1317 beforeTradePairs: []*common.TradePair{
1319 FromAssetID: assetID1,
1320 ToAssetID: assetID2,
1324 FromAssetID: assetID3,
1325 ToAssetID: assetID2,
1329 FromAssetID: assetID4,
1330 ToAssetID: assetID2,
1334 beforeDBStatus: &common.MovDatabaseState{Height: 1, Hash: &bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
1335 addOrders: []*common.Order{
1337 FromAssetID: assetID4,
1338 ToAssetID: assetID2,
1340 Utxo: &common.MovUtxo{
1341 SourceID: &bc.Hash{V0: 36},
1344 ControlProgram: []byte("aa"),
1348 FromAssetID: assetID5,
1349 ToAssetID: assetID2,
1351 Utxo: &common.MovUtxo{
1352 SourceID: &bc.Hash{V0: 37},
1355 ControlProgram: []byte("aa"),
1359 FromAssetID: assetID6,
1360 ToAssetID: assetID2,
1362 Utxo: &common.MovUtxo{
1363 SourceID: &bc.Hash{V0: 38},
1366 ControlProgram: []byte("aa"),
1370 delOrders: []*common.Order{
1372 FromAssetID: assetID1,
1373 ToAssetID: assetID2,
1375 Utxo: &common.MovUtxo{
1376 SourceID: &bc.Hash{V0: 21},
1379 ControlProgram: []byte("aa"),
1383 FromAssetID: assetID1,
1384 ToAssetID: assetID2,
1386 Utxo: &common.MovUtxo{
1387 SourceID: &bc.Hash{V0: 22},
1390 ControlProgram: []byte("aa"),
1394 FromAssetID: assetID1,
1395 ToAssetID: assetID2,
1397 Utxo: &common.MovUtxo{
1398 SourceID: &bc.Hash{V0: 23},
1401 ControlProgram: []byte("aa"),
1405 FromAssetID: assetID1,
1406 ToAssetID: assetID2,
1408 Utxo: &common.MovUtxo{
1409 SourceID: &bc.Hash{V0: 13},
1412 ControlProgram: []byte("aa"),
1416 FromAssetID: assetID1,
1417 ToAssetID: assetID2,
1419 Utxo: &common.MovUtxo{
1420 SourceID: &bc.Hash{V0: 24},
1423 ControlProgram: []byte("aa"),
1427 FromAssetID: assetID1,
1428 ToAssetID: assetID2,
1430 Utxo: &common.MovUtxo{
1431 SourceID: &bc.Hash{V0: 24},
1434 ControlProgram: []byte("aa"),
1438 FromAssetID: assetID1,
1439 ToAssetID: assetID2,
1441 Utxo: &common.MovUtxo{
1442 SourceID: &bc.Hash{V0: 25},
1445 ControlProgram: []byte("aa"),
1449 FromAssetID: assetID1,
1450 ToAssetID: assetID2,
1452 Utxo: &common.MovUtxo{
1453 SourceID: &bc.Hash{V0: 26},
1456 ControlProgram: []byte("aa"),
1460 FromAssetID: assetID3,
1461 ToAssetID: assetID2,
1463 Utxo: &common.MovUtxo{
1464 SourceID: &bc.Hash{V0: 33},
1467 ControlProgram: []byte("aa"),
1471 blockHeader: &types.BlockHeader{Height: 2, PreviousBlockHash: bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
1472 wantOrders: []*common.Order{
1474 FromAssetID: assetID4,
1475 ToAssetID: assetID2,
1477 Utxo: &common.MovUtxo{
1478 SourceID: &bc.Hash{V0: 34},
1481 ControlProgram: []byte("aa"),
1485 FromAssetID: assetID4,
1486 ToAssetID: assetID2,
1488 Utxo: &common.MovUtxo{
1489 SourceID: &bc.Hash{V0: 36},
1492 ControlProgram: []byte("aa"),
1496 FromAssetID: assetID5,
1497 ToAssetID: assetID2,
1499 Utxo: &common.MovUtxo{
1500 SourceID: &bc.Hash{V0: 37},
1503 ControlProgram: []byte("aa"),
1507 FromAssetID: assetID6,
1508 ToAssetID: assetID2,
1510 Utxo: &common.MovUtxo{
1511 SourceID: &bc.Hash{V0: 38},
1514 ControlProgram: []byte("aa"),
1518 wantTradePairs: []*common.TradePair{
1519 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID2, Count: 2},
1520 &common.TradePair{FromAssetID: assetID5, ToAssetID: assetID2, Count: 1},
1521 &common.TradePair{FromAssetID: assetID6, ToAssetID: assetID2, Count: 1},
1523 wantDBState: &common.MovDatabaseState{Height: 2, Hash: &bc.Hash{V0: 3724755213446347384, V1: 158878632373345042, V2: 18283800951484248781, V3: 7520797730449067221}},
1527 initBlockHeader := &types.BlockHeader{
1532 height := initBlockHeader.Height
1533 hash := initBlockHeader.Hash()
1535 defer os.RemoveAll("temp")
1536 for i, c := range cases {
1537 testDB := dbm.NewDB("testdb", "leveldb", "temp")
1538 movStore, err := NewMovStore(testDB, height, &hash)
1540 t.Fatalf("case %d: NewMovStore error %v.", i, err)
1543 batch := movStore.db.NewBatch()
1544 tradePairsCnt := make(map[common.TradePair]int)
1545 movStore.addOrders(batch, c.beforeOrders, tradePairsCnt)
1546 if len(c.beforeOrders) > 0 {
1547 tradePairsCnt = make(map[common.TradePair]int)
1548 for _, tradePair := range c.beforeTradePairs {
1549 tradePairsCnt[*tradePair] = tradePair.Count
1551 movStore.updateTradePairs(batch, tradePairsCnt)
1552 movStore.saveMovDatabaseState(batch, c.beforeDBStatus)
1556 if err := movStore.ProcessOrders(c.addOrders, c.delOrders, c.blockHeader); err != nil {
1557 t.Fatalf("case %d: ProcessOrders error %v.", i, err)
1560 var gotOrders []*common.Order
1562 tmp, err := movStore.ListOrders(&common.Order{FromAssetID: assetID1, ToAssetID: assetID2, Rate: 0})
1564 t.Fatalf("case %d: ListOrders(assetID1 and assetID2) error %v.", i, err)
1567 gotOrders = append(gotOrders, tmp...)
1569 tmp, err = movStore.ListOrders(&common.Order{FromAssetID: assetID3, ToAssetID: assetID2, Rate: 0})
1571 t.Fatalf("case %d: ListOrders(assetID3 and assetID2) error %v.", i, err)
1574 gotOrders = append(gotOrders, tmp...)
1576 tmp, err = movStore.ListOrders(&common.Order{FromAssetID: assetID4, ToAssetID: assetID2, Rate: 0})
1578 t.Fatalf("case %d: ListOrders(assetID4 and assetID2) error %v.", i, err)
1581 gotOrders = append(gotOrders, tmp...)
1583 tmp, err = movStore.ListOrders(&common.Order{FromAssetID: assetID5, ToAssetID: assetID2, Rate: 0})
1585 t.Fatalf("case %d: ListOrders(assetID5 and assetID2) error %v.", i, err)
1588 gotOrders = append(gotOrders, tmp...)
1590 tmp, err = movStore.ListOrders(&common.Order{FromAssetID: assetID6, ToAssetID: assetID2, Rate: 0})
1592 t.Fatalf("case %d: ListOrders(assetID6 and assetID2) error %v.", i, err)
1595 gotOrders = append(gotOrders, tmp...)
1597 if !testutil.DeepEqual(gotOrders, c.wantOrders) {
1598 t.Fatalf("case %d: got orders , gotOrders: %v, wantOrders: %v.", i, gotOrders, c.wantOrders)
1601 gotTradePairs, err := movStore.ListTradePairsWithStart(nil, nil)
1603 t.Fatalf("case %d: ListTradePairsWithStart error %v.", i, err)
1606 if !testutil.DeepEqual(gotTradePairs, c.wantTradePairs) {
1607 t.Fatalf("case %d: got tradePairs, gotTradePairs: %v, wantTradePairs: %v.", i, gotTradePairs, c.wantTradePairs)
1610 gotDBState, err := movStore.GetMovDatabaseState()
1612 t.Fatalf("case %d: GetMovDatabaseState error %v.", i, err)
1615 if !testutil.DeepEqual(gotDBState, c.wantDBState) {
1616 t.Fatalf("case %d: got tradePairs, gotDBState: %v, wantDBStatus: %v.", i, gotDBState, c.wantDBState)
1620 os.RemoveAll("temp")
1624 func TestListOrders(t *testing.T) {
1627 storeOrders []*common.Order
1629 wantOrders []*common.Order
1633 query: &common.Order{FromAssetID: assetID1, ToAssetID: assetID2},
1634 wantOrders: []*common.Order{},
1637 desc: "query from first",
1638 storeOrders: []*common.Order{
1640 FromAssetID: assetID1,
1641 ToAssetID: assetID2,
1643 Utxo: &common.MovUtxo{
1644 SourceID: &bc.Hash{V0: 21},
1647 ControlProgram: []byte("aa"),
1651 FromAssetID: assetID1,
1652 ToAssetID: assetID2,
1654 Utxo: &common.MovUtxo{
1655 SourceID: &bc.Hash{V0: 22},
1658 ControlProgram: []byte("aa"),
1662 FromAssetID: assetID1,
1663 ToAssetID: assetID2,
1665 Utxo: &common.MovUtxo{
1666 SourceID: &bc.Hash{V0: 23},
1669 ControlProgram: []byte("aa"),
1673 FromAssetID: assetID1,
1674 ToAssetID: assetID2,
1676 Utxo: &common.MovUtxo{
1677 SourceID: &bc.Hash{V0: 13},
1680 ControlProgram: []byte("aa"),
1684 FromAssetID: assetID1,
1685 ToAssetID: assetID2,
1687 Utxo: &common.MovUtxo{
1688 SourceID: &bc.Hash{V0: 24},
1691 ControlProgram: []byte("aa"),
1695 FromAssetID: assetID1,
1696 ToAssetID: assetID2,
1698 Utxo: &common.MovUtxo{
1699 SourceID: &bc.Hash{V0: 24},
1702 ControlProgram: []byte("aa"),
1706 FromAssetID: assetID1,
1707 ToAssetID: assetID2,
1709 Utxo: &common.MovUtxo{
1710 SourceID: &bc.Hash{V0: 25},
1713 ControlProgram: []byte("aa"),
1717 FromAssetID: assetID1,
1718 ToAssetID: assetID2,
1720 Utxo: &common.MovUtxo{
1721 SourceID: &bc.Hash{V0: 26},
1724 ControlProgram: []byte("aa"),
1728 query: &common.Order{FromAssetID: assetID1, ToAssetID: assetID2},
1729 wantOrders: []*common.Order{
1731 FromAssetID: assetID1,
1732 ToAssetID: assetID2,
1734 Utxo: &common.MovUtxo{
1735 SourceID: &bc.Hash{V0: 22},
1738 ControlProgram: []byte("aa"),
1742 FromAssetID: assetID1,
1743 ToAssetID: assetID2,
1745 Utxo: &common.MovUtxo{
1746 SourceID: &bc.Hash{V0: 26},
1749 ControlProgram: []byte("aa"),
1753 FromAssetID: assetID1,
1754 ToAssetID: assetID2,
1756 Utxo: &common.MovUtxo{
1757 SourceID: &bc.Hash{V0: 25},
1760 ControlProgram: []byte("aa"),
1764 FromAssetID: assetID1,
1765 ToAssetID: assetID2,
1767 Utxo: &common.MovUtxo{
1768 SourceID: &bc.Hash{V0: 23},
1771 ControlProgram: []byte("aa"),
1775 FromAssetID: assetID1,
1776 ToAssetID: assetID2,
1778 Utxo: &common.MovUtxo{
1779 SourceID: &bc.Hash{V0: 13},
1782 ControlProgram: []byte("aa"),
1786 FromAssetID: assetID1,
1787 ToAssetID: assetID2,
1789 Utxo: &common.MovUtxo{
1790 SourceID: &bc.Hash{V0: 24},
1793 ControlProgram: []byte("aa"),
1797 FromAssetID: assetID1,
1798 ToAssetID: assetID2,
1800 Utxo: &common.MovUtxo{
1801 SourceID: &bc.Hash{V0: 24},
1804 ControlProgram: []byte("aa"),
1808 FromAssetID: assetID1,
1809 ToAssetID: assetID2,
1811 Utxo: &common.MovUtxo{
1812 SourceID: &bc.Hash{V0: 21},
1815 ControlProgram: []byte("aa"),
1821 desc: "query from middle",
1822 storeOrders: []*common.Order{
1824 FromAssetID: assetID1,
1825 ToAssetID: assetID2,
1827 Utxo: &common.MovUtxo{
1828 SourceID: &bc.Hash{V0: 21},
1831 ControlProgram: []byte("aa"),
1835 FromAssetID: assetID1,
1836 ToAssetID: assetID2,
1838 Utxo: &common.MovUtxo{
1839 SourceID: &bc.Hash{V0: 22},
1842 ControlProgram: []byte("aa"),
1846 FromAssetID: assetID1,
1847 ToAssetID: assetID2,
1849 Utxo: &common.MovUtxo{
1850 SourceID: &bc.Hash{V0: 23},
1853 ControlProgram: []byte("aa"),
1857 FromAssetID: assetID1,
1858 ToAssetID: assetID2,
1860 Utxo: &common.MovUtxo{
1861 SourceID: &bc.Hash{V0: 13},
1864 ControlProgram: []byte("aa"),
1868 FromAssetID: assetID1,
1869 ToAssetID: assetID2,
1871 Utxo: &common.MovUtxo{
1872 SourceID: &bc.Hash{V0: 24},
1875 ControlProgram: []byte("aa"),
1879 FromAssetID: assetID1,
1880 ToAssetID: assetID2,
1882 Utxo: &common.MovUtxo{
1883 SourceID: &bc.Hash{V0: 24},
1886 ControlProgram: []byte("aa"),
1890 FromAssetID: assetID1,
1891 ToAssetID: assetID2,
1893 Utxo: &common.MovUtxo{
1894 SourceID: &bc.Hash{V0: 25},
1897 ControlProgram: []byte("aa"),
1901 FromAssetID: assetID1,
1902 ToAssetID: assetID2,
1904 Utxo: &common.MovUtxo{
1905 SourceID: &bc.Hash{V0: 26},
1908 ControlProgram: []byte("aa"),
1912 query: &common.Order{
1913 FromAssetID: assetID1,
1914 ToAssetID: assetID2,
1916 Utxo: &common.MovUtxo{
1917 SourceID: &bc.Hash{V0: 13},
1920 ControlProgram: []byte("aa"),
1923 wantOrders: []*common.Order{
1925 FromAssetID: assetID1,
1926 ToAssetID: assetID2,
1928 Utxo: &common.MovUtxo{
1929 SourceID: &bc.Hash{V0: 24},
1932 ControlProgram: []byte("aa"),
1936 FromAssetID: assetID1,
1937 ToAssetID: assetID2,
1939 Utxo: &common.MovUtxo{
1940 SourceID: &bc.Hash{V0: 24},
1943 ControlProgram: []byte("aa"),
1947 FromAssetID: assetID1,
1948 ToAssetID: assetID2,
1950 Utxo: &common.MovUtxo{
1951 SourceID: &bc.Hash{V0: 21},
1954 ControlProgram: []byte("aa"),
1961 initBlockHeader := &types.BlockHeader{
1966 height := initBlockHeader.Height
1967 hash := initBlockHeader.Hash()
1969 defer os.RemoveAll("temp")
1970 for i, c := range cases {
1971 testDB := dbm.NewDB("testdb", "leveldb", "temp")
1972 movStore, err := NewMovStore(testDB, height, &hash)
1974 t.Fatalf("case %d: NewMovStore error %v.", i, err)
1977 batch := movStore.db.NewBatch()
1978 tradePairsCnt := make(map[common.TradePair]int)
1979 movStore.addOrders(batch, c.storeOrders, tradePairsCnt)
1980 movStore.updateTradePairs(batch, tradePairsCnt)
1983 gotOrders, err := movStore.ListOrders(c.query)
1985 t.Fatalf("case %d: ListOrders error %v.", i, err)
1988 if !testutil.DeepEqual(gotOrders, c.wantOrders) {
1989 t.Fatalf("case %d: got orders , gotOrders: %v, wantOrders: %v.", i, gotOrders, c.wantOrders)
1993 os.RemoveAll("temp")
1997 func TestAddOrders(t *testing.T) {
2000 beforeOrders []*common.Order
2001 addOrders []*common.Order
2002 wantOrders []*common.Order
2006 addOrders: []*common.Order{
2008 FromAssetID: assetID1,
2009 ToAssetID: assetID2,
2011 Utxo: &common.MovUtxo{
2012 SourceID: &bc.Hash{V0: 21},
2015 ControlProgram: []byte("aa"),
2019 FromAssetID: assetID1,
2020 ToAssetID: assetID2,
2022 Utxo: &common.MovUtxo{
2023 SourceID: &bc.Hash{V0: 22},
2026 ControlProgram: []byte("aa"),
2030 FromAssetID: assetID1,
2031 ToAssetID: assetID2,
2033 Utxo: &common.MovUtxo{
2034 SourceID: &bc.Hash{V0: 23},
2037 ControlProgram: []byte("aa"),
2041 FromAssetID: assetID1,
2042 ToAssetID: assetID2,
2044 Utxo: &common.MovUtxo{
2045 SourceID: &bc.Hash{V0: 13},
2048 ControlProgram: []byte("aa"),
2052 FromAssetID: assetID1,
2053 ToAssetID: assetID2,
2055 Utxo: &common.MovUtxo{
2056 SourceID: &bc.Hash{V0: 24},
2059 ControlProgram: []byte("aa"),
2063 FromAssetID: assetID1,
2064 ToAssetID: assetID2,
2066 Utxo: &common.MovUtxo{
2067 SourceID: &bc.Hash{V0: 24},
2070 ControlProgram: []byte("aa"),
2074 FromAssetID: assetID1,
2075 ToAssetID: assetID2,
2077 Utxo: &common.MovUtxo{
2078 SourceID: &bc.Hash{V0: 25},
2081 ControlProgram: []byte("aa"),
2085 FromAssetID: assetID1,
2086 ToAssetID: assetID2,
2088 Utxo: &common.MovUtxo{
2089 SourceID: &bc.Hash{V0: 26},
2092 ControlProgram: []byte("aa"),
2096 wantOrders: []*common.Order{
2098 FromAssetID: assetID1,
2099 ToAssetID: assetID2,
2101 Utxo: &common.MovUtxo{
2102 SourceID: &bc.Hash{V0: 22},
2105 ControlProgram: []byte("aa"),
2109 FromAssetID: assetID1,
2110 ToAssetID: assetID2,
2112 Utxo: &common.MovUtxo{
2113 SourceID: &bc.Hash{V0: 26},
2116 ControlProgram: []byte("aa"),
2120 FromAssetID: assetID1,
2121 ToAssetID: assetID2,
2123 Utxo: &common.MovUtxo{
2124 SourceID: &bc.Hash{V0: 25},
2127 ControlProgram: []byte("aa"),
2131 FromAssetID: assetID1,
2132 ToAssetID: assetID2,
2134 Utxo: &common.MovUtxo{
2135 SourceID: &bc.Hash{V0: 23},
2138 ControlProgram: []byte("aa"),
2142 FromAssetID: assetID1,
2143 ToAssetID: assetID2,
2145 Utxo: &common.MovUtxo{
2146 SourceID: &bc.Hash{V0: 13},
2149 ControlProgram: []byte("aa"),
2153 FromAssetID: assetID1,
2154 ToAssetID: assetID2,
2156 Utxo: &common.MovUtxo{
2157 SourceID: &bc.Hash{V0: 24},
2160 ControlProgram: []byte("aa"),
2164 FromAssetID: assetID1,
2165 ToAssetID: assetID2,
2167 Utxo: &common.MovUtxo{
2168 SourceID: &bc.Hash{V0: 24},
2171 ControlProgram: []byte("aa"),
2175 FromAssetID: assetID1,
2176 ToAssetID: assetID2,
2178 Utxo: &common.MovUtxo{
2179 SourceID: &bc.Hash{V0: 21},
2182 ControlProgram: []byte("aa"),
2188 desc: "Stored data already exists",
2189 beforeOrders: []*common.Order{
2191 FromAssetID: assetID1,
2192 ToAssetID: assetID2,
2194 Utxo: &common.MovUtxo{
2195 SourceID: &bc.Hash{V0: 21},
2198 ControlProgram: []byte("aa"),
2202 FromAssetID: assetID1,
2203 ToAssetID: assetID2,
2205 Utxo: &common.MovUtxo{
2206 SourceID: &bc.Hash{V0: 22},
2209 ControlProgram: []byte("aa"),
2213 FromAssetID: assetID1,
2214 ToAssetID: assetID2,
2216 Utxo: &common.MovUtxo{
2217 SourceID: &bc.Hash{V0: 23},
2220 ControlProgram: []byte("aa"),
2224 FromAssetID: assetID1,
2225 ToAssetID: assetID2,
2227 Utxo: &common.MovUtxo{
2228 SourceID: &bc.Hash{V0: 13},
2231 ControlProgram: []byte("aa"),
2235 addOrders: []*common.Order{
2237 FromAssetID: assetID1,
2238 ToAssetID: assetID2,
2240 Utxo: &common.MovUtxo{
2241 SourceID: &bc.Hash{V0: 24},
2244 ControlProgram: []byte("aa"),
2248 FromAssetID: assetID1,
2249 ToAssetID: assetID2,
2251 Utxo: &common.MovUtxo{
2252 SourceID: &bc.Hash{V0: 24},
2255 ControlProgram: []byte("aa"),
2259 FromAssetID: assetID1,
2260 ToAssetID: assetID2,
2262 Utxo: &common.MovUtxo{
2263 SourceID: &bc.Hash{V0: 25},
2266 ControlProgram: []byte("aa"),
2270 FromAssetID: assetID1,
2271 ToAssetID: assetID2,
2273 Utxo: &common.MovUtxo{
2274 SourceID: &bc.Hash{V0: 26},
2277 ControlProgram: []byte("aa"),
2281 wantOrders: []*common.Order{
2283 FromAssetID: assetID1,
2284 ToAssetID: assetID2,
2286 Utxo: &common.MovUtxo{
2287 SourceID: &bc.Hash{V0: 22},
2290 ControlProgram: []byte("aa"),
2294 FromAssetID: assetID1,
2295 ToAssetID: assetID2,
2297 Utxo: &common.MovUtxo{
2298 SourceID: &bc.Hash{V0: 26},
2301 ControlProgram: []byte("aa"),
2305 FromAssetID: assetID1,
2306 ToAssetID: assetID2,
2308 Utxo: &common.MovUtxo{
2309 SourceID: &bc.Hash{V0: 25},
2312 ControlProgram: []byte("aa"),
2316 FromAssetID: assetID1,
2317 ToAssetID: assetID2,
2319 Utxo: &common.MovUtxo{
2320 SourceID: &bc.Hash{V0: 23},
2323 ControlProgram: []byte("aa"),
2327 FromAssetID: assetID1,
2328 ToAssetID: assetID2,
2330 Utxo: &common.MovUtxo{
2331 SourceID: &bc.Hash{V0: 13},
2334 ControlProgram: []byte("aa"),
2338 FromAssetID: assetID1,
2339 ToAssetID: assetID2,
2341 Utxo: &common.MovUtxo{
2342 SourceID: &bc.Hash{V0: 24},
2345 ControlProgram: []byte("aa"),
2349 FromAssetID: assetID1,
2350 ToAssetID: assetID2,
2352 Utxo: &common.MovUtxo{
2353 SourceID: &bc.Hash{V0: 24},
2356 ControlProgram: []byte("aa"),
2360 FromAssetID: assetID1,
2361 ToAssetID: assetID2,
2363 Utxo: &common.MovUtxo{
2364 SourceID: &bc.Hash{V0: 21},
2367 ControlProgram: []byte("aa"),
2374 initBlockHeader := &types.BlockHeader{
2379 height := initBlockHeader.Height
2380 hash := initBlockHeader.Hash()
2382 defer os.RemoveAll("temp")
2383 for i, c := range cases {
2384 testDB := dbm.NewDB("testdb", "leveldb", "temp")
2385 movStore, err := NewMovStore(testDB, height, &hash)
2387 t.Fatalf("case %d: NewMovStore error %v.", i, err)
2390 batch := movStore.db.NewBatch()
2391 tradePairsCnt := make(map[common.TradePair]int)
2392 movStore.addOrders(batch, c.beforeOrders, tradePairsCnt)
2393 movStore.updateTradePairs(batch, tradePairsCnt)
2396 tradePairsCnt = make(map[common.TradePair]int)
2397 movStore.addOrders(batch, c.addOrders, tradePairsCnt)
2400 gotOrders, err := movStore.ListOrders(&common.Order{FromAssetID: assetID1, ToAssetID: assetID2})
2402 t.Fatalf("case %d: ListOrders error %v.", i, err)
2405 if !testutil.DeepEqual(gotOrders, c.wantOrders) {
2406 t.Fatalf("case %d: got orders , gotOrders: %v, wantOrders: %v.", i, gotOrders, c.wantOrders)
2410 os.RemoveAll("temp")
2414 func TestDelOrders(t *testing.T) {
2417 beforeOrders []*common.Order
2418 delOrders []*common.Order
2419 wantOrders []*common.Order
2424 delOrders: []*common.Order{
2426 FromAssetID: assetID1,
2427 ToAssetID: assetID2,
2429 Utxo: &common.MovUtxo{
2430 SourceID: &bc.Hash{V0: 21},
2433 ControlProgram: []byte("aa"),
2437 FromAssetID: assetID1,
2438 ToAssetID: assetID2,
2440 Utxo: &common.MovUtxo{
2441 SourceID: &bc.Hash{V0: 22},
2444 ControlProgram: []byte("aa"),
2448 wantOrders: []*common.Order{},
2449 err: errors.New("don't find trade pair"),
2452 desc: "Delete existing data",
2453 beforeOrders: []*common.Order{
2455 FromAssetID: assetID1,
2456 ToAssetID: assetID2,
2458 Utxo: &common.MovUtxo{
2459 SourceID: &bc.Hash{V0: 22},
2462 ControlProgram: []byte("aa"),
2466 FromAssetID: assetID1,
2467 ToAssetID: assetID2,
2469 Utxo: &common.MovUtxo{
2470 SourceID: &bc.Hash{V0: 26},
2473 ControlProgram: []byte("aa"),
2477 FromAssetID: assetID1,
2478 ToAssetID: assetID2,
2480 Utxo: &common.MovUtxo{
2481 SourceID: &bc.Hash{V0: 25},
2484 ControlProgram: []byte("aa"),
2488 FromAssetID: assetID1,
2489 ToAssetID: assetID2,
2491 Utxo: &common.MovUtxo{
2492 SourceID: &bc.Hash{V0: 23},
2495 ControlProgram: []byte("aa"),
2499 FromAssetID: assetID1,
2500 ToAssetID: assetID2,
2502 Utxo: &common.MovUtxo{
2503 SourceID: &bc.Hash{V0: 13},
2506 ControlProgram: []byte("aa"),
2510 FromAssetID: assetID1,
2511 ToAssetID: assetID2,
2513 Utxo: &common.MovUtxo{
2514 SourceID: &bc.Hash{V0: 24},
2517 ControlProgram: []byte("aa"),
2521 FromAssetID: assetID1,
2522 ToAssetID: assetID2,
2524 Utxo: &common.MovUtxo{
2525 SourceID: &bc.Hash{V0: 24},
2528 ControlProgram: []byte("aa"),
2532 FromAssetID: assetID1,
2533 ToAssetID: assetID2,
2535 Utxo: &common.MovUtxo{
2536 SourceID: &bc.Hash{V0: 21},
2539 ControlProgram: []byte("aa"),
2543 delOrders: []*common.Order{
2545 FromAssetID: assetID1,
2546 ToAssetID: assetID2,
2548 Utxo: &common.MovUtxo{
2549 SourceID: &bc.Hash{V0: 24},
2552 ControlProgram: []byte("aa"),
2556 FromAssetID: assetID1,
2557 ToAssetID: assetID2,
2559 Utxo: &common.MovUtxo{
2560 SourceID: &bc.Hash{V0: 24},
2563 ControlProgram: []byte("aa"),
2567 FromAssetID: assetID1,
2568 ToAssetID: assetID2,
2570 Utxo: &common.MovUtxo{
2571 SourceID: &bc.Hash{V0: 25},
2574 ControlProgram: []byte("aa"),
2578 FromAssetID: assetID1,
2579 ToAssetID: assetID2,
2581 Utxo: &common.MovUtxo{
2582 SourceID: &bc.Hash{V0: 26},
2585 ControlProgram: []byte("aa"),
2589 wantOrders: []*common.Order{
2591 FromAssetID: assetID1,
2592 ToAssetID: assetID2,
2594 Utxo: &common.MovUtxo{
2595 SourceID: &bc.Hash{V0: 22},
2598 ControlProgram: []byte("aa"),
2602 FromAssetID: assetID1,
2603 ToAssetID: assetID2,
2605 Utxo: &common.MovUtxo{
2606 SourceID: &bc.Hash{V0: 23},
2609 ControlProgram: []byte("aa"),
2613 FromAssetID: assetID1,
2614 ToAssetID: assetID2,
2616 Utxo: &common.MovUtxo{
2617 SourceID: &bc.Hash{V0: 13},
2620 ControlProgram: []byte("aa"),
2624 FromAssetID: assetID1,
2625 ToAssetID: assetID2,
2627 Utxo: &common.MovUtxo{
2628 SourceID: &bc.Hash{V0: 21},
2631 ControlProgram: []byte("aa"),
2638 desc: "Delete all data",
2639 beforeOrders: []*common.Order{
2641 FromAssetID: assetID1,
2642 ToAssetID: assetID2,
2644 Utxo: &common.MovUtxo{
2645 SourceID: &bc.Hash{V0: 26},
2648 ControlProgram: []byte("aa"),
2652 FromAssetID: assetID1,
2653 ToAssetID: assetID2,
2655 Utxo: &common.MovUtxo{
2656 SourceID: &bc.Hash{V0: 25},
2659 ControlProgram: []byte("aa"),
2663 FromAssetID: assetID1,
2664 ToAssetID: assetID2,
2666 Utxo: &common.MovUtxo{
2667 SourceID: &bc.Hash{V0: 24},
2670 ControlProgram: []byte("aa"),
2674 delOrders: []*common.Order{
2676 FromAssetID: assetID1,
2677 ToAssetID: assetID2,
2679 Utxo: &common.MovUtxo{
2680 SourceID: &bc.Hash{V0: 24},
2683 ControlProgram: []byte("aa"),
2687 FromAssetID: assetID1,
2688 ToAssetID: assetID2,
2690 Utxo: &common.MovUtxo{
2691 SourceID: &bc.Hash{V0: 25},
2694 ControlProgram: []byte("aa"),
2698 FromAssetID: assetID1,
2699 ToAssetID: assetID2,
2701 Utxo: &common.MovUtxo{
2702 SourceID: &bc.Hash{V0: 26},
2705 ControlProgram: []byte("aa"),
2709 wantOrders: []*common.Order{},
2714 initBlockHeader := &types.BlockHeader{
2719 height := initBlockHeader.Height
2720 hash := initBlockHeader.Hash()
2722 defer os.RemoveAll("temp")
2723 for i, c := range cases {
2724 testDB := dbm.NewDB("testdb", "leveldb", "temp")
2725 movStore, err := NewMovStore(testDB, height, &hash)
2727 t.Fatalf("case %d: NewMovStore error %v.", i, err)
2730 batch := movStore.db.NewBatch()
2731 tradePairsCnt := make(map[common.TradePair]int)
2732 movStore.addOrders(batch, c.beforeOrders, tradePairsCnt)
2733 movStore.updateTradePairs(batch, tradePairsCnt)
2736 tradePairsCnt = make(map[common.TradePair]int)
2737 movStore.deleteOrders(batch, c.delOrders, tradePairsCnt)
2738 movStore.updateTradePairs(batch, tradePairsCnt)
2741 gotOrders, err := movStore.ListOrders(&common.Order{FromAssetID: assetID1, ToAssetID: assetID2})
2743 t.Fatalf("case %d: ListOrders error %v.", i, err)
2746 if !testutil.DeepEqual(gotOrders, c.wantOrders) {
2747 t.Fatalf("case %d: got orders , gotOrders: %v, wantOrders: %v.", i, gotOrders, c.wantOrders)
2751 os.RemoveAll("temp")
2755 func TestListTradePairsWithStart(t *testing.T) {
2758 storeTradePairs map[common.TradePair]int
2759 query *common.TradePair
2760 wantTradePairs []*common.TradePair
2764 query: &common.TradePair{},
2765 wantTradePairs: []*common.TradePair{},
2768 desc: "query from first",
2769 storeTradePairs: map[common.TradePair]int{
2770 common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}: 1,
2771 common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}: 2,
2772 common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}: 3,
2773 common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}: 4,
2774 common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}: 5,
2775 common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}: 6,
2777 query: &common.TradePair{},
2778 wantTradePairs: []*common.TradePair{
2779 &common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
2780 &common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},
2781 &common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
2782 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5, Count: 4},
2783 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6, Count: 5},
2784 &common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7, Count: 6},
2788 desc: "query from middle",
2789 storeTradePairs: map[common.TradePair]int{
2790 common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}: 1,
2791 common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}: 2,
2792 common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}: 3,
2793 common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}: 4,
2794 common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}: 5,
2795 common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}: 6,
2796 common.TradePair{FromAssetID: assetID6, ToAssetID: assetID8}: 7,
2798 query: &common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
2799 wantTradePairs: []*common.TradePair{
2800 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5, Count: 4},
2801 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6, Count: 5},
2802 &common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7, Count: 6},
2803 &common.TradePair{FromAssetID: assetID6, ToAssetID: assetID8, Count: 7},
2808 initBlockHeader := &types.BlockHeader{
2813 height := initBlockHeader.Height
2814 hash := initBlockHeader.Hash()
2816 defer os.RemoveAll("temp")
2817 for i, c := range cases {
2818 testDB := dbm.NewDB("testdb", "leveldb", "temp")
2819 movStore, err := NewMovStore(testDB, height, &hash)
2821 t.Fatalf("case %d: NewMovStore error %v.", i, err)
2824 batch := movStore.db.NewBatch()
2825 movStore.updateTradePairs(batch, c.storeTradePairs)
2828 gotTradePairs, err := movStore.ListTradePairsWithStart(c.query.FromAssetID, c.query.ToAssetID)
2830 t.Fatalf("case %d: ListTradePairsWithStart error %v.", i, err)
2833 if !testutil.DeepEqual(gotTradePairs, c.wantTradePairs) {
2834 t.Fatalf("case %d: got TradePairs , gotTradePairs: %v, wantTradePairs: %v.", i, gotTradePairs, c.wantTradePairs)
2838 os.RemoveAll("temp")
2842 func TestUpdateTradePairs(t *testing.T) {
2845 beforeTradePairs map[common.TradePair]int
2846 addTradePairs map[common.TradePair]int
2847 delTradePairs map[common.TradePair]int
2848 wantTradePairs []*common.TradePair
2852 addTradePairs: map[common.TradePair]int{
2853 common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}: 1,
2854 common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}: 2,
2855 common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}: 3,
2856 common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}: 4,
2857 common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}: 5,
2858 common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}: 6,
2860 wantTradePairs: []*common.TradePair{
2861 &common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
2862 &common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},
2863 &common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
2864 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5, Count: 4},
2865 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6, Count: 5},
2866 &common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7, Count: 6},
2870 desc: "Stored data already exists",
2871 beforeTradePairs: map[common.TradePair]int{
2872 common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}: 1,
2873 common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}: 2,
2874 common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}: 3,
2876 addTradePairs: map[common.TradePair]int{
2877 common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}: 4,
2878 common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}: 5,
2879 common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}: 6,
2881 wantTradePairs: []*common.TradePair{
2882 &common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
2883 &common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},
2884 &common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
2885 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5, Count: 4},
2886 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6, Count: 5},
2887 &common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7, Count: 6},
2891 desc: "delete some data",
2892 beforeTradePairs: map[common.TradePair]int{
2893 common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}: 1,
2894 common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}: 2,
2895 common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}: 3,
2896 common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}: 4,
2897 common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}: 5,
2898 common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}: 6,
2900 delTradePairs: map[common.TradePair]int{
2901 common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}: -1,
2902 common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}: -4,
2903 common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}: -2,
2904 common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}: -4,
2906 wantTradePairs: []*common.TradePair{
2907 &common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},
2908 &common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
2909 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6, Count: 3},
2910 &common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7, Count: 2},
2915 initBlockHeader := &types.BlockHeader{
2920 height := initBlockHeader.Height
2921 hash := initBlockHeader.Hash()
2923 defer os.RemoveAll("temp")
2924 for i, c := range cases {
2925 testDB := dbm.NewDB("testdb", "leveldb", "temp")
2926 movStore, err := NewMovStore(testDB, height, &hash)
2928 t.Fatalf("case %d: NewMovStore error %v.", i, err)
2931 batch := movStore.db.NewBatch()
2932 movStore.updateTradePairs(batch, c.beforeTradePairs)
2935 movStore.updateTradePairs(batch, c.addTradePairs)
2936 movStore.updateTradePairs(batch, c.delTradePairs)
2939 gotTradePairs, err := movStore.ListTradePairsWithStart(nil, nil)
2941 t.Fatalf("case %d: ListTradePairsWithStart error %v.", i, err)
2944 if !testutil.DeepEqual(gotTradePairs, c.wantTradePairs) {
2945 t.Fatalf("case %d: got TradePairs , gotTradePairs: %v, wantTradePairs: %v.", i, gotTradePairs, c.wantTradePairs)
2949 os.RemoveAll("temp")
2953 func TestCheckMovDatabaseState(t *testing.T) {
2956 beforeDBStatus *common.MovDatabaseState
2957 blockHeader *types.BlockHeader
2961 desc: "attach Block",
2962 beforeDBStatus: &common.MovDatabaseState{Height: 1, Hash: &bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
2963 blockHeader: &types.BlockHeader{Height: 2, PreviousBlockHash: bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
2967 desc: "error attach Block",
2968 beforeDBStatus: &common.MovDatabaseState{Height: 1, Hash: &bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
2969 blockHeader: &types.BlockHeader{Height: 2, PreviousBlockHash: bc.Hash{}},
2970 err: errors.New("the status of the block is inconsistent with that of mov-database"),
2974 desc: "detach Block",
2975 beforeDBStatus: &common.MovDatabaseState{Height: 5, Hash: &bc.Hash{V0: 3724755213446347384, V1: 158878632373345042, V2: 18283800951484248781, V3: 7520797730449067221}},
2976 blockHeader: &types.BlockHeader{Height: 4},
2980 desc: "error detach Block",
2981 beforeDBStatus: &common.MovDatabaseState{Height: 5, Hash: &bc.Hash{V0: 3724755213446347384, V1: 158878632373345042, V2: 18283800951484248781, V3: 7520797730449067221}},
2982 blockHeader: &types.BlockHeader{Height: 3},
2983 err: errors.New("the status of the block is inconsistent with that of mov-database"),
2987 initBlockHeader := &types.BlockHeader{
2992 height := initBlockHeader.Height
2993 hash := initBlockHeader.Hash()
2995 defer os.RemoveAll("temp")
2996 for i, c := range cases {
2997 testDB := dbm.NewDB("testdb", "leveldb", "temp")
2998 movStore, err := NewMovStore(testDB, height, &hash)
3000 t.Fatalf("case %d: NewMovStore error %v.", i, err)
3003 batch := movStore.db.NewBatch()
3004 movStore.saveMovDatabaseState(batch, c.beforeDBStatus)
3007 if err := movStore.checkMovDatabaseState(c.blockHeader); c.err != nil && c.err.Error() != err.Error() {
3008 t.Fatalf("case %d: checkMovDatabaseState error %v.", i, err)
3012 os.RemoveAll("temp")