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  }