diff --git a/server/public_test.go b/server/public_test.go index c2cc3c5c..3d34be2e 100644 --- a/server/public_test.go +++ b/server/public_test.go @@ -8,10 +8,12 @@ import ( "blockbook/common" "blockbook/db" "blockbook/tests/dbtestdata" + "io" "io/ioutil" - "net" + "net/http" + "net/http/httptest" "os" - "strconv" + "strings" "testing" "github.com/golang/glog" @@ -52,32 +54,15 @@ func setupRocksDB(t *testing.T, parser bchain.BlockChainParser) (*db.RocksDB, *c return d, is, tmp } -// getFreePort asks the kernel for a free open port that is ready to use -func getFreePort() (int, error) { - addr, err := net.ResolveTCPAddr("tcp", "localhost:0") - if err != nil { - return 0, err - } - - l, err := net.ListenTCP("tcp", addr) - if err != nil { - return 0, err - } - defer l.Close() - return l.Addr().(*net.TCPAddr).Port, nil -} - -func setupPublicHTTPServer(t *testing.T) (*PublicServer, string, string) { +func setupPublicHTTPServer(t *testing.T) (*PublicServer, string) { parser := btc.NewBitcoinParser( btc.GetChainParams("test"), &btc.Configuration{BlockAddressesToKeep: 1}) - db, is, path := setupRocksDB(t, parser) - - port, err := getFreePort() - if err != nil { - t.Fatal(err) - } + d, is, path := setupRocksDB(t, parser) + is.Coin = "Testnet" + is.CoinLabel = "Bitcoin Testnet" + is.CoinShortcut = "TEST" metrics, err := common.GetMetrics("Testnet") if err != nil { @@ -86,20 +71,23 @@ func setupPublicHTTPServer(t *testing.T) (*PublicServer, string, string) { chain, err := dbtestdata.NewFakeBlockChain(parser) if err != nil { - glog.Fatal("metrics: ", err) + glog.Fatal("fakechain: ", err) } - binding := "localhost:" + strconv.Itoa(port) + txCache, err := db.NewTxCache(d, chain, metrics, is, true) + if err != nil { + glog.Fatal("txCache: ", err) + } - s, err := NewPublicServer(binding, "", db, chain, nil, "", metrics, is, false) + // s.Run is never called, binding can be to any port + s, err := NewPublicServer("localhost:12345", "", d, chain, txCache, "", metrics, is, false) if err != nil { t.Fatal(err) } - return s, binding, path + return s, path } func closeAndDestroyPublicServer(t *testing.T, s *PublicServer, dbpath string) { - // destroy db if err := s.db.Close(); err != nil { t.Fatal(err) @@ -107,7 +95,104 @@ func closeAndDestroyPublicServer(t *testing.T, s *PublicServer, dbpath string) { os.RemoveAll(dbpath) } -func Test_PublicServer_UTXO(t *testing.T) { - s, _, dbpath := setupPublicHTTPServer(t) - defer closeAndDestroyPublicServer(t, s, dbpath) +func newGetRequest(url string, body io.Reader) *http.Request { + r, err := http.NewRequest("GET", url, body) + if err != nil { + glog.Fatal(err) + } + return r +} + +func Test_PublicServer_UTXO(t *testing.T) { + s, dbpath := setupPublicHTTPServer(t) + defer closeAndDestroyPublicServer(t, s, dbpath) + s.ConnectFullPublicInterface() + // take the handler of the public server and pass it to the test server + ts := httptest.NewServer(s.https.Handler) + defer ts.Close() + + tests := []struct { + name string + r *http.Request + status int + contentType string + body []string + }{ + { + name: "explorerTx", + r: newGetRequest(ts.URL+"/tx/fdd824a780cbb718eeb766eb05d83fdefc793a27082cd5e67f856d69798cf7db", nil), + status: http.StatusOK, + contentType: "text/html; charset=utf-8", + body: []string{ + `Bitcoin Testnet Explorer`, + `