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  }