From fe7cbc6c9bb590bbcbf31301906bb9976eb889b1 Mon Sep 17 00:00:00 2001 From: Will Lahti Date: Wed, 22 Apr 2020 16:54:43 -0400 Subject: [PATCH] Update pkg/configtx tests to use New to create ConfigTx (#1143) And some miscellaneous cleanup elsewhere. FAB-17775 #done Signed-off-by: Will Lahti --- pkg/configtx/application.go | 4 +- pkg/configtx/application_test.go | 97 ++++++++------------ pkg/configtx/capabilities_test.go | 41 ++++----- pkg/configtx/config.go | 10 +- pkg/configtx/config_test.go | 115 ----------------------- pkg/configtx/consortiums_test.go | 20 ++-- pkg/configtx/orderer_test.go | 58 ++++-------- pkg/configtx/organization_test.go | 32 ++----- pkg/configtx/policies_test.go | 146 +++++++++--------------------- pkg/configtx/signer_test.go | 117 ++++++++++++++++++++++++ 10 files changed, 249 insertions(+), 391 deletions(-) diff --git a/pkg/configtx/application.go b/pkg/configtx/application.go index 5455e137897..5c9cc99a636 100644 --- a/pkg/configtx/application.go +++ b/pkg/configtx/application.go @@ -77,7 +77,7 @@ func (c *ConfigTx) AddAnchorPeer(orgName string, newAnchorPeer Address) error { // Unmarshal existing anchor peers if the config value exists err := proto.Unmarshal(anchorPeerConfigValue.Value, anchorPeersProto) if err != nil { - return fmt.Errorf("failed unmarshaling %s's anchor peer endpoints: %v", orgName, err) + return fmt.Errorf("failed unmarshaling anchor peer endpoints for org %s: %v", orgName, err) } } @@ -118,7 +118,7 @@ func (c *ConfigTx) RemoveAnchorPeer(orgName string, anchorPeerToRemove Address) // Unmarshal existing anchor peers if the config value exists err := proto.Unmarshal(anchorPeerConfigValue.Value, anchorPeersProto) if err != nil { - return fmt.Errorf("failed unmarshaling %s's anchor peer endpoints: %v", orgName, err) + return fmt.Errorf("failed unmarshaling anchor peer endpoints for org %s: %v", orgName, err) } } diff --git a/pkg/configtx/application_test.go b/pkg/configtx/application_test.go index 84d16a4da31..602fc96e353 100644 --- a/pkg/configtx/application_test.go +++ b/pkg/configtx/application_test.go @@ -11,6 +11,7 @@ import ( "fmt" "testing" + "github.com/golang/protobuf/proto" cb "github.com/hyperledger/fabric-protos-go/common" "github.com/hyperledger/fabric/common/tools/protolator" "github.com/hyperledger/fabric/common/tools/protolator/protoext/peerext" @@ -91,7 +92,8 @@ func TestNewApplicationGroup(t *testing.T) { } }, "version": "0" -}` +} +` applicationGroup, err := newApplicationGroup(application) gt.Expect(err).NotTo(HaveOccurred()) @@ -219,10 +221,7 @@ func TestAddAnchorPeer(t *testing.T) { }, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) newOrg1AnchorPeer := Address{ Host: "host3", @@ -349,7 +348,7 @@ func TestAddAnchorPeer(t *testing.T) { }, "sequence": "0" } - ` +` expectedUpdatedConfig := &cb.Config{} @@ -362,7 +361,7 @@ func TestAddAnchorPeer(t *testing.T) { err = c.AddAnchorPeer("Org2", newOrg2AnchorPeer) gt.Expect(err).NotTo(HaveOccurred()) - gt.Expect(config).To(Equal(expectedUpdatedConfig)) + gt.Expect(proto.Equal(c.UpdatedConfig(), expectedUpdatedConfig)).To(BeTrue()) } func TestRemoveAnchorPeer(t *testing.T) { @@ -385,10 +384,7 @@ func TestRemoveAnchorPeer(t *testing.T) { }, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) expectedUpdatedConfigJSON := ` { @@ -485,19 +481,20 @@ func TestRemoveAnchorPeer(t *testing.T) { }, "sequence": "0" } - ` +` + anchorPeer1 := Address{Host: "host1", Port: 123} err = c.AddAnchorPeer("Org1", anchorPeer1) gt.Expect(err).NotTo(HaveOccurred()) expectedUpdatedConfig := &cb.Config{} err = protolator.DeepUnmarshalJSON(bytes.NewBufferString(expectedUpdatedConfigJSON), expectedUpdatedConfig) - gt.Expect(err).ToNot(HaveOccurred()) + gt.Expect(err).NotTo(HaveOccurred()) err = c.RemoveAnchorPeer("Org1", anchorPeer1) gt.Expect(err).NotTo(HaveOccurred()) - gt.Expect(config).To(Equal(expectedUpdatedConfig)) + gt.Expect(proto.Equal(c.UpdatedConfig(), expectedUpdatedConfig)).To(BeTrue()) } func TestRemoveAnchorPeerFailure(t *testing.T) { @@ -515,7 +512,7 @@ func TestRemoveAnchorPeerFailure(t *testing.T) { orgName: "Org1", anchorPeerToRemove: Address{Host: "host1", Port: 123}, configValues: map[string]*cb.ConfigValue{AnchorPeersKey: {Value: []byte("a little fire")}}, - expectedErr: "failed unmarshaling Org1's anchor peer endpoints: proto: can't skip unknown wire type 6", + expectedErr: "failed unmarshaling anchor peer endpoints for org Org1: proto: can't skip unknown wire type 6", }, } @@ -541,10 +538,7 @@ func TestRemoveAnchorPeerFailure(t *testing.T) { }, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) err = c.RemoveAnchorPeer(tt.orgName, tt.anchorPeerToRemove) gt.Expect(err).To(MatchError(tt.expectedErr)) @@ -567,10 +561,7 @@ func TestAnchorPeers(t *testing.T) { ChannelGroup: channelGroup, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) anchorPeers, err := c.AnchorPeers("Org1") gt.Expect(err).NotTo(HaveOccurred()) @@ -581,6 +572,8 @@ func TestAnchorPeers(t *testing.T) { err = c.AddAnchorPeer("Org1", expectedAnchorPeer) gt.Expect(err).NotTo(HaveOccurred()) + c = New(c.UpdatedConfig()) + anchorPeers, err = c.AnchorPeers("Org1") gt.Expect(err).NotTo(HaveOccurred()) gt.Expect(anchorPeers).To(HaveLen(1)) @@ -623,10 +616,7 @@ func TestAnchorPeerFailures(t *testing.T) { ChannelGroup: channelGroup, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) for _, test := range []struct { name string @@ -763,17 +753,15 @@ func TestRemoveACL(t *testing.T) { if tt.configMod != nil { tt.configMod(config) } - c := &ConfigTx{ - original: config, - updated: config, - } + + c := New(config) err = c.RemoveACLs(tt.removeACL) if tt.expectedErr != "" { gt.Expect(err).To(MatchError(tt.expectedErr)) } else { gt.Expect(err).NotTo(HaveOccurred()) - acls, err := getACLs(config) + acls, err := getACLs(c.UpdatedConfig()) gt.Expect(err).NotTo(HaveOccurred()) gt.Expect(acls).To(Equal(tt.expectedACL)) } @@ -797,10 +785,7 @@ func TestAddApplicationOrg(t *testing.T) { }, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) org := Organization{ Name: "Org3", @@ -961,7 +946,7 @@ func TestAddApplicationOrg(t *testing.T) { err = c.AddApplicationOrg(org) gt.Expect(err).NotTo(HaveOccurred()) - actualApplicationConfigGroup := config.ChannelGroup.Groups[ApplicationGroupKey].Groups["Org3"] + actualApplicationConfigGroup := c.UpdatedConfig().ChannelGroup.Groups[ApplicationGroupKey].Groups["Org3"] buf := bytes.Buffer{} err = protolator.DeepMarshalJSON(&buf, &peerext.DynamicApplicationOrgGroup{ConfigGroup: actualApplicationConfigGroup}) gt.Expect(err).NotTo(HaveOccurred()) @@ -984,10 +969,7 @@ func TestAddApplicationOrgFailures(t *testing.T) { }, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) org := Organization{ Name: "Org3", @@ -1013,15 +995,15 @@ func TestApplicationConfiguration(t *testing.T) { }, } - c := &ConfigTx{ - original: config, - updated: config, - } + c := New(config) + for _, org := range baseApplicationConf.Organizations { err = c.AddApplicationOrg(org) gt.Expect(err).NotTo(HaveOccurred()) } + c = New(c.UpdatedConfig()) + applicationConfig, err := c.ApplicationConfiguration() gt.Expect(err).NotTo(HaveOccurred()) gt.Expect(applicationConfig.ACLs).To(Equal(baseApplicationConf.ACLs)) @@ -1035,22 +1017,22 @@ func TestApplicationConfigurationFailure(t *testing.T) { tests := []struct { testName string - configMod func(*ConfigTx, Application, *GomegaWithT) + configMod func(ConfigTx, Application, *GomegaWithT) expectedErr string }{ { testName: "When the application group does not exist", - configMod: func(ct *ConfigTx, appOrg Application, gt *GomegaWithT) { - delete(ct.original.ChannelGroup.Groups, ApplicationGroupKey) + configMod: func(c ConfigTx, appOrg Application, gt *GomegaWithT) { + delete(c.UpdatedConfig().ChannelGroup.Groups, ApplicationGroupKey) }, expectedErr: "config does not contain application group", }, { testName: "Retrieving application org failed", - configMod: func(ct *ConfigTx, appOrg Application, gt *GomegaWithT) { + configMod: func(c ConfigTx, appOrg Application, gt *GomegaWithT) { for _, org := range appOrg.Organizations { if org.Name == "Org2" { - err := ct.AddApplicationOrg(org) + err := c.AddApplicationOrg(org) gt.Expect(err).NotTo(HaveOccurred()) } } @@ -1078,14 +1060,13 @@ func TestApplicationConfigurationFailure(t *testing.T) { }, } - c := &ConfigTx{ - original: config, - updated: config, - } + c := New(config) if tt.configMod != nil { tt.configMod(c, baseApplicationConf, gt) } + c = New(c.UpdatedConfig()) + _, err = c.ApplicationConfiguration() gt.Expect(err).To(MatchError(tt.expectedErr)) }) @@ -1109,9 +1090,7 @@ func TestApplicationACLs(t *testing.T) { }, } - c := &ConfigTx{ - original: config, - } + c := New(config) applicationACLs, err := c.ApplicationACLs() gt.Expect(err).NotTo(HaveOccurred()) @@ -1139,9 +1118,7 @@ func TestApplicationACLsFailure(t *testing.T) { Value: []byte("another little fire"), } - c := &ConfigTx{ - original: config, - } + c := New(config) applicationACLs, err := c.ApplicationACLs() gt.Expect(err).To(MatchError("unmarshaling ACLs: unexpected EOF")) diff --git a/pkg/configtx/capabilities_test.go b/pkg/configtx/capabilities_test.go index 6025857214f..57afa3fc6ff 100644 --- a/pkg/configtx/capabilities_test.go +++ b/pkg/configtx/capabilities_test.go @@ -32,10 +32,7 @@ func TestChannelCapabilities(t *testing.T) { }, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) err := setValue(config.ChannelGroup, capabilitiesValue(expectedCapabilities), AdminsPolicyKey) gt.Expect(err).NotTo(HaveOccurred()) @@ -68,10 +65,7 @@ func TestOrdererCapabilities(t *testing.T) { }, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) ordererCapabilities, err := c.OrdererCapabilities() gt.Expect(err).NotTo(HaveOccurred()) @@ -101,10 +95,7 @@ func TestApplicationCapabilities(t *testing.T) { }, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) applicationCapabilities, err := c.ApplicationCapabilities() gt.Expect(err).NotTo(HaveOccurred()) @@ -155,7 +146,7 @@ func TestSetChannelCapability(t *testing.T) { gt.Expect(err).NotTo(HaveOccurred()) buf := bytes.Buffer{} - err = protolator.DeepMarshalJSON(&buf, &commonext.DynamicChannelGroup{ConfigGroup: c.updated.ChannelGroup}) + err = protolator.DeepMarshalJSON(&buf, &commonext.DynamicChannelGroup{ConfigGroup: c.UpdatedConfig().ChannelGroup}) gt.Expect(err).NotTo(HaveOccurred()) gt.Expect(buf.String()).To(Equal(expectedConfigGroupJSON)) @@ -167,13 +158,13 @@ func TestSetChannelCapabilityFailures(t *testing.T) { tests := []struct { testName string capability string - baseConfig *cb.Config + config *cb.Config expectedErr string }{ { testName: "when retrieving existing capabilities", capability: "V2_0", - baseConfig: &cb.Config{ + config: &cb.Config{ ChannelGroup: &cb.ConfigGroup{ Values: map[string]*cb.ConfigValue{ CapabilitiesKey: { @@ -193,7 +184,7 @@ func TestSetChannelCapabilityFailures(t *testing.T) { gt := NewGomegaWithT(t) - c := New(tt.baseConfig) + c := New(tt.config) err := c.AddChannelCapability(tt.capability) gt.Expect(err).To(MatchError(tt.expectedErr)) @@ -450,7 +441,7 @@ func TestAddOrdererCapability(t *testing.T) { gt.Expect(err).NotTo(HaveOccurred()) buf := bytes.Buffer{} - err = protolator.DeepMarshalJSON(&buf, &ordererext.DynamicOrdererGroup{ConfigGroup: c.updated.ChannelGroup.Groups[OrdererGroupKey]}) + err = protolator.DeepMarshalJSON(&buf, &ordererext.DynamicOrdererGroup{ConfigGroup: c.UpdatedConfig().ChannelGroup.Groups[OrdererGroupKey]}) gt.Expect(err).NotTo(HaveOccurred()) gt.Expect(buf.String()).To(Equal(expectedConfigGroupJSON)) @@ -709,10 +700,10 @@ func TestAddApplicationCapability(t *testing.T) { gt.Expect(err).NotTo(HaveOccurred()) updatedApplicationGroupJSON := bytes.Buffer{} - err = protolator.DeepMarshalJSON(&updatedApplicationGroupJSON, &peerext.DynamicApplicationGroup{ConfigGroup: c.updated.ChannelGroup.Groups[ApplicationGroupKey]}) + err = protolator.DeepMarshalJSON(&updatedApplicationGroupJSON, &peerext.DynamicApplicationGroup{ConfigGroup: c.UpdatedConfig().ChannelGroup.Groups[ApplicationGroupKey]}) gt.Expect(err).NotTo(HaveOccurred()) originalApplicationGroupJSON := bytes.Buffer{} - err = protolator.DeepMarshalJSON(&originalApplicationGroupJSON, &peerext.DynamicApplicationGroup{ConfigGroup: c.original.ChannelGroup.Groups[ApplicationGroupKey]}) + err = protolator.DeepMarshalJSON(&originalApplicationGroupJSON, &peerext.DynamicApplicationGroup{ConfigGroup: c.OriginalConfig().ChannelGroup.Groups[ApplicationGroupKey]}) gt.Expect(err).NotTo(HaveOccurred()) gt.Expect(updatedApplicationGroupJSON.String()).To(Equal(tt.expectedConfigGroupJSON)) @@ -817,7 +808,7 @@ func TestRemoveChannelCapability(t *testing.T) { gt.Expect(err).NotTo(HaveOccurred()) buf := bytes.Buffer{} - err = protolator.DeepMarshalJSON(&buf, &commonext.DynamicChannelGroup{ConfigGroup: c.updated.ChannelGroup}) + err = protolator.DeepMarshalJSON(&buf, &commonext.DynamicChannelGroup{ConfigGroup: c.UpdatedConfig().ChannelGroup}) gt.Expect(err).NotTo(HaveOccurred()) gt.Expect(buf.String()).To(Equal(expectedConfigGroupJSON)) @@ -829,13 +820,13 @@ func TestRemoveChannelCapabilityFailures(t *testing.T) { tests := []struct { testName string capability string - baseConfig *cb.Config + config *cb.Config expectedErr string }{ { testName: "when capability does not exist", capability: "V2_0", - baseConfig: &cb.Config{ + config: &cb.Config{ ChannelGroup: &cb.ConfigGroup{ Values: map[string]*cb.ConfigValue{ CapabilitiesKey: { @@ -849,7 +840,7 @@ func TestRemoveChannelCapabilityFailures(t *testing.T) { { testName: "when retrieving existing capabilities", capability: "V2_0", - baseConfig: &cb.Config{ + config: &cb.Config{ ChannelGroup: &cb.ConfigGroup{ Values: map[string]*cb.ConfigValue{ CapabilitiesKey: { @@ -869,7 +860,7 @@ func TestRemoveChannelCapabilityFailures(t *testing.T) { gt := NewGomegaWithT(t) - c := New(tt.baseConfig) + c := New(tt.config) err := c.RemoveChannelCapability(tt.capability) gt.Expect(err).To(MatchError(tt.expectedErr)) @@ -1123,7 +1114,7 @@ func TestRemoveOrdererCapability(t *testing.T) { gt.Expect(err).NotTo(HaveOccurred()) buf := bytes.Buffer{} - err = protolator.DeepMarshalJSON(&buf, &ordererext.DynamicOrdererGroup{ConfigGroup: c.updated.ChannelGroup.Groups[OrdererGroupKey]}) + err = protolator.DeepMarshalJSON(&buf, &ordererext.DynamicOrdererGroup{ConfigGroup: c.UpdatedConfig().ChannelGroup.Groups[OrdererGroupKey]}) gt.Expect(err).NotTo(HaveOccurred()) gt.Expect(buf.String()).To(Equal(expectedConfigGroupJSON)) diff --git a/pkg/configtx/config.go b/pkg/configtx/config.go index 3d8d851e9ae..c1bda2c3165 100644 --- a/pkg/configtx/config.go +++ b/pkg/configtx/config.go @@ -317,6 +317,10 @@ func setValue(cg *cb.ConfigGroup, value *standardConfigValue, modPolicy string) return fmt.Errorf("marshaling standard config value '%s': %v", value.key, err) } + if cg.Values == nil { + cg.Values = map[string]*cb.ConfigValue{} + } + cg.Values[value.key] = &cb.ConfigValue{ Value: v, ModPolicy: modPolicy, @@ -487,9 +491,9 @@ func newChannelCreateConfigUpdate(channelID string, channelConfig Channel, templ // newConfigGroup creates an empty *cb.ConfigGroup. func newConfigGroup() *cb.ConfigGroup { return &cb.ConfigGroup{ - Groups: make(map[string]*cb.ConfigGroup), - Values: make(map[string]*cb.ConfigValue), - Policies: make(map[string]*cb.ConfigPolicy), + Groups: map[string]*cb.ConfigGroup{}, + Values: map[string]*cb.ConfigValue{}, + Policies: map[string]*cb.ConfigPolicy{}, } } diff --git a/pkg/configtx/config_test.go b/pkg/configtx/config_test.go index a037fc785d0..1ba26821a5b 100644 --- a/pkg/configtx/config_test.go +++ b/pkg/configtx/config_test.go @@ -18,30 +18,6 @@ import ( . "github.com/onsi/gomega" ) -func TestSignConfigUpdate(t *testing.T) { - t.Parallel() - - gt := NewGomegaWithT(t) - - cert, privateKey := generateCACertAndPrivateKey(t, "org1.example.com") - signingIdentity := SigningIdentity{ - Certificate: cert, - PrivateKey: privateKey, - MSPID: "test-msp", - } - - configSignature, err := signingIdentity.SignConfigUpdate(&cb.ConfigUpdate{}) - gt.Expect(err).NotTo(HaveOccurred()) - - sh, err := signingIdentity.signatureHeader() - gt.Expect(err).NotTo(HaveOccurred()) - expectedCreator := sh.Creator - signatureHeader := &cb.SignatureHeader{} - err = proto.Unmarshal(configSignature.SignatureHeader, signatureHeader) - gt.Expect(err).NotTo(HaveOccurred()) - gt.Expect(signatureHeader.Creator).To(Equal(expectedCreator)) -} - func TestNewCreateChannelTx(t *testing.T) { t.Parallel() @@ -1155,97 +1131,6 @@ func TestNewSystemChannelGenesisBlockFailure(t *testing.T) { } } -func TestCreateSignedConfigUpdateEnvelope(t *testing.T) { - t.Parallel() - gt := NewGomegaWithT(t) - - // create signingIdentity - cert, privateKey := generateCACertAndPrivateKey(t, "org1.example.com") - signingIdentity := SigningIdentity{ - Certificate: cert, - PrivateKey: privateKey, - MSPID: "test-msp", - } - - // create detached config signature - configUpdate := &cb.ConfigUpdate{ - ChannelId: "testchannel", - } - configSignature, err := signingIdentity.SignConfigUpdate(configUpdate) - gt.Expect(err).NotTo(HaveOccurred()) - - // create signed config envelope - signedEnv, err := signingIdentity.SignConfigUpdateEnvelope(configUpdate, configSignature) - gt.Expect(err).NotTo(HaveOccurred()) - - payload := &cb.Payload{} - err = proto.Unmarshal(signedEnv.Payload, payload) - gt.Expect(err).NotTo(HaveOccurred()) - // check header channel ID equal - channelHeader := &cb.ChannelHeader{} - err = proto.Unmarshal(payload.GetHeader().GetChannelHeader(), channelHeader) - gt.Expect(err).NotTo(HaveOccurred()) - gt.Expect(channelHeader.ChannelId).To(Equal(configUpdate.ChannelId)) - // check config update envelope signatures are equal - configEnv := &cb.ConfigUpdateEnvelope{} - err = proto.Unmarshal(payload.Data, configEnv) - gt.Expect(err).NotTo(HaveOccurred()) - gt.Expect(len(configEnv.Signatures)).To(Equal(1)) - expectedSignatures := configEnv.Signatures[0] - gt.Expect(expectedSignatures.SignatureHeader).To(Equal(configSignature.SignatureHeader)) - gt.Expect(expectedSignatures.Signature).To(Equal(configSignature.Signature)) -} - -func TestCreateSignedConfigUpdateEnvelopeFailures(t *testing.T) { - t.Parallel() - gt := NewGomegaWithT(t) - - // create signingIdentity - cert, privateKey := generateCACertAndPrivateKey(t, "org1.example.com") - signingIdentity := SigningIdentity{ - Certificate: cert, - PrivateKey: privateKey, - MSPID: "test-msp", - } - - // create detached config signature - configUpdate := &cb.ConfigUpdate{ - ChannelId: "testchannel", - } - configSignature, err := signingIdentity.SignConfigUpdate(configUpdate) - - gt.Expect(err).NotTo(HaveOccurred()) - - tests := []struct { - spec string - configUpdate *cb.ConfigUpdate - signingIdentity SigningIdentity - configSignature []*cb.ConfigSignature - expectedErr string - }{ - { - spec: "when no signatures are provided", - configUpdate: nil, - signingIdentity: signingIdentity, - configSignature: []*cb.ConfigSignature{configSignature}, - expectedErr: "marshaling config update: proto: Marshal called with nil", - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.spec, func(t *testing.T) { - t.Parallel() - gt := NewGomegaWithT(t) - - // create signed config envelope - signedEnv, err := tc.signingIdentity.SignConfigUpdateEnvelope(tc.configUpdate, tc.configSignature...) - gt.Expect(err).To(MatchError(tc.expectedErr)) - gt.Expect(signedEnv).To(BeNil()) - }) - } -} - func TestComputeUpdate(t *testing.T) { gt := NewGomegaWithT(t) diff --git a/pkg/configtx/consortiums_test.go b/pkg/configtx/consortiums_test.go index aaf843fadcd..18c5f340773 100644 --- a/pkg/configtx/consortiums_test.go +++ b/pkg/configtx/consortiums_test.go @@ -11,6 +11,7 @@ import ( "fmt" "testing" + "github.com/golang/protobuf/proto" cb "github.com/hyperledger/fabric-protos-go/common" "github.com/hyperledger/fabric/common/tools/protolator" "github.com/hyperledger/fabric/common/tools/protolator/protoext/commonext" @@ -353,10 +354,7 @@ func TestAddOrgToConsortium(t *testing.T) { }, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) orgToAdd := Organization{ Name: "Org3", @@ -783,7 +781,7 @@ func TestAddOrgToConsortium(t *testing.T) { err = c.AddOrgToConsortium(orgToAdd, "Consortium1") gt.Expect(err).NotTo(HaveOccurred()) - gt.Expect(config).To(Equal(expectedConfigProto)) + gt.Expect(proto.Equal(c.UpdatedConfig(), expectedConfigProto)).To(BeTrue()) } func TestAddOrgToConsortiumFailures(t *testing.T) { @@ -849,10 +847,7 @@ func TestAddOrgToConsortiumFailures(t *testing.T) { }, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) err = c.AddOrgToConsortium(test.org, test.consortium) gt.Expect(err).To(MatchError(test.expectedErr)) @@ -879,14 +874,11 @@ func TestRemoveConsortium(t *testing.T) { }, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) c.RemoveConsortium("Consortium1") - updatedConsortiumsGroup := c.updated.ChannelGroup.Groups[ConsortiumsGroupKey] + updatedConsortiumsGroup := c.UpdatedConfig().ChannelGroup.Groups[ConsortiumsGroupKey] gt.Expect(updatedConsortiumsGroup.Groups["Consortium1"]).To(BeNil()) } diff --git a/pkg/configtx/orderer_test.go b/pkg/configtx/orderer_test.go index 4f210b49b4b..1fe3f7c3450 100644 --- a/pkg/configtx/orderer_test.go +++ b/pkg/configtx/orderer_test.go @@ -957,10 +957,8 @@ func TestUpdateOrdererConfiguration(t *testing.T) { Options: orderer.EtcdRaftOptions{}, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) + err = c.UpdateOrdererConfiguration(updatedOrdererConf) gt.Expect(err).NotTo(HaveOccurred()) @@ -1238,7 +1236,7 @@ func TestUpdateOrdererConfiguration(t *testing.T) { `, certBase64, crlBase64, pkBase64) buf := &bytes.Buffer{} - err = protolator.DeepMarshalJSON(buf, config) + err = protolator.DeepMarshalJSON(buf, c.UpdatedConfig()) gt.Expect(err).NotTo(HaveOccurred()) gt.Expect(buf.String()).To(MatchJSON(expectedConfigJSON)) @@ -1293,10 +1291,7 @@ func TestOrdererConfiguration(t *testing.T) { }, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) ordererConf, err := c.OrdererConfiguration() gt.Expect(err).NotTo(HaveOccurred()) @@ -1387,18 +1382,15 @@ func TestOrdererConfigurationFailure(t *testing.T) { }, } - c := ConfigTx{ - original: config, - updated: config, - } - - err = setValue(c.updated.ChannelGroup, ordererAddressesValue(baseOrdererConfig.Addresses), ordererAdminsPolicyName) + err = setValue(config.ChannelGroup, ordererAddressesValue(baseOrdererConfig.Addresses), ordererAdminsPolicyName) gt.Expect(err).NotTo(HaveOccurred()) if tt.configMod != nil { - tt.configMod(c.updated, gt) + tt.configMod(config, gt) } + c := New(config) + _, err = c.OrdererConfiguration() gt.Expect(err).To(MatchError(tt.expectedErr)) }) @@ -1421,10 +1413,7 @@ func TestAddOrdererOrg(t *testing.T) { }, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) org := Organization{ Name: "OrdererOrg2", @@ -1591,10 +1580,7 @@ func TestAddOrdererOrgFailures(t *testing.T) { }, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) org := Organization{ Name: "OrdererOrg2", @@ -1638,10 +1624,7 @@ func TestAddOrdererEndpoint(t *testing.T) { Sequence: 0, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) expectedUpdatedConfigJSON := ` { @@ -1690,7 +1673,7 @@ func TestAddOrdererEndpoint(t *testing.T) { err = c.AddOrdererEndpoint("Orderer1Org", newOrderer1OrgEndpoint) gt.Expect(err).NotTo(HaveOccurred()) - gt.Expect(c.updated).To(Equal(expectedUpdatedConfig)) + gt.Expect(proto.Equal(c.UpdatedConfig(), expectedUpdatedConfig)).To(BeTrue()) } func TestAddOrdererEndpointFailure(t *testing.T) { @@ -1725,10 +1708,7 @@ func TestAddOrdererEndpointFailure(t *testing.T) { Sequence: 0, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) tests := []struct { testName string @@ -1798,10 +1778,7 @@ func TestRemoveOrdererEndpoint(t *testing.T) { Sequence: 0, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) expectedUpdatedConfigJSON := ` { @@ -1849,7 +1826,7 @@ func TestRemoveOrdererEndpoint(t *testing.T) { err = c.RemoveOrdererEndpoint("OrdererOrg", removedEndpoint) gt.Expect(err).NotTo(HaveOccurred()) - gt.Expect(c.updated).To(Equal(expectedUpdatedConfig)) + gt.Expect(proto.Equal(c.UpdatedConfig(), expectedUpdatedConfig)).To(BeTrue()) } func TestRemoveOrdererEndpointFailure(t *testing.T) { @@ -1884,10 +1861,7 @@ func TestRemoveOrdererEndpointFailure(t *testing.T) { Sequence: 0, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) err := c.RemoveOrdererEndpoint("OrdererOrg", Address{Host: "127.0.0.1", Port: 8050}) gt.Expect(err).To(MatchError("failed unmarshaling orderer org OrdererOrg's endpoints: proto: can't skip unknown wire type 6")) diff --git a/pkg/configtx/organization_test.go b/pkg/configtx/organization_test.go index 9a147e17bb6..1b96ec9bb68 100644 --- a/pkg/configtx/organization_test.go +++ b/pkg/configtx/organization_test.go @@ -51,10 +51,7 @@ func TestApplicationOrg(t *testing.T) { ChannelGroup: channelGroup, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) expectedOrg := channel.Application.Organizations[0] @@ -114,10 +111,7 @@ func TestRemoveApplicationOrg(t *testing.T) { ChannelGroup: channelGroup, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) c.RemoveApplicationOrg("Org1") gt.Expect(c.updated.ChannelGroup.Groups[ApplicationGroupKey].Groups["Org1"]).To(BeNil()) @@ -135,10 +129,7 @@ func TestOrdererOrg(t *testing.T) { ChannelGroup: channelGroup, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) expectedOrg := channel.Orderer.Organizations[0] @@ -189,10 +180,7 @@ func TestRemoveOrdererOrg(t *testing.T) { ChannelGroup: channelGroup, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) c.RemoveOrdererOrg("OrdererOrg") gt.Expect(c.updated.ChannelGroup.Groups[OrdererGroupKey].Groups["OrdererOrg"]).To(BeNil()) @@ -210,10 +198,7 @@ func TestConsortiumOrg(t *testing.T) { ChannelGroup: channelGroup, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) expectedOrg := channel.Consortiums[0].Organizations[0] @@ -273,13 +258,10 @@ func TestRemoveConsortiumOrg(t *testing.T) { ChannelGroup: channelGroup, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) c.RemoveConsortiumOrg("Consortium1", "Org1") - gt.Expect(c.updated.ChannelGroup.Groups[ConsortiumsGroupKey].Groups["Consortium1"].Groups["Org1"]).To(BeNil()) + gt.Expect(c.UpdatedConfig().ChannelGroup.Groups[ConsortiumsGroupKey].Groups["Consortium1"].Groups["Org1"]).To(BeNil()) } func TestNewOrgConfigGroup(t *testing.T) { diff --git a/pkg/configtx/policies_test.go b/pkg/configtx/policies_test.go index edf7897d207..3b8e7d14a9b 100644 --- a/pkg/configtx/policies_test.go +++ b/pkg/configtx/policies_test.go @@ -75,10 +75,7 @@ func TestRemoveApplicationOrgPolicy(t *testing.T) { ChannelGroup: channelGroup, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) application.Organizations[0].Policies = applicationOrgStandardPolicies() expectedOrgConfigGroup, _ := newOrgConfigGroup(application.Organizations[0]) @@ -87,7 +84,7 @@ func TestRemoveApplicationOrgPolicy(t *testing.T) { err := c.RemoveApplicationOrgPolicy("Org1", "TestPolicy") gt.Expect(err).NotTo(HaveOccurred()) - actualOrg1Policies := c.updated.ChannelGroup.Groups[ApplicationGroupKey].Groups["Org1"].Policies + actualOrg1Policies := c.UpdatedConfig().ChannelGroup.Groups[ApplicationGroupKey].Groups["Org1"].Policies gt.Expect(actualOrg1Policies).To(Equal(expectedPolicies)) } @@ -116,10 +113,7 @@ func TestRemoveApplicationOrgPolicyFailures(t *testing.T) { ChannelGroup: channelGroup, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) err := c.RemoveApplicationOrgPolicy("Org1", "TestPolicy") gt.Expect(err).To(MatchError("unknown policy type: 15")) @@ -147,10 +141,7 @@ func TestAddApplicationOrgPolicy(t *testing.T) { ChannelGroup: channelGroup, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) application.Organizations[0].Policies = applicationOrgStandardPolicies() expectedOrgConfigGroup, _ := newOrgConfigGroup(application.Organizations[0]) @@ -160,7 +151,7 @@ func TestAddApplicationOrgPolicy(t *testing.T) { err := c.AddApplicationOrgPolicy("Org1", AdminsPolicyKey, "TestPolicy", Policy{Type: ImplicitMetaPolicyType, Rule: "MAJORITY Endorsement"}) gt.Expect(err).NotTo(HaveOccurred()) - actualOrg1Policies := config.ChannelGroup.Groups[ApplicationGroupKey].Groups["Org1"].Policies + actualOrg1Policies := c.UpdatedConfig().ChannelGroup.Groups[ApplicationGroupKey].Groups["Org1"].Policies gt.Expect(actualOrg1Policies).To(Equal(expectedPolicies)) } @@ -185,10 +176,7 @@ func TestAddApplicationOrgPolicyFailures(t *testing.T) { ChannelGroup: channelGroup, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) err := c.AddApplicationOrgPolicy("Org1", AdminsPolicyKey, "TestPolicy", Policy{}) gt.Expect(err).To(MatchError("failed to add policy 'TestPolicy': unknown policy type: ")) @@ -209,10 +197,7 @@ func TestAddApplicationPolicy(t *testing.T) { ChannelGroup: channelGroup, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) expectedPolicies := map[string]Policy{ ReadersPolicyKey: { @@ -236,7 +221,7 @@ func TestAddApplicationPolicy(t *testing.T) { err = c.AddApplicationPolicy(AdminsPolicyKey, "TestPolicy", Policy{Type: ImplicitMetaPolicyType, Rule: "MAJORITY Endorsement"}) gt.Expect(err).NotTo(HaveOccurred()) - updatedPolicies, err := getPolicies(c.updated.ChannelGroup.Groups[ApplicationGroupKey].Policies) + updatedPolicies, err := getPolicies(c.UpdatedConfig().ChannelGroup.Groups[ApplicationGroupKey].Policies) gt.Expect(err).NotTo(HaveOccurred()) gt.Expect(updatedPolicies).To(Equal(expectedPolicies)) } @@ -256,10 +241,7 @@ func TestAddApplicationPolicyFailures(t *testing.T) { ChannelGroup: channelGroup, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) expectedPolicies := application.Policies expectedPolicies["TestPolicy"] = expectedPolicies[EndorsementPolicyKey] @@ -284,10 +266,7 @@ func TestRemoveApplicationPolicy(t *testing.T) { ChannelGroup: channelGroup, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) expectedPolicies := map[string]Policy{ ReadersPolicyKey: { @@ -307,7 +286,7 @@ func TestRemoveApplicationPolicy(t *testing.T) { err = c.RemoveApplicationPolicy("TestPolicy") gt.Expect(err).NotTo(HaveOccurred()) - updatedPolicies, err := getPolicies(c.updated.ChannelGroup.Groups[ApplicationGroupKey].Policies) + updatedPolicies, err := getPolicies(c.UpdatedConfig().ChannelGroup.Groups[ApplicationGroupKey].Policies) gt.Expect(err).NotTo(HaveOccurred()) gt.Expect(updatedPolicies).To(Equal(expectedPolicies)) } @@ -333,10 +312,7 @@ func TestRemoveApplicationPolicyFailures(t *testing.T) { ChannelGroup: channelGroup, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) err = c.RemoveApplicationPolicy("TestPolicy") gt.Expect(err).To(MatchError("unknown policy type: 15")) @@ -360,10 +336,7 @@ func TestAddConsortiumOrgPolicy(t *testing.T) { }, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) expectedPolicies := map[string]Policy{ ReadersPolicyKey: { @@ -415,10 +388,7 @@ func TestAddConsortiumOrgPolicyFailures(t *testing.T) { }, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) for _, test := range []struct { name string @@ -474,10 +444,7 @@ func TestRemoveConsortiumOrgPolicy(t *testing.T) { }, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) expectedPolicies := map[string]Policy{ ReadersPolicyKey: { @@ -500,7 +467,7 @@ func TestRemoveConsortiumOrgPolicy(t *testing.T) { c.RemoveConsortiumOrgPolicy("Consortium1", "Org1", "TestPolicy") - consortium1Org1 := c.updated.ChannelGroup.Groups[ConsortiumsGroupKey].Groups["Consortium1"].Groups["Org1"] + consortium1Org1 := c.UpdatedConfig().ChannelGroup.Groups[ConsortiumsGroupKey].Groups["Consortium1"].Groups["Org1"] updatedPolicies, err := getPolicies(consortium1Org1.Policies) gt.Expect(err).NotTo(HaveOccurred()) gt.Expect(updatedPolicies).To(Equal(expectedPolicies)) @@ -524,10 +491,8 @@ func TestAddOrdererPolicy(t *testing.T) { }, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) + expectedPolicies := map[string]Policy{ ReadersPolicyKey: { Type: ImplicitMetaPolicyType, @@ -554,7 +519,7 @@ func TestAddOrdererPolicy(t *testing.T) { err = c.AddOrdererPolicy(AdminsPolicyKey, "TestPolicy", Policy{Type: ImplicitMetaPolicyType, Rule: "ANY Endorsement"}) gt.Expect(err).NotTo(HaveOccurred()) - ordererConfigGroup := c.updated.ChannelGroup.Groups[OrdererGroupKey] + ordererConfigGroup := c.UpdatedConfig().ChannelGroup.Groups[OrdererGroupKey] updatedPolicies, err := getPolicies(ordererConfigGroup.Policies) gt.Expect(err).NotTo(HaveOccurred()) gt.Expect(updatedPolicies).To(Equal(expectedPolicies)) @@ -578,10 +543,7 @@ func TestAddOrdererPolicyFailures(t *testing.T) { }, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) err = c.AddOrdererPolicy(AdminsPolicyKey, "TestPolicy", Policy{}) gt.Expect(err).To(MatchError("failed to add policy 'TestPolicy': unknown policy type: ")) @@ -606,10 +568,7 @@ func TestRemoveOrdererPolicy(t *testing.T) { }, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) expectedPolicies := map[string]Policy{ ReadersPolicyKey: { @@ -658,10 +617,7 @@ func TestRemoveOrdererPolicyFailures(t *testing.T) { }, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) tests := []struct { testName string @@ -723,10 +679,7 @@ func TestAddOrdererOrgPolicy(t *testing.T) { }, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) expectedPolicies := map[string]Policy{ ReadersPolicyKey: { @@ -754,7 +707,7 @@ func TestAddOrdererOrgPolicy(t *testing.T) { err = c.AddOrdererOrgPolicy("OrdererOrg", AdminsPolicyKey, "TestPolicy", Policy{Type: ImplicitMetaPolicyType, Rule: "ANY Endorsement"}) gt.Expect(err).NotTo(HaveOccurred()) - ordererOrgConfigGroup := c.updated.ChannelGroup.Groups[OrdererGroupKey].Groups["OrdererOrg"] + ordererOrgConfigGroup := c.UpdatedConfig().ChannelGroup.Groups[OrdererGroupKey].Groups["OrdererOrg"] updatedPolicies, err := getPolicies(ordererOrgConfigGroup.Policies) gt.Expect(err).NotTo(HaveOccurred()) gt.Expect(updatedPolicies).To(Equal(expectedPolicies)) @@ -778,10 +731,7 @@ func TestAddOrdererOrgPolicyFailures(t *testing.T) { }, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) err = c.AddOrdererOrgPolicy("OrdererOrg", AdminsPolicyKey, "TestPolicy", Policy{}) gt.Expect(err).To(MatchError("unknown policy type: ")) @@ -806,10 +756,7 @@ func TestRemoveOrdererOrgPolicy(t *testing.T) { }, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) expectedPolicies := map[string]Policy{ ReadersPolicyKey: { @@ -833,7 +780,7 @@ func TestRemoveOrdererOrgPolicy(t *testing.T) { err = c.RemoveOrdererOrgPolicy("OrdererOrg", "TestPolicy") gt.Expect(err).NotTo(HaveOccurred()) - ordererOrgConfigGroup := c.updated.ChannelGroup.Groups[OrdererGroupKey].Groups["OrdererOrg"] + ordererOrgConfigGroup := c.UpdatedConfig().ChannelGroup.Groups[OrdererGroupKey].Groups["OrdererOrg"] updatedPolicies, err := getPolicies(ordererOrgConfigGroup.Policies) gt.Expect(err).NotTo(HaveOccurred()) gt.Expect(updatedPolicies).To(Equal(expectedPolicies)) @@ -857,10 +804,7 @@ func TestRemoveOrdererOrgPolicyFailures(t *testing.T) { }, } - c := ConfigTx{ - original: config, - updated: config, - } + c := New(config) err = c.RemoveOrdererOrgPolicy("bad-org", "TestPolicy") gt.Expect(err).To(MatchError("orderer org bad-org does not exist in channel config")) @@ -883,17 +827,15 @@ func TestUpdateConsortiumChannelCreationPolicy(t *testing.T) { }, }, } - c := &ConfigTx{ - original: config, - updated: config, - } + + c := New(config) updatedPolicy := Policy{Type: ImplicitMetaPolicyType, Rule: "MAJORITY Admins"} err = c.UpdateConsortiumChannelCreationPolicy("Consortium1", updatedPolicy) gt.Expect(err).NotTo(HaveOccurred()) - consortium := c.updated.ChannelGroup.Groups[ConsortiumsGroupKey].Groups["Consortium1"] + consortium := c.UpdatedConfig().ChannelGroup.Groups[ConsortiumsGroupKey].Groups["Consortium1"] creationPolicy := consortium.Values[ChannelCreationPolicyKey] policy := &cb.Policy{} err = proto.Unmarshal(creationPolicy.Value, policy) @@ -922,10 +864,8 @@ func TestUpdateConsortiumChannelCreationPolicyFailures(t *testing.T) { }, }, } - c := &ConfigTx{ - original: config, - updated: config, - } + + c := New(config) tests := []struct { name string @@ -1014,13 +954,13 @@ func TestRemoveChannelPolicy(t *testing.T) { err = c.RemoveChannelPolicy(ReadersPolicyKey) gt.Expect(err).NotTo(HaveOccurred()) - updatedChannelPolicy, err := getPolicies(c.updated.ChannelGroup.Policies) + updatedChannelPolicy, err := getPolicies(c.UpdatedConfig().ChannelGroup.Policies) gt.Expect(err).NotTo(HaveOccurred()) gt.Expect(updatedChannelPolicy).To(Equal(expectedPolicies)) - baseChannel := c.original.ChannelGroup - gt.Expect(baseChannel.Policies).To(HaveLen(3)) - gt.Expect(baseChannel.Policies[ReadersPolicyKey]).ToNot(BeNil()) + originalChannel := c.OriginalConfig().ChannelGroup + gt.Expect(originalChannel.Policies).To(HaveLen(3)) + gt.Expect(originalChannel.Policies[ReadersPolicyKey]).ToNot(BeNil()) } func TestRemoveChannelPolicyFailures(t *testing.T) { @@ -1064,10 +1004,8 @@ func TestConsortiumOrgPolicies(t *testing.T) { }, }, } - c := &ConfigTx{ - original: config, - updated: config, - } + + c := New(config) expectedPolicies := map[string]Policy{ ReadersPolicyKey: { @@ -1110,10 +1048,8 @@ func TestConsortiumOrgPoliciesFailures(t *testing.T) { }, }, } - c := &ConfigTx{ - original: config, - updated: config, - } + + c := New(config) tests := []struct { testName string diff --git a/pkg/configtx/signer_test.go b/pkg/configtx/signer_test.go index dd03d710ffd..e01d801b329 100644 --- a/pkg/configtx/signer_test.go +++ b/pkg/configtx/signer_test.go @@ -19,6 +19,8 @@ import ( "testing" "time" + "github.com/golang/protobuf/proto" + cb "github.com/hyperledger/fabric-protos-go/common" . "github.com/onsi/gomega" ) @@ -83,6 +85,121 @@ func TestPublic(t *testing.T) { gt.Expect(signingIdentity.Public()).To(Equal(cert.PublicKey)) } +func TestSignConfigUpdate(t *testing.T) { + t.Parallel() + + gt := NewGomegaWithT(t) + + cert, privateKey := generateCACertAndPrivateKey(t, "org1.example.com") + signingIdentity := SigningIdentity{ + Certificate: cert, + PrivateKey: privateKey, + MSPID: "test-msp", + } + + configSignature, err := signingIdentity.SignConfigUpdate(&cb.ConfigUpdate{}) + gt.Expect(err).NotTo(HaveOccurred()) + + sh, err := signingIdentity.signatureHeader() + gt.Expect(err).NotTo(HaveOccurred()) + expectedCreator := sh.Creator + signatureHeader := &cb.SignatureHeader{} + err = proto.Unmarshal(configSignature.SignatureHeader, signatureHeader) + gt.Expect(err).NotTo(HaveOccurred()) + gt.Expect(signatureHeader.Creator).To(Equal(expectedCreator)) +} + +func TestSignConfigUpdateEnvelope(t *testing.T) { + t.Parallel() + gt := NewGomegaWithT(t) + + // create signingIdentity + cert, privateKey := generateCACertAndPrivateKey(t, "org1.example.com") + signingIdentity := SigningIdentity{ + Certificate: cert, + PrivateKey: privateKey, + MSPID: "test-msp", + } + + // create detached config signature + configUpdate := &cb.ConfigUpdate{ + ChannelId: "testchannel", + } + configSignature, err := signingIdentity.SignConfigUpdate(configUpdate) + gt.Expect(err).NotTo(HaveOccurred()) + + // create signed config envelope + signedEnv, err := signingIdentity.SignConfigUpdateEnvelope(configUpdate, configSignature) + gt.Expect(err).NotTo(HaveOccurred()) + + payload := &cb.Payload{} + err = proto.Unmarshal(signedEnv.Payload, payload) + gt.Expect(err).NotTo(HaveOccurred()) + // check header channel ID equal + channelHeader := &cb.ChannelHeader{} + err = proto.Unmarshal(payload.GetHeader().GetChannelHeader(), channelHeader) + gt.Expect(err).NotTo(HaveOccurred()) + gt.Expect(channelHeader.ChannelId).To(Equal(configUpdate.ChannelId)) + // check config update envelope signatures are equal + configEnv := &cb.ConfigUpdateEnvelope{} + err = proto.Unmarshal(payload.Data, configEnv) + gt.Expect(err).NotTo(HaveOccurred()) + gt.Expect(len(configEnv.Signatures)).To(Equal(1)) + expectedSignatures := configEnv.Signatures[0] + gt.Expect(expectedSignatures.SignatureHeader).To(Equal(configSignature.SignatureHeader)) + gt.Expect(expectedSignatures.Signature).To(Equal(configSignature.Signature)) +} + +func TestSignConfigUpdateEnvelopeFailures(t *testing.T) { + t.Parallel() + gt := NewGomegaWithT(t) + + // create signingIdentity + cert, privateKey := generateCACertAndPrivateKey(t, "org1.example.com") + signingIdentity := SigningIdentity{ + Certificate: cert, + PrivateKey: privateKey, + MSPID: "test-msp", + } + + // create detached config signature + configUpdate := &cb.ConfigUpdate{ + ChannelId: "testchannel", + } + configSignature, err := signingIdentity.SignConfigUpdate(configUpdate) + + gt.Expect(err).NotTo(HaveOccurred()) + + tests := []struct { + spec string + configUpdate *cb.ConfigUpdate + signingIdentity SigningIdentity + configSignature []*cb.ConfigSignature + expectedErr string + }{ + { + spec: "when no signatures are provided", + configUpdate: nil, + signingIdentity: signingIdentity, + configSignature: []*cb.ConfigSignature{configSignature}, + expectedErr: "marshaling config update: proto: Marshal called with nil", + }, + } + + for _, tc := range tests { + tc := tc + t.Run(tc.spec, func(t *testing.T) { + t.Parallel() + gt := NewGomegaWithT(t) + + // create signed config envelope + signedEnv, err := tc.signingIdentity.SignConfigUpdateEnvelope(tc.configUpdate, tc.configSignature...) + gt.Expect(err).To(MatchError(tc.expectedErr)) + gt.Expect(signedEnv).To(BeNil()) + }) + } +} + func TestToLowS(t *testing.T) { t.Parallel()