diff --git a/rpcserver_test.go b/rpcserver_test.go new file mode 100644 index 00000000..f1e6c403 --- /dev/null +++ b/rpcserver_test.go @@ -0,0 +1,133 @@ +// Copyright (c) 2016 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +package main + +import ( + "bytes" + "fmt" + "os" + "testing" + + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/rpctest" +) + +func testGetBestBlock(r *rpctest.Harness, t *testing.T) { + _, prevbestHeight, err := r.Node.GetBestBlock() + if err != nil { + t.Fatalf("Call to `getbestblock` failed: %v", err) + } + + // Create a new block connecting to the current tip. + generatedBlockHashes, err := r.Node.Generate(1) + if err != nil { + t.Fatalf("Unable to generate block: %v", err) + } + + bestHash, bestHeight, err := r.Node.GetBestBlock() + if err != nil { + t.Fatalf("Call to `getbestblock` failed: %v", err) + } + + // Hash should be the same as the newly submitted block. + if !bytes.Equal(bestHash[:], generatedBlockHashes[0][:]) { + t.Fatalf("Block hashes do not match. Returned hash %v, wanted "+ + "hash %v", bestHash, generatedBlockHashes[0][:]) + } + + // Block height should now reflect newest height. + if bestHeight != prevbestHeight+1 { + t.Fatalf("Block heights do not match. Got %v, wanted %v", + bestHeight, prevbestHeight+1) + } +} + +func testGetBlockCount(r *rpctest.Harness, t *testing.T) { + // Save the current count. + currentCount, err := r.Node.GetBlockCount() + if err != nil { + t.Fatalf("Unable to get block count: %v", err) + } + + if _, err := r.Node.Generate(1); err != nil { + t.Fatalf("Unable to generate block: %v", err) + } + + // Count should have increased by one. + newCount, err := r.Node.GetBlockCount() + if err != nil { + t.Fatalf("Unable to get block count: %v", err) + } + if newCount != currentCount+1 { + t.Fatalf("Block count incorrect. Got %v should be %v", + newCount, currentCount+1) + } +} + +func testGetBlockHash(r *rpctest.Harness, t *testing.T) { + // Create a new block connecting to the current tip. + generatedBlockHashes, err := r.Node.Generate(1) + if err != nil { + t.Fatalf("Unable to generate block: %v", err) + } + + info, err := r.Node.GetInfo() + if err != nil { + t.Fatalf("call to getinfo cailed: %v", err) + } + + blockHash, err := r.Node.GetBlockHash(int64(info.Blocks)) + if err != nil { + t.Fatalf("Call to `getblockhash` failed: %v", err) + } + + // Block hashes should match newly created block. + if !bytes.Equal(generatedBlockHashes[0][:], blockHash[:]) { + t.Fatalf("Block hashes do not match. Returned hash %v, wanted "+ + "hash %v", blockHash, generatedBlockHashes[0][:]) + } +} + +var rpcTestCases = []rpctest.HarnessTestCase{ + testGetBestBlock, + testGetBlockCount, + testGetBlockHash, +} + +var primaryHarness *rpctest.Harness + +func TestMain(m *testing.M) { + var err error + primaryHarness, err = rpctest.New(&chaincfg.SimNetParams, nil, nil) + if err != nil { + fmt.Println("unable to create primary harness: ", err) + os.Exit(1) + } + + // Initialize the primary mining node with a chain of length 125, + // providing 25 mature coinbases to allow spending from for testing + // purposes. + if err = primaryHarness.SetUp(true, 25); err != nil { + fmt.Println("unable to setup test chain: ", err) + os.Exit(1) + } + + exitCode := m.Run() + + // Clean up the primary harness created above. This includes removing + // all temporary directories, and shutting down any created processes. + if err := primaryHarness.TearDown(); err != nil { + fmt.Println("unable to setup test chain: ", err) + os.Exit(1) + } + + os.Exit(exitCode) +} + +func TestRpcServer(t *testing.T) { + for _, testCase := range rpcTestCases { + testCase(primaryHarness, t) + } +}