1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
package cache_test
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"google.golang.org/protobuf/encoding/protojson"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/types/known/anypb"
route "github.com/envoyproxy/go-control-plane/envoy/config/route/v3"
discovery "github.com/envoyproxy/go-control-plane/envoy/service/discovery/v3"
"github.com/envoyproxy/go-control-plane/pkg/cache/types"
"github.com/envoyproxy/go-control-plane/pkg/cache/v3"
"github.com/envoyproxy/go-control-plane/pkg/resource/v3"
)
const (
resourceName = "route1"
)
func TestResponseGetDiscoveryResponse(t *testing.T) {
routes := []types.ResourceWithTTL{{Resource: &route.RouteConfiguration{Name: resourceName}}}
resp := cache.RawResponse{
Request: &discovery.DiscoveryRequest{TypeUrl: resource.RouteType},
Version: "v",
Resources: routes,
}
discoveryResponse, err := resp.GetDiscoveryResponse()
require.NoError(t, err)
assert.Equal(t, discoveryResponse.GetVersionInfo(), resp.Version)
assert.Len(t, discoveryResponse.GetResources(), 1)
cachedResponse, err := resp.GetDiscoveryResponse()
require.NoError(t, err)
assert.Same(t, discoveryResponse, cachedResponse)
r := &route.RouteConfiguration{}
err = anypb.UnmarshalTo(discoveryResponse.GetResources()[0], r, proto.UnmarshalOptions{})
require.NoError(t, err)
assert.Equal(t, resourceName, r.GetName())
}
func TestPassthroughResponseGetDiscoveryResponse(t *testing.T) {
routes := []types.Resource{&route.RouteConfiguration{Name: resourceName}}
rsrc, err := anypb.New(routes[0])
require.NoError(t, err)
dr := &discovery.DiscoveryResponse{
TypeUrl: resource.RouteType,
Resources: []*anypb.Any{rsrc},
VersionInfo: "v",
}
resp := cache.PassthroughResponse{
Request: &discovery.DiscoveryRequest{TypeUrl: resource.RouteType},
DiscoveryResponse: dr,
}
discoveryResponse, err := resp.GetDiscoveryResponse()
require.NoError(t, err)
assert.Equal(t, "v", discoveryResponse.GetVersionInfo())
assert.Len(t, discoveryResponse.GetResources(), 1)
r := &route.RouteConfiguration{}
err = anypb.UnmarshalTo(discoveryResponse.GetResources()[0], r, proto.UnmarshalOptions{})
require.NoError(t, err)
assert.Equal(t, resourceName, r.GetName())
assert.Equal(t, discoveryResponse, dr)
}
func TestHeartbeatResponseGetDiscoveryResponse(t *testing.T) {
routes := []types.ResourceWithTTL{{Resource: &route.RouteConfiguration{Name: resourceName}}}
resp := cache.RawResponse{
Request: &discovery.DiscoveryRequest{TypeUrl: resource.RouteType},
Version: "v",
Resources: routes,
Heartbeat: true,
}
discoveryResponse, err := resp.GetDiscoveryResponse()
require.NoError(t, err)
assert.Equal(t, discoveryResponse.GetVersionInfo(), resp.Version)
require.Len(t, discoveryResponse.GetResources(), 1)
assert.False(t, isTTLResource(discoveryResponse.GetResources()[0]))
cachedResponse, err := resp.GetDiscoveryResponse()
require.NoError(t, err)
assert.Same(t, discoveryResponse, cachedResponse)
r := &route.RouteConfiguration{}
err = anypb.UnmarshalTo(discoveryResponse.GetResources()[0], r, proto.UnmarshalOptions{})
require.NoError(t, err)
assert.Equal(t, resourceName, r.GetName())
}
func isTTLResource(resource *anypb.Any) bool {
wrappedResource := &discovery.Resource{}
err := protojson.Unmarshal(resource.GetValue(), wrappedResource)
if err != nil {
return false
}
return wrappedResource.GetResource() == nil
}
|