Skip to content
This repository was archived by the owner on Apr 25, 2025. It is now read-only.

Commit f0f2ef5

Browse files
committed
[FAB-4637] Add multi-org integration test
Change-Id: I03fd1fd0dc95c7ebb1222e812ff2cf59fe978615 Signed-off-by: Divyank Katira <Divyank.Katira@securekey.com>
1 parent 1bb8099 commit f0f2ef5

File tree

11 files changed

+359
-4
lines changed

11 files changed

+359
-4
lines changed

api/config.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ type Config interface {
2121
CAClientCertFile(org string) (string, error)
2222
MspID(org string) (string, error)
2323
FabricClientViper() *viper.Viper
24+
OrderersConfig() ([]OrdererConfig, error)
2425
RandomOrdererConfig() (*OrdererConfig, error)
2526
OrdererConfig(name string) (*OrdererConfig, error)
2627
PeersConfig(org string) ([]PeerConfig, error)

api/mocks/mockconfig.gen.go

Lines changed: 13 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

fabric-txn/transaction.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ func InvokeChaincode(client api.FabricClient, channel api.Channel, targets []api
7676

7777
select {
7878
case <-done:
79-
case <-fail:
80-
return fmt.Errorf("invoke Error received from eventhub for txid(%s), error(%v)", txID, fail)
79+
case err := <-fail:
80+
return fmt.Errorf("invoke Error received from eventhub for txid(%s), error(%v)", txID, err)
8181
case <-time.After(time.Second * 30):
8282
return fmt.Errorf("invoke Didn't receive block event for txid(%s)", txID)
8383
}

pkg/config/config.go

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,12 @@ func (c *config) MspID(org string) (string, error) {
138138
if err != nil {
139139
return "", err
140140
}
141+
mspID := config.Organizations[org].MspID
142+
if mspID == "" {
143+
return "", fmt.Errorf("MSP ID is empty for org: %s", org)
144+
}
141145

142-
return config.Organizations[org].MspID, nil
146+
return mspID, nil
143147
}
144148

145149
// FabricClientViper returns the internal viper instance used by the
@@ -158,6 +162,23 @@ func (c *config) cacheNetworkConfiguration() error {
158162
return err
159163
}
160164

165+
// GetOrderersConfig returns a list of defined orderers
166+
func (c *config) OrderersConfig() ([]api.OrdererConfig, error) {
167+
orderers := []api.OrdererConfig{}
168+
config, err := c.NetworkConfig()
169+
if err != nil {
170+
return nil, err
171+
}
172+
173+
for _, orderer := range config.Orderers {
174+
orderer.TLS.Certificate = strings.Replace(orderer.TLS.Certificate, "$GOPATH",
175+
os.Getenv("GOPATH"), -1)
176+
orderers = append(orderers, orderer)
177+
}
178+
179+
return orderers, nil
180+
}
181+
161182
// RandomOrdererConfig returns a pseudo-random orderer from the network config
162183
func (c *config) RandomOrdererConfig() (*api.OrdererConfig, error) {
163184
config, err := c.NetworkConfig()

pkg/config/config_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ package config
99
import (
1010
"fmt"
1111
"os"
12+
"path/filepath"
1213
"strings"
1314
"testing"
1415

@@ -289,6 +290,17 @@ func TestNetworkConfig(t *testing.T) {
289290
}
290291
}
291292

293+
func TestOrdererConfig(t *testing.T) {
294+
orderers, err := configImpl.OrderersConfig()
295+
if err != nil {
296+
t.Fatal(err)
297+
}
298+
299+
if !filepath.IsAbs(orderers[0].TLS.Certificate) {
300+
t.Fatal("Expected GOPATH relative path to be replaced")
301+
}
302+
}
303+
292304
func TestMain(m *testing.M) {
293305
var err error
294306
configImpl, err = InitConfig("../../test/fixtures/config/config_test.yaml")

pkg/fabric-ca-client/mocks/mockconfig.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,11 @@ func (c *MockConfig) SecurityLevel() int {
9191

9292
}
9393

94+
// OrderersConfig returns a list of defined orderers
95+
func (c *MockConfig) OrderersConfig() ([]api.OrdererConfig, error) {
96+
return nil, nil
97+
}
98+
9499
// RandomOrdererConfig not implemented
95100
func (c *MockConfig) RandomOrdererConfig() (*api.OrdererConfig, error) {
96101
return nil, nil

pkg/fabric-client/mocks/mockconfig.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,11 @@ func (c *MockConfig) SecurityLevel() int {
9191

9292
}
9393

94+
// OrderersConfig returns a list of defined orderers
95+
func (c *MockConfig) OrderersConfig() ([]api.OrdererConfig, error) {
96+
return nil, nil
97+
}
98+
9499
// RandomOrdererConfig not implemented
95100
func (c *MockConfig) RandomOrdererConfig() (*api.OrdererConfig, error) {
96101
return nil, nil

test/fixtures/docker-compose.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ services:
104104
environment:
105105
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
106106
- CORE_PEER_ID=peer0.org2.example.com
107+
- CORE_LOGGING_PEER=debug
107108
- CORE_PEER_LOCALMSPID=Org2MSP
108109
- CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/peer/
109110
- CORE_PEER_ADDRESS=peer0.org2.example.com:7051
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
/*
2+
Copyright SecureKey Technologies Inc. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package orgs
8+
9+
import (
10+
"fmt"
11+
"strconv"
12+
"testing"
13+
14+
"github.com/hyperledger/fabric-sdk-go/api"
15+
fabrictxn "github.com/hyperledger/fabric-sdk-go/fabric-txn"
16+
)
17+
18+
// TestOrgsEndToEnd creates a channel with two organisations, installs chaincode
19+
// on each of them, and finally invokes a transaction on an org2 peer and queries
20+
// the result from an org1 peer
21+
func TestOrgsEndToEnd(t *testing.T) {
22+
// Bootstrap network
23+
initializeFabricClient(t)
24+
loadOrgUsers(t)
25+
loadOrgPeers(t)
26+
loadOrderer(t)
27+
createTestChannel(t)
28+
joinTestChannel(t)
29+
installAndInstantiate(t)
30+
31+
fmt.Printf("peer0 is %+v, peer1 is %+v\n", orgTestPeer0, orgTestPeer1)
32+
33+
// Query initial value on org1 peer
34+
orgTestClient.SetUserContext(org1User)
35+
orgTestChannel.SetPrimaryPeer(orgTestPeer0)
36+
result, err := fabrictxn.QueryChaincode(orgTestClient, orgTestChannel,
37+
"exampleCC", generateQueryArgs())
38+
failTestIfError(err, t)
39+
initialValue, err := strconv.Atoi(result)
40+
failTestIfError(err, t)
41+
42+
// Change value on org2 peer
43+
orgTestClient.SetUserContext(org2User)
44+
orgTestChannel.SetPrimaryPeer(orgTestPeer1)
45+
err = fabrictxn.InvokeChaincode(orgTestClient, orgTestChannel, []api.Peer{orgTestPeer1},
46+
peer0EventHub, "exampleCC", generateInvokeArgs(), nil)
47+
failTestIfError(err, t)
48+
49+
// Assert changed value on org1 peer
50+
orgTestClient.SetUserContext(org1User)
51+
orgTestChannel.SetPrimaryPeer(orgTestPeer0)
52+
result, err = fabrictxn.QueryChaincode(orgTestClient, orgTestChannel,
53+
"exampleCC", generateQueryArgs())
54+
failTestIfError(err, t)
55+
finalValue, err := strconv.Atoi(result)
56+
failTestIfError(err, t)
57+
58+
if initialValue+1 != finalValue {
59+
t.Fatalf("Org1 invoke result was not propagated to org2. Expected %d, got: %d",
60+
(initialValue + 1), finalValue)
61+
}
62+
}
63+
64+
func generateQueryArgs() []string {
65+
var args []string
66+
args = append(args, "invoke")
67+
args = append(args, "query")
68+
args = append(args, "b")
69+
70+
return args
71+
}
72+
73+
func generateInvokeArgs() []string {
74+
var args []string
75+
args = append(args, "invoke")
76+
args = append(args, "move")
77+
args = append(args, "a")
78+
args = append(args, "b")
79+
args = append(args, "1")
80+
81+
return args
82+
}

0 commit comments

Comments
 (0)