@@ -27,10 +27,12 @@ import (
2727 "testing"
2828 "time"
2929
30+ iampb "cloud.google.com/go/iam/apiv1/iampb"
3031 "cloud.google.com/go/internal/testutil"
3132 pb "cloud.google.com/go/pubsub/apiv1/pubsubpb"
3233 "google.golang.org/grpc"
3334 "google.golang.org/grpc/codes"
35+ "google.golang.org/grpc/credentials/insecure"
3436 "google.golang.org/grpc/status"
3537 "google.golang.org/protobuf/types/known/durationpb"
3638 field_mask "google.golang.org/protobuf/types/known/fieldmaskpb"
@@ -62,6 +64,47 @@ func TestNewServerWithPort(t *testing.T) {
6264 defer conn .Close ()
6365}
6466
67+ func TestNewServerWithCallback (t * testing.T ) {
68+ // Allocate an available port to use with NewServerWithPort and then close it so it's available.
69+ // Note: There is no guarantee that the port does not become used between closing
70+ // the listener and creating the new server with NewServerWithPort, but the chances are
71+ // very small.
72+ l , err := net .Listen ("tcp" , ":0" )
73+ if err != nil {
74+ t .Fatal (err )
75+ }
76+ port := l .Addr ().(* net.TCPAddr ).Port
77+ l .Close ()
78+
79+ additionalFake := struct {
80+ iampb.UnimplementedIAMPolicyServer
81+ }{}
82+
83+ verifyCallback := false
84+ callback := func (grpc * grpc.Server ) {
85+ // register something
86+ iampb .RegisterIAMPolicyServer (grpc , & additionalFake )
87+ verifyCallback = true
88+ }
89+
90+ // Pass a non 0 port to demonstrate we can pass a hardcoded port for the server to listen on
91+ srv := NewServerWithCallback (port , callback )
92+ if err != nil {
93+ t .Fatal (err )
94+ }
95+ defer srv .Close ()
96+
97+ conn , err := grpc .NewClient (srv .Addr , grpc .WithTransportCredentials (insecure .NewCredentials ()))
98+ if err != nil {
99+ t .Fatal (err )
100+ }
101+ defer conn .Close ()
102+
103+ if ! verifyCallback {
104+ t .Fatal ("callback was not invoked" )
105+ }
106+ }
107+
65108func TestTopics (t * testing.T ) {
66109 pclient , sclient , server , cleanup := newFake (context .TODO (), t )
67110 defer cleanup ()
0 commit comments