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