Skip to content

Commit 77bd4b9

Browse files
authored
chore: Restrict network-dependent helper to integration tests (#4250)
1 parent 9ab24e4 commit 77bd4b9

File tree

6 files changed

+69
-51
lines changed

6 files changed

+69
-51
lines changed

pkg/experiment/metastore/client/server_mock_test.go

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package metastoreclient
33
import (
44
"context"
55
"fmt"
6-
"net"
76
"sync"
87
"testing"
98

@@ -19,6 +18,7 @@ import (
1918
metastorev1 "github.com/grafana/pyroscope/api/gen/proto/go/metastore/v1"
2019
"github.com/grafana/pyroscope/pkg/experiment/metastore/discovery"
2120
"github.com/grafana/pyroscope/pkg/experiment/metastore/raftnode/raftnodepb"
21+
"github.com/grafana/pyroscope/pkg/test"
2222
"github.com/grafana/pyroscope/pkg/test/mocks/mockmetastorev1"
2323
"github.com/grafana/pyroscope/pkg/test/mocks/mockraftnodepb"
2424
)
@@ -201,16 +201,14 @@ func errOrT[T any](t *T, f func() error) (*T, error) {
201201
// Returns the grpc.DialOptions needed for a client connection to the created mock servers.
202202
func createMockServers(t *testing.T, l log.Logger, dServers []discovery.Server) (*mockServers, []grpc.DialOption) {
203203
var servers []*mockServer
204-
listeners := make(map[string]*bufconn.Listener)
204+
listeners, dialOpt := createInMemoryListeners(dServers)
205205
for idx, dserv := range dServers {
206206
s := newMockServer(t)
207207
s.index = idx
208208
s.id = testServerId(idx)
209209
s.address = dserv.ResolvedAddress
210-
lis := bufconn.Listen(256 << 10)
211-
listeners[s.address] = lis
212210
go func() {
213-
if err := s.srv.Serve(lis); err != nil {
211+
if err := s.srv.Serve(listeners[s.address]); err != nil {
214212
assert.NoError(t, err)
215213
}
216214
}()
@@ -222,14 +220,15 @@ func createMockServers(t *testing.T, l log.Logger, dServers []discovery.Server)
222220
t: t,
223221
l: l,
224222
}
225-
dialer := func(_ context.Context, address string) (net.Conn, error) {
226-
el := listeners[address]
227-
if el != nil {
228-
return el.Dial()
229-
}
230-
return net.Dial("tcp", address)
223+
return ms, []grpc.DialOption{dialOpt}
224+
}
225+
226+
func createInMemoryListeners(dServers []discovery.Server) (map[string]*bufconn.Listener, grpc.DialOption) {
227+
addrs := make([]string, 0, len(dServers))
228+
for _, ds := range dServers {
229+
addrs = append(addrs, ds.ResolvedAddress)
231230
}
232-
return ms, []grpc.DialOption{grpc.WithContextDialer(dialer)}
231+
return test.CreateInMemoryListeners(addrs)
233232
}
234233

235234
func newMockServer(t *testing.T) *mockServer {

pkg/experiment/metastore/test/create.go

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package test
33
import (
44
"context"
55
"fmt"
6-
"net"
76
"testing"
87
"time"
98

@@ -32,24 +31,20 @@ import (
3231
func NewMetastoreSet(t *testing.T, cfg *metastore.Config, n int, bucket objstore.Bucket) MetastoreSet {
3332
l := test.NewTestingLogger(t)
3433

35-
ports, err := test.GetFreePorts(2 * n)
36-
addresses := make([]string, 2*n)
37-
for i, port := range ports {
38-
addresses[i] = fmt.Sprintf("localhost:%d", port)
39-
}
40-
grpcAddresses := addresses[:n]
41-
raftAddresses := addresses[n:]
34+
grpcAddresses := make([]string, n)
35+
raftAddresses := make([]string, n)
4236
raftIds := make([]string, n)
37+
bootstrapPeers := make([]string, n)
4338
for i := 0; i < n; i++ {
39+
grpcAddresses[i] = fmt.Sprintf("localhost:%d", 10500+i)
40+
raftAddresses[i] = fmt.Sprintf("localhost:%d", 10500+2*i)
4441
raftIds[i] = fmt.Sprintf("node-%d", i)
42+
bootstrapPeers[i] = fmt.Sprintf("%s/%s", raftAddresses[i], raftIds[i])
4543
}
46-
bootstrapPeers := make([]string, n)
47-
configs := make([]metastore.Config, n)
48-
servers := make([]discovery.Server, n)
44+
l.Log("grpcAddresses", fmt.Sprintf("%+v", grpcAddresses), "raftAddresses", fmt.Sprintf("%+v", raftAddresses))
4945

46+
configs := make([]metastore.Config, n)
5047
for i := 0; i < n; i++ {
51-
bootstrapPeers[i] = fmt.Sprintf("%s/%s", raftAddresses[i], raftIds[i])
52-
5348
icfg := *cfg
5449
icfg.MinReadyDuration = 0
5550
icfg.Address = grpcAddresses[i]
@@ -60,30 +55,35 @@ func NewMetastoreSet(t *testing.T, cfg *metastore.Config, n int, bucket objstore
6055
icfg.Raft.BindAddress = raftAddresses[i]
6156
icfg.Raft.BootstrapPeers = bootstrapPeers
6257
icfg.Raft.BootstrapExpectPeers = n
58+
configs[i] = icfg
59+
}
60+
61+
servers := make([]discovery.Server, n)
62+
for i := 0; i < n; i++ {
6363
srv := discovery.Server{
6464
Raft: raft.Server{
6565
ID: raft.ServerID(raftIds[i]),
6666
Address: raft.ServerAddress(raftAddresses[i]),
6767
},
68-
ResolvedAddress: addresses[i],
68+
ResolvedAddress: grpcAddresses[i],
6969
}
7070
servers[i] = srv
71-
configs[i] = icfg
7271
}
73-
require.NoError(t, err)
7472

73+
listeners, dialOpt := test.CreateInMemoryListeners(grpcAddresses)
7574
d := MockStaticDiscovery(t, servers)
76-
client := metastoreclient.New(l, cfg.GRPCClientConfig, d)
77-
err = client.Service().StartAsync(context.Background())
75+
client := metastoreclient.New(l, cfg.GRPCClientConfig, d, dialOpt)
76+
err := client.Service().StartAsync(context.Background())
7877
require.NoError(t, err)
7978

80-
l.Log("grpcAddresses", fmt.Sprintf("%+v", grpcAddresses), "raftAddresses", fmt.Sprintf("%+v", raftAddresses))
8179
res := MetastoreSet{
8280
t: t,
8381
}
82+
8483
for i := 0; i < n; i++ {
8584
options, err := cfg.GRPCClientConfig.DialOption(nil, nil)
8685
require.NoError(t, err)
86+
options = append(options, dialOpt)
8787
cc, err := grpc.Dial(grpcAddresses[i], options...)
8888
require.NoError(t, err)
8989
logger := log.With(l, "idx", bootstrapPeers[i])
@@ -100,8 +100,7 @@ func NewMetastoreSet(t *testing.T, cfg *metastore.Config, n int, bucket objstore
100100
require.NoError(t, err)
101101
m.Register(server)
102102

103-
lis, err := net.Listen("tcp", grpcAddresses[i])
104-
assert.NoError(t, err)
103+
lis := listeners[grpcAddresses[i]]
105104
go func() {
106105
err := server.Serve(lis)
107106
assert.NoError(t, err)

pkg/experiment/query_backend/client/client_test.go

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"context"
55
"flag"
66
"fmt"
7-
"net"
87
"testing"
98
"time"
109

@@ -14,7 +13,6 @@ import (
1413
"golang.org/x/sync/errgroup"
1514
"google.golang.org/grpc"
1615
"google.golang.org/grpc/resolver"
17-
"google.golang.org/grpc/test/bufconn"
1816

1917
metastorev1 "github.com/grafana/pyroscope/api/gen/proto/go/metastore/v1"
2018
queryv1 "github.com/grafana/pyroscope/api/gen/proto/go/query/v1"
@@ -83,28 +81,20 @@ func (r *multiResolver) Close() {}
8381
// actual network I/O.
8482
func Test_Concurrency(t *testing.T) {
8583
addresses := make([]string, 0, nServers)
86-
listeners := make(map[string]*bufconn.Listener)
87-
88-
// Create a separate bufconn listener to be used by each server setup below.
8984
for i := 0; i < nServers; i++ {
9085
address := fmt.Sprintf("localhost:%d", 10004+i)
9186
addresses = append(addresses, address)
92-
listeners[address] = bufconn.Listen(256 << 10)
93-
}
94-
// In-memory dialer for the client dials the appropriate bufconn listener.
95-
dialer := func(_ context.Context, address string) (net.Conn, error) {
96-
listener := listeners[address]
97-
require.NotNil(t, listener)
98-
return listener.Dial()
9987
}
10088

89+
listeners, dialOpt := test.CreateInMemoryListeners(addresses)
90+
10191
grpcClientCfg := grpcclient.Config{}
10292
grpcClientCfg.RegisterFlags(flag.NewFlagSet("", flag.PanicOnError))
10393

10494
resolver.Register(&multiResolverBuilder{targets: addresses})
10595
backendAddress := "multi:///"
10696

107-
cl, err := New(backendAddress, grpcClientCfg, grpc.WithContextDialer(dialer))
97+
cl, err := New(backendAddress, grpcClientCfg, dialOpt)
10898
require.NoError(t, err)
10999

110100
for i := 0; i < nServers; i++ {

pkg/test/in_memory_listeners.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package test
2+
3+
import (
4+
"context"
5+
"net"
6+
7+
"google.golang.org/grpc"
8+
"google.golang.org/grpc/test/bufconn"
9+
)
10+
11+
// Create in-memory listeners at given addresses.
12+
// Also returns gRPC dial option for a client to connect to the appropriate in-memory listener
13+
// for a given address.
14+
func CreateInMemoryListeners(addresses []string) (map[string]*bufconn.Listener, grpc.DialOption) {
15+
listeners := make(map[string]*bufconn.Listener)
16+
for _, a := range addresses {
17+
el := bufconn.Listen(256 << 10)
18+
listeners[a] = el
19+
}
20+
dialer := func(_ context.Context, address string) (net.Conn, error) {
21+
el := listeners[address]
22+
if el != nil {
23+
return el.Dial()
24+
}
25+
return net.Dial("tcp", address)
26+
}
27+
return listeners, grpc.WithContextDialer(dialer)
28+
}

pkg/test/integration/helper.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ import (
1717
"testing"
1818
"time"
1919

20-
"github.com/grafana/pyroscope/pkg/test"
21-
2220
"connectrpc.com/connect"
2321
"github.com/prometheus/client_golang/prometheus"
2422
"github.com/stretchr/testify/assert"
@@ -109,7 +107,7 @@ func (p *PyroscopeTest) start(t *testing.T) {
109107
}
110108

111109
func (p *PyroscopeTest) Configure(t *testing.T, v2 bool) *PyroscopeTest {
112-
ports, err := test.GetFreePorts(4)
110+
ports, err := GetFreePorts(4)
113111
require.NoError(t, err)
114112
p.httpPort = ports[0]
115113
p.memberlistPort = ports[1]

pkg/test/ports.go renamed to pkg/test/integration/ports.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1-
package test
1+
package integration
22

33
import "net"
44

5-
// GetFreePorts returns a number of free local port for the tests to listen on. Note this will make sure the returned ports do not overlap, by stopping to listen once all ports are allocated
5+
// GetFreePorts returns a number of free local port for the tests to listen on.
6+
// This will make sure the returned ports do not overlap, by stopping to listen once all ports are allocated
7+
//
8+
// Note: This function should only be used in integration tests.
9+
// Use in-memory network connections in unittests.
610
func GetFreePorts(len int) (ports []int, err error) {
711
ports = make([]int, len)
812
for i := 0; i < len; i++ {

0 commit comments

Comments
 (0)