2222import static org .robolectric .Shadows .shadowOf ;
2323
2424import android .app .Application ;
25- import android .content .ComponentName ;
2625import androidx .test .core .app .ApplicationProvider ;
2726import com .google .common .util .concurrent .Futures ;
2827import com .google .common .util .concurrent .ListenableFuture ;
@@ -58,13 +57,57 @@ public final class RobolectricBinderSecurityTest {
5857 private static final String SERVICE_NAME = "fake_service" ;
5958 private static final String FULL_METHOD_NAME = "fake_service/fake_method" ;
6059 private final Application context = ApplicationProvider .getApplicationContext ();
61- private AndroidComponentAddress listenAddress ;
60+ private final ArrayBlockingQueue <SettableFuture <Status >> statusesToSet =
61+ new ArrayBlockingQueue <>(128 );
6262 private ManagedChannel channel ;
63+ private Server server ;
6364
6465 @ Before
6566 public void setUp () {
66- listenAddress =
67+ AndroidComponentAddress listenAddress =
6768 AndroidComponentAddress .forRemoteComponent (context .getPackageName (), "HostService" );
69+
70+ MethodDescriptor <Empty , Empty > methodDesc = getMethodDescriptor ();
71+ ServerCallHandler <Empty , Empty > callHandler =
72+ ServerCalls .asyncUnaryCall (
73+ (req , respObserver ) -> {
74+ respObserver .onNext (req );
75+ respObserver .onCompleted ();
76+ });
77+ ServerMethodDefinition <Empty , Empty > methodDef =
78+ ServerMethodDefinition .create (methodDesc , callHandler );
79+ ServerServiceDefinition def =
80+ ServerServiceDefinition .builder (SERVICE_NAME ).addMethod (methodDef ).build ();
81+
82+ IBinderReceiver binderReceiver = new IBinderReceiver ();
83+ server =
84+ BinderServerBuilder .forAddress (listenAddress , binderReceiver )
85+ .addService (def )
86+ .securityPolicy (
87+ ServerSecurityPolicy .newBuilder ()
88+ .servicePolicy (
89+ SERVICE_NAME ,
90+ new AsyncSecurityPolicy () {
91+ @ Override
92+ public ListenableFuture <Status > checkAuthorizationAsync (int uid ) {
93+ SettableFuture <Status > status = SettableFuture .create ();
94+ statusesToSet .add (status );
95+ return status ;
96+ }
97+ })
98+ .build ())
99+ .build ();
100+ try {
101+ server .start ();
102+ } catch (IOException e ) {
103+ throw new IllegalStateException (e );
104+ }
105+
106+ shadowOf (context )
107+ .setComponentNameAndServiceForBindServiceForIntent (
108+ listenAddress .asBindIntent (),
109+ listenAddress .getComponent (),
110+ checkNotNull (binderReceiver .get ()));
68111 channel =
69112 BinderChannelBuilder .forAddress (listenAddress , context )
70113 .build ();
@@ -73,6 +116,7 @@ public void setUp() {
73116 @ After
74117 public void tearDown () {
75118 channel .shutdownNow ();
119+ server .shutdownNow ();
76120 }
77121
78122 @ Test
@@ -121,57 +165,4 @@ private static MethodDescriptor<Empty, Empty> getMethodDescriptor() {
121165 .setSampledToLocalTracing (true )
122166 .build ();
123167 }
124-
125- private final IBinderReceiver binderReceiver = new IBinderReceiver ();
126- private final ArrayBlockingQueue <SettableFuture <Status >> statusesToSet =
127- new ArrayBlockingQueue <>(128 );
128- private Server server ;
129-
130- @ Before
131- public void setupServer () {
132- MethodDescriptor <Empty , Empty > methodDesc = getMethodDescriptor ();
133- ServerCallHandler <Empty , Empty > callHandler =
134- ServerCalls .asyncUnaryCall (
135- (req , respObserver ) -> {
136- respObserver .onNext (req );
137- respObserver .onCompleted ();
138- });
139- ServerMethodDefinition <Empty , Empty > methodDef =
140- ServerMethodDefinition .create (methodDesc , callHandler );
141- ServerServiceDefinition def =
142- ServerServiceDefinition .builder (SERVICE_NAME ).addMethod (methodDef ).build ();
143-
144- server =
145- BinderServerBuilder .forAddress (listenAddress , binderReceiver )
146- .addService (def )
147- .securityPolicy (
148- ServerSecurityPolicy .newBuilder ()
149- .servicePolicy (
150- SERVICE_NAME ,
151- new AsyncSecurityPolicy () {
152- @ Override
153- public ListenableFuture <Status > checkAuthorizationAsync (int uid ) {
154- SettableFuture <Status > status = SettableFuture .create ();
155- statusesToSet .add (status );
156- return status ;
157- }
158- })
159- .build ())
160- .build ();
161- try {
162- server .start ();
163- } catch (IOException e ) {
164- throw new IllegalStateException (e );
165- }
166-
167- ComponentName componentName = new ComponentName (context , "SomeService" );
168- shadowOf (context )
169- .setComponentNameAndServiceForBindService (
170- componentName , checkNotNull (binderReceiver .get ()));
171- }
172-
173- @ After
174- public void tearDownServer () {
175- server .shutdownNow ();
176- }
177168}
0 commit comments