5858import java .io .InputStream ;
5959import java .util .ArrayDeque ;
6060import java .util .Deque ;
61- import java .util .concurrent .BlockingQueue ;
6261import java .util .concurrent .ExecutorService ;
6362import java .util .concurrent .Executors ;
64- import java .util .concurrent .LinkedBlockingQueue ;
6563import java .util .concurrent .ScheduledExecutorService ;
6664import java .util .concurrent .TimeUnit ;
6765import javax .annotation .Nullable ;
@@ -102,7 +100,7 @@ public final class BinderClientTransportTest {
102100
103101 AndroidComponentAddress serverAddress ;
104102 BinderTransport .BinderClientTransport transport ;
105- BlockingSecurityPolicy blockingSecurityPolicy = new BlockingSecurityPolicy ();
103+ SettableAsyncSecurityPolicy blockingSecurityPolicy = new SettableAsyncSecurityPolicy ();
106104
107105 private final ObjectPool <ScheduledExecutorService > executorServicePool =
108106 new FixedObjectPool <>(Executors .newScheduledThreadPool (1 ));
@@ -170,6 +168,11 @@ public BinderClientTransportBuilder setReadyTimeoutMillis(int timeoutMillis) {
170168 return this ;
171169 }
172170
171+ public BinderClientTransportBuilder setPreAuthorizeServer (boolean preAuthorizeServer ) {
172+ factoryBuilder .setPreAuthorizeServers (preAuthorizeServer );
173+ return this ;
174+ }
175+
173176 public BinderTransport .BinderClientTransport build () {
174177 return factoryBuilder
175178 .buildClientTransportFactory ()
@@ -179,7 +182,7 @@ public BinderTransport.BinderClientTransport build() {
179182
180183 @ After
181184 public void tearDown () throws Exception {
182- blockingSecurityPolicy .provideNextCheckAuthorizationResult (Status .ABORTED );
185+ blockingSecurityPolicy .setAuthorizationResult (Status .ABORTED );
183186 transport .shutdownNow (Status .OK );
184187 HostServices .awaitServiceShutdown ();
185188 shutdownAndTerminate (executorServicePool .getObject ());
@@ -285,16 +288,16 @@ public void testMessageProducerClosedAfterStream_b169313545() throws Exception {
285288 @ Test
286289 public void testNewStreamBeforeTransportReadyFails () throws Exception {
287290 // Use a special SecurityPolicy that lets us act before the transport is setup/ready.
288- transport =
289- new BinderClientTransportBuilder ().setSecurityPolicy (blockingSecurityPolicy ).build ();
291+ SettableAsyncSecurityPolicy securityPolicy = new SettableAsyncSecurityPolicy ();
292+ transport = new BinderClientTransportBuilder ().setSecurityPolicy (securityPolicy ).build ();
290293 transport .start (transportListener ).run ();
291294 ClientStream stream =
292295 transport .newStream (streamingMethodDesc , new Metadata (), CallOptions .DEFAULT , tracers );
293296 stream .start (streamListener );
294297 assertThat (streamListener .awaitClose ().getCode ()).isEqualTo (Code .INTERNAL );
295298
296299 // Unblock the SETUP_TRANSPORT handshake and make sure it becomes ready in the usual way.
297- blockingSecurityPolicy . provideNextCheckAuthorizationResult (Status .OK );
300+ securityPolicy . setAuthorizationResult (Status .OK );
298301 transportListener .awaitReady ();
299302 }
300303
@@ -370,24 +373,60 @@ public void testBlackHoleEndpointConnectTimeout() throws Exception {
370373 }
371374
372375 @ Test
373- public void testBlackHoleSecurityPolicyConnectTimeout () throws Exception {
376+ public void testBlackHoleSecurityPolicyAuthTimeout () throws Exception {
377+ transport =
378+ new BinderClientTransportBuilder ()
379+ .setSecurityPolicy (blockingSecurityPolicy )
380+ .setPreAuthorizeServer (false )
381+ .setReadyTimeoutMillis (1_234 )
382+ .build ();
383+ transport .start (transportListener ).run ();
384+ Status transportStatus = transportListener .awaitShutdown ();
385+ assertThat (transportStatus .getCode ()).isEqualTo (Code .DEADLINE_EXCEEDED );
386+ assertThat (transportStatus .getDescription ()).contains ("1234" );
387+ transportListener .awaitTermination ();
388+ }
389+
390+ @ Test
391+ public void testBlackHoleSecurityPolicyPreAuthTimeout () throws Exception {
374392 transport =
375393 new BinderClientTransportBuilder ()
376394 .setSecurityPolicy (blockingSecurityPolicy )
395+ .setPreAuthorizeServer (true )
377396 .setReadyTimeoutMillis (1_234 )
378397 .build ();
379398 transport .start (transportListener ).run ();
380399 Status transportStatus = transportListener .awaitShutdown ();
381400 assertThat (transportStatus .getCode ()).isEqualTo (Code .DEADLINE_EXCEEDED );
382401 assertThat (transportStatus .getDescription ()).contains ("1234" );
383402 transportListener .awaitTermination ();
384- blockingSecurityPolicy .provideNextCheckAuthorizationResult (Status .OK );
385403 }
386404
387405 @ Test
388- public void testAsyncSecurityPolicyFailure () throws Exception {
406+ public void testAsyncSecurityPolicyAuthFailure () throws Exception {
389407 SettableAsyncSecurityPolicy securityPolicy = new SettableAsyncSecurityPolicy ();
390- transport = new BinderClientTransportBuilder ().setSecurityPolicy (securityPolicy ).build ();
408+ transport =
409+ new BinderClientTransportBuilder ()
410+ .setPreAuthorizeServer (false )
411+ .setSecurityPolicy (securityPolicy )
412+ .build ();
413+ RuntimeException exception = new NullPointerException ();
414+ securityPolicy .setAuthorizationException (exception );
415+ transport .start (transportListener ).run ();
416+ Status transportStatus = transportListener .awaitShutdown ();
417+ assertThat (transportStatus .getCode ()).isEqualTo (Code .INTERNAL );
418+ assertThat (transportStatus .getCause ()).isEqualTo (exception );
419+ transportListener .awaitTermination ();
420+ }
421+
422+ @ Test
423+ public void testAsyncSecurityPolicyPreAuthFailure () throws Exception {
424+ SettableAsyncSecurityPolicy securityPolicy = new SettableAsyncSecurityPolicy ();
425+ transport =
426+ new BinderClientTransportBuilder ()
427+ .setPreAuthorizeServer (true )
428+ .setSecurityPolicy (securityPolicy )
429+ .build ();
391430 RuntimeException exception = new NullPointerException ();
392431 securityPolicy .setAuthorizationException (exception );
393432 transport .start (transportListener ).run ();
@@ -400,11 +439,32 @@ public void testAsyncSecurityPolicyFailure() throws Exception {
400439 @ Test
401440 public void testAsyncSecurityPolicySuccess () throws Exception {
402441 SettableAsyncSecurityPolicy securityPolicy = new SettableAsyncSecurityPolicy ();
403- transport = new BinderClientTransportBuilder ().setSecurityPolicy (securityPolicy ).build ();
404- securityPolicy .setAuthorizationResult (Status .PERMISSION_DENIED );
442+ transport =
443+ new BinderClientTransportBuilder ()
444+ .setPreAuthorizeServer (false )
445+ .setSecurityPolicy (securityPolicy )
446+ .build ();
447+ securityPolicy .setAuthorizationResult (Status .PERMISSION_DENIED .withDescription ("xyzzy" ));
448+ transport .start (transportListener ).run ();
449+ Status transportStatus = transportListener .awaitShutdown ();
450+ assertThat (transportStatus .getCode ()).isEqualTo (Code .PERMISSION_DENIED );
451+ assertThat (transportStatus .getDescription ()).contains ("xyzzy" );
452+ transportListener .awaitTermination ();
453+ }
454+
455+ @ Test
456+ public void testAsyncSecurityPolicyPreAuthSuccess () throws Exception {
457+ SettableAsyncSecurityPolicy securityPolicy = new SettableAsyncSecurityPolicy ();
458+ transport =
459+ new BinderClientTransportBuilder ()
460+ .setPreAuthorizeServer (true )
461+ .setSecurityPolicy (securityPolicy )
462+ .build ();
463+ securityPolicy .setAuthorizationResult (Status .PERMISSION_DENIED .withDescription ("xyzzy" ));
405464 transport .start (transportListener ).run ();
406465 Status transportStatus = transportListener .awaitShutdown ();
407466 assertThat (transportStatus .getCode ()).isEqualTo (Code .PERMISSION_DENIED );
467+ assertThat (transportStatus .getDescription ()).contains ("xyzzy" );
408468 transportListener .awaitTermination ();
409469 }
410470
@@ -548,26 +608,6 @@ public synchronized void closed(Status status, RpcProgress rpcProgress, Metadata
548608 }
549609 }
550610
551- /**
552- * A SecurityPolicy that blocks the transport authorization check until a test sets the outcome.
553- */
554- static class BlockingSecurityPolicy extends SecurityPolicy {
555- private final BlockingQueue <Status > results = new LinkedBlockingQueue <>();
556-
557- public void provideNextCheckAuthorizationResult (Status status ) {
558- results .add (status );
559- }
560-
561- @ Override
562- public Status checkAuthorization (int uid ) {
563- try {
564- return results .take ();
565- } catch (InterruptedException e ) {
566- return Status .fromThrowable (e );
567- }
568- }
569- }
570-
571611 /** An AsyncSecurityPolicy that lets a test specify the outcome of checkAuthorizationAsync(). */
572612 static class SettableAsyncSecurityPolicy extends AsyncSecurityPolicy {
573613 private SettableFuture <Status > result = SettableFuture .create ();
0 commit comments