github.com/leonlxy/hyperledger@v1.0.0-alpha.0.20170427033203-34922035d248/orderer/multichain/systemchain_test.go (about) 1 /* 2 Copyright IBM Corp. 2016 All Rights Reserved. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package multichain 18 19 import ( 20 "fmt" 21 "testing" 22 23 "github.com/hyperledger/fabric/common/config" 24 "github.com/hyperledger/fabric/common/configtx" 25 configtxapi "github.com/hyperledger/fabric/common/configtx/api" 26 mockconfig "github.com/hyperledger/fabric/common/mocks/config" 27 mockconfigtx "github.com/hyperledger/fabric/common/mocks/configtx" 28 "github.com/hyperledger/fabric/orderer/common/filter" 29 cb "github.com/hyperledger/fabric/protos/common" 30 "github.com/hyperledger/fabric/protos/utils" 31 32 "github.com/stretchr/testify/assert" 33 ) 34 35 type mockSupport struct { 36 msc *mockconfig.Orderer 37 } 38 39 func newMockSupport() *mockSupport { 40 return &mockSupport{ 41 msc: &mockconfig.Orderer{}, 42 } 43 } 44 45 func (ms *mockSupport) SharedConfig() config.Orderer { 46 return ms.msc 47 } 48 49 type mockChainCreator struct { 50 ms *mockSupport 51 newChains []*cb.Envelope 52 NewChannelConfigErr error 53 } 54 55 func newMockChainCreator() *mockChainCreator { 56 mcc := &mockChainCreator{ 57 ms: newMockSupport(), 58 } 59 return mcc 60 } 61 62 func (mcc *mockChainCreator) newChain(configTx *cb.Envelope) { 63 mcc.newChains = append(mcc.newChains, configTx) 64 } 65 66 func (mcc *mockChainCreator) channelsCount() int { 67 return len(mcc.newChains) 68 } 69 70 func (mcc *mockChainCreator) NewChannelConfig(envConfigUpdate *cb.Envelope) (configtxapi.Manager, error) { 71 if mcc.NewChannelConfigErr != nil { 72 return nil, mcc.NewChannelConfigErr 73 } 74 confUpdate := configtx.UnmarshalConfigUpdateOrPanic(configtx.UnmarshalConfigUpdateEnvelopeOrPanic(utils.UnmarshalPayloadOrPanic(envConfigUpdate.Payload).Data).ConfigUpdate) 75 return &mockconfigtx.Manager{ 76 ConfigEnvelopeVal: &cb.ConfigEnvelope{ 77 Config: &cb.Config{Sequence: 1, ChannelGroup: confUpdate.WriteSet}, 78 LastUpdate: envConfigUpdate, 79 }, 80 }, nil 81 } 82 83 func TestGoodProposal(t *testing.T) { 84 newChainID := "NewChainID" 85 86 mcc := newMockChainCreator() 87 88 configEnv, err := configtx.NewCompositeTemplate( 89 configtx.NewSimpleTemplate( 90 config.DefaultHashingAlgorithm(), 91 config.DefaultBlockDataHashingStructure(), 92 config.TemplateOrdererAddresses([]string{"foo"}), 93 ), 94 configtx.NewChainCreationTemplate("SampleConsortium", []string{}), 95 ).Envelope(newChainID) 96 if err != nil { 97 t.Fatalf("Error constructing configtx") 98 } 99 ingressTx := makeConfigTxFromConfigUpdateEnvelope(newChainID, configEnv) 100 wrapped := wrapConfigTx(ingressTx) 101 102 sysFilter := newSystemChainFilter(mcc.ms, mcc) 103 action, committer := sysFilter.Apply(wrapped) 104 105 assert.EqualValues(t, action, filter.Accept, "Did not accept valid transaction") 106 assert.True(t, committer.Isolated(), "Channel creation belong in its own block") 107 108 committer.Commit() 109 assert.Len(t, mcc.newChains, 1, "Proposal should only have created 1 new chain") 110 111 assert.Equal(t, ingressTx, mcc.newChains[0], "New chain should have been created with ingressTx") 112 } 113 114 func TestProposalRejectedByConfig(t *testing.T) { 115 newChainID := "NewChainID" 116 117 mcc := newMockChainCreator() 118 mcc.NewChannelConfigErr = fmt.Errorf("Error creating channel") 119 120 configEnv, err := configtx.NewCompositeTemplate( 121 configtx.NewSimpleTemplate( 122 config.DefaultHashingAlgorithm(), 123 config.DefaultBlockDataHashingStructure(), 124 config.TemplateOrdererAddresses([]string{"foo"}), 125 ), 126 configtx.NewChainCreationTemplate("SampleConsortium", []string{}), 127 ).Envelope(newChainID) 128 if err != nil { 129 t.Fatalf("Error constructing configtx") 130 } 131 ingressTx := makeConfigTxFromConfigUpdateEnvelope(newChainID, configEnv) 132 wrapped := wrapConfigTx(ingressTx) 133 134 sysFilter := newSystemChainFilter(mcc.ms, mcc) 135 action, _ := sysFilter.Apply(wrapped) 136 137 assert.EqualValues(t, action, filter.Reject, "Did not accept valid transaction") 138 assert.Len(t, mcc.newChains, 0, "Proposal should not have created a new chain") 139 } 140 141 func TestNumChainsExceeded(t *testing.T) { 142 newChainID := "NewChainID" 143 144 mcc := newMockChainCreator() 145 mcc.ms.msc.MaxChannelsCountVal = 1 146 mcc.newChains = make([]*cb.Envelope, 2) 147 148 configEnv, err := configtx.NewCompositeTemplate( 149 configtx.NewSimpleTemplate( 150 config.DefaultHashingAlgorithm(), 151 config.DefaultBlockDataHashingStructure(), 152 config.TemplateOrdererAddresses([]string{"foo"}), 153 ), 154 configtx.NewChainCreationTemplate("SampleConsortium", []string{}), 155 ).Envelope(newChainID) 156 if err != nil { 157 t.Fatalf("Error constructing configtx") 158 } 159 ingressTx := makeConfigTxFromConfigUpdateEnvelope(newChainID, configEnv) 160 wrapped := wrapConfigTx(ingressTx) 161 162 sysFilter := newSystemChainFilter(mcc.ms, mcc) 163 action, _ := sysFilter.Apply(wrapped) 164 165 assert.EqualValues(t, filter.Reject, action, "Transaction had created too many channels") 166 }