MCPcopy
hub / github.com/grpc/grpc-go / TestNoMatchingVirtualHost

Method TestNoMatchingVirtualHost

internal/xds/resolver/xds_resolver_test.go:291–341  ·  view source on GitHub ↗

Tests the case where there is no virtual host in the route configuration matches the dataplane authority. Verifies that the resolver returns the correct error.

(t *testing.T)

Source from the content-addressed store, hash-verified

289// matches the dataplane authority. Verifies that the resolver returns the
290// correct error.
291func (s) TestNoMatchingVirtualHost(t *testing.T) {
292 // Spin up an xDS management server for the test.
293 ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout)
294 defer cancel()
295 nodeID := uuid.New().String()
296 mgmtServer, _, _, bc := setupManagementServerForTest(t, nodeID)
297
298 // Configure route resource with no virtual host so that it does not match the authority.
299 listener := e2e.DefaultClientListener(defaultTestServiceName, defaultTestRouteConfigName)
300 route := e2e.DefaultRouteConfig(defaultTestRouteConfigName, defaultTestServiceName, defaultTestClusterName)
301 route.VirtualHosts = nil
302 configureResources(ctx, t, mgmtServer, nodeID, []*v3listenerpb.Listener{listener}, []*v3routepb.RouteConfiguration{route}, nil, nil)
303
304 // Build the resolver inline (duplicating buildResolverForTarget internals)
305 // to avoid issues with blocked channel writes when NACKs occur.
306 target := resolver.Target{URL: *testutils.MustParseURL("xds:///" + defaultTestServiceName)}
307
308 // Create an xDS resolver with the provided bootstrap configuration.
309 builder, err := internal.NewXDSResolverWithConfigForTesting.(func([]byte) (resolver.Builder, error))(bc)
310 if err != nil {
311 t.Fatalf("Failed to create xDS resolver for testing: %v", err)
312 }
313
314 errCh := testutils.NewChannel()
315 tcc := &testutils.ResolverClientConn{Logger: t, ReportErrorF: func(err error) { errCh.Replace(err) }}
316 r, err := builder.Build(target, tcc, resolver.BuildOptions{
317 Authority: url.PathEscape(target.Endpoint()),
318 })
319 if err != nil {
320 t.Fatalf("Failed to build xDS resolver for target %q: %v", target, err)
321 }
322 defer r.Close()
323
324 // Wait for and verify the error update from the resolver.
325 // Since the resource is not cached, it should be received as resource error.
326 select {
327 case <-ctx.Done():
328 t.Fatalf("Timeout waiting for error to be propagated to the ClientConn")
329 case gotErr := <-errCh.C:
330 if gotErr == nil {
331 t.Fatalf("got nil error from resolver, want error containing 'could not find VirtualHost'")
332 }
333 errStr := fmt.Sprint(gotErr)
334 if !strings.Contains(errStr, fmt.Sprintf("could not find VirtualHost for %q", defaultTestServiceName)) {
335 t.Fatalf("got error from resolver %q, want error containing 'could not find VirtualHost for %q'", errStr, defaultTestServiceName)
336 }
337 if !strings.Contains(errStr, nodeID) {
338 t.Fatalf("got error from resolver %q, want nodeID %q", errStr, nodeID)
339 }
340 }
341}
342
343// Tests the case where a resource, not present in cache, returned by the
344// management server is NACKed by the xDS client, which then returns an update

Callers

nothing calls this directly

Calls 11

ReplaceMethod · 0.95
EndpointMethod · 0.95
MustParseURLFunction · 0.92
NewChannelFunction · 0.92
configureResourcesFunction · 0.85
StringMethod · 0.65
FatalfMethod · 0.65
BuildMethod · 0.65
CloseMethod · 0.65
DoneMethod · 0.45

Tested by

no test coverage detected