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  }