diff --git a/test/integration/base_test_setup.go b/test/integration/base_test_setup.go index f9ba52dd52..d5898ab2e0 100644 --- a/test/integration/base_test_setup.go +++ b/test/integration/base_test_setup.go @@ -22,9 +22,11 @@ package integration import ( "encoding/pem" "fmt" + "math/rand" "os" "path" "testing" + "time" "github.com/hyperledger/fabric-sdk-go/config" fabricCAClient "github.com/hyperledger/fabric-sdk-go/fabric-ca-client" @@ -37,20 +39,34 @@ import ( pb "github.com/hyperledger/fabric/protos/peer" ) +var chainCodeID = "" +var chainID = "mychannel" +var chainCodePath = "github.com/example_cc" +var chainCodeVersion = "v0" +var goPath string + // BaseTestSetup is an interface used by the integration tests // it performs setup activities like user enrollment, chain creation, // crypto suite selection, and event hub initialization type BaseTestSetup interface { - GetChains(t *testing.T) (*fabricClient.Chain, *fabricClient.Chain) - GetEventHub(t *testing.T, interestedEvents []*pb.Interest) *events.EventHub + GetChain() (fabricClient.Chain, error) + GetEventHub(interestedEvents []*pb.Interest) (events.EventHub, error) + InstallCC(chain fabricClient.Chain, chainCodeID string, chainCodePath string, chainCodeVersion string, chaincodePackage []byte, targets []fabricClient.Peer) error + InstantiateCC(chain fabricClient.Chain, eventHub events.EventHub) error + GetQueryValue(t *testing.T, chain fabricClient.Chain) (string, error) + Invoke(chain fabricClient.Chain, eventHub events.EventHub) (string, error) + InitConfig() + ChangeGOPATHToDeploy() + ResetGOPATH() + GenerateRandomCCID() } // BaseSetupImpl implementation of BaseTestSetup type BaseSetupImpl struct { } -// GetChains initializes and returns a query chain and invoke chain -func (setup *BaseSetupImpl) GetChains(t *testing.T) (fabricClient.Chain, fabricClient.Chain, fabricClient.Chain) { +// GetChain initializes and returns a chain +func (setup *BaseSetupImpl) GetChain() (fabricClient.Chain, error) { client := fabricClient.NewClient() err := bccspFactory.InitFactories(&bccspFactory.FactoryOpts{ @@ -65,95 +81,71 @@ func (setup *BaseSetupImpl) GetChains(t *testing.T) (fabricClient.Chain, fabricC }, }) if err != nil { - t.Fatalf("Failed getting ephemeral software-based BCCSP [%s]", err) + return nil, fmt.Errorf("Failed getting ephemeral software-based BCCSP [%s]", err) } cryptoSuite := bccspFactory.GetDefault() client.SetCryptoSuite(cryptoSuite) stateStore, err := kvs.CreateNewFileKeyValueStore("/tmp/enroll_user") if err != nil { - t.Fatalf("CreateNewFileKeyValueStore return error[%s]", err) + return nil, fmt.Errorf("CreateNewFileKeyValueStore return error[%s]", err) } client.SetStateStore(stateStore) user, err := client.GetUserContext("admin") if err != nil { - t.Fatalf("client.GetUserContext return error: %v", err) + return nil, fmt.Errorf("client.GetUserContext return error: %v", err) } if user == nil { fabricCAClient, err1 := fabricCAClient.NewFabricCAClient() if err1 != nil { - t.Fatalf("NewFabricCAClient return error: %v", err) + return nil, fmt.Errorf("NewFabricCAClient return error: %v", err) } key, cert, err1 := fabricCAClient.Enroll("admin", "adminpw") keyPem, _ := pem.Decode(key) if err1 != nil { - t.Fatalf("Enroll return error: %v", err1) + return nil, fmt.Errorf("Enroll return error: %v", err1) } user := fabricClient.NewUser("admin") k, err1 := client.GetCryptoSuite().KeyImport(keyPem.Bytes, &bccsp.ECDSAPrivateKeyImportOpts{Temporary: false}) if err1 != nil { - t.Fatalf("KeyImport return error: %v", err) + return nil, fmt.Errorf("KeyImport return error: %v", err) } user.SetPrivateKey(k) user.SetEnrollmentCertificate(cert) err = client.SetUserContext(user, false) if err != nil { - t.Fatalf("client.SetUserContext return error: %v", err) + return nil, fmt.Errorf("client.SetUserContext return error: %v", err) } } - querychain, err := client.NewChain("mychannel") - if err != nil { - t.Fatalf("NewChain return error: %v", err) - } - - invokechain, err := client.NewChain("invokechain") + chain, err := client.NewChain(chainID) if err != nil { - t.Fatalf("NewChain return error: %v", err) + return nil, fmt.Errorf("NewChain return error: %v", err) } orderer, err := fabricClient.CreateNewOrderer(fmt.Sprintf("%s:%s", config.GetOrdererHost(), config.GetOrdererPort()), config.GetOrdererTLSCertificate(), config.GetOrdererTLSServerHostOverride()) if err != nil { - t.Fatalf("CreateNewOrderer return error: %v", err) + return nil, fmt.Errorf("CreateNewOrderer return error: %v", err) } - invokechain.AddOrderer(orderer) + chain.AddOrderer(orderer) for _, p := range config.GetPeersConfig() { endorser, err := fabricClient.CreateNewPeer(fmt.Sprintf("%s:%s", p.Host, p.Port), p.TLSCertificate, p.TLSServerHostOverride) if err != nil { - t.Fatalf("CreateNewPeer return error: %v", err) + return nil, fmt.Errorf("CreateNewPeer return error: %v", err) } - querychain.AddPeer(endorser) - invokechain.AddPeer(endorser) - break - } - - deploychain, err := client.NewChain("deploychain") - if err != nil { - t.Fatalf("NewChain return error: %v", err) - } - orderer, err = fabricClient.CreateNewOrderer(fmt.Sprintf("%s:%s", config.GetOrdererHost(), config.GetOrdererPort()), - config.GetOrdererTLSCertificate(), config.GetOrdererTLSServerHostOverride()) - if err != nil { - t.Fatalf("CreateNewOrderer return error: %v", err) - } - deploychain.AddOrderer(orderer) - - for _, p := range config.GetPeersConfig() { - endorser, err := fabricClient.CreateNewPeer(fmt.Sprintf("%s:%s", p.Host, p.Port), p.TLSCertificate, p.TLSServerHostOverride) - if err != nil { - t.Fatalf("CreateNewPeer return error: %v", err) + chain.AddPeer(endorser) + if p.Port == "7051" { + chain.SetPrimaryPeer(endorser) } - deploychain.AddPeer(endorser) } - return querychain, invokechain, deploychain + return chain, nil } // GetEventHub initilizes the event hub -func (setup *BaseSetupImpl) GetEventHub(t *testing.T, - interestedEvents []*pb.Interest) events.EventHub { +func (setup *BaseSetupImpl) GetEventHub(interestedEvents []*pb.Interest) (events.EventHub, error) { eventHub := events.NewEventHub() foundEventHub := false for _, p := range config.GetPeersConfig() { @@ -165,7 +157,7 @@ func (setup *BaseSetupImpl) GetEventHub(t *testing.T, } if !foundEventHub { - t.Fatalf("No EventHub configuration found") + return nil, fmt.Errorf("No EventHub configuration found") } // TODO: this is coming back in some other form @@ -173,14 +165,189 @@ func (setup *BaseSetupImpl) GetEventHub(t *testing.T, eventHub.SetInterestedEvents(interestedEvents) }*/ if err := eventHub.Connect(); err != nil { - t.Fatalf("Failed eventHub.Connect() [%s]", err) + return nil, fmt.Errorf("Failed eventHub.Connect() [%s]", err) + } + + return eventHub, nil +} + +func (setup *BaseSetupImpl) InstallCC(chain fabricClient.Chain, chainCodeID string, chainCodePath string, chainCodeVersion string, chaincodePackage []byte, targets []fabricClient.Peer) error { + setup.ChangeGOPATHToDeploy() + transactionProposalResponse, _, err := chain.SendInstallProposal(chainCodeID, chainCodePath, chainCodeVersion, chaincodePackage, targets) + if err != nil { + return fmt.Errorf("SendInstallProposal return error: %v", err) + } + setup.ResetGOPATH() + + for _, v := range transactionProposalResponse { + if v.Err != nil { + return fmt.Errorf("SendInstallProposal Endorser %s return error: %v", v.Endorser, v.Err) + } + fmt.Printf("SendInstallProposal Endorser '%s' return ProposalResponse status:%v\n", v.Endorser, v.Status) + } + + return nil + +} + +func (setup *BaseSetupImpl) InstantiateCC(chain fabricClient.Chain, eventHub events.EventHub) error { + + var args []string + args = append(args, "init") + args = append(args, "a") + args = append(args, "100") + args = append(args, "b") + args = append(args, "200") + + transactionProposalResponse, txID, err := chain.SendInstantiateProposal(chainCodeID, chainID, args, chainCodePath, chainCodeVersion, nil) + if err != nil { + return fmt.Errorf("SendInstantiateProposal return error: %v", err) + } + + for _, v := range transactionProposalResponse { + if v.Err != nil { + return fmt.Errorf("SendInstantiateProposal Endorser %s return error: %v", v.Endorser, v.Err) + } + fmt.Printf("SendInstantiateProposal Endorser '%s' return ProposalResponse status:%v\n", v.Endorser, v.Status) + } + + tx, err := chain.CreateTransaction(transactionProposalResponse) + if err != nil { + return fmt.Errorf("CreateTransaction return error: %v", err) + + } + transactionResponse, err := chain.SendTransaction(tx) + if err != nil { + return fmt.Errorf("SendTransaction return error: %v", err) + + } + for _, v := range transactionResponse { + if v.Err != nil { + return fmt.Errorf("Orderer %s return error: %v", v.Orderer, v.Err) + } + } + done := make(chan bool) + fail := make(chan error) + + eventHub.RegisterTxEvent(txID, func(txId string, err error) { + if err != nil { + fail <- err + } else { + fmt.Printf("instantiateCC receive success event for txid(%s)\n", txId) + done <- true + } + + }) + + select { + case <-done: + case <-fail: + return fmt.Errorf("instantiateCC Error received from eventhub for txid(%s) error(%v)", txID, fail) + case <-time.After(time.Second * 30): + return fmt.Errorf("instantiateCC Didn't receive block event for txid(%s)", txID) } + return nil - return eventHub } -// SetupChaincodeDeploy set up environment -func (setup *BaseSetupImpl) SetupChaincodeDeploy() { +func (setup *BaseSetupImpl) GetQueryValue(t *testing.T, chain fabricClient.Chain) (string, error) { + + var args []string + args = append(args, "invoke") + args = append(args, "query") + args = append(args, "b") + + signedProposal, err := chain.CreateTransactionProposal(chainCodeID, chainID, args, true, nil) + if err != nil { + return "", fmt.Errorf("SendTransactionProposal return error: %v", err) + } + transactionProposalResponses, err := chain.SendTransactionProposal(signedProposal, 0, []fabricClient.Peer{chain.GetPrimaryPeer()}) + if err != nil { + return "", fmt.Errorf("SendTransactionProposal return error: %v", err) + } + + for _, v := range transactionProposalResponses { + if v.Err != nil { + return "", fmt.Errorf("query Endorser %s return error: %v", v.Endorser, v.Err) + } + return string(v.GetResponsePayload()), nil + } + return "", nil +} + +func (setup *BaseSetupImpl) Invoke(chain fabricClient.Chain, eventHub events.EventHub) (string, error) { + + var args []string + args = append(args, "invoke") + args = append(args, "move") + args = append(args, "a") + args = append(args, "b") + args = append(args, "1") + + signedProposal, err := chain.CreateTransactionProposal(chainCodeID, chainID, args, true, nil) + if err != nil { + return "", fmt.Errorf("SendTransactionProposal return error: %v", err) + } + transactionProposalResponse, err := chain.SendTransactionProposal(signedProposal, 0, []fabricClient.Peer{chain.GetPrimaryPeer()}) + if err != nil { + return "", fmt.Errorf("SendTransactionProposal return error: %v", err) + } + + for _, v := range transactionProposalResponse { + if v.Err != nil { + return "", fmt.Errorf("invoke Endorser %s return error: %v", v.Endorser, v.Err) + } + fmt.Printf("invoke Endorser '%s' return ProposalResponse status:%v\n", v.Endorser, v.Status) + } + + tx, err := chain.CreateTransaction(transactionProposalResponse) + if err != nil { + return "", fmt.Errorf("CreateTransaction return error: %v", err) + + } + transactionResponse, err := chain.SendTransaction(tx) + if err != nil { + return "", fmt.Errorf("SendTransaction return error: %v", err) + + } + for _, v := range transactionResponse { + if v.Err != nil { + return "", fmt.Errorf("Orderer %s return error: %v", v.Orderer, v.Err) + } + } + done := make(chan bool) + fail := make(chan error) + eventHub.RegisterTxEvent(signedProposal.TransactionID, func(txId string, err error) { + if err != nil { + fail <- err + } else { + fmt.Printf("invoke receive success event for txid(%s)\n", txId) + done <- true + } + }) + + select { + case <-done: + case <-fail: + return "", fmt.Errorf("invoke Error received from eventhub for txid(%s) error(%v)", signedProposal.TransactionID, fail) + case <-time.After(time.Second * 30): + return "", fmt.Errorf("invoke Didn't receive block event for txid(%s)", signedProposal.TransactionID) + } + return signedProposal.TransactionID, nil + +} + +func randomString(strlen int) string { + const chars = "abcdefghijklmnopqrstuvwxyz0123456789" + result := make([]byte, strlen) + for i := 0; i < strlen; i++ { + result[i] = chars[rand.Intn(len(chars))] + } + return string(result) +} + +func (setup *BaseSetupImpl) ChangeGOPATHToDeploy() { + goPath = os.Getenv("GOPATH") pwd, err := os.Getwd() if err != nil { fmt.Println(err) @@ -188,3 +355,20 @@ func (setup *BaseSetupImpl) SetupChaincodeDeploy() { } os.Setenv("GOPATH", path.Join(pwd, "../fixtures")) } + +func (setup *BaseSetupImpl) ResetGOPATH() { + os.Setenv("GOPATH", goPath) +} + +func (setup *BaseSetupImpl) InitConfig() { + err := config.InitConfig("../fixtures/config/config_test.yaml") + if err != nil { + fmt.Println(err.Error()) + } + setup.GenerateRandomCCID() +} + +func (setup *BaseSetupImpl) GenerateRandomCCID() { + rand.Seed(time.Now().UnixNano()) + chainCodeID = randomString(10) +} diff --git a/test/integration/chain_queries_test.go b/test/integration/chain_queries_test.go index a85678d647..2d252fa559 100644 --- a/test/integration/chain_queries_test.go +++ b/test/integration/chain_queries_test.go @@ -26,39 +26,44 @@ import ( func TestChainQueries(t *testing.T) { - InitConfigForEndToEnd() testSetup := BaseSetupImpl{} + testSetup.InitConfig() - eventHub := testSetup.GetEventHub(t, nil) - queryChain, invokeChain, deployChain := testSetup.GetChains(t) - testSetup.SetupChaincodeDeploy() - err := installCC(deployChain) + eventHub, err := testSetup.GetEventHub(nil) + if err != nil { + t.Fatalf("GetEventHub return error: %v", err) + } + chain, err := testSetup.GetChain() + if err != nil { + t.Fatalf("GetChain return error: %v", err) + } + err = testSetup.InstallCC(chain, chainCodeID, chainCodePath, chainCodeVersion, nil, nil) if err != nil { t.Fatalf("installCC return error: %v", err) } - err = instantiateCC(deployChain, eventHub) + err = testSetup.InstantiateCC(chain, eventHub) if err != nil { t.Fatalf("instantiateCC return error: %v", err) } // Test Query Info - retrieve values before transaction - bciBeforeTx, err := queryChain.QueryInfo() + bciBeforeTx, err := chain.QueryInfo() if err != nil { t.Fatalf("QueryInfo return error: %v", err) } // Start transaction that will change block state - value, err := getQueryValue(t, queryChain) + value, err := testSetup.GetQueryValue(t, chain) if err != nil { t.Fatalf("getQueryValue return error: %v", err) } - txID, err := invoke(t, invokeChain, eventHub) + txID, err := testSetup.Invoke(chain, eventHub) if err != nil { t.Fatalf("invoke return error: %v", err) } - valueAfterInvoke, err := getQueryValue(t, queryChain) + valueAfterInvoke, err := testSetup.GetQueryValue(t, chain) if err != nil { t.Fatalf("getQueryValue return error: %v", err) } @@ -74,7 +79,7 @@ func TestChainQueries(t *testing.T) { // End transaction that changed block state // Test Query Info - retrieve values after transaction - bciAfterTx, err := queryChain.QueryInfo() + bciAfterTx, err := chain.QueryInfo() if err != nil { t.Fatalf("QueryInfo return error: %v", err) } @@ -85,7 +90,7 @@ func TestChainQueries(t *testing.T) { } // Test Query Transaction -- verify that transaction has been processed - processedTransaction, err := queryChain.QueryTransaction(txID) + processedTransaction, err := chain.QueryTransaction(txID) if err != nil { t.Fatalf("QueryTransaction return error: %v", err) } @@ -95,13 +100,13 @@ func TestChainQueries(t *testing.T) { } // Test Query Transaction -- Retrieve non existing transaction - processedTransaction, err = queryChain.QueryTransaction("123ABC") + processedTransaction, err = chain.QueryTransaction("123ABC") if err == nil { t.Fatalf("QueryTransaction non-existing didn't return an error") } // Test Query Block by Hash - retrieve current block by hash - block, err := queryChain.QueryBlockByHash(bciAfterTx.CurrentBlockHash) + block, err := chain.QueryBlockByHash(bciAfterTx.CurrentBlockHash) if err != nil { t.Fatalf("QueryBlockByHash return error: %v", err) } @@ -111,13 +116,13 @@ func TestChainQueries(t *testing.T) { } // Test Query Block by Hash - retrieve block by non-existent hash - block, err = queryChain.QueryBlockByHash([]byte("non-existent")) + block, err = chain.QueryBlockByHash([]byte("non-existent")) if err == nil { t.Fatalf("QueryBlockByHash non-existent didn't return an error") } // Test Query Block - retrieve block by number - block, err = queryChain.QueryBlock(1) + block, err = chain.QueryBlock(1) if err != nil { t.Fatalf("QueryBlock return error: %v", err) } @@ -127,7 +132,7 @@ func TestChainQueries(t *testing.T) { } // Test Query Block - retrieve block by non-existent number - block, err = queryChain.QueryBlock(2147483647) + block, err = chain.QueryBlock(2147483647) if err == nil { t.Fatalf("QueryBlock return error: %v", err) } diff --git a/test/integration/end_to_end_test.go b/test/integration/end_to_end_test.go index 0cd5769759..75db021ea4 100644 --- a/test/integration/end_to_end_test.go +++ b/test/integration/end_to_end_test.go @@ -21,50 +21,44 @@ package integration import ( "fmt" - "math/rand" "strconv" "testing" - "time" - - fabric_client "github.com/hyperledger/fabric-sdk-go/fabric-client" - events "github.com/hyperledger/fabric-sdk-go/fabric-client/events" - - config "github.com/hyperledger/fabric-sdk-go/config" ) -var chainCodeID = "" -var chainID = "mychannel" -var chainCodePath = "github.com/example_cc" -var chainCodeVersion = "v0" - func TestChainCodeInvoke(t *testing.T) { - InitConfigForEndToEnd() testSetup := BaseSetupImpl{} - eventHub := testSetup.GetEventHub(t, nil) - queryChain, invokeChain, deployChain := testSetup.GetChains(t) - testSetup.SetupChaincodeDeploy() - err := installCC(deployChain) + testSetup.InitConfig() + + eventHub, err := testSetup.GetEventHub(nil) + if err != nil { + t.Fatalf("GetEventHub return error: %v", err) + } + chain, err := testSetup.GetChain() + if err != nil { + t.Fatalf("GetChain return error: %v", err) + } + err = testSetup.InstallCC(chain, chainCodeID, chainCodePath, chainCodeVersion, nil, nil) if err != nil { t.Fatalf("installCC return error: %v", err) } - err = instantiateCC(deployChain, eventHub) + err = testSetup.InstantiateCC(chain, eventHub) if err != nil { t.Fatalf("instantiateCC return error: %v", err) } // Get Query value before invoke - value, err := getQueryValue(t, queryChain) + value, err := testSetup.GetQueryValue(t, chain) if err != nil { t.Fatalf("getQueryValue return error: %v", err) } fmt.Printf("*** QueryValue before invoke %s\n", value) - _, err = invoke(t, invokeChain, eventHub) + _, err = testSetup.Invoke(chain, eventHub) if err != nil { t.Fatalf("invoke return error: %v", err) } - valueAfterInvoke, err := getQueryValue(t, queryChain) + valueAfterInvoke, err := testSetup.GetQueryValue(t, chain) if err != nil { t.Errorf("getQueryValue return error: %v", err) return @@ -80,189 +74,3 @@ func TestChainCodeInvoke(t *testing.T) { } } - -func getQueryValue(t *testing.T, chain fabric_client.Chain) (string, error) { - - var args []string - args = append(args, "invoke") - args = append(args, "query") - args = append(args, "b") - - signedProposal, err := chain.CreateTransactionProposal(chainCodeID, chainID, args, true, nil) - if err != nil { - return "", fmt.Errorf("SendTransactionProposal return error: %v", err) - } - transactionProposalResponses, err := chain.SendTransactionProposal(signedProposal, 0, nil) - if err != nil { - return "", fmt.Errorf("SendTransactionProposal return error: %v", err) - } - - for _, v := range transactionProposalResponses { - if v.Err != nil { - return "", fmt.Errorf("query Endorser %s return error: %v", v.Endorser, v.Err) - } - return string(v.GetResponsePayload()), nil - } - return "", nil -} - -func invoke(t *testing.T, chain fabric_client.Chain, eventHub events.EventHub) (string, error) { - - var args []string - args = append(args, "invoke") - args = append(args, "move") - args = append(args, "a") - args = append(args, "b") - args = append(args, "1") - - signedProposal, err := chain.CreateTransactionProposal(chainCodeID, chainID, args, true, nil) - if err != nil { - return "", fmt.Errorf("SendTransactionProposal return error: %v", err) - } - transactionProposalResponse, err := chain.SendTransactionProposal(signedProposal, 0, nil) - if err != nil { - return "", fmt.Errorf("SendTransactionProposal return error: %v", err) - } - - for _, v := range transactionProposalResponse { - if v.Err != nil { - return "", fmt.Errorf("invoke Endorser %s return error: %v", v.Endorser, v.Err) - } - fmt.Printf("invoke Endorser '%s' return ProposalResponse status:%v\n", v.Endorser, v.Status) - } - - tx, err := chain.CreateTransaction(transactionProposalResponse) - if err != nil { - return "", fmt.Errorf("CreateTransaction return error: %v", err) - - } - transactionResponse, err := chain.SendTransaction(tx) - if err != nil { - return "", fmt.Errorf("SendTransaction return error: %v", err) - - } - for _, v := range transactionResponse { - if v.Err != nil { - return "", fmt.Errorf("Orderer %s return error: %v", v.Orderer, v.Err) - } - } - done := make(chan bool) - fail := make(chan error) - eventHub.RegisterTxEvent(signedProposal.TransactionID, func(txId string, err error) { - if err != nil { - fail <- err - } else { - fmt.Printf("invoke receive success event for txid(%s)\n", txId) - done <- true - } - }) - - select { - case <-done: - case <-fail: - return "", fmt.Errorf("invoke Error received from eventhub for txid(%s) error(%v)", signedProposal.TransactionID, fail) - case <-time.After(time.Second * 30): - return "", fmt.Errorf("invoke Didn't receive block event for txid(%s)", signedProposal.TransactionID) - } - return signedProposal.TransactionID, nil - -} - -func installCC(chain fabric_client.Chain) error { - - transactionProposalResponse, _, err := chain.SendInstallProposal(chainCodeID, chainCodePath, chainCodeVersion, nil, nil) - if err != nil { - return fmt.Errorf("SendInstallProposal return error: %v", err) - } - - for _, v := range transactionProposalResponse { - if v.Err != nil { - return fmt.Errorf("SendInstallProposal Endorser %s return error: %v", v.Endorser, v.Err) - } - fmt.Printf("SendInstallProposal Endorser '%s' return ProposalResponse status:%v\n", v.Endorser, v.Status) - } - - return nil - -} - -func instantiateCC(chain fabric_client.Chain, eventHub events.EventHub) error { - - var args []string - args = append(args, "init") - args = append(args, "a") - args = append(args, "100") - args = append(args, "b") - args = append(args, "200") - - transactionProposalResponse, txID, err := chain.SendInstantiateProposal(chainCodeID, chainID, args, chainCodePath, chainCodeVersion, nil) - if err != nil { - return fmt.Errorf("SendInstantiateProposal return error: %v", err) - } - - for _, v := range transactionProposalResponse { - if v.Err != nil { - return fmt.Errorf("SendInstantiateProposal Endorser %s return error: %v", v.Endorser, v.Err) - } - fmt.Printf("SendInstantiateProposal Endorser '%s' return ProposalResponse status:%v\n", v.Endorser, v.Status) - } - - tx, err := chain.CreateTransaction(transactionProposalResponse) - if err != nil { - return fmt.Errorf("CreateTransaction return error: %v", err) - - } - transactionResponse, err := chain.SendTransaction(tx) - if err != nil { - return fmt.Errorf("SendTransaction return error: %v", err) - - } - for _, v := range transactionResponse { - if v.Err != nil { - return fmt.Errorf("Orderer %s return error: %v", v.Orderer, v.Err) - } - } - done := make(chan bool) - fail := make(chan error) - - eventHub.RegisterTxEvent(txID, func(txId string, err error) { - if err != nil { - fail <- err - } else { - fmt.Printf("instantiateCC receive success event for txid(%s)\n", txId) - done <- true - } - - }) - - select { - case <-done: - case <-fail: - return fmt.Errorf("instantiateCC Error received from eventhub for txid(%s) error(%v)", txID, fail) - case <-time.After(time.Second * 30): - return fmt.Errorf("instantiateCC Didn't receive block event for txid(%s)", txID) - } - return nil - -} - -func InitConfigForEndToEnd() { - err := config.InitConfig("../fixtures/config/config_test.yaml") - if err != nil { - fmt.Println(err.Error()) - } -} - -func randomString(strlen int) string { - const chars = "abcdefghijklmnopqrstuvwxyz0123456789" - result := make([]byte, strlen) - for i := 0; i < strlen; i++ { - result[i] = chars[rand.Intn(len(chars))] - } - return string(result) -} - -func init() { - rand.Seed(time.Now().UnixNano()) - chainCodeID = randomString(10) -} diff --git a/test/integration/fabric_ca_test.go b/test/integration/fabric_ca_test.go index 68843094c0..8831b0e68d 100644 --- a/test/integration/fabric_ca_test.go +++ b/test/integration/fabric_ca_test.go @@ -29,19 +29,21 @@ import ( "time" config "github.com/hyperledger/fabric-sdk-go/config" - fabric_client "github.com/hyperledger/fabric-sdk-go/fabric-client" + fabricClient "github.com/hyperledger/fabric-sdk-go/fabric-client" kvs "github.com/hyperledger/fabric-sdk-go/fabric-client/keyvaluestore" "github.com/hyperledger/fabric/bccsp" bccspFactory "github.com/hyperledger/fabric/bccsp/factory" - fabric_ca_client "github.com/hyperledger/fabric-sdk-go/fabric-ca-client" + fabricCAClient "github.com/hyperledger/fabric-sdk-go/fabric-ca-client" ) // This test loads/enrols an admin user // Using the admin, it registers, enrols, and revokes a test user func TestRegisterEnrollRevoke(t *testing.T) { - InitConfigForFabricCA() - client := fabric_client.NewClient() + testSetup := BaseSetupImpl{} + + testSetup.InitConfig() + client := fabricClient.NewClient() err := bccspFactory.InitFactories(&bccspFactory.FactoryOpts{ ProviderName: "SW", @@ -67,7 +69,7 @@ func TestRegisterEnrollRevoke(t *testing.T) { } client.SetStateStore(stateStore) - fabricCAClient, err := fabric_ca_client.NewFabricCAClient() + caClient, err := fabricCAClient.NewFabricCAClient() if err != nil { t.Fatalf("NewFabricCAClient return error: %v", err) } @@ -79,7 +81,7 @@ func TestRegisterEnrollRevoke(t *testing.T) { t.Fatalf("client.GetUserContext return error: %v", err) } if adminUser == nil { - key, cert, err := fabricCAClient.Enroll("admin", "adminpw") + key, cert, err := caClient.Enroll("admin", "adminpw") if err != nil { t.Fatalf("Enroll return error: %v", err) } @@ -107,7 +109,7 @@ func TestRegisterEnrollRevoke(t *testing.T) { if err != nil { t.Fatalf("pem Decode return error: %v", err) } - adminUser = fabric_client.NewUser("admin") + adminUser = fabricClient.NewUser("admin") k, err := client.GetCryptoSuite().KeyImport(keyPem.Bytes, &bccsp.ECDSAPrivateKeyImportOpts{Temporary: false}) if err != nil { t.Fatalf("KeyImport return error: %v", err) @@ -129,31 +131,27 @@ func TestRegisterEnrollRevoke(t *testing.T) { // Register a random user userName := createRandomName() - registerRequest := fabric_ca_client.RegistrationRequest{Name: userName, Type: "user", Affiliation: "org1.department1"} - enrolmentSecret, err := fabricCAClient.Register(adminUser, ®isterRequest) + registerRequest := fabricCAClient.RegistrationRequest{Name: userName, Type: "user", Affiliation: "org1.department1"} + enrolmentSecret, err := caClient.Register(adminUser, ®isterRequest) if err != nil { t.Fatalf("Error from Register: %s", err) } fmt.Printf("Registered User: %s, Secret: %s\n", userName, enrolmentSecret) // Enrol the previously registered user - _, _, err = fabricCAClient.Enroll(userName, enrolmentSecret) + _, _, err = caClient.Enroll(userName, enrolmentSecret) if err != nil { t.Fatalf("Error enroling user: %s", err.Error()) } - revokeRequest := fabric_ca_client.RevocationRequest{Name: userName} - err = fabricCAClient.Revoke(adminUser, &revokeRequest) + revokeRequest := fabricCAClient.RevocationRequest{Name: userName} + err = caClient.Revoke(adminUser, &revokeRequest) if err != nil { t.Fatalf("Error from Revoke: %s", err) } } -func InitConfigForFabricCA() { - config.InitConfig("../fixtures/config/config_test.yaml") -} - func createRandomName() string { rand.Seed(time.Now().UnixNano()) return "user" + strconv.Itoa(rand.Intn(5000)) diff --git a/test/integration/install_chaincode_test.go b/test/integration/install_chaincode_test.go new file mode 100644 index 0000000000..c059ea545f --- /dev/null +++ b/test/integration/install_chaincode_test.go @@ -0,0 +1,101 @@ +/* +Copyright SecureKey Technologies Inc. All Rights Reserved. + + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + + http://www.apache.org/licenses/LICENSE-2.0 + + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package integration + +import ( + "fmt" + "math/rand" + "os" + "strconv" + "strings" + "testing" + "time" + + fabricClient "github.com/hyperledger/fabric-sdk-go/fabric-client" +) + +var chain fabricClient.Chain + +// Test chaincode install using chaincodePath to create chaincodePackage +func TestChaincodeInstallUsingChaincodePath(t *testing.T) { + testSetup := BaseSetupImpl{} + + chainCodeVersion := "v0" + strconv.Itoa(rand.Intn(100)) + err := testSetup.InstallCC(chain, "install", chainCodePath, chainCodeVersion, nil, nil) + if err != nil { + t.Fatalf("installCC return error: %v", err) + } + + //Install same chaincode again, should fail + err = testSetup.InstallCC(chain, "install", chainCodePath, chainCodeVersion, nil, nil) + if err == nil { + t.Fatalf("install same chaincode didn't return error") + } + fmt.Println(err.Error()) + if strings.Contains(err.Error(), "chaincodes/install.v"+chainCodeVersion+" exists") { + t.Fatalf("install same chaincode didn't return the correct error") + } + +} + +// Test chaincode install using chaincodePackage[byte] +func TestChaincodeInstallUsingChaincodePackage(t *testing.T) { + testSetup := BaseSetupImpl{} + + chainCodeVersion := "v0" + strconv.Itoa(rand.Intn(100)) + testSetup.ChangeGOPATHToDeploy() + chaincodePackage, err := fabricClient.PackageCC(chainCodePath, "") + if err != nil { + t.Fatalf("PackageCC return error: %s", err) + } + testSetup.ResetGOPATH() + + err = testSetup.InstallCC(chain, "install", "github.com/example_cc_pkg", chainCodeVersion, chaincodePackage, nil) + if err != nil { + t.Fatalf("installCC return error: %v", err) + } + //Install same chaincode again, should fail + err = testSetup.InstallCC(chain, "install", chainCodePath, chainCodeVersion, chaincodePackage, nil) + if err == nil { + t.Fatalf("install same chaincode didn't return error") + } + fmt.Println(err.Error()) + if strings.Contains(err.Error(), "chaincodes/install.v"+chainCodeVersion+" exists") { + t.Fatalf("install same chaincode didn't return the correct error") + } +} + +func TestMain(m *testing.M) { + testSetup := BaseSetupImpl{} + + testSetup.InitConfig() + var err error + chain, err = testSetup.GetChain() + if err != nil { + fmt.Printf("error from GetChains %v", err) + os.Exit(-1) + } + code := m.Run() + os.Exit(code) +} + +func init() { + rand.Seed(time.Now().UnixNano()) +}