decred.org/dcrdex@v1.0.5/tatanka/chain/utxo/btc_live_test.go (about)

     1  //go:build harness
     2  
     3  package utxo
     4  
     5  import (
     6  	"context"
     7  	"encoding/json"
     8  	"fmt"
     9  	"os/user"
    10  	"path/filepath"
    11  	"testing"
    12  	"time"
    13  
    14  	"decred.org/dcrdex/dex"
    15  	dexbtc "decred.org/dcrdex/dex/networks/btc"
    16  	"decred.org/dcrdex/tatanka/chain"
    17  )
    18  
    19  func TestSimnetBTC(t *testing.T) {
    20  	simnetAlphaHarnessConfig := &BitcoinConfigFile{
    21  		RPCConfig: dexbtc.RPCConfig{
    22  			RPCUser: "user",
    23  			RPCPass: "pass",
    24  			RPCBind: "127.0.0.1",
    25  			RPCPort: 20556,
    26  		},
    27  	}
    28  	ctx, cancel := context.WithCancel(context.Background())
    29  	defer cancel()
    30  	rawCfg, _ := json.Marshal(simnetAlphaHarnessConfig)
    31  	c := prepareSimnetChain(t, ctx, NewBitcoin, rawCfg)
    32  
    33  	q := &query{
    34  		Method: "getchaintxstats",
    35  		Args:   []json.RawMessage{[]byte("5")},
    36  	}
    37  	rawQuery, _ := json.Marshal(q)
    38  	rawRes, err := c.Query(ctx, chain.Query(rawQuery))
    39  	if err != nil {
    40  		t.Fatalf("Query error: %v", err)
    41  	}
    42  
    43  	var res struct {
    44  		Blocks uint `json:"window_block_count"`
    45  	}
    46  	if err := json.Unmarshal(rawRes, &res); err != nil {
    47  		t.Fatalf("Query unmarshal error: %v", err)
    48  	}
    49  
    50  	if res.Blocks != 5 {
    51  		t.Fatalf("Unexpected query results")
    52  	}
    53  }
    54  func TestSimnetDCR(t *testing.T) {
    55  	usr, _ := user.Current()
    56  	dextestDir := filepath.Join(usr.HomeDir, "dextest")
    57  	rpcPath := filepath.Join(dextestDir, "dcr", "alpha", "rpc.cert")
    58  	simnetAlphaHarnessConfig := &DecredConfigFile{
    59  		RPCUser:   "user",
    60  		RPCPass:   "pass",
    61  		RPCListen: "127.0.0.1:19561",
    62  		RPCCert:   rpcPath,
    63  	}
    64  	rawCfg, _ := json.Marshal(simnetAlphaHarnessConfig)
    65  	ctx, cancel := context.WithCancel(context.Background())
    66  	defer cancel()
    67  	c := prepareSimnetChain(t, ctx, NewDecred, rawCfg)
    68  
    69  	q := &query{
    70  		Method: "getvoteinfo",
    71  		Args:   []json.RawMessage{[]byte("4")},
    72  	}
    73  	rawQuery, _ := json.Marshal(q)
    74  	rawRes, err := c.Query(ctx, chain.Query(rawQuery))
    75  	if err != nil {
    76  		t.Fatalf("Query error: %v", err)
    77  	}
    78  
    79  	var res struct {
    80  		Agendas []struct {
    81  			ID string `json:"id"`
    82  		} `json:"agendas"`
    83  	}
    84  	if err := json.Unmarshal(rawRes, &res); err != nil {
    85  		t.Fatalf("Query unmarshal error: %v", err)
    86  	}
    87  
    88  	if len(res.Agendas) != 1 || res.Agendas[0].ID != "maxblocksize" {
    89  		t.Fatalf("Unexpected query results")
    90  	}
    91  }
    92  
    93  func prepareSimnetChain(t *testing.T, ctx context.Context, newChain chain.ChainConstructor, rawCfg json.RawMessage) chain.Chain {
    94  	feeMonitorTick = time.Second
    95  
    96  	c, err := newChain(rawCfg, dex.StdOutLogger("T", dex.LevelTrace), dex.Simnet)
    97  	if err != nil {
    98  		t.Fatalf("NewBTC error: %v", err)
    99  	}
   100  
   101  	cm := dex.NewConnectionMaster(c)
   102  	if err := cm.ConnectOnce(ctx); err != nil {
   103  		t.Fatalf("Connect error: %v", err)
   104  	}
   105  
   106  	fmt.Println("Waiting for fee update")
   107  	select {
   108  	case fees := <-c.FeeChannel():
   109  		fmt.Println("Fees received over fee channel =", fees)
   110  	case <-time.After(time.Second * 30):
   111  		t.Fatalf("No fee update seen. Is the miner running?")
   112  	}
   113  
   114  	return c
   115  }