+package database
+
+import (
+ "encoding/binary"
+ "encoding/json"
+ "io/ioutil"
+ "math"
+ "os"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+ "golang.org/x/crypto/sha3"
+
+ "github.com/vapor/application/dex/common"
+ "github.com/vapor/database/leveldb"
+ "github.com/vapor/protocol/bc"
+ "github.com/vapor/testutil"
+)
+
+func TestSortOrderKey(t *testing.T) {
+ dirname, err := ioutil.TempDir("", "db_common_test")
+ require.Nil(t, err)
+
+ db, err := leveldb.NewGoLevelDB("testdb", dirname)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ defer func() {
+ db.Close()
+ os.RemoveAll(dirname)
+ }()
+
+ type expectedData struct {
+ rate float64
+ utxoHash string
+ }
+
+ cases := []struct {
+ orders []common.Order
+ want []expectedData
+ }{
+ {
+ orders: []common.Order{
+ common.Order{
+ FromAssetID: &bc.AssetID{V0: 1},
+ ToAssetID: &bc.AssetID{V0: 0},
+ Rate: 1.00090,
+ Utxo: &common.DexUtxo{
+ SourceID: &bc.Hash{V0: 21},
+ Amount: 1,
+ SourcePos: 0,
+ ControlProgram: []byte("aa"),
+ },
+ },
+ common.Order{
+ FromAssetID: &bc.AssetID{V0: 1},
+ ToAssetID: &bc.AssetID{V0: 0},
+ Rate: 0.00090,
+ Utxo: &common.DexUtxo{
+ SourceID: &bc.Hash{V0: 22},
+ Amount: 1,
+ SourcePos: 0,
+ ControlProgram: []byte("aa"),
+ },
+ },
+ common.Order{
+ FromAssetID: &bc.AssetID{V0: 1},
+ ToAssetID: &bc.AssetID{V0: 0},
+ Rate: 0.00097,
+ Utxo: &common.DexUtxo{
+ SourceID: &bc.Hash{V0: 23},
+ Amount: 1,
+ SourcePos: 0,
+ ControlProgram: []byte("aa"),
+ },
+ },
+ common.Order{
+ FromAssetID: &bc.AssetID{V0: 1},
+ ToAssetID: &bc.AssetID{V0: 0},
+ Rate: 0.00098,
+ Utxo: &common.DexUtxo{
+ SourceID: &bc.Hash{V0: 13},
+ Amount: 1,
+ SourcePos: 0,
+ ControlProgram: []byte("aa"),
+ },
+ },
+ common.Order{
+ FromAssetID: &bc.AssetID{V0: 1},
+ ToAssetID: &bc.AssetID{V0: 0},
+ Rate: 0.00098,
+ Utxo: &common.DexUtxo{
+ SourceID: &bc.Hash{V0: 24},
+ Amount: 10,
+ SourcePos: 1,
+ ControlProgram: []byte("aa"),
+ },
+ },
+ common.Order{
+ FromAssetID: &bc.AssetID{V0: 1},
+ ToAssetID: &bc.AssetID{V0: 0},
+ Rate: 0.00099,
+ Utxo: &common.DexUtxo{
+ SourceID: &bc.Hash{V0: 24},
+ Amount: 1,
+ SourcePos: 0,
+ ControlProgram: []byte("aa"),
+ },
+ },
+ common.Order{
+ FromAssetID: &bc.AssetID{V0: 1},
+ ToAssetID: &bc.AssetID{V0: 0},
+ Rate: 0.00096,
+ Utxo: &common.DexUtxo{
+ SourceID: &bc.Hash{V0: 25},
+ Amount: 1,
+ SourcePos: 0,
+ ControlProgram: []byte("aa"),
+ },
+ },
+ common.Order{
+ FromAssetID: &bc.AssetID{V0: 1},
+ ToAssetID: &bc.AssetID{V0: 0},
+ Rate: 0.00095,
+ Utxo: &common.DexUtxo{
+ SourceID: &bc.Hash{V0: 26},
+ Amount: 1,
+ SourcePos: 0,
+ ControlProgram: []byte("aa"),
+ },
+ },
+ common.Order{
+ FromAssetID: &bc.AssetID{V0: 1},
+ ToAssetID: &bc.AssetID{V0: 0},
+ Rate: 0.00091,
+ Utxo: &common.DexUtxo{
+ SourceID: &bc.Hash{V0: 26},
+ Amount: 1,
+ SourcePos: 0,
+ ControlProgram: []byte("aa"),
+ },
+ },
+ common.Order{
+ FromAssetID: &bc.AssetID{V0: 1},
+ ToAssetID: &bc.AssetID{V0: 0},
+ Rate: 0.00092,
+ Utxo: &common.DexUtxo{
+ SourceID: &bc.Hash{V0: 27},
+ Amount: 1,
+ SourcePos: 0,
+ ControlProgram: []byte("aa"),
+ },
+ },
+ common.Order{
+ FromAssetID: &bc.AssetID{V0: 1},
+ ToAssetID: &bc.AssetID{V0: 0},
+ Rate: 0.00093,
+ Utxo: &common.DexUtxo{
+ SourceID: &bc.Hash{V0: 28},
+ Amount: 1,
+ SourcePos: 0,
+ ControlProgram: []byte("aa"),
+ },
+ },
+ common.Order{
+ FromAssetID: &bc.AssetID{V0: 1},
+ ToAssetID: &bc.AssetID{V0: 0},
+ Rate: 0.00094,
+ Utxo: &common.DexUtxo{
+ SourceID: &bc.Hash{V0: 29},
+ Amount: 1,
+ SourcePos: 0,
+ ControlProgram: []byte("aa"),
+ },
+ },
+ common.Order{
+ FromAssetID: &bc.AssetID{V0: 1},
+ ToAssetID: &bc.AssetID{V0: 0},
+ Rate: 0.00077,
+ Utxo: &common.DexUtxo{
+ SourceID: &bc.Hash{V0: 30},
+ Amount: 1,
+ SourcePos: 0,
+ ControlProgram: []byte("aa"),
+ },
+ },
+ common.Order{
+ FromAssetID: &bc.AssetID{V0: 1},
+ ToAssetID: &bc.AssetID{V0: 0},
+ Rate: 0.00088,
+ Utxo: &common.DexUtxo{
+ SourceID: &bc.Hash{V0: 31},
+ Amount: 1,
+ SourcePos: 0,
+ ControlProgram: []byte("aa"),
+ },
+ },
+ common.Order{
+ FromAssetID: &bc.AssetID{V0: 1},
+ ToAssetID: &bc.AssetID{V0: 0},
+ Rate: 999999.9521,
+ Utxo: &common.DexUtxo{
+ SourceID: &bc.Hash{V0: 32},
+ Amount: 1,
+ SourcePos: 0,
+ ControlProgram: []byte("aa"),
+ },
+ },
+ common.Order{
+ FromAssetID: &bc.AssetID{V0: 1},
+ ToAssetID: &bc.AssetID{V0: 0},
+ Rate: 888888.7954,
+ Utxo: &common.DexUtxo{
+ SourceID: &bc.Hash{V0: 33},
+ Amount: 1,
+ SourcePos: 0,
+ ControlProgram: []byte("aa"),
+ },
+ },
+ },
+ want: []expectedData{
+ expectedData{
+ rate: 0.00077,
+ utxoHash: "7967bb8c4cca951749553e9c7787255d35a032d9e1acecefe4011c8095dc8e6f",
+ },
+ expectedData{
+ rate: 0.00088,
+ utxoHash: "215a6e7e3a5006151bd0b81c54fcccda0381f3a22e7b6646ed201c35f9fa6c5a",
+ },
+ expectedData{
+ rate: 0.00090,
+ utxoHash: "cb373d3a383d30eb2863317ea2cfb5b4b269772fbc0fb8413a2be7d7b69ec2b9",
+ },
+ expectedData{
+ rate: 0.00091,
+ utxoHash: "298c39d327cb4b0dcefcf701aa8d1b559f1de0148e9bcbe14da48cfa268c01ea",
+ },
+ expectedData{
+ rate: 0.00092,
+ utxoHash: "b2c59190fb0d948c9545c146a69b1f17503b2d280b2f3f45ecc0a7b7e2cd1784",
+ },
+ expectedData{
+ rate: 0.00093,
+ utxoHash: "80b44aae2b2cf57bd2cf77cb88f0d8363066f5f16a17a3e85224ecbbc6387d8b",
+ },
+ expectedData{
+ rate: 0.00094,
+ utxoHash: "4843adc8c4a50672a022e5f377dfd2ac11119364dc0a547be45b4a5edacef33b",
+ },
+ expectedData{
+ rate: 0.00095,
+ utxoHash: "298c39d327cb4b0dcefcf701aa8d1b559f1de0148e9bcbe14da48cfa268c01ea",
+ },
+ expectedData{
+ rate: 0.00096,
+ utxoHash: "d8d1a85303e9ac738e675b874b866e5ffbfa10e05201113404dde544055a18b9",
+ },
+ expectedData{
+ rate: 0.00097,
+ utxoHash: "2305be66ab9648b713a58e3807fa1cba1f84e5d11359b316e967d98e9a7667da",
+ },
+ expectedData{
+ rate: 0.00098,
+ utxoHash: "030dc8a868a3e534799d465ebc8209eb32d9465985dc8c35e731b124bf3ffbcf",
+ },
+ expectedData{
+ rate: 0.00098,
+ utxoHash: "8222a9a43b3951f247612ddce2fe36f96cd843bc0dfef86c7d0ef5335331f11f",
+ },
+ expectedData{
+ rate: 0.00099,
+ utxoHash: "a40bd183cd2ff2b52faac5ebc2cfc1e36104cbc92bcebac011b45792b39e380e",
+ },
+ expectedData{
+ rate: 1.0009,
+ utxoHash: "118b2c40848887614d99b0e7eb6c88a10b47196e6aca3ff2eeab452bfdb9cfcb",
+ },
+ expectedData{
+ rate: 888888.7954,
+ utxoHash: "545a5c6f7ff9be19ed07a7246277c67d661f9cc7d8956bb81ce9a4045fba3720",
+ },
+ expectedData{
+ rate: 999999.9521,
+ utxoHash: "d9f7725d908510268c7bdecd29cb2031baab93b9bfa69108eb0a926ba7ae18f9",
+ },
+ },
+ },
+ }
+
+ for i, c := range cases {
+ for _, order := range c.orders {
+ data, err := json.Marshal(order.Utxo)
+ if err != nil {
+ t.Fatal(err)
+ }
+ utxoHash := bc.NewHash(sha3.Sum256(data))
+ key := calcOrdersPrefix(order.FromAssetID, order.ToAssetID, &utxoHash, order.Rate)
+ db.SetSync(key, data)
+ }
+
+ got := []expectedData{}
+
+ itr := db.IteratorPrefixWithStart(nil, nil, false)
+ for itr.Next() {
+ key := itr.Key()
+ pos := len(ordersPreFix) + 32*2
+ b := [32]byte{}
+ copy(b[:], key[pos+8:])
+ utxoHash := bc.NewHash(b)
+ got = append(got, expectedData{
+ rate: math.Float64frombits(binary.BigEndian.Uint64(key[pos : pos+8])),
+ utxoHash: utxoHash.String(),
+ })
+ }
+ itr.Release()
+
+ if !testutil.DeepEqual(c.want, got) {
+ t.Errorf("case %v: got recovery status, got: %v, want: %v.", i, got, c.want)
+ }
+
+ }
+}