github.com/google/cloudprober@v0.11.3/servers/grpc/grpc_test.go (about) 1 // Copyright 2018 The Cloudprober Authors. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 // Unit tests for grpc server. 16 package grpc 17 18 import ( 19 "context" 20 "errors" 21 "net" 22 "reflect" 23 "sync" 24 "testing" 25 "time" 26 27 "github.com/golang/protobuf/proto" 28 "github.com/google/cloudprober/config/runconfig" 29 "github.com/google/cloudprober/logger" 30 configpb "github.com/google/cloudprober/servers/grpc/proto" 31 grpcpb "github.com/google/cloudprober/servers/grpc/proto" 32 spb "github.com/google/cloudprober/servers/grpc/proto" 33 "google.golang.org/grpc" 34 ) 35 36 var once sync.Once 37 38 // globalGRPCServer sets up runconfig and returns a gRPC server. 39 func globalGRPCServer() (*grpc.Server, error) { 40 var err error 41 once.Do(func() { 42 err = runconfig.SetDefaultGRPCServer(grpc.NewServer()) 43 }) 44 if err != nil { 45 return nil, err 46 } 47 srv := runconfig.DefaultGRPCServer() 48 if srv == nil { 49 return nil, errors.New("runconfig gRPC server not setup properly") 50 } 51 return srv, nil 52 } 53 54 func TestGRPCSuccess(t *testing.T) { 55 ctx, cancel := context.WithCancel(context.Background()) 56 defer cancel() 57 58 // global config setup is necessary for gRPC probe server. 59 if _, err := globalGRPCServer(); err != nil { 60 t.Fatalf("Error initializing global config: %v", err) 61 } 62 cfg := &configpb.ServerConf{ 63 Port: proto.Int32(0), 64 } 65 l := &logger.Logger{} 66 67 srv, err := New(ctx, cfg, l) 68 if err != nil { 69 t.Fatalf("Unable to create grpc server: %v", err) 70 } 71 go srv.Start(ctx, nil) 72 if !srv.dedicatedSrv { 73 t.Error("Probe server not using dedicated gRPC server.") 74 } 75 76 listenAddr := srv.ln.Addr().String() 77 conn, err := grpc.Dial(listenAddr, grpc.WithInsecure()) 78 if err != nil { 79 t.Fatalf("Unable to connect to grpc server at %v: %v", listenAddr, err) 80 } 81 82 client := grpcpb.NewProberClient(conn) 83 timedCtx, timedCancel := context.WithTimeout(ctx, time.Second) 84 defer timedCancel() 85 sReq := &spb.StatusRequest{} 86 sResp, err := client.ServerStatus(timedCtx, sReq) 87 if err != nil { 88 t.Errorf("ServerStatus call error: %v", err) 89 } 90 t.Logf("Uptime: %v", sResp.GetUptimeUs()) 91 if sResp.GetUptimeUs() == 0 { 92 t.Error("Uptime not being incremented.") 93 } 94 95 timedCtx, timedCancel = context.WithTimeout(ctx, time.Second) 96 defer timedCancel() 97 msg := []byte("test message") 98 echoReq := &spb.EchoMessage{Blob: msg} 99 echoResp, err := client.Echo(timedCtx, echoReq) 100 if err != nil { 101 t.Errorf("Echo call error: %v", err) 102 } 103 t.Logf("EchoResponse: <%v>", string(echoResp.Blob)) 104 if !reflect.DeepEqual(echoResp.Blob, echoReq.Blob) { 105 t.Errorf("Echo response mismatch: got %v want %v", echoResp.Blob, echoReq.Blob) 106 } 107 108 wantReadSize := 4 109 readReq := &spb.BlobReadRequest{Size: proto.Int32(int32(wantReadSize))} 110 readResp, err := client.BlobRead(timedCtx, readReq) 111 if err != nil { 112 t.Errorf("Read call error: %v", err) 113 } 114 t.Logf("ReadResponse: <%v>", readResp) 115 readSize := len(readResp.GetBlob()) 116 if readSize != wantReadSize { 117 t.Errorf("Read response mismatch: got %v want %v", readSize, wantReadSize) 118 } 119 120 msg = []byte("test_write") 121 writeReq := &spb.BlobWriteRequest{Blob: msg} 122 writeResp, err := client.BlobWrite(timedCtx, writeReq) 123 if err != nil { 124 t.Errorf("Write call error: %v", err) 125 } 126 t.Logf("WriteResponse: <%v>", writeResp) 127 if writeResp.GetSize() != int32(len(msg)) { 128 t.Errorf("Write response mismatch: got %v want %v", writeResp.GetSize(), len(msg)) 129 } 130 } 131 132 func TestInjection(t *testing.T) { 133 ctx, cancel := context.WithCancel(context.Background()) 134 defer cancel() 135 136 grpcSrv, err := globalGRPCServer() 137 if err != nil { 138 t.Fatalf("Error getting global gRPC server: %v", err) 139 } 140 cfg := &configpb.ServerConf{ 141 Port: proto.Int32(0), 142 UseDedicatedServer: proto.Bool(false), 143 } 144 l := &logger.Logger{} 145 146 ln, err := net.Listen("tcp", ":0") 147 if err != nil { 148 t.Fatalf("Unable to open socket for listening: %v", err) 149 } 150 defer ln.Close() 151 152 if _, err = New(ctx, cfg, l); err != nil { 153 t.Fatalf("Error creating gRPC probe server: %v", err) 154 } 155 go grpcSrv.Serve(ln) 156 time.Sleep(time.Second) 157 158 listenAddr := ln.Addr().String() 159 conn, err := grpc.Dial(listenAddr, grpc.WithInsecure()) 160 if err != nil { 161 t.Fatalf("Unable to connect to grpc server at %v: %v", listenAddr, err) 162 } 163 164 client := grpcpb.NewProberClient(conn) 165 timedCtx, timedCancel := context.WithTimeout(ctx, time.Second) 166 defer timedCancel() 167 sReq := &spb.StatusRequest{} 168 sResp, err := client.ServerStatus(timedCtx, sReq) 169 if err != nil { 170 t.Errorf("ServerStatus call error: %v", err) 171 } 172 t.Logf("Uptime: %v", sResp.GetUptimeUs()) 173 if sResp.GetUptimeUs() == 0 { 174 t.Error("Uptime not being incremented.") 175 } 176 } 177 178 func TestInjectionOverride(t *testing.T) { 179 ctx, cancel := context.WithCancel(context.Background()) 180 defer cancel() 181 182 grpcSrv, err := globalGRPCServer() 183 if err != nil { 184 t.Fatalf("Error getting global gRPC server: %v", err) 185 } 186 cfg := &configpb.ServerConf{ 187 Port: proto.Int32(0), 188 } 189 l := &logger.Logger{} 190 191 srv, err := New(ctx, cfg, l) 192 if err != nil { 193 t.Fatalf("Error creating gRPC probe server: %v", err) 194 } 195 if srv.grpcSrv == grpcSrv { 196 t.Error("Probe server not using dedicated gRPC server.") 197 } 198 if !srv.dedicatedSrv { 199 t.Error("Got dedicatedSrv=false, want true.") 200 } 201 } 202 203 func TestSizeError(t *testing.T) { 204 ctx, cancel := context.WithCancel(context.Background()) 205 defer cancel() 206 207 // global config setup is necessary for gRPC probe server. 208 if _, err := globalGRPCServer(); err != nil { 209 t.Fatalf("Error initializing global config: %v", err) 210 } 211 cfg := &configpb.ServerConf{ 212 Port: proto.Int32(0), 213 } 214 l := &logger.Logger{} 215 216 srv, err := New(ctx, cfg, l) 217 if err != nil { 218 t.Fatalf("Unable to create grpc server: %v", err) 219 } 220 go srv.Start(ctx, nil) 221 if !srv.dedicatedSrv { 222 t.Error("Probe server not using dedicated gRPC server.") 223 } 224 225 listenAddr := srv.ln.Addr().String() 226 conn, err := grpc.Dial(listenAddr, grpc.WithInsecure()) 227 if err != nil { 228 t.Fatalf("Unable to connect to grpc server at %v: %v", listenAddr, err) 229 } 230 231 client := grpcpb.NewProberClient(conn) 232 timedCtx, timedCancel := context.WithTimeout(ctx, time.Second) 233 defer timedCancel() 234 235 readReq := &spb.BlobReadRequest{Size: proto.Int32(int32(maxMsgSize + 1))} 236 readResp, err := client.BlobRead(timedCtx, readReq) 237 if err == nil { 238 t.Errorf("Read call unexpectedly succeeded: %v", readResp) 239 } 240 241 writeReq := &spb.BlobWriteRequest{Blob: make([]byte, maxMsgSize+1)} 242 writeResp, err := client.BlobWrite(timedCtx, writeReq) 243 if err == nil { 244 t.Errorf("Write call unexpectedly succeeded: %v", writeResp) 245 } 246 247 }