Skip to content

Commit 8d2b382

Browse files
authored
[mock-orderer & sidecar] TLS coverage unit test for mock-orderer and client-sidecar (#173)
#### Type of change - Test update #### Description 1. Extend the existing unit test (TestBroadcastDeliver) to verify the mock-orderer’s TLS support. 2. Extend the Orderer’s Loadgen unit tests to cover various TLS modes. 3. Extend the TestSidecar to support various TLS modes. #### Related issues * Resolves #172 * Resolves #170 * Resolves #169 * Resolves #26 --------- Signed-off-by: Dean Amar <[email protected]>
1 parent 6218c30 commit 8d2b382

File tree

4 files changed

+267
-211
lines changed

4 files changed

+267
-211
lines changed

loadgen/client_test.go

Lines changed: 122 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,6 @@ import (
3333
const (
3434
// We expect at least 3 blocks for a valid test run.
3535
defaultExpectedTXs = defaultBlockSize * 3
36-
// Each server's SAN is localhost.
37-
defaultServerSAN = "localhost"
3836
)
3937

4038
// We can enforce exact limits only for the sidecar and the coordinator.
@@ -49,7 +47,7 @@ func TestLoadGenForLoadGen(t *testing.T) {
4947
for _, mode := range test.ServerModes {
5048
t.Run(fmt.Sprintf("tls-mode:%s", mode), func(t *testing.T) {
5149
t.Parallel()
52-
serverTLSConfig, clientTLSConfig := createServerAndClientTLSConfig(t, mode)
50+
serverTLSConfig, clientTLSConfig := test.CreateServerAndClientTLSConfig(t, mode)
5351
for _, limit := range defaultLimits {
5452
t.Run(limitToString(limit), func(t *testing.T) {
5553
t.Parallel()
@@ -84,7 +82,7 @@ func TestLoadGenForVCService(t *testing.T) {
8482
for _, mode := range test.ServerModes {
8583
t.Run(fmt.Sprintf("tls-mode:%s", mode), func(t *testing.T) {
8684
t.Parallel()
87-
serverTLSConfig, clientTLSConfig := createServerAndClientTLSConfig(t, mode)
85+
serverTLSConfig, clientTLSConfig := test.CreateServerAndClientTLSConfig(t, mode)
8886
for _, limit := range defaultLimits {
8987
t.Run(limitToString(limit), func(t *testing.T) {
9088
t.Parallel()
@@ -104,7 +102,7 @@ func TestLoadGenForSigVerifier(t *testing.T) {
104102
for _, mode := range test.ServerModes {
105103
t.Run(fmt.Sprintf("tls-mode:%s", mode), func(t *testing.T) {
106104
t.Parallel()
107-
serverTLSConfig, clientTLSConfig := createServerAndClientTLSConfig(t, mode)
105+
serverTLSConfig, clientTLSConfig := test.CreateServerAndClientTLSConfig(t, mode)
108106
for _, limit := range defaultLimits {
109107
t.Run(limitToString(limit), func(t *testing.T) {
110108
t.Parallel()
@@ -145,7 +143,7 @@ func TestLoadGenForCoordinator(t *testing.T) {
145143
for _, mode := range test.ServerModes {
146144
t.Run(fmt.Sprintf("tls-mode:%s", mode), func(t *testing.T) {
147145
t.Parallel()
148-
serverTLSConfig, clientTLSConfig := createServerAndClientTLSConfig(t, mode)
146+
serverTLSConfig, clientTLSConfig := test.CreateServerAndClientTLSConfig(t, mode)
149147
for _, limit := range append(
150148
defaultLimits,
151149
&adapters.GenerateLimit{Blocks: 5},
@@ -191,7 +189,7 @@ func TestLoadGenForSidecar(t *testing.T) {
191189
for _, mode := range test.ServerModes {
192190
t.Run(fmt.Sprintf("tls-mode:%s", mode), func(t *testing.T) {
193191
t.Parallel()
194-
serverTLSConfig, clientTLSConfig := createServerAndClientTLSConfig(t, mode)
192+
serverTLSConfig, clientTLSConfig := test.CreateServerAndClientTLSConfig(t, mode)
195193
for _, limit := range append(
196194
defaultLimits,
197195
&adapters.GenerateLimit{Blocks: 5},
@@ -208,18 +206,18 @@ func TestLoadGenForSidecar(t *testing.T) {
208206
// To avoid manually pre-choosing ports that might conflict with other tests,
209207
// we pre allocate them by starting a listener that picks a port automatically and bind to it.
210208
// In real evaluation scenario, the ports will be selected by the deployment infrastructure.
211-
sidecarServerConf := preAllocatePorts(t)
209+
sidecarServerConf := preAllocatePorts(t, serverTLSConfig)
212210
ordererServers := make([]*connection.ServerConfig, 3)
213211
for i := range ordererServers {
214-
ordererServers[i] = preAllocatePorts(t)
212+
ordererServers[i] = preAllocatePorts(t, serverTLSConfig)
215213
}
216-
sidecarServerConf.TLS = serverTLSConfig
217214
// Start server under test
218215
sidecarConf := &sidecar.Config{
219216
Server: sidecarServerConf,
220217
Orderer: ordererconn.Config{
221218
Connection: ordererconn.ConnectionConfig{
222219
Endpoints: ordererconn.NewEndpoints(0, "org", ordererServers...),
220+
TLS: clientTLSConfig,
223221
},
224222
ChannelID: clientConf.LoadProfile.Transaction.Policy.ChannelID,
225223
Identity: clientConf.LoadProfile.Transaction.Policy.Identity,
@@ -253,109 +251,136 @@ func TestLoadGenForSidecar(t *testing.T) {
253251

254252
func TestLoadGenForOrderer(t *testing.T) {
255253
t.Parallel()
256-
for _, limit := range defaultLimits {
257-
t.Run(limitToString(limit), func(t *testing.T) {
254+
for _, mode := range test.ServerModes {
255+
t.Run(fmt.Sprintf("tls-mode:%s", mode), func(t *testing.T) {
258256
t.Parallel()
259-
clientConf := DefaultClientConf()
260-
clientConf.Limit = limit
261-
// Start dependencies
262-
orderer, ordererServer := mock.StartMockOrderingServices(
263-
t, &mock.OrdererConfig{NumService: 3, BlockSize: 100},
264-
)
265-
_, coordinatorServer := mock.StartMockCoordinatorService(t)
266-
267-
endpoints := ordererconn.NewEndpoints(0, "msp", ordererServer.Configs...)
268-
sidecarConf := &sidecar.Config{
269-
Server: connection.NewLocalHostServerWithTLS(test.InsecureTLSConfig),
270-
Orderer: ordererconn.Config{
271-
Connection: ordererconn.ConnectionConfig{
272-
Endpoints: endpoints,
273-
},
274-
ChannelID: clientConf.LoadProfile.Transaction.Policy.ChannelID,
275-
Identity: clientConf.LoadProfile.Transaction.Policy.Identity,
276-
ConsensusType: ordererconn.Bft,
277-
},
278-
LastCommittedBlockSetInterval: 100 * time.Millisecond,
279-
WaitingTxsLimit: 5000,
280-
Committer: test.NewInsecureClientConfig(&coordinatorServer.Configs[0].Endpoint),
281-
Monitoring: defaultMonitoring(),
282-
Ledger: sidecar.LedgerConfig{
283-
Path: t.TempDir(),
284-
},
285-
}
257+
serverTLSConfig, clientTLSConfig := test.CreateServerAndClientTLSConfig(t, mode)
258+
for _, limit := range defaultLimits {
259+
t.Run(limitToString(limit), func(t *testing.T) {
260+
t.Parallel()
261+
clientConf := DefaultClientConf()
262+
clientConf.Limit = limit
263+
numService := 3
264+
sc := make([]*connection.ServerConfig, numService)
265+
for i := range sc {
266+
sc[i] = connection.NewLocalHostServerWithTLS(serverTLSConfig)
267+
}
268+
// Start dependencies
269+
orderer, ordererServer := mock.StartMockOrderingServices(
270+
t, &mock.OrdererConfig{ServerConfigs: sc, NumService: numService, BlockSize: 100},
271+
)
272+
_, coordinatorServer := mock.StartMockCoordinatorService(t)
273+
274+
endpoints := ordererconn.NewEndpoints(0, "msp", ordererServer.Configs...)
275+
sidecarConf := &sidecar.Config{
276+
Server: connection.NewLocalHostServerWithTLS(serverTLSConfig),
277+
Orderer: ordererconn.Config{
278+
Connection: ordererconn.ConnectionConfig{
279+
Endpoints: endpoints,
280+
TLS: clientTLSConfig,
281+
},
282+
ChannelID: clientConf.LoadProfile.Transaction.Policy.ChannelID,
283+
Identity: clientConf.LoadProfile.Transaction.Policy.Identity,
284+
ConsensusType: ordererconn.Bft,
285+
},
286+
LastCommittedBlockSetInterval: 100 * time.Millisecond,
287+
WaitingTxsLimit: 5000,
288+
Committer: test.NewInsecureClientConfig(
289+
&coordinatorServer.Configs[0].Endpoint,
290+
),
291+
Monitoring: defaultMonitoring(),
292+
Ledger: sidecar.LedgerConfig{
293+
Path: t.TempDir(),
294+
},
295+
}
296+
297+
// Start sidecar.
298+
service, err := sidecar.New(sidecarConf)
299+
require.NoError(t, err)
300+
t.Cleanup(service.Close)
301+
test.RunServiceAndGrpcForTest(t.Context(), t, service, sidecarConf.Server)
286302

287-
// Start sidecar.
288-
service, err := sidecar.New(sidecarConf)
289-
require.NoError(t, err)
290-
t.Cleanup(service.Close)
291-
test.RunServiceAndGrpcForTest(t.Context(), t, service, sidecarConf.Server)
292-
293-
// Submit default config block.
294-
require.NotNil(t, clientConf.LoadProfile)
295-
clientConf.LoadProfile.Transaction.Policy.OrdererEndpoints = endpoints
296-
configBlock, err := workload.CreateConfigBlock(clientConf.LoadProfile.Transaction.Policy)
297-
require.NoError(t, err)
298-
err = orderer.SubmitBlock(t.Context(), configBlock)
299-
require.NoError(t, err)
300-
301-
// Start client
302-
clientConf.Adapter.OrdererClient = &adapters.OrdererClientConfig{
303-
SidecarClient: test.NewInsecureClientConfig(&sidecarConf.Server.Endpoint),
304-
Orderer: sidecarConf.Orderer,
305-
BroadcastParallelism: 5,
303+
// Submit default config block.
304+
require.NotNil(t, clientConf.LoadProfile)
305+
clientConf.LoadProfile.Transaction.Policy.OrdererEndpoints = endpoints
306+
configBlock, err := workload.CreateConfigBlock(clientConf.LoadProfile.Transaction.Policy)
307+
require.NoError(t, err)
308+
err = orderer.SubmitBlock(t.Context(), configBlock)
309+
require.NoError(t, err)
310+
311+
// Start client
312+
clientConf.Adapter.OrdererClient = &adapters.OrdererClientConfig{
313+
SidecarClient: test.NewTLSClientConfig(clientTLSConfig, &sidecarConf.Server.Endpoint),
314+
Orderer: sidecarConf.Orderer,
315+
BroadcastParallelism: 5,
316+
}
317+
testLoadGenerator(t, clientConf)
318+
})
306319
}
307-
testLoadGenerator(t, clientConf)
308320
})
309321
}
310322
}
311323

312324
func TestLoadGenForOnlyOrderer(t *testing.T) {
313325
t.Parallel()
314-
for _, limit := range defaultLimits {
315-
clientConf := DefaultClientConf()
316-
clientConf.Limit = limit
317-
t.Run(limitToString(limit), func(t *testing.T) {
326+
for _, mode := range test.ServerModes {
327+
t.Run(fmt.Sprintf("tls-mode:%s", mode), func(t *testing.T) {
318328
t.Parallel()
319-
// Start dependencies
320-
orderer, ordererServer := mock.StartMockOrderingServices(
321-
t, &mock.OrdererConfig{
322-
NumService: 3,
323-
BlockSize: int(clientConf.LoadProfile.Block.Size), //nolint:gosec // uint64 -> int.
324-
},
325-
)
326-
327-
endpoints := ordererconn.NewEndpoints(0, "msp", ordererServer.Configs...)
328-
329-
// Submit default config block.
330-
// This is ignored when sidecar isn't used.
331-
// We validate the test doesn't break when config block is delivered.
332-
require.NotNil(t, clientConf.LoadProfile)
333-
clientConf.LoadProfile.Transaction.Policy.OrdererEndpoints = endpoints
334-
configBlock, err := workload.CreateConfigBlock(clientConf.LoadProfile.Transaction.Policy)
335-
require.NoError(t, err)
336-
err = orderer.SubmitBlock(t.Context(), configBlock)
337-
require.NoError(t, err)
338-
339-
// Start client
340-
clientConf.Adapter.OrdererClient = &adapters.OrdererClientConfig{
341-
Orderer: ordererconn.Config{
342-
Connection: ordererconn.ConnectionConfig{
343-
Endpoints: endpoints,
344-
},
345-
ChannelID: clientConf.LoadProfile.Transaction.Policy.ChannelID,
346-
Identity: clientConf.LoadProfile.Transaction.Policy.Identity,
347-
ConsensusType: ordererconn.Bft,
348-
},
349-
BroadcastParallelism: 5,
329+
serverTLSConfig, clientTLSConfig := test.CreateServerAndClientTLSConfig(t, mode)
330+
for _, limit := range defaultLimits {
331+
clientConf := DefaultClientConf()
332+
clientConf.Limit = limit
333+
t.Run(limitToString(limit), func(t *testing.T) {
334+
t.Parallel()
335+
numService := 3
336+
sc := make([]*connection.ServerConfig, numService)
337+
for i := range sc {
338+
sc[i] = connection.NewLocalHostServerWithTLS(serverTLSConfig)
339+
}
340+
// Start dependencies
341+
orderer, ordererServer := mock.StartMockOrderingServices(
342+
t, &mock.OrdererConfig{
343+
ServerConfigs: sc,
344+
NumService: numService,
345+
BlockSize: int(clientConf.LoadProfile.Block.Size), //nolint:gosec // uint64 -> int.
346+
},
347+
)
348+
349+
endpoints := ordererconn.NewEndpoints(0, "msp", ordererServer.Configs...)
350+
351+
// Submit default config block.
352+
// This is ignored when sidecar isn't used.
353+
// We validate the test doesn't break when config block is delivered.
354+
require.NotNil(t, clientConf.LoadProfile)
355+
clientConf.LoadProfile.Transaction.Policy.OrdererEndpoints = endpoints
356+
configBlock, err := workload.CreateConfigBlock(clientConf.LoadProfile.Transaction.Policy)
357+
require.NoError(t, err)
358+
err = orderer.SubmitBlock(t.Context(), configBlock)
359+
require.NoError(t, err)
360+
361+
// Start client
362+
clientConf.Adapter.OrdererClient = &adapters.OrdererClientConfig{
363+
Orderer: ordererconn.Config{
364+
Connection: ordererconn.ConnectionConfig{
365+
Endpoints: endpoints,
366+
TLS: clientTLSConfig,
367+
},
368+
ChannelID: clientConf.LoadProfile.Transaction.Policy.ChannelID,
369+
Identity: clientConf.LoadProfile.Transaction.Policy.Identity,
370+
ConsensusType: ordererconn.Bft,
371+
},
372+
BroadcastParallelism: 5,
373+
}
374+
testLoadGenerator(t, clientConf)
375+
})
350376
}
351-
testLoadGenerator(t, clientConf)
352377
})
353378
}
354379
}
355380

356-
func preAllocatePorts(t *testing.T) *connection.ServerConfig {
381+
func preAllocatePorts(t *testing.T, tlsConfig connection.TLSConfig) *connection.ServerConfig {
357382
t.Helper()
358-
server := connection.NewLocalHostServerWithTLS(test.InsecureTLSConfig)
383+
server := connection.NewLocalHostServerWithTLS(tlsConfig)
359384
listener, err := server.PreAllocateListener()
360385
require.NoError(t, err)
361386
t.Cleanup(func() {
@@ -445,15 +470,3 @@ func limitToString(m *adapters.GenerateLimit) string {
445470
}
446471
return strings.Join(out, ",")
447472
}
448-
449-
// createServerAndClientTLSConfig creates tls configurations for
450-
// both the server and client.
451-
func createServerAndClientTLSConfig(t *testing.T, tlsMode string) (
452-
serverTLSConfig, clientTLSConfig connection.TLSConfig,
453-
) {
454-
t.Helper()
455-
credsFactory := test.NewCredentialsFactory(t)
456-
clientTLSConfig, _ = credsFactory.CreateServerCredentials(t, tlsMode, defaultServerSAN)
457-
serverTLSConfig, _ = credsFactory.CreateClientCredentials(t, tlsMode)
458-
return clientTLSConfig, serverTLSConfig
459-
}

service/sidecar/sidecar_test.go

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -221,23 +221,28 @@ func (env *sidecarTestEnv) startNotificationStream(
221221

222222
func TestSidecar(t *testing.T) {
223223
t.Parallel()
224-
for _, conf := range []sidecarTestConfig{
225-
{WithConfigBlock: false},
226-
{WithConfigBlock: true},
227-
{
228-
WithConfigBlock: true,
229-
NumFakeService: 3,
230-
},
231-
} {
232-
conf := conf
233-
t.Run(conf.String(), func(t *testing.T) {
224+
for _, mode := range test.ServerModes {
225+
t.Run(fmt.Sprintf("tls-mode:%s", mode), func(t *testing.T) {
234226
t.Parallel()
235-
env := newSidecarTestEnvWithTLS(t, conf, test.InsecureTLSConfig)
236-
ctx, cancel := context.WithTimeout(t.Context(), 2*time.Minute)
237-
t.Cleanup(cancel)
238-
env.startSidecarServiceAndClientAndNotificationStream(ctx, t, 0, test.InsecureTLSConfig)
239-
env.requireBlock(ctx, t, 0)
240-
env.sendTransactionsAndEnsureCommitted(ctx, t, 1)
227+
serverTLSConfig, clientTLSConfig := test.CreateServerAndClientTLSConfig(t, mode)
228+
for _, conf := range []sidecarTestConfig{
229+
{WithConfigBlock: false},
230+
{WithConfigBlock: true},
231+
{
232+
WithConfigBlock: true,
233+
NumFakeService: 3,
234+
},
235+
} {
236+
t.Run(conf.String(), func(t *testing.T) {
237+
t.Parallel()
238+
env := newSidecarTestEnvWithTLS(t, conf, serverTLSConfig)
239+
ctx, cancel := context.WithTimeout(t.Context(), 2*time.Minute)
240+
t.Cleanup(cancel)
241+
env.startSidecarServiceAndClientAndNotificationStream(ctx, t, 0, clientTLSConfig)
242+
env.requireBlock(ctx, t, 0)
243+
env.sendTransactionsAndEnsureCommitted(ctx, t, 1)
244+
})
245+
}
241246
})
242247
}
243248
}

0 commit comments

Comments
 (0)