lotus/api/test/test.go

180 lines
4.0 KiB
Go
Raw Normal View History

package test
import (
"context"
"testing"
"github.com/filecoin-project/lotus/chain/stmgr"
2020-08-13 20:37:09 +00:00
"github.com/multiformats/go-multiaddr"
2020-06-01 19:11:37 +00:00
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/filecoin-project/go-state-types/abi"
2020-10-12 06:31:23 +00:00
"github.com/filecoin-project/go-state-types/network"
"github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/build"
2020-07-28 16:16:46 +00:00
"github.com/filecoin-project/lotus/miner"
"github.com/filecoin-project/lotus/node"
)
2019-09-23 15:27:30 +00:00
type TestNode struct {
api.FullNode
2020-08-13 20:37:09 +00:00
// ListenAddr is the address on which an API server is listening, if an
// API server is created for this Node
ListenAddr multiaddr.Multiaddr
2019-09-23 15:27:30 +00:00
}
type TestStorageNode struct {
api.StorageMiner
2020-08-13 20:37:09 +00:00
// ListenAddr is the address on which an API server is listening, if an
// API server is created for this Node
ListenAddr multiaddr.Multiaddr
2019-11-30 23:17:50 +00:00
2020-07-28 16:16:46 +00:00
MineOne func(context.Context, miner.MineReq) error
2019-09-23 15:27:30 +00:00
}
2020-04-23 17:50:52 +00:00
var PresealGenesis = -1
2020-06-01 12:49:48 +00:00
const GenesisPreseals = 2
2020-04-23 17:50:52 +00:00
// Options for setting up a mock storage miner
2020-04-23 17:50:52 +00:00
type StorageMiner struct {
Full int
Preseal int
}
type OptionGenerator func([]TestNode) node.Option
// Options for setting up a mock full node
type FullNodeOpts struct {
Lite bool // run node in "lite" mode
Opts OptionGenerator // generate dependency injection options
}
2019-07-02 13:05:43 +00:00
// APIBuilder is a function which is invoked in test suite to provide
// test nodes and networks
2019-09-23 15:27:30 +00:00
//
// fullOpts array defines options for each full node
2019-09-23 15:27:30 +00:00
// storage array defines storage nodes, numbers in the array specify full node
// index the storage node 'belongs' to
type APIBuilder func(t *testing.T, full []FullNodeOpts, storage []StorageMiner) ([]TestNode, []TestStorageNode)
type testSuite struct {
2019-07-09 16:27:07 +00:00
makeNodes APIBuilder
}
2019-07-02 13:05:43 +00:00
// TestApis is the entry point to API test suite
2019-07-02 12:40:25 +00:00
func TestApis(t *testing.T, b APIBuilder) {
ts := testSuite{
2019-07-09 16:27:07 +00:00
makeNodes: b,
}
t.Run("version", ts.testVersion)
2019-07-09 17:03:36 +00:00
t.Run("id", ts.testID)
t.Run("testConnectTwo", ts.testConnectTwo)
2019-09-23 15:27:30 +00:00
t.Run("testMining", ts.testMining)
2020-04-30 22:24:58 +00:00
t.Run("testMiningReal", ts.testMiningReal)
}
func DefaultFullOpts(nFull int) []FullNodeOpts {
full := make([]FullNodeOpts, nFull)
for i := range full {
full[i] = FullNodeOpts{
Opts: func(nodes []TestNode) node.Option {
return node.Options()
},
}
}
return full
}
2020-08-13 20:37:09 +00:00
var OneMiner = []StorageMiner{{Full: 0, Preseal: PresealGenesis}}
var OneFull = DefaultFullOpts(1)
var TwoFull = DefaultFullOpts(2)
2020-04-23 17:50:52 +00:00
var FullNodeWithUpgradeAt = func(upgradeHeight abi.ChainEpoch) FullNodeOpts {
return FullNodeOpts{
Opts: func(nodes []TestNode) node.Option {
return node.Override(new(stmgr.UpgradeSchedule), stmgr.UpgradeSchedule{{
2020-10-12 06:31:23 +00:00
// Skip directly to tape height so precommits work.
Network: network.Version5,
Height: upgradeHeight,
Migration: stmgr.UpgradeActorsV2,
}})
},
}
}
func (ts *testSuite) testVersion(t *testing.T) {
build.RunningNodeType = build.NodeFull
ctx := context.Background()
apis, _ := ts.makeNodes(t, OneFull, OneMiner)
2019-09-23 15:27:30 +00:00
api := apis[0]
2019-07-09 17:03:36 +00:00
v, err := api.Version(ctx)
if err != nil {
t.Fatal(err)
}
2020-06-01 19:11:37 +00:00
require.Equal(t, v.Version, build.BuildVersion)
}
2019-07-09 17:03:36 +00:00
func (ts *testSuite) testID(t *testing.T) {
ctx := context.Background()
apis, _ := ts.makeNodes(t, OneFull, OneMiner)
2019-09-23 15:27:30 +00:00
api := apis[0]
2019-07-09 17:03:36 +00:00
id, err := api.ID(ctx)
if err != nil {
t.Fatal(err)
}
assert.Regexp(t, "^12", id.Pretty())
2019-07-09 17:03:36 +00:00
}
func (ts *testSuite) testConnectTwo(t *testing.T) {
ctx := context.Background()
apis, _ := ts.makeNodes(t, TwoFull, OneMiner)
2019-07-09 17:03:36 +00:00
p, err := apis[0].NetPeers(ctx)
if err != nil {
t.Fatal(err)
}
if len(p) != 0 {
t.Error("Node 0 has a peer")
}
p, err = apis[1].NetPeers(ctx)
if err != nil {
t.Fatal(err)
}
if len(p) != 0 {
t.Error("Node 1 has a peer")
}
addrs, err := apis[1].NetAddrsListen(ctx)
if err != nil {
t.Fatal(err)
}
if err := apis[0].NetConnect(ctx, addrs); err != nil {
t.Fatal(err)
}
p, err = apis[0].NetPeers(ctx)
if err != nil {
t.Fatal(err)
}
if len(p) != 1 {
t.Error("Node 0 doesn't have 1 peer")
}
p, err = apis[1].NetPeers(ctx)
if err != nil {
t.Fatal(err)
}
if len(p) != 1 {
t.Error("Node 0 doesn't have 1 peer")
}
}