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

Commit 478d097

Browse files
committed
[FAB-10549] gracefully stop mock servers
Change-Id: I1e271af290c1d96dc8e999a1ef443bbecc429f3f Signed-off-by: Troy Ronda <troy@troyronda.com>
1 parent cc5f23c commit 478d097

File tree

9 files changed

+159
-213
lines changed

9 files changed

+159
-213
lines changed

pkg/client/resmgmt/resmgmt_test.go

Lines changed: 26 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ package resmgmt
88

99
import (
1010
"fmt"
11-
"net"
1211
"net/http"
1312
"os"
1413
"strings"
@@ -18,10 +17,6 @@ import (
1817
"github.com/hyperledger/fabric-sdk-go/pkg/common/errors/retry"
1918

2019
"github.com/golang/protobuf/proto"
21-
"github.com/pkg/errors"
22-
"github.com/stretchr/testify/assert"
23-
"google.golang.org/grpc"
24-
2520
"github.com/hyperledger/fabric-sdk-go/pkg/common/errors/status"
2621
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/context"
2722
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/core"
@@ -40,12 +35,15 @@ import (
4035
"github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/common/cauthdsl"
4136
"github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/common"
4237
pb "github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/peer"
38+
"github.com/pkg/errors"
39+
"github.com/stretchr/testify/assert"
4340
)
4441

4542
const (
4643
channelConfig = "../../../test/fixtures/fabric/v1.0/channel/mychannel.tx"
4744
networkCfg = "../../../test/fixtures/config/config_test.yaml"
4845
configPath = "../../core/config/testdata/config_test.yaml"
46+
testAddress = "127.0.0.1:0"
4947
)
5048

5149
func withLocalContextProvider(provider context.LocalProvider) ClientOption {
@@ -57,10 +55,10 @@ func withLocalContextProvider(provider context.LocalProvider) ClientOption {
5755

5856
func TestJoinChannelFail(t *testing.T) {
5957

60-
grpcServer := grpc.NewServer()
61-
defer grpcServer.Stop()
58+
srv := &fcmocks.MockEndorserServer{}
59+
addr := srv.Start(testAddress)
60+
defer srv.Stop()
6261

63-
endorserServer, addr := startEndorserServer(t, grpcServer)
6462
ctx := setupTestContext("test", "Org1MSP")
6563

6664
// Create mock orderer with simple mock block
@@ -83,7 +81,7 @@ func TestJoinChannelFail(t *testing.T) {
8381
peer1, _ := peer.New(fcmocks.NewMockEndpointConfig(), peer.WithURL("grpc://"+addr))
8482

8583
// Test fail with send proposal error
86-
endorserServer.ProposalError = errors.New("Test Error")
84+
srv.ProposalError = errors.New("Test Error")
8785
err = rc.JoinChannel("mychannel", WithTargets(peer1))
8886

8987
if err == nil || !strings.Contains(err.Error(), "Test Error") {
@@ -93,10 +91,10 @@ func TestJoinChannelFail(t *testing.T) {
9391
}
9492

9593
func TestJoinChannelSuccess(t *testing.T) {
96-
grpcServer := grpc.NewServer()
97-
defer grpcServer.Stop()
94+
srv := &fcmocks.MockEndorserServer{}
95+
addr := srv.Start(testAddress)
96+
defer srv.Stop()
9897

99-
_, addr := startEndorserServer(t, grpcServer)
10098
ctx := setupTestContext("test", "Org1MSP")
10199

102100
// Create mock orderer with simple mock block
@@ -129,10 +127,10 @@ func TestWithFilterOption(t *testing.T) {
129127
}
130128

131129
func TestJoinChannelWithFilter(t *testing.T) {
132-
grpcServer := grpc.NewServer()
133-
defer grpcServer.Stop()
130+
srv := &fcmocks.MockEndorserServer{}
131+
addr := srv.Start(testAddress)
132+
defer srv.Stop()
134133

135-
_, addr := startEndorserServer(t, grpcServer)
136134
ctx := setupTestContext("test", "Org1MSP")
137135

138136
// Create mock orderer with simple mock block
@@ -216,10 +214,9 @@ func TestJoinChannelRequiredParameters(t *testing.T) {
216214

217215
func TestJoinChannelWithOptsRequiredParameters(t *testing.T) {
218216

219-
grpcServer := grpc.NewServer()
220-
defer grpcServer.Stop()
221-
222-
_, addr := startEndorserServer(t, grpcServer)
217+
srv := &fcmocks.MockEndorserServer{}
218+
addr := srv.Start(testAddress)
219+
defer srv.Stop()
223220

224221
ctx := setupTestContext("test", "Org1MSP")
225222
network := getNetworkConfig(t)
@@ -1003,21 +1000,6 @@ func setupCustomOrderer(ctx *fcmocks.MockContext, mockOrderer fab.Orderer) *fcmo
10031000
return ctx
10041001
}
10051002

1006-
func startEndorserServer(t *testing.T, grpcServer *grpc.Server) (*fcmocks.MockEndorserServer, string) {
1007-
lis, err := net.Listen("tcp", "127.0.0.1:0")
1008-
addr := lis.Addr().String()
1009-
1010-
endorserServer := &fcmocks.MockEndorserServer{}
1011-
pb.RegisterEndorserServer(grpcServer, endorserServer)
1012-
if err != nil {
1013-
t.Logf("Error starting test server %s", err)
1014-
t.FailNow()
1015-
}
1016-
t.Logf("Starting test server on %s\n", addr)
1017-
go grpcServer.Serve(lis)
1018-
return endorserServer, addr
1019-
}
1020-
10211003
func getNetworkConfig(t *testing.T) fab.EndpointConfig {
10221004
configBackend, err := configImpl.FromFile(networkCfg)()
10231005
if err != nil {
@@ -1034,9 +1016,9 @@ func getNetworkConfig(t *testing.T) fab.EndpointConfig {
10341016

10351017
func TestSaveChannelSuccess(t *testing.T) {
10361018

1037-
grpcServer := grpc.NewServer()
1038-
defer grpcServer.Stop()
1039-
_, addr := fcmocks.StartMockBroadcastServer("127.0.0.1:0", grpcServer)
1019+
mb := fcmocks.MockBroadcastServer{}
1020+
addr := mb.Start("127.0.0.1:0")
1021+
defer mb.Stop()
10401022

10411023
ctx := setupTestContext("test", "Org1MSP")
10421024

@@ -1137,9 +1119,9 @@ func TestSaveChannelFailure(t *testing.T) {
11371119

11381120
func TestSaveChannelWithOpts(t *testing.T) {
11391121

1140-
grpcServer := grpc.NewServer()
1141-
defer grpcServer.Stop()
1142-
_, addr := fcmocks.StartMockBroadcastServer("127.0.0.1:0", grpcServer)
1122+
mb := fcmocks.MockBroadcastServer{}
1123+
addr := mb.Start("127.0.0.1:0")
1124+
defer mb.Stop()
11431125

11441126
ctx := setupTestContext("test", "Org1MSP")
11451127

@@ -1210,9 +1192,10 @@ func TestJoinChannelWithInvalidOpts(t *testing.T) {
12101192
}
12111193

12121194
func TestSaveChannelWithMultipleSigningIdenities(t *testing.T) {
1213-
grpcServer := grpc.NewServer()
1214-
defer grpcServer.Stop()
1215-
_, addr := fcmocks.StartMockBroadcastServer("127.0.0.1:0", grpcServer)
1195+
mb := fcmocks.MockBroadcastServer{}
1196+
addr := mb.Start("127.0.0.1:0")
1197+
defer mb.Stop()
1198+
12161199
ctx := setupTestContext("test", "Org1MSP")
12171200

12181201
mockConfig := &fcmocks.MockConfig{}

pkg/fab/comm/comm_test.go

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,10 @@ import (
1111
"net"
1212
"os"
1313
"testing"
14-
"time"
1514

1615
eventmocks "github.com/hyperledger/fabric-sdk-go/pkg/fab/events/mocks"
1716
"github.com/hyperledger/fabric-sdk-go/pkg/fab/mocks"
18-
"github.com/hyperledger/fabric-sdk-go/pkg/util/test"
1917
pb "github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/peer"
20-
"github.com/pkg/errors"
2118
"google.golang.org/grpc"
2219
)
2320

@@ -51,37 +48,18 @@ func TestMain(m *testing.M) {
5148
}
5249
endorserAddr = addrs
5350

54-
time.Sleep(2 * time.Second)
5551
os.Exit(m.Run())
5652
}
5753

58-
func startEndorsers(count int, address string) ([]*grpc.Server, []string, error) {
59-
srvs := make([]*grpc.Server, 0, count)
54+
func startEndorsers(count int, address string) ([]*mocks.MockEndorserServer, []string, error) {
55+
srvs := make([]*mocks.MockEndorserServer, 0, count)
6056
addrs := make([]string, 0, count)
6157

6258
for i := 0; i < count; i++ {
63-
srv := grpc.NewServer()
64-
_, addr, ok := startEndorserServer(srv, address)
65-
if !ok {
66-
return nil, nil, errors.New("unable to start GRPC server")
67-
}
59+
srv := &mocks.MockEndorserServer{}
60+
addr := srv.Start(address)
6861
srvs = append(srvs, srv)
6962
addrs = append(addrs, addr)
7063
}
7164
return srvs, addrs, nil
7265
}
73-
74-
func startEndorserServer(grpcServer *grpc.Server, address string) (*mocks.MockEndorserServer, string, bool) {
75-
lis, err := net.Listen("tcp", address)
76-
if err != nil {
77-
test.Logf("Error starting test server [%s]", err)
78-
return nil, "", false
79-
}
80-
addr := lis.Addr().String()
81-
82-
endorserServer := &mocks.MockEndorserServer{}
83-
pb.RegisterEndorserServer(grpcServer, endorserServer)
84-
test.Logf("Starting test server [%s]", addr)
85-
go grpcServer.Serve(lis)
86-
return endorserServer, addr, true
87-
}

pkg/fab/events/endpoint/endpoint_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ func newMockConfig(channelPeers ...fab.ChannelPeer) *mockConfig {
135135
}
136136

137137
func (c *mockConfig) ChannelPeers(name string) ([]fab.ChannelPeer, bool) {
138-
test.Logf("mockConfig.ChannelPeers [%#n]", c.channelPeers)
138+
test.Logf("mockConfig.ChannelPeers [%#v]", c.channelPeers)
139139
return c.channelPeers, true
140140
}
141141

pkg/fab/mocks/mockbroadcastserver.go

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"fmt"
1111
"io"
1212
"net"
13+
"sync"
1314

1415
po "github.com/hyperledger/fabric-sdk-go/internal/github.com/hyperledger/fabric/protos/orderer"
1516
"github.com/hyperledger/fabric-sdk-go/pkg/util/test"
@@ -38,6 +39,8 @@ type MockBroadcastServer struct {
3839
DeliverResponse *po.DeliverResponse
3940
BroadcastError error
4041
BroadcastCustomResponse *po.BroadcastResponse
42+
srv *grpc.Server
43+
wg sync.WaitGroup
4144
}
4245

4346
// Broadcast mock broadcast
@@ -90,22 +93,39 @@ func (m *MockBroadcastServer) Deliver(server po.AtomicBroadcast_DeliverServer) e
9093
return nil
9194
}
9295

93-
//StartMockBroadcastServer starts mock server for unit testing purpose
94-
func StartMockBroadcastServer(broadcastTestURL string, grpcServer *grpc.Server) (*MockBroadcastServer, string) {
95-
lis, err := net.Listen("tcp", broadcastTestURL)
96+
// Start the mock broadcast server
97+
func (m *MockBroadcastServer) Start(address string) string {
98+
if m.srv != nil {
99+
panic("MockBroadcastServer already started")
100+
}
101+
m.srv = grpc.NewServer()
102+
103+
lis, err := net.Listen("tcp", address)
96104
if err != nil {
97105
panic(fmt.Sprintf("Error starting BroadcastServer %s", err))
98106
}
99107
addr := lis.Addr().String()
100108

101109
test.Logf("Starting MockEventServer [%s]", addr)
102-
broadcastServer := new(MockBroadcastServer)
103-
po.RegisterAtomicBroadcastServer(grpcServer, broadcastServer)
110+
po.RegisterAtomicBroadcastServer(m.srv, m)
111+
m.wg.Add(1)
104112
go func() {
105-
if err := grpcServer.Serve(lis); err != nil {
113+
defer m.wg.Done()
114+
if err := m.srv.Serve(lis); err != nil {
106115
test.Logf("StartMockBroadcastServer failed [%s]", err)
107116
}
108117
}()
109118

110-
return broadcastServer, addr
119+
return addr
120+
}
121+
122+
// Stop the mock broadcast server and wait for completion.
123+
func (m *MockBroadcastServer) Stop() {
124+
if m.srv == nil {
125+
panic("MockBroadcastServer not started")
126+
}
127+
128+
m.srv.Stop()
129+
m.wg.Wait()
130+
m.srv = nil
111131
}

pkg/fab/mocks/mockendorserserver.go

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,23 @@ package mocks
99
import (
1010
"fmt"
1111
"net"
12+
"sync"
1213

1314
"github.com/golang/protobuf/proto"
15+
"github.com/hyperledger/fabric-sdk-go/pkg/util/test"
16+
"github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/rwsetutil"
17+
"github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/ledger/rwset/kvrwset"
18+
pb "github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/peer"
1419
"golang.org/x/net/context"
1520
"google.golang.org/grpc"
16-
17-
rwsetutil "github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/rwsetutil"
18-
kvrwset "github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/ledger/rwset/kvrwset"
19-
pb "github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/peer"
2021
)
2122

2223
// MockEndorserServer mock endoreser server to process endorsement proposals
2324
type MockEndorserServer struct {
2425
ProposalError error
2526
AddkvWrite bool
27+
srv *grpc.Server
28+
wg sync.WaitGroup
2629
}
2730

2831
// ProcessProposal mock implementation that returns success if error is not set
@@ -72,20 +75,39 @@ func (m *MockEndorserServer) createProposalResponsePayload() []byte {
7275
return prpBytes
7376
}
7477

75-
//StartEndorserServer starts mock server for unit testing purpose
76-
func StartEndorserServer(endorserTestURL string) *MockEndorserServer {
77-
grpcServer := grpc.NewServer()
78-
lis, err := net.Listen("tcp", endorserTestURL)
78+
// Start the mock broadcast server
79+
func (m *MockEndorserServer) Start(address string) string {
80+
if m.srv != nil {
81+
panic("MockBroadcastServer already started")
82+
}
83+
m.srv = grpc.NewServer()
84+
85+
lis, err := net.Listen("tcp", address)
7986
if err != nil {
80-
panic(fmt.Sprintf("Error starting endorser server: %s", err))
87+
panic(fmt.Sprintf("Error starting BroadcastServer %s", err))
8188
}
82-
endorserServer := &MockEndorserServer{}
83-
pb.RegisterEndorserServer(grpcServer, endorserServer)
84-
fmt.Print("Test endorser server started\n")
89+
addr := lis.Addr().String()
90+
91+
test.Logf("Starting MockEventServer [%s]", addr)
92+
pb.RegisterEndorserServer(m.srv, m)
93+
m.wg.Add(1)
8594
go func() {
86-
if err := grpcServer.Serve(lis); err != nil {
87-
panic(err.Error())
95+
defer m.wg.Done()
96+
if err := m.srv.Serve(lis); err != nil {
97+
test.Logf("StartMockBroadcastServer failed [%s]", err)
8898
}
8999
}()
90-
return endorserServer
100+
101+
return addr
102+
}
103+
104+
// Stop the mock broadcast server and wait for completion.
105+
func (m *MockEndorserServer) Stop() {
106+
if m.srv == nil {
107+
panic("MockBroadcastServer not started")
108+
}
109+
110+
m.srv.Stop()
111+
m.wg.Wait()
112+
m.srv = nil
91113
}

0 commit comments

Comments
 (0)