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