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