1 /*
2 * Copyright (C) 2022, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 //! Test Rust service for the AIDL compiler.
18
19 use aidl_test_fixedsizearray::aidl::android::aidl::fixedsizearray::FixedSizeArrayExample::{
20 IRepeatFixedSizeArray, IntParcelable::IntParcelable,
21 };
22 use aidl_test_interface::aidl::android::aidl::tests::nested::{
23 INestedService, ParcelableWithNested,
24 };
25 use aidl_test_interface::aidl::android::aidl::tests::ITestService::{
26 self, BnTestService, BpTestService, Empty::Empty,
27 };
28 use aidl_test_interface::aidl::android::aidl::tests::{
29 extension::ExtendableParcelable::ExtendableParcelable, extension::MyExt::MyExt,
30 BackendType::BackendType, ByteEnum::ByteEnum, CircularParcelable::CircularParcelable,
31 ConstantExpressionEnum::ConstantExpressionEnum, ICircular, INamedCallback, INewName, IOldName,
32 IntEnum::IntEnum, LongEnum::LongEnum, RecursiveList::RecursiveList, StructuredParcelable,
33 Union,
34 };
35 use aidl_test_interface::binder::{
36 self, BinderFeatures, Interface, ParcelFileDescriptor, SpIBinder,
37 };
38 use aidl_test_versioned_interface::aidl::android::aidl::versioned::tests::{
39 BazUnion::BazUnion, Foo::Foo, IFooInterface, IFooInterface::BnFooInterface,
40 IFooInterface::BpFooInterface,
41 };
42 use aidl_test_vintf_parcelable::aidl::android::aidl::tests::vintf::VintfExtendableParcelable::VintfExtendableParcelable;
43 use android_aidl_test_trunk::aidl::android::aidl::test::trunk::{
44 ITrunkStableTest, ITrunkStableTest::BnTrunkStableTest, ITrunkStableTest::BpTrunkStableTest,
45 ITrunkStableTest::IMyCallback, ITrunkStableTest::MyEnum::MyEnum,
46 ITrunkStableTest::MyOtherParcelable::MyOtherParcelable,
47 ITrunkStableTest::MyParcelable::MyParcelable, ITrunkStableTest::MyUnion::MyUnion,
48 };
49 use binder_tokio::Tokio;
50 use simple_parcelable::SimpleParcelable;
51 use std::collections::HashMap;
52 use std::sync::Mutex;
53
54 use async_trait::async_trait;
55
dup_fd(fd: &ParcelFileDescriptor) -> ParcelFileDescriptor56 fn dup_fd(fd: &ParcelFileDescriptor) -> ParcelFileDescriptor {
57 ParcelFileDescriptor::new(fd.as_ref().try_clone().unwrap())
58 }
59
60 struct NamedCallback(String);
61
62 impl Interface for NamedCallback {}
63
64 #[async_trait]
65 impl INamedCallback::INamedCallbackAsyncServer for NamedCallback {
GetName(&self) -> binder::Result<String>66 async fn GetName(&self) -> binder::Result<String> {
67 Ok(self.0.clone())
68 }
69 }
70
71 struct OldName;
72
73 impl Interface for OldName {}
74
75 #[async_trait]
76 impl IOldName::IOldNameAsyncServer for OldName {
RealName(&self) -> binder::Result<String>77 async fn RealName(&self) -> binder::Result<String> {
78 Ok("OldName".into())
79 }
80 }
81
82 #[derive(Debug, Default)]
83 struct NewName;
84
85 impl Interface for NewName {}
86
87 #[async_trait]
88 impl INewName::INewNameAsyncServer for NewName {
RealName(&self) -> binder::Result<String>89 async fn RealName(&self) -> binder::Result<String> {
90 Ok("NewName".into())
91 }
92 }
93
94 #[derive(Debug, Default)]
95 struct Circular;
96
97 impl Interface for Circular {}
98
99 #[async_trait]
100 impl ICircular::ICircularAsyncServer for Circular {
GetTestService( &self, ) -> binder::Result<Option<binder::Strong<dyn ITestService::ITestService>>>101 async fn GetTestService(
102 &self,
103 ) -> binder::Result<Option<binder::Strong<dyn ITestService::ITestService>>> {
104 Ok(None)
105 }
106 }
107
108 #[derive(Default)]
109 struct TestService {
110 service_map: Mutex<HashMap<String, binder::Strong<dyn INamedCallback::INamedCallback>>>,
111 }
112
113 impl Interface for TestService {}
114
115 // Macros are expanded in the wrong order, so async_trait does not apply to
116 // functions defined by declarative macros.
117
118 type BoxFuture<'a, T> = std::pin::Pin<Box<dyn std::future::Future<Output = T> + Send + 'a>>;
119
120 macro_rules! impl_repeat {
121 ($repeat_name:ident, $type:ty) => {
122 fn $repeat_name<'a, 'b>(&'a self, token: $type) -> BoxFuture<'b, binder::Result<$type>>
123 where
124 'a: 'b,
125 Self: 'b,
126 {
127 Box::pin(async move { Ok(token) })
128 }
129 };
130 }
131
132 macro_rules! impl_reverse {
133 ($reverse_name:ident, $type:ty) => {
134 fn $reverse_name<'a, 'b, 'c, 'd>(
135 &'a self,
136 input: &'b [$type],
137 repeated: &'c mut Vec<$type>,
138 ) -> BoxFuture<'d, binder::Result<Vec<$type>>>
139 where
140 'a: 'd,
141 'b: 'd,
142 'c: 'd,
143 Self: 'd,
144 {
145 Box::pin(async move {
146 repeated.clear();
147 repeated.extend_from_slice(input);
148 Ok(input.iter().rev().cloned().collect())
149 })
150 }
151 };
152 }
153
154 macro_rules! impl_repeat_reverse {
155 ($repeat_name:ident, $reverse_name:ident, $type:ty) => {
156 impl_repeat! {$repeat_name, $type}
157 impl_reverse! {$reverse_name, $type}
158 };
159 }
160
161 macro_rules! impl_repeat_nullable {
162 ($repeat_nullable_name:ident, $type:ty) => {
163 fn $repeat_nullable_name<'a, 'b, 'c>(
164 &'a self,
165 input: Option<&'b [$type]>,
166 ) -> BoxFuture<'c, binder::Result<Option<Vec<$type>>>>
167 where
168 'a: 'c,
169 'b: 'c,
170 Self: 'c,
171 {
172 Box::pin(async move { Ok(input.map(<[$type]>::to_vec)) })
173 }
174 };
175 }
176
177 #[async_trait]
178 impl ITestService::ITestServiceAsyncServer for TestService {
179 impl_repeat! {RepeatByte, i8}
180 impl_reverse! {ReverseByte, u8}
181
UnimplementedMethod(&self, _: i32) -> binder::Result<i32>182 async fn UnimplementedMethod(&self, _: i32) -> binder::Result<i32> {
183 // Pretend this method hasn't been implemented
184 Err(binder::StatusCode::UNKNOWN_TRANSACTION.into())
185 }
186
TestOneway(&self) -> binder::Result<()>187 async fn TestOneway(&self) -> binder::Result<()> {
188 Err(binder::StatusCode::UNKNOWN_ERROR.into())
189 }
190
Deprecated(&self) -> binder::Result<()>191 async fn Deprecated(&self) -> binder::Result<()> {
192 Ok(())
193 }
194
195 impl_repeat_reverse! {RepeatBoolean, ReverseBoolean, bool}
196 impl_repeat_reverse! {RepeatChar, ReverseChar, u16}
197 impl_repeat_reverse! {RepeatInt, ReverseInt, i32}
198 impl_repeat_reverse! {RepeatLong, ReverseLong, i64}
199 impl_repeat_reverse! {RepeatFloat, ReverseFloat, f32}
200 impl_repeat_reverse! {RepeatDouble, ReverseDouble, f64}
201 impl_repeat_reverse! {RepeatByteEnum, ReverseByteEnum, ByteEnum}
202 impl_repeat_reverse! {RepeatIntEnum, ReverseIntEnum, IntEnum}
203 impl_repeat_reverse! {RepeatLongEnum, ReverseLongEnum, LongEnum}
204 impl_reverse! {ReverseString, String}
205 impl_reverse! {ReverseStringList, String}
206 impl_reverse! {ReverseUtf8CppString, String}
207
RepeatString(&self, input: &str) -> binder::Result<String>208 async fn RepeatString(&self, input: &str) -> binder::Result<String> {
209 Ok(input.into())
210 }
211
RepeatUtf8CppString(&self, input: &str) -> binder::Result<String>212 async fn RepeatUtf8CppString(&self, input: &str) -> binder::Result<String> {
213 Ok(input.into())
214 }
215
GetOtherTestService( &self, name: &str, ) -> binder::Result<binder::Strong<dyn INamedCallback::INamedCallback>>216 async fn GetOtherTestService(
217 &self,
218 name: &str,
219 ) -> binder::Result<binder::Strong<dyn INamedCallback::INamedCallback>> {
220 let mut service_map = self.service_map.lock().unwrap();
221 let other_service = service_map.entry(name.into()).or_insert_with(|| {
222 let named_callback = NamedCallback(name.into());
223 INamedCallback::BnNamedCallback::new_async_binder(
224 named_callback,
225 rt(),
226 BinderFeatures::default(),
227 )
228 });
229 Ok(other_service.to_owned())
230 }
231
SetOtherTestService( &self, name: &str, service: &binder::Strong<dyn INamedCallback::INamedCallback>, ) -> binder::Result<bool>232 async fn SetOtherTestService(
233 &self,
234 name: &str,
235 service: &binder::Strong<dyn INamedCallback::INamedCallback>,
236 ) -> binder::Result<bool> {
237 let mut service_map = self.service_map.lock().unwrap();
238 if let Some(existing_service) = service_map.get(name) {
239 if existing_service == service {
240 return Ok(true);
241 }
242 }
243 service_map.insert(name.into(), service.clone());
244 Ok(false)
245 }
246
VerifyName( &self, service: &binder::Strong<dyn INamedCallback::INamedCallback>, name: &str, ) -> binder::Result<bool>247 async fn VerifyName(
248 &self,
249 service: &binder::Strong<dyn INamedCallback::INamedCallback>,
250 name: &str,
251 ) -> binder::Result<bool> {
252 service.clone().into_async::<Tokio>().GetName().await.map(|found_name| found_name == name)
253 }
254
GetInterfaceArray( &self, names: &[String], ) -> binder::Result<Vec<binder::Strong<dyn INamedCallback::INamedCallback>>>255 async fn GetInterfaceArray(
256 &self,
257 names: &[String],
258 ) -> binder::Result<Vec<binder::Strong<dyn INamedCallback::INamedCallback>>> {
259 let mut res = Vec::new();
260 for name in names {
261 res.push(self.GetOtherTestService(name).await?);
262 }
263 Ok(res)
264 }
265
VerifyNamesWithInterfaceArray( &self, services: &[binder::Strong<dyn INamedCallback::INamedCallback>], names: &[String], ) -> binder::Result<bool>266 async fn VerifyNamesWithInterfaceArray(
267 &self,
268 services: &[binder::Strong<dyn INamedCallback::INamedCallback>],
269 names: &[String],
270 ) -> binder::Result<bool> {
271 if services.len() == names.len() {
272 for (s, n) in services.iter().zip(names) {
273 if !self.VerifyName(s, n).await? {
274 return Ok(false);
275 }
276 }
277 Ok(true)
278 } else {
279 Ok(false)
280 }
281 }
282
GetNullableInterfaceArray( &self, names: Option<&[Option<String>]>, ) -> binder::Result<Option<Vec<Option<binder::Strong<dyn INamedCallback::INamedCallback>>>>>283 async fn GetNullableInterfaceArray(
284 &self,
285 names: Option<&[Option<String>]>,
286 ) -> binder::Result<Option<Vec<Option<binder::Strong<dyn INamedCallback::INamedCallback>>>>>
287 {
288 if let Some(names) = names {
289 let mut services = vec![];
290 for name in names {
291 if let Some(name) = name {
292 services.push(Some(self.GetOtherTestService(name).await?));
293 } else {
294 services.push(None);
295 }
296 }
297 Ok(Some(services))
298 } else {
299 Ok(None)
300 }
301 }
302
VerifyNamesWithNullableInterfaceArray( &self, services: Option<&[Option<binder::Strong<dyn INamedCallback::INamedCallback>>]>, names: Option<&[Option<String>]>, ) -> binder::Result<bool>303 async fn VerifyNamesWithNullableInterfaceArray(
304 &self,
305 services: Option<&[Option<binder::Strong<dyn INamedCallback::INamedCallback>>]>,
306 names: Option<&[Option<String>]>,
307 ) -> binder::Result<bool> {
308 if let (Some(services), Some(names)) = (services, names) {
309 for (s, n) in services.iter().zip(names) {
310 if let (Some(s), Some(n)) = (s, n) {
311 if !self.VerifyName(s, n).await? {
312 return Ok(false);
313 }
314 } else if s.is_some() || n.is_some() {
315 return Ok(false);
316 }
317 }
318 Ok(true)
319 } else {
320 Ok(services.is_none() && names.is_none())
321 }
322 }
323
GetInterfaceList( &self, names: Option<&[Option<String>]>, ) -> binder::Result<Option<Vec<Option<binder::Strong<dyn INamedCallback::INamedCallback>>>>>324 async fn GetInterfaceList(
325 &self,
326 names: Option<&[Option<String>]>,
327 ) -> binder::Result<Option<Vec<Option<binder::Strong<dyn INamedCallback::INamedCallback>>>>>
328 {
329 self.GetNullableInterfaceArray(names).await
330 }
331
VerifyNamesWithInterfaceList( &self, services: Option<&[Option<binder::Strong<dyn INamedCallback::INamedCallback>>]>, names: Option<&[Option<String>]>, ) -> binder::Result<bool>332 async fn VerifyNamesWithInterfaceList(
333 &self,
334 services: Option<&[Option<binder::Strong<dyn INamedCallback::INamedCallback>>]>,
335 names: Option<&[Option<String>]>,
336 ) -> binder::Result<bool> {
337 self.VerifyNamesWithNullableInterfaceArray(services, names).await
338 }
339
RepeatParcelFileDescriptor( &self, read: &ParcelFileDescriptor, ) -> binder::Result<ParcelFileDescriptor>340 async fn RepeatParcelFileDescriptor(
341 &self,
342 read: &ParcelFileDescriptor,
343 ) -> binder::Result<ParcelFileDescriptor> {
344 Ok(dup_fd(read))
345 }
346
ReverseParcelFileDescriptorArray( &self, input: &[ParcelFileDescriptor], repeated: &mut Vec<Option<ParcelFileDescriptor>>, ) -> binder::Result<Vec<ParcelFileDescriptor>>347 async fn ReverseParcelFileDescriptorArray(
348 &self,
349 input: &[ParcelFileDescriptor],
350 repeated: &mut Vec<Option<ParcelFileDescriptor>>,
351 ) -> binder::Result<Vec<ParcelFileDescriptor>> {
352 repeated.clear();
353 repeated.extend(input.iter().map(dup_fd).map(Some));
354 Ok(input.iter().rev().map(dup_fd).collect())
355 }
356
ThrowServiceException(&self, code: i32) -> binder::Result<()>357 async fn ThrowServiceException(&self, code: i32) -> binder::Result<()> {
358 Err(binder::Status::new_service_specific_error(code, None))
359 }
360
361 impl_repeat_nullable! {RepeatNullableIntArray, i32}
362 impl_repeat_nullable! {RepeatNullableByteEnumArray, ByteEnum}
363 impl_repeat_nullable! {RepeatNullableIntEnumArray, IntEnum}
364 impl_repeat_nullable! {RepeatNullableLongEnumArray, LongEnum}
365 impl_repeat_nullable! {RepeatNullableStringList, Option<String>}
366
RepeatNullableString(&self, input: Option<&str>) -> binder::Result<Option<String>>367 async fn RepeatNullableString(&self, input: Option<&str>) -> binder::Result<Option<String>> {
368 Ok(input.map(String::from))
369 }
370
RepeatNullableUtf8CppString( &self, input: Option<&str>, ) -> binder::Result<Option<String>>371 async fn RepeatNullableUtf8CppString(
372 &self,
373 input: Option<&str>,
374 ) -> binder::Result<Option<String>> {
375 Ok(input.map(String::from))
376 }
377
RepeatNullableParcelable( &self, input: Option<&Empty>, ) -> binder::Result<Option<Empty>>378 async fn RepeatNullableParcelable(
379 &self,
380 input: Option<&Empty>,
381 ) -> binder::Result<Option<Empty>> {
382 Ok(input.cloned())
383 }
384
385 impl_repeat_nullable! {RepeatNullableParcelableArray, Option<Empty>}
386 impl_repeat_nullable! {RepeatNullableParcelableList, Option<Empty>}
387
TakesAnIBinder(&self, _: &SpIBinder) -> binder::Result<()>388 async fn TakesAnIBinder(&self, _: &SpIBinder) -> binder::Result<()> {
389 Ok(())
390 }
391
TakesANullableIBinder(&self, _: Option<&SpIBinder>) -> binder::Result<()>392 async fn TakesANullableIBinder(&self, _: Option<&SpIBinder>) -> binder::Result<()> {
393 Ok(())
394 }
395
TakesAnIBinderList(&self, _: &[SpIBinder]) -> binder::Result<()>396 async fn TakesAnIBinderList(&self, _: &[SpIBinder]) -> binder::Result<()> {
397 Ok(())
398 }
399
TakesANullableIBinderList( &self, _: Option<&[Option<SpIBinder>]>, ) -> binder::Result<()>400 async fn TakesANullableIBinderList(
401 &self,
402 _: Option<&[Option<SpIBinder>]>,
403 ) -> binder::Result<()> {
404 Ok(())
405 }
406
ReverseNullableUtf8CppString( &self, input: Option<&[Option<String>]>, repeated: &mut Option<Vec<Option<String>>>, ) -> binder::Result<Option<Vec<Option<String>>>>407 async fn ReverseNullableUtf8CppString(
408 &self,
409 input: Option<&[Option<String>]>,
410 repeated: &mut Option<Vec<Option<String>>>,
411 ) -> binder::Result<Option<Vec<Option<String>>>> {
412 if let Some(input) = input {
413 *repeated = Some(input.to_vec());
414 Ok(Some(input.iter().rev().cloned().collect()))
415 } else {
416 // We don't touch `repeated` here, since
417 // the C++ test service doesn't either
418 Ok(None)
419 }
420 }
421
ReverseUtf8CppStringList( &self, input: Option<&[Option<String>]>, repeated: &mut Option<Vec<Option<String>>>, ) -> binder::Result<Option<Vec<Option<String>>>>422 async fn ReverseUtf8CppStringList(
423 &self,
424 input: Option<&[Option<String>]>,
425 repeated: &mut Option<Vec<Option<String>>>,
426 ) -> binder::Result<Option<Vec<Option<String>>>> {
427 self.ReverseNullableUtf8CppString(input, repeated).await
428 }
429
GetCallback( &self, return_null: bool, ) -> binder::Result<Option<binder::Strong<dyn INamedCallback::INamedCallback>>>430 async fn GetCallback(
431 &self,
432 return_null: bool,
433 ) -> binder::Result<Option<binder::Strong<dyn INamedCallback::INamedCallback>>> {
434 if return_null {
435 Ok(None)
436 } else {
437 self.GetOtherTestService("ABT: always be testing").await.map(Some)
438 }
439 }
440
FillOutStructuredParcelable( &self, parcelable: &mut StructuredParcelable::StructuredParcelable, ) -> binder::Result<()>441 async fn FillOutStructuredParcelable(
442 &self,
443 parcelable: &mut StructuredParcelable::StructuredParcelable,
444 ) -> binder::Result<()> {
445 parcelable.shouldBeJerry = "Jerry".into();
446 parcelable.shouldContainThreeFs = vec![parcelable.f, parcelable.f, parcelable.f];
447 parcelable.shouldBeByteBar = ByteEnum::BAR;
448 parcelable.shouldBeIntBar = IntEnum::BAR;
449 parcelable.shouldBeLongBar = LongEnum::BAR;
450 parcelable.shouldContainTwoByteFoos = vec![ByteEnum::FOO, ByteEnum::FOO];
451 parcelable.shouldContainTwoIntFoos = vec![IntEnum::FOO, IntEnum::FOO];
452 parcelable.shouldContainTwoLongFoos = vec![LongEnum::FOO, LongEnum::FOO];
453
454 parcelable.const_exprs_1 = ConstantExpressionEnum::decInt32_1;
455 parcelable.const_exprs_2 = ConstantExpressionEnum::decInt32_2;
456 parcelable.const_exprs_3 = ConstantExpressionEnum::decInt64_1;
457 parcelable.const_exprs_4 = ConstantExpressionEnum::decInt64_2;
458 parcelable.const_exprs_5 = ConstantExpressionEnum::decInt64_3;
459 parcelable.const_exprs_6 = ConstantExpressionEnum::decInt64_4;
460 parcelable.const_exprs_7 = ConstantExpressionEnum::hexInt32_1;
461 parcelable.const_exprs_8 = ConstantExpressionEnum::hexInt32_2;
462 parcelable.const_exprs_9 = ConstantExpressionEnum::hexInt32_3;
463 parcelable.const_exprs_10 = ConstantExpressionEnum::hexInt64_1;
464
465 parcelable.shouldSetBit0AndBit2 = StructuredParcelable::BIT0 | StructuredParcelable::BIT2;
466
467 parcelable.u = Some(Union::Union::Ns(vec![1, 2, 3]));
468 parcelable.shouldBeConstS1 = Some(Union::Union::S(Union::S1.to_string()));
469 Ok(())
470 }
471
RepeatExtendableParcelable( &self, ep: &ExtendableParcelable, ep2: &mut ExtendableParcelable, ) -> binder::Result<()>472 async fn RepeatExtendableParcelable(
473 &self,
474 ep: &ExtendableParcelable,
475 ep2: &mut ExtendableParcelable,
476 ) -> binder::Result<()> {
477 ep2.a = ep.a;
478 ep2.b.clone_from(&ep.b);
479
480 let my_ext = ep.ext.get_parcelable::<MyExt>()?;
481 if let Some(my_ext) = my_ext {
482 ep2.ext.set_parcelable(my_ext)?;
483 } else {
484 ep2.ext.reset();
485 }
486
487 Ok(())
488 }
489
RepeatExtendableParcelableVintf( &self, ep: &ExtendableParcelable, ep2: &mut ExtendableParcelable, ) -> binder::Result<()>490 async fn RepeatExtendableParcelableVintf(
491 &self,
492 ep: &ExtendableParcelable,
493 ep2: &mut ExtendableParcelable,
494 ) -> binder::Result<()> {
495 ep2.a = ep.a;
496 ep2.b.clone_from(&ep.b);
497
498 let my_ext = ep.ext.get_parcelable::<VintfExtendableParcelable>()?;
499 if let Some(my_ext) = my_ext {
500 ep2.ext.set_parcelable(my_ext)?;
501 } else {
502 ep2.ext.reset();
503 }
504
505 Ok(())
506 }
507
ReverseList(&self, list: &RecursiveList) -> binder::Result<RecursiveList>508 async fn ReverseList(&self, list: &RecursiveList) -> binder::Result<RecursiveList> {
509 let mut reversed: Option<RecursiveList> = None;
510 let mut cur: Option<&RecursiveList> = Some(list);
511 while let Some(node) = cur {
512 reversed = Some(RecursiveList { value: node.value, next: reversed.map(Box::new) });
513 cur = node.next.as_ref().map(|n| n.as_ref());
514 }
515 // `list` is always not empty, so is `reversed`.
516 Ok(reversed.unwrap())
517 }
518
ReverseIBinderArray( &self, input: &[SpIBinder], repeated: &mut Vec<Option<SpIBinder>>, ) -> binder::Result<Vec<SpIBinder>>519 async fn ReverseIBinderArray(
520 &self,
521 input: &[SpIBinder],
522 repeated: &mut Vec<Option<SpIBinder>>,
523 ) -> binder::Result<Vec<SpIBinder>> {
524 *repeated = input.iter().cloned().map(Some).collect();
525 Ok(input.iter().rev().cloned().collect())
526 }
527
ReverseNullableIBinderArray( &self, input: Option<&[Option<SpIBinder>]>, repeated: &mut Option<Vec<Option<SpIBinder>>>, ) -> binder::Result<Option<Vec<Option<SpIBinder>>>>528 async fn ReverseNullableIBinderArray(
529 &self,
530 input: Option<&[Option<SpIBinder>]>,
531 repeated: &mut Option<Vec<Option<SpIBinder>>>,
532 ) -> binder::Result<Option<Vec<Option<SpIBinder>>>> {
533 let input = input.expect("input is null");
534 *repeated = Some(input.to_vec());
535 Ok(Some(input.iter().rev().cloned().collect()))
536 }
537
RepeatSimpleParcelable( &self, input: &SimpleParcelable, repeat: &mut SimpleParcelable, ) -> binder::Result<SimpleParcelable>538 async fn RepeatSimpleParcelable(
539 &self,
540 input: &SimpleParcelable,
541 repeat: &mut SimpleParcelable,
542 ) -> binder::Result<SimpleParcelable> {
543 *repeat = input.clone();
544 Ok(input.clone())
545 }
546
ReverseSimpleParcelables( &self, input: &[SimpleParcelable], repeated: &mut Vec<SimpleParcelable>, ) -> binder::Result<Vec<SimpleParcelable>>547 async fn ReverseSimpleParcelables(
548 &self,
549 input: &[SimpleParcelable],
550 repeated: &mut Vec<SimpleParcelable>,
551 ) -> binder::Result<Vec<SimpleParcelable>> {
552 *repeated = input.to_vec();
553 Ok(input.iter().rev().cloned().collect())
554 }
555
GetOldNameInterface(&self) -> binder::Result<binder::Strong<dyn IOldName::IOldName>>556 async fn GetOldNameInterface(&self) -> binder::Result<binder::Strong<dyn IOldName::IOldName>> {
557 Ok(IOldName::BnOldName::new_async_binder(OldName, rt(), BinderFeatures::default()))
558 }
559
GetNewNameInterface(&self) -> binder::Result<binder::Strong<dyn INewName::INewName>>560 async fn GetNewNameInterface(&self) -> binder::Result<binder::Strong<dyn INewName::INewName>> {
561 Ok(INewName::BnNewName::new_async_binder(NewName, rt(), BinderFeatures::default()))
562 }
563
GetUnionTags(&self, input: &[Union::Union]) -> binder::Result<Vec<Union::Tag::Tag>>564 async fn GetUnionTags(&self, input: &[Union::Union]) -> binder::Result<Vec<Union::Tag::Tag>> {
565 Ok(input
566 .iter()
567 .map(|u| match u {
568 Union::Union::Ns(_) => Union::Tag::Tag::ns,
569 Union::Union::N(_) => Union::Tag::Tag::n,
570 Union::Union::M(_) => Union::Tag::Tag::m,
571 Union::Union::S(_) => Union::Tag::Tag::s,
572 Union::Union::Ibinder(_) => Union::Tag::Tag::ibinder,
573 Union::Union::Ss(_) => Union::Tag::Tag::ss,
574 Union::Union::Be(_) => Union::Tag::Tag::be,
575 })
576 .collect::<Vec<_>>())
577 }
578
GetCppJavaTests(&self) -> binder::Result<Option<SpIBinder>>579 async fn GetCppJavaTests(&self) -> binder::Result<Option<SpIBinder>> {
580 Ok(None)
581 }
582
getBackendType(&self) -> binder::Result<BackendType>583 async fn getBackendType(&self) -> binder::Result<BackendType> {
584 Ok(BackendType::RUST)
585 }
586
GetCircular( &self, _: &mut CircularParcelable, ) -> binder::Result<binder::Strong<dyn ICircular::ICircular>>587 async fn GetCircular(
588 &self,
589 _: &mut CircularParcelable,
590 ) -> binder::Result<binder::Strong<dyn ICircular::ICircular>> {
591 Ok(ICircular::BnCircular::new_async_binder(Circular, rt(), BinderFeatures::default()))
592 }
593 }
594
595 struct FooInterface;
596
597 impl Interface for FooInterface {}
598
599 #[async_trait]
600 impl IFooInterface::IFooInterfaceAsyncServer for FooInterface {
originalApi(&self) -> binder::Result<()>601 async fn originalApi(&self) -> binder::Result<()> {
602 Ok(())
603 }
acceptUnionAndReturnString(&self, u: &BazUnion) -> binder::Result<String>604 async fn acceptUnionAndReturnString(&self, u: &BazUnion) -> binder::Result<String> {
605 match u {
606 BazUnion::IntNum(n) => Ok(n.to_string()),
607 }
608 }
returnsLengthOfFooArray(&self, foos: &[Foo]) -> binder::Result<i32>609 async fn returnsLengthOfFooArray(&self, foos: &[Foo]) -> binder::Result<i32> {
610 Ok(foos.len() as i32)
611 }
ignoreParcelablesAndRepeatInt( &self, _in_foo: &Foo, _inout_foo: &mut Foo, _out_foo: &mut Foo, value: i32, ) -> binder::Result<i32>612 async fn ignoreParcelablesAndRepeatInt(
613 &self,
614 _in_foo: &Foo,
615 _inout_foo: &mut Foo,
616 _out_foo: &mut Foo,
617 value: i32,
618 ) -> binder::Result<i32> {
619 Ok(value)
620 }
621 }
622
623 struct TrunkStableTest;
624
625 impl Interface for TrunkStableTest {}
626
627 #[async_trait]
628 impl ITrunkStableTest::ITrunkStableTestAsyncServer for TrunkStableTest {
repeatParcelable(&self, in_parcel: &MyParcelable) -> binder::Result<MyParcelable>629 async fn repeatParcelable(&self, in_parcel: &MyParcelable) -> binder::Result<MyParcelable> {
630 let tmp: MyParcelable = MyParcelable { a: in_parcel.a, b: in_parcel.b, c: in_parcel.c };
631 Ok(tmp)
632 }
repeatEnum(&self, in_enum: MyEnum) -> binder::Result<MyEnum>633 async fn repeatEnum(&self, in_enum: MyEnum) -> binder::Result<MyEnum> {
634 Ok(in_enum)
635 }
repeatUnion(&self, in_union: &MyUnion) -> binder::Result<MyUnion>636 async fn repeatUnion(&self, in_union: &MyUnion) -> binder::Result<MyUnion> {
637 match in_union {
638 MyUnion::A(n) => Ok(MyUnion::A(*n)),
639 MyUnion::B(n) => Ok(MyUnion::B(*n)),
640 MyUnion::C(n) => Ok(MyUnion::C(*n)),
641 }
642 }
repeatOtherParcelable( &self, in_parcel: &MyOtherParcelable, ) -> binder::Result<MyOtherParcelable>643 async fn repeatOtherParcelable(
644 &self,
645 in_parcel: &MyOtherParcelable,
646 ) -> binder::Result<MyOtherParcelable> {
647 let tmp: MyOtherParcelable = MyOtherParcelable { a: in_parcel.a, b: in_parcel.b };
648 Ok(tmp)
649 }
callMyCallback( &self, _in_cb: &binder::Strong<dyn IMyCallback::IMyCallback>, ) -> binder::Result<()>650 async fn callMyCallback(
651 &self,
652 _in_cb: &binder::Strong<dyn IMyCallback::IMyCallback>,
653 ) -> binder::Result<()> {
654 let p1 = MyParcelable::default();
655 let _ = _in_cb.repeatParcelable(&p1);
656
657 let e1 = MyEnum::THREE;
658 let _ = _in_cb.repeatEnum(e1);
659
660 let u1 = MyUnion::A(12);
661 let _ = _in_cb.repeatUnion(&u1);
662
663 let o1 = MyOtherParcelable::default();
664 // expected to fail when not using the frozen version
665 let _ = _in_cb.repeatOtherParcelable(&o1);
666
667 Ok(())
668 }
669 }
670
671 struct NestedService;
672
673 impl Interface for NestedService {}
674
675 #[async_trait]
676 impl INestedService::INestedServiceAsyncServer for NestedService {
flipStatus( &self, p: &ParcelableWithNested::ParcelableWithNested, ) -> binder::Result<INestedService::Result::Result>677 async fn flipStatus(
678 &self,
679 p: &ParcelableWithNested::ParcelableWithNested,
680 ) -> binder::Result<INestedService::Result::Result> {
681 if p.status == ParcelableWithNested::Status::Status::OK {
682 Ok(INestedService::Result::Result {
683 status: ParcelableWithNested::Status::Status::NOT_OK,
684 })
685 } else {
686 Ok(INestedService::Result::Result { status: ParcelableWithNested::Status::Status::OK })
687 }
688 }
flipStatusWithCallback( &self, st: ParcelableWithNested::Status::Status, cb: &binder::Strong<dyn INestedService::ICallback::ICallback>, ) -> binder::Result<()>689 async fn flipStatusWithCallback(
690 &self,
691 st: ParcelableWithNested::Status::Status,
692 cb: &binder::Strong<dyn INestedService::ICallback::ICallback>,
693 ) -> binder::Result<()> {
694 if st == ParcelableWithNested::Status::Status::OK {
695 cb.done(ParcelableWithNested::Status::Status::NOT_OK)
696 } else {
697 cb.done(ParcelableWithNested::Status::Status::OK)
698 }
699 }
700 }
701
702 struct FixedSizeArrayService;
703
704 impl Interface for FixedSizeArrayService {}
705
706 #[async_trait]
707 impl IRepeatFixedSizeArray::IRepeatFixedSizeArrayAsyncServer for FixedSizeArrayService {
RepeatBytes( &self, input: &[u8; 3], repeated: &mut [u8; 3], ) -> binder::Result<[u8; 3]>708 async fn RepeatBytes(
709 &self,
710 input: &[u8; 3],
711 repeated: &mut [u8; 3],
712 ) -> binder::Result<[u8; 3]> {
713 *repeated = *input;
714 Ok(*input)
715 }
RepeatInts( &self, input: &[i32; 3], repeated: &mut [i32; 3], ) -> binder::Result<[i32; 3]>716 async fn RepeatInts(
717 &self,
718 input: &[i32; 3],
719 repeated: &mut [i32; 3],
720 ) -> binder::Result<[i32; 3]> {
721 *repeated = *input;
722 Ok(*input)
723 }
RepeatBinders( &self, input: &[SpIBinder; 3], repeated: &mut [Option<SpIBinder>; 3], ) -> binder::Result<[SpIBinder; 3]>724 async fn RepeatBinders(
725 &self,
726 input: &[SpIBinder; 3],
727 repeated: &mut [Option<SpIBinder>; 3],
728 ) -> binder::Result<[SpIBinder; 3]> {
729 *repeated = input.clone().map(Some);
730 Ok(input.clone())
731 }
RepeatParcelables( &self, input: &[IntParcelable; 3], repeated: &mut [IntParcelable; 3], ) -> binder::Result<[IntParcelable; 3]>732 async fn RepeatParcelables(
733 &self,
734 input: &[IntParcelable; 3],
735 repeated: &mut [IntParcelable; 3],
736 ) -> binder::Result<[IntParcelable; 3]> {
737 *repeated = *input;
738 Ok(*input)
739 }
Repeat2dBytes( &self, input: &[[u8; 3]; 2], repeated: &mut [[u8; 3]; 2], ) -> binder::Result<[[u8; 3]; 2]>740 async fn Repeat2dBytes(
741 &self,
742 input: &[[u8; 3]; 2],
743 repeated: &mut [[u8; 3]; 2],
744 ) -> binder::Result<[[u8; 3]; 2]> {
745 *repeated = *input;
746 Ok(*input)
747 }
Repeat2dInts( &self, input: &[[i32; 3]; 2], repeated: &mut [[i32; 3]; 2], ) -> binder::Result<[[i32; 3]; 2]>748 async fn Repeat2dInts(
749 &self,
750 input: &[[i32; 3]; 2],
751 repeated: &mut [[i32; 3]; 2],
752 ) -> binder::Result<[[i32; 3]; 2]> {
753 *repeated = *input;
754 Ok(*input)
755 }
Repeat2dBinders( &self, input: &[[SpIBinder; 3]; 2], repeated: &mut [[Option<SpIBinder>; 3]; 2], ) -> binder::Result<[[SpIBinder; 3]; 2]>756 async fn Repeat2dBinders(
757 &self,
758 input: &[[SpIBinder; 3]; 2],
759 repeated: &mut [[Option<SpIBinder>; 3]; 2],
760 ) -> binder::Result<[[SpIBinder; 3]; 2]> {
761 *repeated = input.clone().map(|nested| nested.map(Some));
762 Ok(input.clone())
763 }
Repeat2dParcelables( &self, input: &[[IntParcelable; 3]; 2], repeated: &mut [[IntParcelable; 3]; 2], ) -> binder::Result<[[IntParcelable; 3]; 2]>764 async fn Repeat2dParcelables(
765 &self,
766 input: &[[IntParcelable; 3]; 2],
767 repeated: &mut [[IntParcelable; 3]; 2],
768 ) -> binder::Result<[[IntParcelable; 3]; 2]> {
769 *repeated = *input;
770 Ok(*input)
771 }
772 }
773
rt() -> binder_tokio::TokioRuntime<tokio::runtime::Handle>774 fn rt() -> binder_tokio::TokioRuntime<tokio::runtime::Handle> {
775 binder_tokio::TokioRuntime(tokio::runtime::Handle::current())
776 }
777
main()778 fn main() {
779 binder::ProcessState::set_thread_pool_max_thread_count(0);
780 binder::ProcessState::start_thread_pool();
781
782 let runtime = tokio::runtime::Builder::new_current_thread().enable_all().build().unwrap();
783 runtime.block_on(async {
784 let service_name = <BpTestService as ITestService::ITestService>::get_descriptor();
785 let service =
786 BnTestService::new_async_binder(TestService::default(), rt(), BinderFeatures::default());
787 binder::add_service(service_name, service.as_binder()).expect("Could not register service");
788
789 let versioned_service_name = <BpFooInterface as IFooInterface::IFooInterface>::get_descriptor();
790 let versioned_service =
791 BnFooInterface::new_async_binder(FooInterface, rt(), BinderFeatures::default());
792 binder::add_service(versioned_service_name, versioned_service.as_binder())
793 .expect("Could not register service");
794
795 let nested_service_name =
796 <INestedService::BpNestedService as INestedService::INestedService>::get_descriptor();
797 let nested_service = INestedService::BnNestedService::new_async_binder(
798 NestedService,
799 rt(),
800 BinderFeatures::default(),
801 );
802 binder::add_service(nested_service_name, nested_service.as_binder())
803 .expect("Could not register service");
804
805 let fixed_size_array_service_name =
806 <IRepeatFixedSizeArray::BpRepeatFixedSizeArray as IRepeatFixedSizeArray::IRepeatFixedSizeArray>::get_descriptor();
807 let fixed_size_array_service = IRepeatFixedSizeArray::BnRepeatFixedSizeArray::new_async_binder(
808 FixedSizeArrayService,
809 rt(),
810 BinderFeatures::default(),
811 );
812 binder::add_service(fixed_size_array_service_name, fixed_size_array_service.as_binder())
813 .expect("Could not register service");
814
815 let trunk_stable_service_name =
816 <BpTrunkStableTest as ITrunkStableTest::ITrunkStableTest>::get_descriptor();
817 let trunk_stable_service = BnTrunkStableTest::new_async_binder(
818 TrunkStableTest,
819 rt(),
820 BinderFeatures::default()
821 );
822 binder::add_service(trunk_stable_service_name, trunk_stable_service.as_binder())
823 .expect("Could not register service");
824
825 // By awaiting `pending`, we yield to the runtime. This results in the current-thread
826 // runtime being driven by the current thread (the main thread in this case). E.g., this
827 // means that anything spawned with `tokio::spawn` will run on this thread.
828 std::future::pending().await
829 })
830 }
831