215 lines
5.7 KiB
Go
215 lines
5.7 KiB
Go
/*
|
|
Copyright Hitachi America, Ltd.
|
|
|
|
SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
package node
|
|
|
|
import (
|
|
"bytes"
|
|
"strconv"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/hyperledger/fabric-protos-go/common"
|
|
"github.com/hyperledger/fabric/core/handlers/library"
|
|
"github.com/hyperledger/fabric/core/testutil"
|
|
"github.com/hyperledger/fabric/internal/peer/node/mock"
|
|
msptesttools "github.com/hyperledger/fabric/msp/mgmt/testtools"
|
|
"github.com/mitchellh/mapstructure"
|
|
. "github.com/onsi/gomega"
|
|
"github.com/spf13/viper"
|
|
"github.com/stretchr/testify/require"
|
|
"google.golang.org/grpc"
|
|
)
|
|
|
|
func TestStartCmd(t *testing.T) {
|
|
defer viper.Reset()
|
|
g := NewGomegaWithT(t)
|
|
|
|
tempDir := t.TempDir()
|
|
|
|
viper.Set("peer.address", "localhost:6051")
|
|
viper.Set("peer.listenAddress", "0.0.0.0:6051")
|
|
viper.Set("peer.chaincodeListenAddress", "0.0.0.0:6052")
|
|
viper.Set("peer.fileSystemPath", tempDir)
|
|
viper.Set("chaincode.executetimeout", "30s")
|
|
viper.Set("chaincode.mode", "dev")
|
|
viper.Set("vm.endpoint", "unix:///var/run/docker.sock")
|
|
|
|
msptesttools.LoadMSPSetupForTesting()
|
|
|
|
go func() {
|
|
cmd := startCmd()
|
|
require.NoError(t, cmd.Execute(), "expected to successfully start command")
|
|
}()
|
|
|
|
grpcProbe := func(addr string) bool {
|
|
c, err := grpc.Dial(addr, grpc.WithBlock(), grpc.WithInsecure())
|
|
if err == nil {
|
|
c.Close()
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
g.Eventually(grpcProbe("localhost:6051")).Should(BeTrue())
|
|
}
|
|
|
|
func TestHandlerMap(t *testing.T) {
|
|
config1 := `
|
|
peer:
|
|
handlers:
|
|
authFilters:
|
|
- name: filter1
|
|
library: /opt/lib/filter1.so
|
|
- name: filter2
|
|
`
|
|
viper.SetConfigType("yaml")
|
|
err := viper.ReadConfig(bytes.NewBuffer([]byte(config1)))
|
|
require.NoError(t, err)
|
|
|
|
var libConf library.Config
|
|
err = mapstructure.Decode(viper.Get("peer.handlers"), &libConf)
|
|
require.NoError(t, err)
|
|
require.Len(t, libConf.AuthFilters, 2, "expected two filters")
|
|
require.Equal(t, "/opt/lib/filter1.so", libConf.AuthFilters[0].Library)
|
|
require.Equal(t, "filter2", libConf.AuthFilters[1].Name)
|
|
}
|
|
|
|
func TestComputeChaincodeEndpoint(t *testing.T) {
|
|
tests := []struct {
|
|
peerAddress string
|
|
chaincodeAddress string
|
|
chaincodeListenAddress string
|
|
expectedError string
|
|
expectedEndpoint string
|
|
}{
|
|
{
|
|
peerAddress: "0.0.0.0",
|
|
expectedError: "invalid endpoint for chaincode to connect",
|
|
},
|
|
{
|
|
peerAddress: "127.0.0.1",
|
|
expectedEndpoint: "127.0.0.1:7052",
|
|
},
|
|
{
|
|
peerAddress: "0.0.0.0",
|
|
chaincodeListenAddress: "0.0.0.0:8052",
|
|
expectedError: "invalid endpoint for chaincode to connect",
|
|
},
|
|
{
|
|
peerAddress: "127.0.0.1",
|
|
chaincodeListenAddress: "0.0.0.0:8052",
|
|
expectedEndpoint: "127.0.0.1:8052",
|
|
},
|
|
{
|
|
peerAddress: "127.0.0.1",
|
|
chaincodeListenAddress: "127.0.0.1:8052",
|
|
expectedEndpoint: "127.0.0.1:8052",
|
|
},
|
|
{
|
|
peerAddress: "127.0.0.1",
|
|
chaincodeListenAddress: "abc",
|
|
expectedError: "address abc: missing port in address",
|
|
},
|
|
{
|
|
peerAddress: "127.0.0.1",
|
|
chaincodeAddress: "0.0.0.0:9052",
|
|
expectedError: "invalid endpoint for chaincode to connect",
|
|
},
|
|
{
|
|
peerAddress: "127.0.0.1",
|
|
chaincodeAddress: "127.0.0.2:9052",
|
|
expectedEndpoint: "127.0.0.2:9052",
|
|
},
|
|
{
|
|
peerAddress: "127.0.0.1",
|
|
chaincodeAddress: "bcd",
|
|
chaincodeListenAddress: "ignored",
|
|
expectedError: "address bcd: missing port in address",
|
|
},
|
|
{
|
|
peerAddress: "127.0.0.1",
|
|
chaincodeAddress: "127.0.0.2:9052",
|
|
chaincodeListenAddress: "ignored",
|
|
expectedEndpoint: "127.0.0.2:9052",
|
|
},
|
|
}
|
|
|
|
for i, tt := range tests {
|
|
t.Run(strconv.Itoa(i), func(t *testing.T) {
|
|
ccEndpoint, err := computeChaincodeEndpoint(tt.chaincodeAddress, tt.chaincodeListenAddress, tt.peerAddress)
|
|
if tt.expectedError != "" {
|
|
require.EqualErrorf(t, err, tt.expectedError, "peerAddress: %q, ccListenAddr: %q, ccAddr: %q", tt.peerAddress, tt.chaincodeListenAddress, tt.chaincodeAddress)
|
|
return
|
|
}
|
|
require.NoErrorf(t, err, "peerAddress: %q, ccListenAddr: %q, ccAddr: %q", tt.peerAddress, tt.chaincodeListenAddress, tt.chaincodeAddress)
|
|
require.Equalf(t, tt.expectedEndpoint, ccEndpoint, "peerAddress: %q, ccListenAddr: %q, ccAddr: %q", tt.peerAddress, tt.chaincodeListenAddress, tt.chaincodeAddress)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestGetDockerHostConfig(t *testing.T) {
|
|
testutil.SetupTestConfig(t)
|
|
hostConfig := getDockerHostConfig()
|
|
require.NotNil(t, hostConfig)
|
|
require.Equal(t, "host", hostConfig.NetworkMode)
|
|
require.Equal(t, "json-file", hostConfig.LogConfig.Type)
|
|
require.Equal(t, "50m", hostConfig.LogConfig.Config["max-size"])
|
|
require.Equal(t, "5", hostConfig.LogConfig.Config["max-file"])
|
|
require.Equal(t, int64(1024*1024*1024*2), hostConfig.Memory)
|
|
require.Equal(t, int64(0), hostConfig.CPUShares)
|
|
}
|
|
|
|
func TestResetLoop(t *testing.T) {
|
|
peerLedger := &mock.PeerLedger{}
|
|
peerLedger.GetBlockchainInfoReturnsOnCall(
|
|
0,
|
|
&common.BlockchainInfo{
|
|
Height: uint64(1),
|
|
},
|
|
nil,
|
|
)
|
|
|
|
peerLedger.GetBlockchainInfoReturnsOnCall(
|
|
1,
|
|
&common.BlockchainInfo{
|
|
Height: uint64(5),
|
|
},
|
|
nil,
|
|
)
|
|
|
|
peerLedger.GetBlockchainInfoReturnsOnCall(
|
|
2,
|
|
&common.BlockchainInfo{
|
|
Height: uint64(11),
|
|
},
|
|
nil,
|
|
)
|
|
|
|
peerLedger.GetBlockchainInfoReturnsOnCall(
|
|
3,
|
|
&common.BlockchainInfo{
|
|
Height: uint64(11),
|
|
},
|
|
nil,
|
|
)
|
|
|
|
getLedger := &mock.GetLedger{}
|
|
getLedger.Returns(peerLedger)
|
|
resetFilter := &reset{
|
|
reject: true,
|
|
}
|
|
|
|
ledgerIDs := []string{"testchannel", "testchannel2"}
|
|
heights := map[string]uint64{
|
|
"testchannel": uint64(10),
|
|
"testchannel2": uint64(10),
|
|
}
|
|
|
|
resetLoop(resetFilter, heights, ledgerIDs, getLedger.Spy, 1*time.Second)
|
|
require.False(t, resetFilter.reject)
|
|
require.Equal(t, 4, peerLedger.GetBlockchainInfoCallCount())
|
|
}
|