github.com/yous1230/fabric@v2.0.0-beta.0.20191224111736-74345bee6ac2+incompatible/core/chaincode/container_runtime_test.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package chaincode_test
     8  
     9  import (
    10  	"testing"
    11  
    12  	pb "github.com/hyperledger/fabric-protos-go/peer"
    13  	"github.com/hyperledger/fabric/core/chaincode"
    14  	"github.com/hyperledger/fabric/core/chaincode/mock"
    15  	"github.com/hyperledger/fabric/core/container"
    16  	"github.com/hyperledger/fabric/core/container/ccintf"
    17  	"github.com/pkg/errors"
    18  	"github.com/stretchr/testify/assert"
    19  )
    20  
    21  func TestContainerRuntimeBuild(t *testing.T) {
    22  	fakeRouter := &mock.ContainerRouter{}
    23  	fakeRouter.ChaincodeServerInfoReturns(&ccintf.ChaincodeServerInfo{Address: "ccaddress:12345"}, nil)
    24  
    25  	cr := &chaincode.ContainerRuntime{
    26  		ContainerRouter: fakeRouter,
    27  		BuildRegistry:   &container.BuildRegistry{},
    28  	}
    29  
    30  	ccinfo, err := cr.Build("chaincode-name:chaincode-version")
    31  	assert.NoError(t, err)
    32  	assert.Equal(t, &ccintf.ChaincodeServerInfo{Address: "ccaddress:12345"}, ccinfo)
    33  
    34  	assert.Equal(t, 1, fakeRouter.BuildCallCount())
    35  	packageID := fakeRouter.BuildArgsForCall(0)
    36  	assert.Equal(t, "chaincode-name:chaincode-version", packageID)
    37  }
    38  
    39  func TestContainerRuntimeStart(t *testing.T) {
    40  	fakeRouter := &mock.ContainerRouter{}
    41  
    42  	cr := &chaincode.ContainerRuntime{
    43  		ContainerRouter: fakeRouter,
    44  		BuildRegistry:   &container.BuildRegistry{},
    45  	}
    46  
    47  	err := cr.Start("chaincode-name:chaincode-version", &ccintf.PeerConnection{Address: "peer-address"})
    48  	assert.NoError(t, err)
    49  
    50  	assert.Equal(t, 1, fakeRouter.StartCallCount())
    51  	ccid, peerConnection := fakeRouter.StartArgsForCall(0)
    52  	assert.Equal(t, "chaincode-name:chaincode-version", ccid)
    53  	assert.Equal(t, "peer-address", peerConnection.Address)
    54  	assert.Nil(t, peerConnection.TLSConfig)
    55  
    56  	// Try starting a second time, to ensure build is not invoked again
    57  	// as the BuildRegistry already holds it
    58  	err = cr.Start("chaincode-name:chaincode-version", &ccintf.PeerConnection{Address: "fake-address"})
    59  	assert.NoError(t, err)
    60  	assert.Equal(t, 2, fakeRouter.StartCallCount())
    61  }
    62  
    63  func TestContainerRuntimeStartErrors(t *testing.T) {
    64  	tests := []struct {
    65  		chaincodeType string
    66  		startErr      error
    67  		errValue      string
    68  	}{
    69  		{pb.ChaincodeSpec_GOLANG.String(), errors.New("process-failed"), "error starting container: process-failed"},
    70  	}
    71  
    72  	for _, tc := range tests {
    73  		fakeRouter := &mock.ContainerRouter{}
    74  		fakeRouter.StartReturns(tc.startErr)
    75  
    76  		cr := &chaincode.ContainerRuntime{
    77  			ContainerRouter: fakeRouter,
    78  			BuildRegistry:   &container.BuildRegistry{},
    79  		}
    80  
    81  		err := cr.Start("ccid", &ccintf.PeerConnection{Address: "fake-address"})
    82  		assert.EqualError(t, err, tc.errValue)
    83  	}
    84  }
    85  
    86  func TestContainerRuntimeStop(t *testing.T) {
    87  	fakeRouter := &mock.ContainerRouter{}
    88  
    89  	cr := &chaincode.ContainerRuntime{
    90  		ContainerRouter: fakeRouter,
    91  	}
    92  
    93  	err := cr.Stop("chaincode-id-name:chaincode-version")
    94  	assert.NoError(t, err)
    95  
    96  	assert.Equal(t, 1, fakeRouter.StopCallCount())
    97  	ccid := fakeRouter.StopArgsForCall(0)
    98  	assert.Equal(t, "chaincode-id-name:chaincode-version", ccid)
    99  }
   100  
   101  func TestContainerRuntimeStopErrors(t *testing.T) {
   102  	tests := []struct {
   103  		processErr error
   104  		errValue   string
   105  	}{
   106  		{errors.New("process-failed"), "error stopping container: process-failed"},
   107  	}
   108  
   109  	for _, tc := range tests {
   110  		fakeRouter := &mock.ContainerRouter{}
   111  		fakeRouter.StopReturns(tc.processErr)
   112  
   113  		cr := &chaincode.ContainerRuntime{
   114  			ContainerRouter: fakeRouter,
   115  		}
   116  
   117  		assert.EqualError(t, cr.Stop("ccid"), tc.errValue)
   118  	}
   119  }
   120  
   121  func TestContainerRuntimeWait(t *testing.T) {
   122  	fakeRouter := &mock.ContainerRouter{}
   123  
   124  	cr := &chaincode.ContainerRuntime{
   125  		ContainerRouter: fakeRouter,
   126  	}
   127  
   128  	exitCode, err := cr.Wait("chaincode-id-name:chaincode-version")
   129  	assert.NoError(t, err)
   130  	assert.Equal(t, 0, exitCode)
   131  	assert.Equal(t, 1, fakeRouter.WaitCallCount())
   132  	assert.Equal(t, "chaincode-id-name:chaincode-version", fakeRouter.WaitArgsForCall(0))
   133  
   134  	fakeRouter.WaitReturns(3, errors.New("moles-and-trolls"))
   135  	code, err := cr.Wait("chaincode-id-name:chaincode-version")
   136  	assert.EqualError(t, err, "moles-and-trolls")
   137  	assert.Equal(t, code, 3)
   138  }