@@ -53,6 +53,7 @@ import (
53
53
"google.golang.org/grpc/peer"
54
54
"google.golang.org/grpc/status"
55
55
"google.golang.org/grpc/tap"
56
+ "google.golang.org/grpc/test/bufconn"
56
57
testpb "google.golang.org/grpc/test/grpc_testing"
57
58
)
58
59
@@ -354,7 +355,7 @@ const tlsDir = "testdata/"
354
355
355
356
type env struct {
356
357
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.
358
359
security string // The security protocol such as TLS, SSH, etc.
359
360
httpHandler bool // whether to use the http.Handler ServerTransport; requires TLS
360
361
balancer bool // whether to use balancer
@@ -367,21 +368,19 @@ func (e env) runnable() bool {
367
368
return true
368
369
}
369
370
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"
373
372
374
373
var (
375
374
tcpClearEnv = env {name : "tcp-clear" , network : "tcp" , balancer : true }
376
375
tcpTLSEnv = env {name : "tcp-tls" , network : "tcp" , security : "tls" , balancer : true }
377
376
unixClearEnv = env {name : "unix-clear" , network : "unix" , balancer : true }
378
377
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 }
381
380
allEnv = []env {tcpClearEnv , tcpTLSEnv , unixClearEnv , unixTLSEnv , handlerEnv , noBalancerEnv }
382
381
)
383
382
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." )
385
384
386
385
func listTestEnv () (envs []env ) {
387
386
if * onlyEnv != "" {
@@ -442,6 +441,7 @@ type test struct {
442
441
// srv and srvAddr are set once startServer is called.
443
442
srv * grpc.Server
444
443
srvAddr string
444
+ lis net.Listener
445
445
446
446
cc * grpc.ClientConn // nil until requested via clientConn
447
447
restoreLogs func () // nil unless declareLogNoise is used
@@ -523,7 +523,12 @@ func (te *test) startServer(ts testpb.TestServiceServer) {
523
523
la = "/tmp/testsock" + fmt .Sprintf ("%d" , time .Now ().UnixNano ())
524
524
syscall .Unlink (la )
525
525
}
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
+ }
527
532
if err != nil {
528
533
te .t .Fatalf ("Failed to listen: %v" , err )
529
534
}
@@ -556,24 +561,36 @@ func (te *test) startServer(ts testpb.TestServiceServer) {
556
561
addr := la
557
562
switch te .e .network {
558
563
case "unix" :
564
+ case "bufconn" :
565
+ addr = te .lis .Addr ().String ()
559
566
default :
560
- _ , port , err := net .SplitHostPort (lis .Addr ().String ())
567
+ _ , port , err := net .SplitHostPort (te . lis .Addr ().String ())
561
568
if err != nil {
562
569
te .t .Fatalf ("Failed to parse listener address: %v" , err )
563
570
}
564
571
addr = "localhost:" + port
565
572
}
566
573
567
- go s .Serve (lis )
574
+ go s .Serve (te . lis )
568
575
te .srvAddr = addr
569
576
}
570
577
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
+
571
588
func (te * test ) clientConn () * grpc.ClientConn {
572
589
if te .cc != nil {
573
590
return te .cc
574
591
}
575
592
opts := []grpc.DialOption {
576
- grpc .WithDialer (te .e . dialer ),
593
+ grpc .WithDialer (te .dialer ),
577
594
grpc .WithUserAgent (te .userAgent ),
578
595
}
579
596
@@ -644,7 +661,7 @@ func (te *test) declareLogNoise(phrases ...string) {
644
661
}
645
662
646
663
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 )
648
665
if err != nil {
649
666
te .t .Fatal (err )
650
667
}
@@ -1089,7 +1106,7 @@ func testFailFast(t *testing.T, e env) {
1089
1106
if grpc .Code (err ) == codes .Unavailable {
1090
1107
break
1091
1108
}
1092
- fmt . Printf ("%v.EmptyCall(_, _) = _, %v" , tc , err )
1109
+ t . Logf ("%v.EmptyCall(_, _) = _, %v" , tc , err )
1093
1110
time .Sleep (10 * time .Millisecond )
1094
1111
}
1095
1112
// 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) {
2222
2239
t .Fatalf ("TestService/EmptyCall(_, _) = _, %v, want _, <nil>" , err )
2223
2240
}
2224
2241
pa := peer .Addr .String ()
2225
- if e .network == "unix" {
2242
+ switch e .network {
2243
+ case "unix" , "bufconn" :
2226
2244
if pa != te .srvAddr {
2227
2245
t .Fatalf ("peer.Addr = %v, want %v" , pa , te .srvAddr )
2228
2246
}
@@ -3968,12 +3986,8 @@ func TestDialWithBlockErrorOnBadCertificates(t *testing.T) {
3968
3986
te .startServer (& testServer {security : te .e .security })
3969
3987
defer te .tearDown ()
3970
3988
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 ))
3977
3991
if err != errClientAlwaysFailCred {
3978
3992
te .t .Fatalf ("Dial(%q) = %v, want %v" , te .srvAddr , err , errClientAlwaysFailCred )
3979
3993
}
@@ -4435,18 +4449,16 @@ func (ss *stubServer) FullDuplexCall(stream testpb.TestService_FullDuplexCallSer
4435
4449
4436
4450
// Start starts the server and creates a client connected to it.
4437
4451
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 () }
4442
4454
ss .cleanups = append (ss .cleanups , func () { lis .Close () })
4443
4455
4444
4456
s := grpc .NewServer ()
4445
4457
testpb .RegisterTestServiceServer (s , ss )
4446
4458
go s .Serve (lis )
4447
4459
ss .cleanups = append (ss .cleanups , s .Stop )
4448
4460
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 ) )
4450
4462
if err != nil {
4451
4463
return fmt .Errorf ("grpc.Dial(%q) = %v" , lis .Addr ().String (), err )
4452
4464
}
0 commit comments