github.com/google/fleetspeak@v0.1.15-0.20240426164851-4f31f62c1aea/fleetspeak/src/server/grpcservice/service_test.go (about) 1 // Copyright 2017 Google Inc. 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 // https://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 package grpcservice 16 17 import ( 18 "context" 19 "net" 20 "testing" 21 22 log "github.com/golang/glog" 23 24 "google.golang.org/grpc" 25 "google.golang.org/grpc/credentials/insecure" 26 27 "github.com/google/fleetspeak/fleetspeak/src/common/anypbtest" 28 "github.com/google/fleetspeak/fleetspeak/src/server/sertesting" 29 "github.com/google/fleetspeak/fleetspeak/src/server/service" 30 31 fspb "github.com/google/fleetspeak/fleetspeak/src/common/proto/fleetspeak" 32 ggrpc "github.com/google/fleetspeak/fleetspeak/src/server/grpcservice/proto/fleetspeak_grpcservice" 33 gpb "github.com/google/fleetspeak/fleetspeak/src/server/grpcservice/proto/fleetspeak_grpcservice" 34 spb "github.com/google/fleetspeak/fleetspeak/src/server/proto/fleetspeak_server" 35 ) 36 37 type trivialProcessorServer struct { 38 ggrpc.UnimplementedProcessorServer 39 40 msgs chan *fspb.Message 41 } 42 43 func (s *trivialProcessorServer) Process(ctx context.Context, m *fspb.Message) (*fspb.EmptyMessage, error) { 44 s.msgs <- m 45 return &fspb.EmptyMessage{}, nil 46 } 47 48 func startServer() (msgs <-chan *fspb.Message, addr string, fin func()) { 49 s := trivialProcessorServer{ 50 msgs: make(chan *fspb.Message, 1), 51 } 52 l, err := net.Listen("tcp", "localhost:") 53 if err != nil { 54 log.Fatal(err) 55 } 56 57 gs := grpc.NewServer() 58 ggrpc.RegisterProcessorServer(gs, &s) 59 go gs.Serve(l) 60 61 return s.msgs, l.Addr().String(), gs.Stop 62 } 63 64 func TestNewUpdate(t *testing.T) { 65 msgs1, addr1, fin1 := startServer() 66 defer fin1() 67 68 con1, err := grpc.DialContext(context.Background(), addr1, grpc.WithTransportCredentials(insecure.NewCredentials())) 69 if err != nil { 70 t.Fatal(err) 71 } 72 svc := NewGRPCService(con1) 73 sctx := sertesting.FakeContext{} 74 svc.Start(&sctx) 75 defer svc.Stop() 76 77 if err := svc.ProcessMessage(context.Background(), &fspb.Message{ 78 MessageType: "Test Message 1", 79 }); err != nil { 80 t.Errorf("ProcessMessages returned error: %v", err) 81 } 82 m := <-msgs1 83 if m.MessageType != "Test Message 1" { 84 t.Errorf("Expected Test Message 1, got: %v", m) 85 } 86 87 // setting a nil should cause temp errors 88 svc.Update(nil) 89 if err := svc.ProcessMessage(context.Background(), &fspb.Message{ 90 MessageType: "Test Message 2", 91 }); err == nil || !service.IsTemporary(err) { 92 t.Errorf("Expected TemporaryError from ProcessMessages, got: %v", err) 93 } 94 95 msgs2, addr2, fin2 := startServer() 96 defer fin2() 97 con2, err := grpc.DialContext(context.Background(), addr2, grpc.WithTransportCredentials(insecure.NewCredentials())) 98 if err != nil { 99 t.Fatal(err) 100 } 101 svc.Update(con2) 102 103 if err := svc.ProcessMessage(context.Background(), &fspb.Message{ 104 MessageType: "Test Message 3", 105 }); err != nil { 106 t.Errorf("ProcessMessages returned error: %v", err) 107 } 108 m = <-msgs2 109 if m.MessageType != "Test Message 3" { 110 t.Errorf("Expected Test Message 3, got: %v", m) 111 } 112 113 // Should be fine to Stop when con is nil. 114 svc.Update(nil) 115 } 116 117 func TestFactory(t *testing.T) { 118 msgs, addr, fin := startServer() 119 defer fin() 120 121 svc, err := Factory(&spb.ServiceConfig{ 122 Config: anypbtest.New(t, &gpb.Config{ 123 Target: addr, 124 Insecure: true, 125 }), 126 }) 127 if err != nil { 128 t.Fatalf("Unable to create service: %v", err) 129 } 130 131 sctx := sertesting.FakeContext{} 132 svc.Start(&sctx) 133 134 if err := svc.ProcessMessage(context.Background(), &fspb.Message{ 135 MessageType: "Test Message", 136 }); err != nil { 137 t.Errorf("ProcessMessages returned error: %v", err) 138 } 139 svc.Stop() 140 141 m := <-msgs 142 if m.MessageType != "Test Message" { 143 t.Errorf("Expected Test Message, got: %v", m) 144 } 145 }