github.com/zhouxv/fabric@v2.1.1+incompatible/core/chaincode/lifecycle/metadata_manager_test.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package lifecycle_test
     8  
     9  import (
    10  	"github.com/hyperledger/fabric/common/chaincode"
    11  	"github.com/hyperledger/fabric/core/chaincode/lifecycle"
    12  	"github.com/hyperledger/fabric/core/chaincode/lifecycle/mock"
    13  
    14  	. "github.com/onsi/ginkgo"
    15  	. "github.com/onsi/gomega"
    16  )
    17  
    18  var _ = Describe("MetadataManager", func() {
    19  	var (
    20  		metadataManager            *lifecycle.MetadataManager
    21  		fakeMetadataUpdateListener *mock.MetadataUpdateListener
    22  	)
    23  
    24  	BeforeEach(func() {
    25  		metadataManager = lifecycle.NewMetadataManager()
    26  		fakeMetadataUpdateListener = &mock.MetadataUpdateListener{}
    27  		metadataManager.AddListener(lifecycle.HandleMetadataUpdateFunc(fakeMetadataUpdateListener.HandleMetadataUpdate))
    28  	})
    29  
    30  	It("initializes metadata", func() {
    31  		chaincodes := chaincode.MetadataSet{
    32  			{
    33  				Name:    "cc-name",
    34  				Version: "cc-version",
    35  				Policy:  []byte("cc-policy"),
    36  			},
    37  		}
    38  		metadataManager.InitializeMetadata("testchannel", chaincodes)
    39  		Expect(metadataManager.MetadataSet["testchannel"]).To(HaveLen(1))
    40  		Expect(metadataManager.MetadataSet["testchannel"]).To(ConsistOf(
    41  			chaincode.Metadata{
    42  				Name:    "cc-name",
    43  				Version: "cc-version",
    44  				Policy:  []byte("cc-policy"),
    45  			},
    46  		))
    47  	})
    48  
    49  	It("updates metadata and notifies registered listeners", func() {
    50  		chaincodes := chaincode.MetadataSet{
    51  			{
    52  				Name:    "cc-name",
    53  				Version: "cc-version",
    54  				Policy:  []byte("cc-policy"),
    55  			},
    56  		}
    57  
    58  		metadataManager.UpdateMetadata("testchannel", chaincodes)
    59  		Expect(metadataManager.MetadataSet["testchannel"]).To(HaveLen(1))
    60  		Expect(metadataManager.MetadataSet["testchannel"]).To(ConsistOf(
    61  			chaincode.Metadata{
    62  				Name:    "cc-name",
    63  				Version: "cc-version",
    64  				Policy:  []byte("cc-policy"),
    65  			},
    66  		))
    67  		Expect(fakeMetadataUpdateListener.HandleMetadataUpdateCallCount()).To(Equal(1))
    68  	})
    69  
    70  	It("updates legacy metadata and notifies registered listeners", func() {
    71  		chaincodes := chaincode.MetadataSet{
    72  			{
    73  				Name:    "legacy-cc-name",
    74  				Version: "legacy-cc-version",
    75  				Policy:  []byte("legacy-cc-policy"),
    76  			},
    77  		}
    78  
    79  		metadataManager.HandleMetadataUpdate("testchannel", chaincodes)
    80  		Expect(metadataManager.LegacyMetadataSet["testchannel"]).To(HaveLen(1))
    81  		Expect(metadataManager.LegacyMetadataSet["testchannel"]).To(ConsistOf(
    82  			chaincode.Metadata{
    83  				Name:    "legacy-cc-name",
    84  				Version: "legacy-cc-version",
    85  				Policy:  []byte("legacy-cc-policy"),
    86  			},
    87  		))
    88  		Expect(fakeMetadataUpdateListener.HandleMetadataUpdateCallCount()).To(Equal(1))
    89  	})
    90  
    91  	Context("when _lifecycle and lscc chaincodes are both defined and an lscc chaincode is updated", func() {
    92  		var legacyChaincodes chaincode.MetadataSet
    93  
    94  		BeforeEach(func() {
    95  			chaincodes := chaincode.MetadataSet{
    96  				{
    97  					Name:      "cc-name",
    98  					Version:   "cc-version",
    99  					Policy:    []byte("cc-policy"),
   100  					Approved:  true,
   101  					Installed: true,
   102  				},
   103  			}
   104  			legacyChaincodes = chaincode.MetadataSet{
   105  				{
   106  					Name:    "legacy-cc-name",
   107  					Version: "legacy-cc-version",
   108  					Policy:  []byte("legacy-cc-policy"),
   109  				},
   110  			}
   111  			metadataManager.InitializeMetadata("testchannel", chaincodes)
   112  			Expect(metadataManager.MetadataSet["testchannel"]).To(HaveLen(1))
   113  			Expect(metadataManager.MetadataSet["testchannel"]).To(ConsistOf(
   114  				chaincode.Metadata{
   115  					Name:      "cc-name",
   116  					Version:   "cc-version",
   117  					Policy:    []byte("cc-policy"),
   118  					Approved:  true,
   119  					Installed: true,
   120  				},
   121  			))
   122  		})
   123  
   124  		It("aggregates the chaincode metadata", func() {
   125  			metadataManager.HandleMetadataUpdate("testchannel", legacyChaincodes)
   126  			Expect(fakeMetadataUpdateListener.HandleMetadataUpdateCallCount()).To(Equal(1))
   127  			channelArg, metadataSetArg := fakeMetadataUpdateListener.HandleMetadataUpdateArgsForCall(0)
   128  			Expect(channelArg).To(Equal("testchannel"))
   129  			Expect(metadataSetArg).To(HaveLen(2))
   130  			Expect(metadataSetArg).To(ConsistOf(
   131  				chaincode.Metadata{
   132  					Name:      "cc-name",
   133  					Version:   "cc-version",
   134  					Policy:    []byte("cc-policy"),
   135  					Approved:  true,
   136  					Installed: true,
   137  				},
   138  				chaincode.Metadata{
   139  					Name:    "legacy-cc-name",
   140  					Version: "legacy-cc-version",
   141  					Policy:  []byte("legacy-cc-policy"),
   142  				},
   143  			))
   144  		})
   145  	})
   146  
   147  	Context("when _lifecycle and lscc chaincodes are both for the same chaincode", func() {
   148  		var legacyChaincodes chaincode.MetadataSet
   149  
   150  		BeforeEach(func() {
   151  			chaincodes := chaincode.MetadataSet{
   152  				{
   153  					Name:      "cc-name",
   154  					Version:   "cc-version",
   155  					Policy:    []byte("cc-policy"),
   156  					Approved:  true,
   157  					Installed: true,
   158  				},
   159  			}
   160  			legacyChaincodes = chaincode.MetadataSet{
   161  				{
   162  					Name:    "cc-name",
   163  					Version: "legacy-cc-version",
   164  					Policy:  []byte("legacy-cc-policy"),
   165  				},
   166  			}
   167  			metadataManager.InitializeMetadata("testchannel", chaincodes)
   168  			Expect(metadataManager.MetadataSet["testchannel"]).To(HaveLen(1))
   169  			Expect(metadataManager.MetadataSet["testchannel"]).To(ConsistOf(
   170  				chaincode.Metadata{
   171  					Name:      "cc-name",
   172  					Version:   "cc-version",
   173  					Policy:    []byte("cc-policy"),
   174  					Approved:  true,
   175  					Installed: true,
   176  				},
   177  			))
   178  		})
   179  
   180  		It("returns the version from _lifecycle", func() {
   181  			metadataManager.HandleMetadataUpdate("testchannel", legacyChaincodes)
   182  			Expect(fakeMetadataUpdateListener.HandleMetadataUpdateCallCount()).To(Equal(1))
   183  			channelArg, metadataSetArg := fakeMetadataUpdateListener.HandleMetadataUpdateArgsForCall(0)
   184  			Expect(channelArg).To(Equal("testchannel"))
   185  			Expect(metadataSetArg).To(HaveLen(1))
   186  			Expect(metadataSetArg).To(ConsistOf(
   187  				chaincode.Metadata{
   188  					Name:      "cc-name",
   189  					Version:   "cc-version",
   190  					Policy:    []byte("cc-policy"),
   191  					Approved:  true,
   192  					Installed: true,
   193  				},
   194  			))
   195  		})
   196  	})
   197  
   198  	Context("when _lifecycle and lscc chaincodes are both for the same chaincode but has not been approved/installed in _lifecycle", func() {
   199  		var legacyChaincodes chaincode.MetadataSet
   200  
   201  		BeforeEach(func() {
   202  			chaincodes := chaincode.MetadataSet{
   203  				{
   204  					Name:      "notapproved",
   205  					Version:   "na-version",
   206  					Policy:    []byte("na-policy"),
   207  					Approved:  false,
   208  					Installed: true,
   209  				},
   210  				{
   211  					Name:      "notinstalled",
   212  					Version:   "ni-version",
   213  					Policy:    []byte("ni-policy"),
   214  					Approved:  true,
   215  					Installed: false,
   216  				},
   217  			}
   218  			legacyChaincodes = chaincode.MetadataSet{
   219  				{
   220  					Name:    "notapproved",
   221  					Version: "na-version",
   222  					Policy:  []byte("legacy-na-policy"),
   223  				},
   224  				{
   225  					Name:    "notinstalled",
   226  					Version: "ni-version",
   227  					Policy:  []byte("legacy-ni-policy"),
   228  				},
   229  			}
   230  			metadataManager.InitializeMetadata("testchannel", chaincodes)
   231  			Expect(metadataManager.MetadataSet["testchannel"]).To(HaveLen(2))
   232  			Expect(metadataManager.MetadataSet["testchannel"]).To(ConsistOf(
   233  				chaincode.Metadata{
   234  					Name:      "notapproved",
   235  					Version:   "na-version",
   236  					Policy:    []byte("na-policy"),
   237  					Approved:  false,
   238  					Installed: true,
   239  				},
   240  				chaincode.Metadata{
   241  					Name:      "notinstalled",
   242  					Version:   "ni-version",
   243  					Policy:    []byte("ni-policy"),
   244  					Approved:  true,
   245  					Installed: false,
   246  				},
   247  			))
   248  		})
   249  
   250  		It("does not include stale definitions from lscc", func() {
   251  			metadataManager.HandleMetadataUpdate("testchannel", legacyChaincodes)
   252  			Expect(fakeMetadataUpdateListener.HandleMetadataUpdateCallCount()).To(Equal(1))
   253  			channelArg, metadataSetArg := fakeMetadataUpdateListener.HandleMetadataUpdateArgsForCall(0)
   254  			Expect(channelArg).To(Equal("testchannel"))
   255  			Expect(metadataSetArg).To(BeEmpty())
   256  		})
   257  	})
   258  })