@@ -172,6 +172,12 @@ public BinderClientTransportBuilder setReadyTimeoutMillis(int timeoutMillis) {
172172 return this ;
173173 }
174174
175+ @ CanIgnoreReturnValue
176+ public BinderClientTransportBuilder setPreAuthorizeServer (boolean preAuthorizeServer ) {
177+ factoryBuilder .setPreAuthorizeServers (preAuthorizeServer );
178+ return this ;
179+ }
180+
175181 public BinderTransport .BinderClientTransport build () {
176182 return factoryBuilder
177183 .buildClientTransportFactory ()
@@ -372,11 +378,12 @@ public void testBlackHoleEndpointConnectTimeout() throws Exception {
372378 }
373379
374380 @ Test
375- public void testBlackHoleSecurityPolicyConnectTimeout () throws Exception {
381+ public void testBlackHoleSecurityPolicyAuthTimeout () throws Exception {
376382 SettableAsyncSecurityPolicy securityPolicy = new SettableAsyncSecurityPolicy ();
377383 transport =
378384 new BinderClientTransportBuilder ()
379385 .setSecurityPolicy (securityPolicy )
386+ .setPreAuthorizeServer (false )
380387 .setReadyTimeoutMillis (1_234 )
381388 .build ();
382389 transport .start (transportListener ).run ();
@@ -387,15 +394,39 @@ public void testBlackHoleSecurityPolicyConnectTimeout() throws Exception {
387394 assertThat (transportStatus .getCode ()).isEqualTo (Code .DEADLINE_EXCEEDED );
388395 assertThat (transportStatus .getDescription ()).contains ("1234" );
389396 transportListener .awaitTermination ();
390-
391397 // If the transport gave up waiting on auth, it should cancel its request.
392398 assertThat (authRequest .isCancelled ()).isTrue ();
393399 }
394400
395401 @ Test
396- public void testAsyncSecurityPolicyFailure () throws Exception {
402+ public void testBlackHoleSecurityPolicyPreAuthTimeout () throws Exception {
397403 SettableAsyncSecurityPolicy securityPolicy = new SettableAsyncSecurityPolicy ();
398- transport = new BinderClientTransportBuilder ().setSecurityPolicy (securityPolicy ).build ();
404+ transport =
405+ new BinderClientTransportBuilder ()
406+ .setSecurityPolicy (securityPolicy )
407+ .setPreAuthorizeServer (true )
408+ .setReadyTimeoutMillis (1_234 )
409+ .build ();
410+ transport .start (transportListener ).run ();
411+ // Take the next authRequest but don't respond to it, in order to trigger the ready timeout.
412+ AuthRequest preAuthRequest = securityPolicy .takeNextAuthRequest (TIMEOUT_SECONDS , SECONDS );
413+
414+ Status transportStatus = transportListener .awaitShutdown ();
415+ assertThat (transportStatus .getCode ()).isEqualTo (Code .DEADLINE_EXCEEDED );
416+ assertThat (transportStatus .getDescription ()).contains ("1234" );
417+ transportListener .awaitTermination ();
418+ // If the transport gave up waiting on auth, it should cancel its request.
419+ assertThat (preAuthRequest .isCancelled ()).isTrue ();
420+ }
421+
422+ @ Test
423+ public void testAsyncSecurityPolicyAuthFailure () throws Exception {
424+ SettableAsyncSecurityPolicy securityPolicy = new SettableAsyncSecurityPolicy ();
425+ transport =
426+ new BinderClientTransportBuilder ()
427+ .setPreAuthorizeServer (false )
428+ .setSecurityPolicy (securityPolicy )
429+ .build ();
399430 RuntimeException exception = new NullPointerException ();
400431 transport .start (transportListener ).run ();
401432 securityPolicy .takeNextAuthRequest (TIMEOUT_SECONDS , SECONDS ).setResult (exception );
@@ -406,15 +437,55 @@ public void testAsyncSecurityPolicyFailure() throws Exception {
406437 }
407438
408439 @ Test
409- public void testAsyncSecurityPolicySuccess () throws Exception {
440+ public void testAsyncSecurityPolicyPreAuthFailure () throws Exception {
410441 SettableAsyncSecurityPolicy securityPolicy = new SettableAsyncSecurityPolicy ();
411- transport = new BinderClientTransportBuilder ().setSecurityPolicy (securityPolicy ).build ();
442+ transport =
443+ new BinderClientTransportBuilder ()
444+ .setPreAuthorizeServer (true )
445+ .setSecurityPolicy (securityPolicy )
446+ .build ();
447+ RuntimeException exception = new NullPointerException ();
448+ transport .start (transportListener ).run ();
449+ securityPolicy .takeNextAuthRequest (TIMEOUT_SECONDS , SECONDS ).setResult (exception );
450+ Status transportStatus = transportListener .awaitShutdown ();
451+ assertThat (transportStatus .getCode ()).isEqualTo (Code .INTERNAL );
452+ assertThat (transportStatus .getCause ()).isEqualTo (exception );
453+ transportListener .awaitTermination ();
454+ }
455+
456+ @ Test
457+ public void testAsyncSecurityPolicyAuthSuccess () throws Exception {
458+ SettableAsyncSecurityPolicy securityPolicy = new SettableAsyncSecurityPolicy ();
459+ transport =
460+ new BinderClientTransportBuilder ()
461+ .setPreAuthorizeServer (false )
462+ .setSecurityPolicy (securityPolicy )
463+ .build ();
464+ transport .start (transportListener ).run ();
465+ securityPolicy
466+ .takeNextAuthRequest (TIMEOUT_SECONDS , SECONDS )
467+ .setResult (Status .PERMISSION_DENIED .withDescription ("xyzzy" ));
468+ Status transportStatus = transportListener .awaitShutdown ();
469+ assertThat (transportStatus .getCode ()).isEqualTo (Code .PERMISSION_DENIED );
470+ assertThat (transportStatus .getDescription ()).contains ("xyzzy" );
471+ transportListener .awaitTermination ();
472+ }
473+
474+ @ Test
475+ public void testAsyncSecurityPolicyPreAuthSuccess () throws Exception {
476+ SettableAsyncSecurityPolicy securityPolicy = new SettableAsyncSecurityPolicy ();
477+ transport =
478+ new BinderClientTransportBuilder ()
479+ .setPreAuthorizeServer (true )
480+ .setSecurityPolicy (securityPolicy )
481+ .build ();
412482 transport .start (transportListener ).run ();
413483 securityPolicy
414484 .takeNextAuthRequest (TIMEOUT_SECONDS , SECONDS )
415- .setResult (Status .PERMISSION_DENIED );
485+ .setResult (Status .PERMISSION_DENIED . withDescription ( "xyzzy" ) );
416486 Status transportStatus = transportListener .awaitShutdown ();
417487 assertThat (transportStatus .getCode ()).isEqualTo (Code .PERMISSION_DENIED );
488+ assertThat (transportStatus .getDescription ()).contains ("xyzzy" );
418489 transportListener .awaitTermination ();
419490 }
420491
0 commit comments