decred.org/dcrdex@v1.0.3/client/mm/price_oracle_test.go (about) 1 //go:build live 2 3 package mm 4 5 import ( 6 "context" 7 "fmt" 8 "testing" 9 "time" 10 11 _ "decred.org/dcrdex/client/asset/btc" 12 _ "decred.org/dcrdex/client/asset/dcr" 13 _ "decred.org/dcrdex/client/asset/eth" 14 "github.com/davecgh/go-spew/spew" 15 16 "decred.org/dcrdex/dex" 17 ) 18 19 func TestPriceOracle(t *testing.T) { 20 ctx, cancel := context.WithCancel(context.Background()) 21 defer cancel() 22 23 logger := dex.StdOutLogger("TEST", dex.LevelTrace) 24 25 oracle := newPriceOracle(ctx, logger) 26 27 markets := []*marketPair{ 28 {baseID: 42, quoteID: 0}, 29 {baseID: 60, quoteID: 0}, 30 {baseID: 42, quoteID: 60002}, 31 {baseID: 60001, quoteID: 60002}, 32 } 33 for _, mkt := range markets { 34 price, oracleReport, err := oracle.getOracleInfo(mkt.baseID, mkt.quoteID) 35 if err != nil { 36 t.Fatal(err) 37 } 38 fmt.Println("~~~~~ Get oracle info result:", mkt) 39 fmt.Printf("Price: %f, OracleReport: %s \n", price, spew.Sdump(oracleReport)) 40 41 // Should be the same because cached 42 priceOnly := oracle.getMarketPrice(mkt.baseID, mkt.quoteID) 43 if priceOnly != price { 44 t.Fatalf("Expected price %f, got %f", price, priceOnly) 45 } 46 } 47 } 48 49 func TestAutoSyncPriceOracle(t *testing.T) { 50 ctx, cancel := context.WithCancel(context.Background()) 51 defer cancel() 52 53 logger := dex.StdOutLogger("TEST", dex.LevelTrace) 54 55 oracle := newPriceOracle(ctx, logger) 56 57 markets := []*marketPair{ 58 {baseID: 42, quoteID: 0}, 59 {baseID: 60, quoteID: 0}, 60 } 61 for _, mkt := range markets { 62 err := oracle.startAutoSyncingMarket(mkt.baseID, mkt.quoteID) 63 if err != nil { 64 t.Fatal(err) 65 } 66 67 err = oracle.startAutoSyncingMarket(mkt.baseID, mkt.quoteID) 68 if err != nil { 69 t.Fatal(err) 70 } 71 72 price, oracleReport, err := oracle.getOracleInfo(mkt.baseID, mkt.quoteID) 73 if err != nil { 74 t.Fatal(err) 75 } 76 77 fmt.Println("~~~~~ Get oracle info result:", mkt) 78 fmt.Printf("Price: %f, OracleReport: %s \n", price, spew.Sdump(oracleReport)) 79 80 oracle.stopAutoSyncingMarket(mkt.baseID, mkt.quoteID) 81 if !oracle.marketIsAutoSyncing(mkt.baseID, mkt.quoteID) { 82 t.Fatalf("Expected market to be auto-syncing") 83 } 84 oracle.stopAutoSyncingMarket(mkt.baseID, mkt.quoteID) 85 if oracle.marketIsAutoSyncing(mkt.baseID, mkt.quoteID) { 86 t.Fatalf("Expected market to not be auto-syncing") 87 } 88 } 89 } 90 91 func testSpreader(t *testing.T, spreader Spreader, baseSymbol, quoteSymbol string) { 92 ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) 93 defer cancel() 94 sell, buy, err := spreader(ctx, baseSymbol, quoteSymbol, tLogger) 95 if err != nil { 96 t.Fatal(err) 97 } 98 fmt.Printf("Fetched: sell = %f, buy = %f \n", sell, buy) 99 } 100 101 func TestFetchBinanceSpread(t *testing.T) { 102 testSpreader(t, fetchBinanceSpread, "dcr", "btc") 103 } 104 105 func TestFetchCoinbaseSpread(t *testing.T) { 106 testSpreader(t, fetchCoinbaseSpread, "btc", "usd") 107 } 108 109 func TestFetchBittrexSpread(t *testing.T) { 110 testSpreader(t, fetchBittrexSpread, "dcr", "btc") 111 } 112 113 func TestFetchHitBTCSpread(t *testing.T) { 114 testSpreader(t, fetchHitBTCSpread, "dcr", "btc") 115 } 116 117 func TestFetchEXMOSpread(t *testing.T) { 118 testSpreader(t, fetchEXMOSpread, "dcr", "btc") 119 }