github.com/sykesm/fabric@v1.1.0-preview.0.20200129034918-2aa12b1a0181/core/peer/peer_test.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package peer
     8  
     9  import (
    10  	"fmt"
    11  	"io/ioutil"
    12  	"math/rand"
    13  	"os"
    14  	"path/filepath"
    15  	"runtime"
    16  	"testing"
    17  
    18  	"github.com/hyperledger/fabric-protos-go/common"
    19  	"github.com/hyperledger/fabric/bccsp/sw"
    20  	configtxtest "github.com/hyperledger/fabric/common/configtx/test"
    21  	"github.com/hyperledger/fabric/common/metrics/disabled"
    22  	"github.com/hyperledger/fabric/core/comm"
    23  	"github.com/hyperledger/fabric/core/committer/txvalidator/plugin"
    24  	"github.com/hyperledger/fabric/core/deliverservice"
    25  	validation "github.com/hyperledger/fabric/core/handlers/validation/api"
    26  	"github.com/hyperledger/fabric/core/ledger"
    27  	"github.com/hyperledger/fabric/core/ledger/ledgermgmt"
    28  	"github.com/hyperledger/fabric/core/ledger/ledgermgmt/ledgermgmttest"
    29  	"github.com/hyperledger/fabric/core/ledger/mock"
    30  	ledgermocks "github.com/hyperledger/fabric/core/ledger/mock"
    31  	"github.com/hyperledger/fabric/core/transientstore"
    32  	"github.com/hyperledger/fabric/gossip/gossip"
    33  	gossipmetrics "github.com/hyperledger/fabric/gossip/metrics"
    34  	"github.com/hyperledger/fabric/gossip/service"
    35  	gossipservice "github.com/hyperledger/fabric/gossip/service"
    36  	peergossip "github.com/hyperledger/fabric/internal/peer/gossip"
    37  	"github.com/hyperledger/fabric/internal/peer/gossip/mocks"
    38  	"github.com/hyperledger/fabric/msp/mgmt"
    39  	msptesttools "github.com/hyperledger/fabric/msp/mgmt/testtools"
    40  	"github.com/stretchr/testify/assert"
    41  	"github.com/stretchr/testify/require"
    42  	"google.golang.org/grpc"
    43  )
    44  
    45  func TestMain(m *testing.M) {
    46  	msptesttools.LoadMSPSetupForTesting()
    47  	rc := m.Run()
    48  	os.Exit(rc)
    49  }
    50  
    51  func NewTestPeer(t *testing.T) (*Peer, func()) {
    52  	tempdir, err := ioutil.TempDir("", "peer-test")
    53  	require.NoError(t, err, "failed to create temporary directory")
    54  
    55  	// Initialize gossip service
    56  	cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
    57  	assert.NoError(t, err)
    58  	signer := mgmt.GetLocalSigningIdentityOrPanic(cryptoProvider)
    59  
    60  	messageCryptoService := peergossip.NewMCS(&mocks.ChannelPolicyManagerGetter{}, signer, mgmt.NewDeserializersManager(cryptoProvider), cryptoProvider)
    61  	secAdv := peergossip.NewSecurityAdvisor(mgmt.NewDeserializersManager(cryptoProvider))
    62  	defaultSecureDialOpts := func() []grpc.DialOption { return []grpc.DialOption{grpc.WithInsecure()} }
    63  	defaultDeliverClientDialOpts := []grpc.DialOption{grpc.WithBlock()}
    64  	defaultDeliverClientDialOpts = append(
    65  		defaultDeliverClientDialOpts,
    66  		grpc.WithDefaultCallOptions(
    67  			grpc.MaxCallRecvMsgSize(comm.MaxRecvMsgSize),
    68  			grpc.MaxCallSendMsgSize(comm.MaxSendMsgSize)))
    69  	defaultDeliverClientDialOpts = append(
    70  		defaultDeliverClientDialOpts,
    71  		comm.ClientKeepaliveOptions(comm.DefaultKeepaliveOptions)...,
    72  	)
    73  	gossipConfig, err := gossip.GlobalConfig("localhost:0", nil)
    74  
    75  	gossipService, err := gossipservice.New(
    76  		signer,
    77  		gossipmetrics.NewGossipMetrics(&disabled.Provider{}),
    78  		"localhost:0",
    79  		grpc.NewServer(),
    80  		messageCryptoService,
    81  		secAdv,
    82  		defaultSecureDialOpts,
    83  		nil,
    84  		nil,
    85  		gossipConfig,
    86  		&service.ServiceConfig{},
    87  		&deliverservice.DeliverServiceConfig{
    88  			ReConnectBackoffThreshold:   deliverservice.DefaultReConnectBackoffThreshold,
    89  			ReconnectTotalTimeThreshold: deliverservice.DefaultReConnectTotalTimeThreshold,
    90  		},
    91  	)
    92  	require.NoError(t, err, "failed to create gossip service")
    93  
    94  	ledgerMgr, err := constructLedgerMgrWithTestDefaults(filepath.Join(tempdir, "ledgersData"))
    95  	require.NoError(t, err, "failed to create ledger manager")
    96  
    97  	assert.NoError(t, err)
    98  	transientStoreProvider, err := transientstore.NewStoreProvider(
    99  		filepath.Join(tempdir, "transientstore"),
   100  	)
   101  	assert.NoError(t, err)
   102  	peerInstance := &Peer{
   103  		GossipService:  gossipService,
   104  		StoreProvider:  transientStoreProvider,
   105  		LedgerMgr:      ledgerMgr,
   106  		CryptoProvider: cryptoProvider,
   107  	}
   108  
   109  	cleanup := func() {
   110  		ledgerMgr.Close()
   111  		os.RemoveAll(tempdir)
   112  	}
   113  	return peerInstance, cleanup
   114  }
   115  
   116  func TestInitialize(t *testing.T) {
   117  	peerInstance, cleanup := NewTestPeer(t)
   118  	defer cleanup()
   119  
   120  	org1CA, err := ioutil.ReadFile(filepath.Join("testdata", "Org1-cert.pem"))
   121  	require.NoError(t, err)
   122  	org1Server1Key, err := ioutil.ReadFile(filepath.Join("testdata", "Org1-server1-key.pem"))
   123  	require.NoError(t, err)
   124  	org1Server1Cert, err := ioutil.ReadFile(filepath.Join("testdata", "Org1-server1-cert.pem"))
   125  	require.NoError(t, err)
   126  	serverConfig := comm.ServerConfig{
   127  		SecOpts: comm.SecureOptions{
   128  			UseTLS:            true,
   129  			Certificate:       org1Server1Cert,
   130  			Key:               org1Server1Key,
   131  			ServerRootCAs:     [][]byte{org1CA},
   132  			RequireClientCert: true,
   133  		},
   134  	}
   135  
   136  	server, err := comm.NewGRPCServer("localhost:0", serverConfig)
   137  	if err != nil {
   138  		t.Fatalf("NewGRPCServer failed with error [%s]", err)
   139  		return
   140  	}
   141  
   142  	peerInstance.Initialize(
   143  		nil,
   144  		server,
   145  		plugin.MapBasedMapper(map[string]validation.PluginFactory{}),
   146  		&ledgermocks.DeployedChaincodeInfoProvider{},
   147  		nil,
   148  		nil,
   149  		runtime.NumCPU(),
   150  	)
   151  	assert.Equal(t, peerInstance.server, server)
   152  }
   153  
   154  func TestCreateChannel(t *testing.T) {
   155  	peerInstance, cleanup := NewTestPeer(t)
   156  	defer cleanup()
   157  
   158  	var initArg string
   159  	peerInstance.Initialize(
   160  		func(cid string) { initArg = cid },
   161  		nil,
   162  		plugin.MapBasedMapper(map[string]validation.PluginFactory{}),
   163  		&ledgermocks.DeployedChaincodeInfoProvider{},
   164  		nil,
   165  		nil,
   166  		runtime.NumCPU(),
   167  	)
   168  
   169  	testChainID := fmt.Sprintf("mytestchainid-%d", rand.Int())
   170  	block, err := configtxtest.MakeGenesisBlock(testChainID)
   171  	if err != nil {
   172  		fmt.Printf("Failed to create a config block, err %s\n", err)
   173  		t.FailNow()
   174  	}
   175  
   176  	err = peerInstance.CreateChannel(testChainID, block, &mock.DeployedChaincodeInfoProvider{}, nil, nil)
   177  	if err != nil {
   178  		t.Fatalf("failed to create chain %s", err)
   179  	}
   180  
   181  	assert.Equal(t, testChainID, initArg)
   182  
   183  	// Correct ledger
   184  	ledger := peerInstance.GetLedger(testChainID)
   185  	if ledger == nil {
   186  		t.Fatalf("failed to get correct ledger")
   187  	}
   188  
   189  	// Get config block from ledger
   190  	block, err = ConfigBlockFromLedger(ledger)
   191  	assert.NoError(t, err, "Failed to get config block from ledger")
   192  	assert.NotNil(t, block, "Config block should not be nil")
   193  	assert.Equal(t, uint64(0), block.Header.Number, "config block should have been block 0")
   194  
   195  	// Bad ledger
   196  	ledger = peerInstance.GetLedger("BogusChain")
   197  	if ledger != nil {
   198  		t.Fatalf("got a bogus ledger")
   199  	}
   200  
   201  	// Correct PolicyManager
   202  	pmgr := peerInstance.GetPolicyManager(testChainID)
   203  	if pmgr == nil {
   204  		t.Fatal("failed to get PolicyManager")
   205  	}
   206  
   207  	// Bad PolicyManager
   208  	pmgr = peerInstance.GetPolicyManager("BogusChain")
   209  	if pmgr != nil {
   210  		t.Fatal("got a bogus PolicyManager")
   211  	}
   212  
   213  	channels := peerInstance.GetChannelsInfo()
   214  	if len(channels) != 1 {
   215  		t.Fatalf("incorrect number of channels")
   216  	}
   217  }
   218  
   219  func TestDeliverSupportManager(t *testing.T) {
   220  	peerInstance, cleanup := NewTestPeer(t)
   221  	defer cleanup()
   222  
   223  	manager := &DeliverChainManager{Peer: peerInstance}
   224  
   225  	chainSupport := manager.GetChain("fake")
   226  	assert.Nil(t, chainSupport, "chain support should be nil")
   227  
   228  	peerInstance.channels = map[string]*Channel{"testchain": {}}
   229  	chainSupport = manager.GetChain("testchain")
   230  	assert.NotNil(t, chainSupport, "chain support should not be nil")
   231  }
   232  
   233  func constructLedgerMgrWithTestDefaults(ledgersDataDir string) (*ledgermgmt.LedgerMgr, error) {
   234  	ledgerInitializer := ledgermgmttest.NewInitializer(ledgersDataDir)
   235  
   236  	ledgerInitializer.CustomTxProcessors = map[common.HeaderType]ledger.CustomTxProcessor{
   237  		common.HeaderType_CONFIG: &ConfigTxProcessor{},
   238  	}
   239  	ledgerInitializer.Config.HistoryDBConfig = &ledger.HistoryDBConfig{
   240  		Enabled: true,
   241  	}
   242  	return ledgermgmt.NewLedgerMgr(ledgerInitializer), nil
   243  }
   244  
   245  // SetServer sets the gRPC server for the peer.
   246  // It should only be used in peer/pkg_test.
   247  func (p *Peer) SetServer(server *comm.GRPCServer) {
   248  	p.server = server
   249  }