gitee.com/zhaochuninhefei/gmgo@v0.0.31-0.20240209061119-069254a02979/go-control-plane/pkg/integration/ttl_integration_test.go (about) 1 package integration 2 3 import ( 4 "context" 5 "gitee.com/zhaochuninhefei/gmgo/grpc/credentials/insecure" 6 "net" 7 "testing" 8 "time" 9 10 "gitee.com/zhaochuninhefei/gmgo/grpc" 11 "github.com/stretchr/testify/assert" 12 13 envoyconfigcorev3 "gitee.com/zhaochuninhefei/gmgo/go-control-plane/envoy/config/core/v3" 14 envoyconfigendpointv3 "gitee.com/zhaochuninhefei/gmgo/go-control-plane/envoy/config/endpoint/v3" 15 envoyservicediscoveryv3 "gitee.com/zhaochuninhefei/gmgo/go-control-plane/envoy/service/discovery/v3" 16 endpointservice "gitee.com/zhaochuninhefei/gmgo/go-control-plane/envoy/service/endpoint/v3" 17 "gitee.com/zhaochuninhefei/gmgo/go-control-plane/pkg/cache/types" 18 "gitee.com/zhaochuninhefei/gmgo/go-control-plane/pkg/cache/v3" 19 "gitee.com/zhaochuninhefei/gmgo/go-control-plane/pkg/resource/v3" 20 "gitee.com/zhaochuninhefei/gmgo/go-control-plane/pkg/server/v3" 21 ) 22 23 type logger struct { 24 t *testing.T 25 } 26 27 func (log logger) Debugf(format string, args ...interface{}) { log.t.Logf(format, args...) } 28 func (log logger) Infof(format string, args ...interface{}) { log.t.Logf(format, args...) } 29 func (log logger) Warnf(format string, args ...interface{}) { log.t.Logf(format, args...) } 30 func (log logger) Errorf(format string, args ...interface{}) { log.t.Logf(format, args...) } 31 32 func TestTTLResponse(t *testing.T) { 33 34 ctx, cancel := context.WithCancel(context.Background()) 35 defer cancel() 36 37 snapshotCache := cache.NewSnapshotCacheWithHeartbeating(ctx, false, cache.IDHash{}, logger{t: t}, time.Second) 38 39 ttlServer := server.NewServer(ctx, snapshotCache, nil) 40 41 grpcServer := grpc.NewServer() 42 endpointservice.RegisterEndpointDiscoveryServiceServer(grpcServer, ttlServer) 43 44 l, err := net.Listen("tcp", ":9999") // nolint:gosec 45 assert.NoError(t, err) 46 47 go func() { 48 assert.NoError(t, grpcServer.Serve(l)) 49 }() 50 defer grpcServer.Stop() 51 52 // grpc.WithInsecure() is deprecated, use WithTransportCredentials and insecure.NewCredentials() instead. 53 //conn, err := grpc.Dial(":9999", grpc.WithInsecure()) 54 conn, err := grpc.Dial(":9999", grpc.WithTransportCredentials(insecure.NewCredentials())) 55 assert.NoError(t, err) 56 client := endpointservice.NewEndpointDiscoveryServiceClient(conn) 57 58 sclient, err := client.StreamEndpoints(ctx) 59 assert.NoError(t, err) 60 61 err = sclient.Send(&envoyservicediscoveryv3.DiscoveryRequest{ 62 Node: &envoyconfigcorev3.Node{ 63 Id: "test", 64 }, 65 ResourceNames: []string{"resource"}, 66 TypeUrl: resource.EndpointType, 67 }) 68 assert.NoError(t, err) 69 70 oneSecond := time.Second 71 cla := &envoyconfigendpointv3.ClusterLoadAssignment{ClusterName: "resource"} 72 snap, _ := cache.NewSnapshotWithTTLs("1", map[resource.Type][]types.ResourceWithTTL{ 73 resource.EndpointType: {{ 74 Resource: cla, 75 TTL: &oneSecond, 76 }}, 77 }) 78 err = snapshotCache.SetSnapshot(context.Background(), "test", snap) 79 assert.NoError(t, err) 80 81 timeout := time.NewTimer(5 * time.Second) 82 83 awaitResponse := func() *envoyservicediscoveryv3.DiscoveryResponse { 84 t.Helper() 85 doneCh := make(chan *envoyservicediscoveryv3.DiscoveryResponse) 86 go func() { 87 88 r, err := sclient.Recv() 89 assert.NoError(t, err) 90 91 doneCh <- r 92 }() 93 94 select { 95 case <-timeout.C: 96 assert.Fail(t, "timed out") 97 return nil 98 case r := <-doneCh: 99 return r 100 } 101 } 102 103 response := awaitResponse() 104 isFullResponseWithTTL(t, response) 105 106 err = sclient.Send(&envoyservicediscoveryv3.DiscoveryRequest{ 107 Node: &envoyconfigcorev3.Node{ 108 Id: "test", 109 }, 110 ResourceNames: []string{"resource"}, 111 TypeUrl: resource.EndpointType, 112 VersionInfo: "1", 113 ResponseNonce: response.Nonce, 114 }) 115 assert.NoError(t, err) 116 117 response = awaitResponse() 118 isHeartbeatResponseWithTTL(t, response) 119 } 120 121 func isFullResponseWithTTL(t *testing.T, response *envoyservicediscoveryv3.DiscoveryResponse) { 122 t.Helper() 123 124 assert.Len(t, response.Resources, 1) 125 r := response.Resources[0] 126 res := &envoyservicediscoveryv3.Resource{} 127 // ptypes.UnmarshalAny is deprecated, Call the any.UnmarshalTo method instead. 128 //err := ptypes.UnmarshalAny(r, res) 129 err := r.UnmarshalTo(res) 130 131 assert.NoError(t, err) 132 133 assert.NotNil(t, res.Ttl) 134 assert.NotNil(t, res.Resource) 135 } 136 137 func isHeartbeatResponseWithTTL(t *testing.T, response *envoyservicediscoveryv3.DiscoveryResponse) { 138 t.Helper() 139 140 assert.Len(t, response.Resources, 1) 141 r := response.Resources[0] 142 res := &envoyservicediscoveryv3.Resource{} 143 // ptypes.UnmarshalAny is deprecated, Call the any.UnmarshalTo method instead. 144 //err := ptypes.UnmarshalAny(r, res) 145 err := r.UnmarshalTo(res) 146 assert.NoError(t, err) 147 148 assert.NotNil(t, res.Ttl) 149 assert.Nil(t, res.Resource) 150 }