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)
| 289 | // matches the dataplane authority. Verifies that the resolver returns the |
| 290 | // correct error. |
| 291 | func (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 |
nothing calls this directly
no test coverage detected