func TestGoodProposal(t *testing.T) { newChainID := "NewChainID" mcc := newMockChainCreator() mcc.ms.msc.chainCreators = []string{provisional.AcceptAllPolicyKey} mcc.ms.mpm.mp = &mockPolicy{} chainCreateTx := &cb.ConfigurationItem{ Header: &cb.ChainHeader{ ChainID: newChainID, Type: int32(cb.HeaderType_CONFIGURATION_ITEM), }, Key: utils.CreationPolicyKey, Type: cb.ConfigurationItem_Orderer, Value: utils.MarshalOrPanic(&ab.CreationPolicy{ Policy: provisional.AcceptAllPolicyKey, Digest: coreutil.ComputeCryptoHash([]byte{}), }), } ingressTx := makeConfigTxWithItems(newChainID, chainCreateTx) status := mcc.sysChain.proposeChain(ingressTx) if status != cb.Status_SUCCESS { t.Fatalf("Should have successfully proposed chain") } expected := 1 if len(mcc.ms.queue) != expected { t.Fatalf("Expected %d creation txs in the chain, but found %d", expected, len(mcc.ms.queue)) } wrapped := mcc.ms.queue[0] payload := utils.UnmarshalPayloadOrPanic(wrapped.Payload) if payload.Header.ChainHeader.Type != int32(cb.HeaderType_ORDERER_TRANSACTION) { t.Fatalf("Wrapped transaction should be of type ORDERER_TRANSACTION") } envelope := utils.UnmarshalEnvelopeOrPanic(payload.Data) if !reflect.DeepEqual(envelope, ingressTx) { t.Fatalf("Received different configtx than ingressed into the system") } sysFilter := newSystemChainFilter(mcc) action, committer := sysFilter.Apply(wrapped) if action != filter.Accept { t.Fatalf("Should have accepted the transaction, as it was already validated") } if !committer.Isolated() { t.Fatalf("Chain creation transactions should be isolated on commit") } committer.Commit() if len(mcc.newChains) != 1 { t.Fatalf("Proposal should only have created 1 new chain") } if !reflect.DeepEqual(mcc.newChains[0], ingressTx) { t.Fatalf("New chain should have been created with ingressTx") } }
// This test brings up the entire system, with the mock consenter, including the broadcasters etc. and creates a new chain func TestNewChain(t *testing.T) { conf := config.Load() lf, rl := ramledger.New(10, genesisBlock) consenters := make(map[string]Consenter) consenters[conf.General.OrdererType] = &mockConsenter{} manager := NewManagerImpl(lf, consenters) oldGenesisTx := utils.ExtractEnvelopeOrPanic(genesisBlock, 0) oldGenesisTxPayload := utils.ExtractPayloadOrPanic(oldGenesisTx) oldConfigEnv := utils.UnmarshalConfigurationEnvelopeOrPanic(oldGenesisTxPayload.Data) newChainID := "TestNewChain" newChainMessage := utils.ChainCreationConfigurationTransaction(provisional.AcceptAllPolicyKey, newChainID, oldConfigEnv) status := manager.ProposeChain(newChainMessage) if status != cb.Status_SUCCESS { t.Fatalf("Error submitting chain creation request") } it, _ := rl.Iterator(ab.SeekInfo_SPECIFIED, 1) select { case <-it.ReadyChan(): block, status := it.Next() if status != cb.Status_SUCCESS { t.Fatalf("Could not retrieve block") } if len(block.Data.Data) != 1 { t.Fatalf("Should have had only one message in the orderer transaction block") } genesisConfigTx := utils.UnmarshalEnvelopeOrPanic(utils.UnmarshalPayloadOrPanic(utils.ExtractEnvelopeOrPanic(block, 0).Payload).Data) if !reflect.DeepEqual(genesisConfigTx, newChainMessage) { t.Errorf("Orderer config block contains wrong transaction, expected %v got %v", genesisConfigTx, newChainMessage) } case <-time.After(time.Second): t.Fatalf("Block 1 not produced after timeout in system chain") } chainSupport, ok := manager.GetChain(newChainID) if !ok { t.Fatalf("Should have gotten new chain which was created") } messages := make([]*cb.Envelope, conf.General.BatchSize) for i := 0; i < int(conf.General.BatchSize); i++ { messages[i] = makeNormalTx(newChainID, i) } for _, message := range messages { chainSupport.Enqueue(message) } it, _ = chainSupport.Reader().Iterator(ab.SeekInfo_SPECIFIED, 0) select { case <-it.ReadyChan(): block, status := it.Next() if status != cb.Status_SUCCESS { t.Fatalf("Could not retrieve new chain genesis block") } if len(block.Data.Data) != 1 { t.Fatalf("Should have had only one message in the new genesis block") } genesisConfigTx := utils.ExtractEnvelopeOrPanic(block, 0) if !reflect.DeepEqual(genesisConfigTx, newChainMessage) { t.Errorf("Genesis block contains wrong transaction, expected %v got %v", genesisConfigTx, newChainMessage) } case <-time.After(time.Second): t.Fatalf("Block 1 not produced after timeout in system chain") } select { case <-it.ReadyChan(): block, status := it.Next() if status != cb.Status_SUCCESS { t.Fatalf("Could not retrieve block on new chain") } for i := 0; i < int(conf.General.BatchSize); i++ { if !reflect.DeepEqual(utils.ExtractEnvelopeOrPanic(block, i), messages[i]) { t.Errorf("Block contents wrong at index %d in new chain", i) } } case <-time.After(time.Second): t.Fatalf("Block 1 not produced after timeout on new chain") } }