e1408b6525
Note that the protocol differs a bit from #895 in its notifications format, to avoid additional server-side processing we're omitting some metadata like: * block size and confirmations * transaction fees, confirmations, block hash and timestamp * application execution doesn't have ScriptHash populated Some block fields may also differ in encoding compared to `getblock` results (like nonce field). I think these differences are unnoticieable for most use cases, so we can leave them as is, but it can be changed in the future.
102 lines
2.8 KiB
Go
102 lines
2.8 KiB
Go
package server
|
|
|
|
import (
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/nspcc-dev/neo-go/pkg/config"
|
|
"github.com/nspcc-dev/neo-go/pkg/core"
|
|
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
|
"github.com/nspcc-dev/neo-go/pkg/core/storage"
|
|
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
|
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
|
"github.com/nspcc-dev/neo-go/pkg/network"
|
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
|
"github.com/stretchr/testify/require"
|
|
"go.uber.org/zap"
|
|
"go.uber.org/zap/zaptest"
|
|
)
|
|
|
|
func getUnitTestChain(t *testing.T) (*core.Blockchain, config.Config, *zap.Logger) {
|
|
net := config.ModeUnitTestNet
|
|
configPath := "../../../config"
|
|
cfg, err := config.Load(configPath, net)
|
|
require.NoError(t, err, "could not load config")
|
|
|
|
memoryStore := storage.NewMemoryStore()
|
|
logger := zaptest.NewLogger(t)
|
|
chain, err := core.NewBlockchain(memoryStore, cfg.ProtocolConfiguration, logger)
|
|
require.NoError(t, err, "could not create chain")
|
|
|
|
go chain.Run()
|
|
|
|
return chain, cfg, logger
|
|
}
|
|
|
|
func getTestBlocks(t *testing.T) []*block.Block {
|
|
blocks := make([]*block.Block, 0)
|
|
// File "./testdata/testblocks.acc" was generated by function core._
|
|
// ("neo-go/pkg/core/helper_test.go").
|
|
// To generate new "./testdata/testblocks.acc", follow the steps:
|
|
// 1. Rename the function
|
|
// 2. Add specific test-case into "neo-go/pkg/core/blockchain_test.go"
|
|
// 3. Run tests with `$ make test`
|
|
f, err := os.Open("testdata/testblocks.acc")
|
|
require.Nil(t, err)
|
|
br := io.NewBinReaderFromIO(f)
|
|
nBlocks := br.ReadU32LE()
|
|
require.Nil(t, br.Err)
|
|
for i := 0; i < int(nBlocks); i++ {
|
|
_ = br.ReadU32LE()
|
|
b := &block.Block{}
|
|
b.DecodeBinary(br)
|
|
require.Nil(t, br.Err)
|
|
blocks = append(blocks, b)
|
|
}
|
|
return blocks
|
|
}
|
|
|
|
func initClearServerWithInMemoryChain(t *testing.T) (*core.Blockchain, *Server, *httptest.Server) {
|
|
chain, cfg, logger := getUnitTestChain(t)
|
|
|
|
serverConfig := network.NewServerConfig(cfg)
|
|
server, err := network.NewServer(serverConfig, chain, logger)
|
|
require.NoError(t, err)
|
|
rpcServer := New(chain, cfg.ApplicationConfiguration.RPC, server, logger)
|
|
errCh := make(chan error, 2)
|
|
go rpcServer.Start(errCh)
|
|
|
|
handler := http.HandlerFunc(rpcServer.handleHTTPRequest)
|
|
srv := httptest.NewServer(handler)
|
|
|
|
return chain, &rpcServer, srv
|
|
}
|
|
|
|
func initServerWithInMemoryChain(t *testing.T) (*core.Blockchain, *Server, *httptest.Server) {
|
|
chain, rpcServer, srv := initClearServerWithInMemoryChain(t)
|
|
|
|
for _, b := range getTestBlocks(t) {
|
|
require.NoError(t, chain.AddBlock(b))
|
|
}
|
|
return chain, rpcServer, srv
|
|
}
|
|
|
|
type FeerStub struct{}
|
|
|
|
func (fs *FeerStub) NetworkFee(*transaction.Transaction) util.Fixed8 {
|
|
return 0
|
|
}
|
|
|
|
func (fs *FeerStub) IsLowPriority(util.Fixed8) bool {
|
|
return false
|
|
}
|
|
|
|
func (fs *FeerStub) FeePerByte(*transaction.Transaction) util.Fixed8 {
|
|
return 0
|
|
}
|
|
|
|
func (fs *FeerStub) SystemFee(*transaction.Transaction) util.Fixed8 {
|
|
return 0
|
|
}
|