Skip to content

Commit c7e2c00

Browse files
committed
Use bufconn in end2end tests.
1 parent 9a71c79 commit c7e2c00

File tree

1 file changed

+37
-25
lines changed

1 file changed

+37
-25
lines changed

test/end2end_test.go

Lines changed: 37 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ import (
5353
"google.golang.org/grpc/peer"
5454
"google.golang.org/grpc/status"
5555
"google.golang.org/grpc/tap"
56+
"google.golang.org/grpc/test/bufconn"
5657
testpb "google.golang.org/grpc/test/grpc_testing"
5758
)
5859

@@ -354,7 +355,7 @@ const tlsDir = "testdata/"
354355

355356
type env struct {
356357
name string
357-
network string // The type of network such as tcp, unix, etc.
358+
network string // The type of network such as tcp, unix, bufconn, etc.
358359
security string // The security protocol such as TLS, SSH, etc.
359360
httpHandler bool // whether to use the http.Handler ServerTransport; requires TLS
360361
balancer bool // whether to use balancer
@@ -367,21 +368,19 @@ func (e env) runnable() bool {
367368
return true
368369
}
369370

370-
func (e env) dialer(addr string, timeout time.Duration) (net.Conn, error) {
371-
return net.DialTimeout(e.network, addr, timeout)
372-
}
371+
const bufconnNetwork = "bufconn"
373372

374373
var (
375374
tcpClearEnv = env{name: "tcp-clear", network: "tcp", balancer: true}
376375
tcpTLSEnv = env{name: "tcp-tls", network: "tcp", security: "tls", balancer: true}
377376
unixClearEnv = env{name: "unix-clear", network: "unix", balancer: true}
378377
unixTLSEnv = env{name: "unix-tls", network: "unix", security: "tls", balancer: true}
379-
handlerEnv = env{name: "handler-tls", network: "tcp", security: "tls", httpHandler: true, balancer: true}
380-
noBalancerEnv = env{name: "no-balancer", network: "tcp", security: "tls", balancer: false}
378+
handlerEnv = env{name: "handler-tls", network: bufconnNetwork, security: "tls", httpHandler: true, balancer: true}
379+
noBalancerEnv = env{name: "no-balancer", network: bufconnNetwork, security: "tls", balancer: false}
381380
allEnv = []env{tcpClearEnv, tcpTLSEnv, unixClearEnv, unixTLSEnv, handlerEnv, noBalancerEnv}
382381
)
383382

384-
var onlyEnv = flag.String("only_env", "", "If non-empty, one of 'tcp-clear', 'tcp-tls', 'unix-clear', 'unix-tls', or 'handler-tls' to only run the tests for that environment. Empty means all.")
383+
var onlyEnv = flag.String("only_env", "", "Restrict tests to the named environment. Empty means all.")
385384

386385
func listTestEnv() (envs []env) {
387386
if *onlyEnv != "" {
@@ -442,6 +441,7 @@ type test struct {
442441
// srv and srvAddr are set once startServer is called.
443442
srv *grpc.Server
444443
srvAddr string
444+
lis net.Listener
445445

446446
cc *grpc.ClientConn // nil until requested via clientConn
447447
restoreLogs func() // nil unless declareLogNoise is used
@@ -523,7 +523,12 @@ func (te *test) startServer(ts testpb.TestServiceServer) {
523523
la = "/tmp/testsock" + fmt.Sprintf("%d", time.Now().UnixNano())
524524
syscall.Unlink(la)
525525
}
526-
lis, err := net.Listen(te.e.network, la)
526+
var err error
527+
if te.e.network == bufconnNetwork {
528+
te.lis = bufconn.Listen(1024 * 1024)
529+
} else {
530+
te.lis, err = net.Listen(te.e.network, la)
531+
}
527532
if err != nil {
528533
te.t.Fatalf("Failed to listen: %v", err)
529534
}
@@ -556,24 +561,36 @@ func (te *test) startServer(ts testpb.TestServiceServer) {
556561
addr := la
557562
switch te.e.network {
558563
case "unix":
564+
case "bufconn":
565+
addr = te.lis.Addr().String()
559566
default:
560-
_, port, err := net.SplitHostPort(lis.Addr().String())
567+
_, port, err := net.SplitHostPort(te.lis.Addr().String())
561568
if err != nil {
562569
te.t.Fatalf("Failed to parse listener address: %v", err)
563570
}
564571
addr = "localhost:" + port
565572
}
566573

567-
go s.Serve(lis)
574+
go s.Serve(te.lis)
568575
te.srvAddr = addr
569576
}
570577

578+
func (te *test) dialer(addr string, timeout time.Duration) (net.Conn, error) {
579+
if te.lis == nil {
580+
return nil, fmt.Errorf("no listener")
581+
}
582+
if te.e.network == bufconnNetwork {
583+
return te.lis.(*bufconn.Listener).Dial()
584+
}
585+
return net.DialTimeout(te.e.network, addr, timeout)
586+
}
587+
571588
func (te *test) clientConn() *grpc.ClientConn {
572589
if te.cc != nil {
573590
return te.cc
574591
}
575592
opts := []grpc.DialOption{
576-
grpc.WithDialer(te.e.dialer),
593+
grpc.WithDialer(te.dialer),
577594
grpc.WithUserAgent(te.userAgent),
578595
}
579596

@@ -644,7 +661,7 @@ func (te *test) declareLogNoise(phrases ...string) {
644661
}
645662

646663
func (te *test) withServerTester(fn func(st *serverTester)) {
647-
c, err := te.e.dialer(te.srvAddr, 10*time.Second)
664+
c, err := te.dialer(te.srvAddr, 10*time.Second)
648665
if err != nil {
649666
te.t.Fatal(err)
650667
}
@@ -1089,7 +1106,7 @@ func testFailFast(t *testing.T, e env) {
10891106
if grpc.Code(err) == codes.Unavailable {
10901107
break
10911108
}
1092-
fmt.Printf("%v.EmptyCall(_, _) = _, %v", tc, err)
1109+
t.Logf("%v.EmptyCall(_, _) = _, %v", tc, err)
10931110
time.Sleep(10 * time.Millisecond)
10941111
}
10951112
// The client keeps reconnecting and ongoing fail-fast RPCs should fail with code.Unavailable.
@@ -2222,7 +2239,8 @@ func testPeerClientSide(t *testing.T, e env) {
22222239
t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, <nil>", err)
22232240
}
22242241
pa := peer.Addr.String()
2225-
if e.network == "unix" {
2242+
switch e.network {
2243+
case "unix", "bufconn":
22262244
if pa != te.srvAddr {
22272245
t.Fatalf("peer.Addr = %v, want %v", pa, te.srvAddr)
22282246
}
@@ -3968,12 +3986,8 @@ func TestDialWithBlockErrorOnBadCertificates(t *testing.T) {
39683986
te.startServer(&testServer{security: te.e.security})
39693987
defer te.tearDown()
39703988

3971-
var (
3972-
err error
3973-
opts []grpc.DialOption
3974-
)
3975-
opts = append(opts, grpc.WithTransportCredentials(clientAlwaysFailCred{}), grpc.WithBlock())
3976-
te.cc, err = grpc.Dial(te.srvAddr, opts...)
3989+
var err error
3990+
te.cc, err = grpc.Dial(te.srvAddr, grpc.WithTransportCredentials(clientAlwaysFailCred{}), grpc.WithBlock(), grpc.WithDialer(te.dialer))
39773991
if err != errClientAlwaysFailCred {
39783992
te.t.Fatalf("Dial(%q) = %v, want %v", te.srvAddr, err, errClientAlwaysFailCred)
39793993
}
@@ -4435,18 +4449,16 @@ func (ss *stubServer) FullDuplexCall(stream testpb.TestService_FullDuplexCallSer
44354449

44364450
// Start starts the server and creates a client connected to it.
44374451
func (ss *stubServer) Start() error {
4438-
lis, err := net.Listen("tcp", "localhost:0")
4439-
if err != nil {
4440-
return fmt.Errorf(`net.Listen("tcp", "localhost:0") = %v`, err)
4441-
}
4452+
lis := bufconn.Listen(1024 * 1024)
4453+
dialer := func(string, time.Duration) (net.Conn, error) { return lis.Dial() }
44424454
ss.cleanups = append(ss.cleanups, func() { lis.Close() })
44434455

44444456
s := grpc.NewServer()
44454457
testpb.RegisterTestServiceServer(s, ss)
44464458
go s.Serve(lis)
44474459
ss.cleanups = append(ss.cleanups, s.Stop)
44484460

4449-
cc, err := grpc.Dial(lis.Addr().String(), grpc.WithInsecure(), grpc.WithBlock())
4461+
cc, err := grpc.Dial(lis.Addr().String(), grpc.WithInsecure(), grpc.WithBlock(), grpc.WithDialer(dialer))
44504462
if err != nil {
44514463
return fmt.Errorf("grpc.Dial(%q) = %v", lis.Addr().String(), err)
44524464
}

0 commit comments

Comments
 (0)