github.com/sykesm/fabric@v1.1.0-preview.0.20200129034918-2aa12b1a0181/core/ledger/kvledger/coll_elg_notifier_test.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package kvledger
     8  
     9  import (
    10  	"testing"
    11  
    12  	"github.com/hyperledger/fabric-protos-go/common"
    13  	"github.com/hyperledger/fabric-protos-go/ledger/rwset/kvrwset"
    14  	"github.com/hyperledger/fabric-protos-go/peer"
    15  	"github.com/hyperledger/fabric/core/ledger"
    16  	"github.com/hyperledger/fabric/core/ledger/mock"
    17  	"github.com/stretchr/testify/assert"
    18  )
    19  
    20  func TestCollElgNotifier(t *testing.T) {
    21  	mockDeployedChaincodeInfoProvider := &mock.DeployedChaincodeInfoProvider{}
    22  	mockDeployedChaincodeInfoProvider.UpdatedChaincodesReturns([]*ledger.ChaincodeLifecycleInfo{
    23  		{Name: "cc1"},
    24  	}, nil)
    25  
    26  	// Returns 3 collections - the bool value indicates the eligibility of peer for corresponding collection
    27  	mockDeployedChaincodeInfoProvider.ChaincodeInfoReturnsOnCall(0,
    28  		&ledger.DeployedChaincodeInfo{
    29  			ExplicitCollectionConfigPkg: testutilPrepapreMockCollectionConfigPkg(
    30  				map[string]bool{"coll1": true, "coll2": true, "coll3": false})}, nil)
    31  
    32  	// post commit - returns 4 collections
    33  	mockDeployedChaincodeInfoProvider.ChaincodeInfoReturnsOnCall(1,
    34  		&ledger.DeployedChaincodeInfo{
    35  			ExplicitCollectionConfigPkg: testutilPrepapreMockCollectionConfigPkg(
    36  				map[string]bool{"coll1": false, "coll2": true, "coll3": true, "coll4": true})}, nil)
    37  
    38  	mockMembershipInfoProvider := &mock.MembershipInfoProvider{}
    39  	mockMembershipInfoProvider.AmMemberOfStub = func(channel string, p *peer.CollectionPolicyConfig) (bool, error) {
    40  		return testutilIsEligibleForMockPolicy(p), nil
    41  	}
    42  
    43  	mockCollElgListener := &mockCollElgListener{}
    44  
    45  	collElgNotifier := &collElgNotifier{
    46  		mockDeployedChaincodeInfoProvider,
    47  		mockMembershipInfoProvider,
    48  		make(map[string]collElgListener),
    49  	}
    50  	collElgNotifier.registerListener("testLedger", mockCollElgListener)
    51  
    52  	collElgNotifier.HandleStateUpdates(&ledger.StateUpdateTrigger{
    53  		LedgerID:           "testLedger",
    54  		CommittingBlockNum: uint64(500),
    55  		StateUpdates: map[string]*ledger.KVStateUpdates{
    56  			"doesNotMatterNS": {
    57  				PublicUpdates: []*kvrwset.KVWrite{
    58  					{
    59  						Key:   "doesNotMatterKey",
    60  						Value: []byte("doesNotMatterVal"),
    61  					},
    62  				},
    63  			},
    64  		},
    65  	})
    66  
    67  	// event triggered should only contain "coll3" as this is the only collection
    68  	// for which peer became from ineligile to eligible by upgrade tx
    69  	assert.Equal(t, uint64(500), mockCollElgListener.receivedCommittingBlk)
    70  	assert.Equal(t,
    71  		map[string][]string{
    72  			"cc1": {"coll3"},
    73  		},
    74  		mockCollElgListener.receivedNsCollMap,
    75  	)
    76  }
    77  
    78  type mockCollElgListener struct {
    79  	receivedCommittingBlk uint64
    80  	receivedNsCollMap     map[string][]string
    81  }
    82  
    83  func (m *mockCollElgListener) ProcessCollsEligibilityEnabled(commitingBlk uint64, nsCollMap map[string][]string) error {
    84  	m.receivedCommittingBlk = commitingBlk
    85  	m.receivedNsCollMap = nsCollMap
    86  	return nil
    87  }
    88  
    89  func testutilPrepapreMockCollectionConfigPkg(collEligibilityMap map[string]bool) *peer.CollectionConfigPackage {
    90  	pkg := &peer.CollectionConfigPackage{}
    91  	for collName, isEligible := range collEligibilityMap {
    92  		var version int32
    93  		if isEligible {
    94  			version = 1
    95  		}
    96  		policy := &peer.CollectionPolicyConfig{
    97  			Payload: &peer.CollectionPolicyConfig_SignaturePolicy{
    98  				SignaturePolicy: &common.SignaturePolicyEnvelope{Version: version},
    99  			},
   100  		}
   101  		sCollConfig := &peer.CollectionConfig_StaticCollectionConfig{
   102  			StaticCollectionConfig: &peer.StaticCollectionConfig{
   103  				Name:             collName,
   104  				MemberOrgsPolicy: policy,
   105  			},
   106  		}
   107  		config := &peer.CollectionConfig{Payload: sCollConfig}
   108  		pkg.Config = append(pkg.Config, config)
   109  	}
   110  	return pkg
   111  }
   112  
   113  func testutilIsEligibleForMockPolicy(p *peer.CollectionPolicyConfig) bool {
   114  	return p.GetSignaturePolicy().Version == 1
   115  }