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 client for the AIDL compiler.
18 
19 use ::binder::{binder_impl::Parcel, Parcelable};
20 use aidl_test_fixedsizearray::aidl::android::aidl::fixedsizearray::FixedSizeArrayExample::{
21     FixedSizeArrayExample,
22     IRepeatFixedSizeArray::{BpRepeatFixedSizeArray, IRepeatFixedSizeArray},
23     IntParcelable::IntParcelable,
24 };
25 use aidl_test_interface::aidl::android::aidl::tests::nested::{
26     INestedService, ParcelableWithNested,
27 };
28 use aidl_test_interface::aidl::android::aidl::tests::unions::EnumUnion::EnumUnion;
29 use aidl_test_interface::aidl::android::aidl::tests::INewName::{self, BpNewName};
30 use aidl_test_interface::aidl::android::aidl::tests::IOldName::{self, BpOldName};
31 use aidl_test_interface::aidl::android::aidl::tests::ITestService::{
32     self, BpTestService, Empty::Empty, ITestServiceDefault, ITestServiceDefaultRef,
33 };
34 use aidl_test_interface::aidl::android::aidl::tests::{
35     extension::ExtendableParcelable::ExtendableParcelable, extension::MyExt::MyExt,
36     extension::MyExt2::MyExt2, extension::MyExtLike::MyExtLike, BackendType::BackendType,
37     ByteEnum::ByteEnum, IntEnum::IntEnum, LongEnum::LongEnum, RecursiveList::RecursiveList,
38     StructuredParcelable, Union,
39 };
40 use aidl_test_interface::binder::{self, BinderFeatures, IBinder, Interface};
41 use aidl_test_nonvintf_parcelable::aidl::android::aidl::tests::nonvintf::{
42     NonVintfExtendableParcelable::NonVintfExtendableParcelable,
43     NonVintfParcelable::NonVintfParcelable,
44 };
45 use aidl_test_unstable_parcelable::aidl::android::aidl::tests::unstable::{
46     UnstableExtendableParcelable::UnstableExtendableParcelable,
47     UnstableParcelable::UnstableParcelable,
48 };
49 use aidl_test_versioned_interface::aidl::android::aidl::versioned::tests::{
50     BazUnion::BazUnion, Foo::Foo, IFooInterface, IFooInterface::BpFooInterface,
51 };
52 use aidl_test_vintf_parcelable::aidl::android::aidl::tests::vintf::{
53     VintfExtendableParcelable::VintfExtendableParcelable, VintfParcelable::VintfParcelable,
54 };
55 use android_aidl_test_trunk::aidl::android::aidl::test::trunk::{
56     ITrunkStableTest::BpTrunkStableTest, ITrunkStableTest::IMyCallback,
57     ITrunkStableTest::ITrunkStableTest, ITrunkStableTest::MyEnum::MyEnum,
58     ITrunkStableTest::MyOtherParcelable::MyOtherParcelable,
59     ITrunkStableTest::MyParcelable::MyParcelable, ITrunkStableTest::MyUnion::MyUnion,
60 };
61 use simple_parcelable::SimpleParcelable;
62 
63 use std::fs::File;
64 use std::io::{Read, Write};
65 use std::os::fd::{FromRawFd, OwnedFd};
66 use std::sync::{Arc, Mutex};
67 
get_test_service() -> binder::Strong<dyn ITestService::ITestService>68 fn get_test_service() -> binder::Strong<dyn ITestService::ITestService> {
69     binder::wait_for_interface(<BpTestService as ITestService::ITestService>::get_descriptor())
70         .expect("did not get binder service")
71 }
72 
get_test_trunk_stable_service() -> binder::Strong<dyn ITrunkStableTest>73 fn get_test_trunk_stable_service() -> binder::Strong<dyn ITrunkStableTest> {
74     binder::wait_for_interface(<BpTrunkStableTest as ITrunkStableTest>::get_descriptor())
75         .expect("did not get binder service")
76 }
77 
78 #[test]
test_constants()79 fn test_constants() {
80     assert_eq!(ITestService::A1, 1);
81     assert_eq!(ITestService::A2, 1);
82     assert_eq!(ITestService::A3, 1);
83     assert_eq!(ITestService::A4, 1);
84     assert_eq!(ITestService::A5, 1);
85     assert_eq!(ITestService::A6, 1);
86     assert_eq!(ITestService::A7, 1);
87     assert_eq!(ITestService::A8, 1);
88     assert_eq!(ITestService::A9, 1);
89     assert_eq!(ITestService::A10, 1);
90     assert_eq!(ITestService::A11, 1);
91     assert_eq!(ITestService::A12, 1);
92     assert_eq!(ITestService::A13, 1);
93     assert_eq!(ITestService::A14, 1);
94     assert_eq!(ITestService::A15, 1);
95     assert_eq!(ITestService::A16, 1);
96     assert_eq!(ITestService::A17, 1);
97     assert_eq!(ITestService::A18, 1);
98     assert_eq!(ITestService::A19, 1);
99     assert_eq!(ITestService::A20, 1);
100     assert_eq!(ITestService::A21, 1);
101     assert_eq!(ITestService::A22, 1);
102     assert_eq!(ITestService::A23, 1);
103     assert_eq!(ITestService::A24, 1);
104     assert_eq!(ITestService::A25, 1);
105     assert_eq!(ITestService::A26, 1);
106     assert_eq!(ITestService::A27, 1);
107     assert_eq!(ITestService::A28, 1);
108     assert_eq!(ITestService::A29, 1);
109     assert_eq!(ITestService::A30, 1);
110     assert_eq!(ITestService::A31, 1);
111     assert_eq!(ITestService::A32, 1);
112     assert_eq!(ITestService::A33, 1);
113     assert_eq!(ITestService::A34, 1);
114     assert_eq!(ITestService::A35, 1);
115     assert_eq!(ITestService::A36, 1);
116     assert_eq!(ITestService::A37, 1);
117     assert_eq!(ITestService::A38, 1);
118     assert_eq!(ITestService::A39, 1);
119     assert_eq!(ITestService::A40, 1);
120     assert_eq!(ITestService::A41, 1);
121     assert_eq!(ITestService::A42, 1);
122     assert_eq!(ITestService::A43, 1);
123     assert_eq!(ITestService::A44, 1);
124     assert_eq!(ITestService::A45, 1);
125     assert_eq!(ITestService::A46, 1);
126     assert_eq!(ITestService::A47, 1);
127     assert_eq!(ITestService::A48, 1);
128     assert_eq!(ITestService::A49, 1);
129     assert_eq!(ITestService::A50, 1);
130     assert_eq!(ITestService::A51, 1);
131     assert_eq!(ITestService::A52, 1);
132     assert_eq!(ITestService::A53, 1);
133     assert_eq!(ITestService::A54, 1);
134     assert_eq!(ITestService::A55, 1);
135     assert_eq!(ITestService::A56, 1);
136     assert_eq!(ITestService::A57, 1);
137     assert_eq!(ITestService::FLOAT_CONSTANT4, 2.2_f32);
138     assert_eq!(ITestService::FLOAT_CONSTANT5, -2.2_f32);
139     assert_eq!(ITestService::DOUBLE_CONSTANT4, 2.2_f64);
140     assert_eq!(ITestService::DOUBLE_CONSTANT5, -2.2_f64);
141 }
142 
143 #[test]
test_oneway()144 fn test_oneway() {
145     let result = get_test_service().TestOneway();
146     assert_eq!(result, Ok(()));
147 }
148 
149 macro_rules! test_primitive {
150     ($test:ident, $func:ident, $value:expr) => {
151         #[test]
152         fn $test() {
153             let value = $value;
154             let result = get_test_service().$func(value);
155             assert_eq!(result, Ok(value));
156         }
157     };
158 }
159 
160 test_primitive! {test_primitive_bool_false, RepeatBoolean, false}
161 test_primitive! {test_primitive_bool_true, RepeatBoolean, true}
162 test_primitive! {test_primitive_byte, RepeatByte, -128i8}
163 test_primitive! {test_primitive_char, RepeatChar, 'A' as u16}
164 test_primitive! {test_primitive_int, RepeatInt, 1i32 << 30}
165 test_primitive! {test_primitive_long, RepeatLong, 1i64 << 60}
166 test_primitive! {test_primitive_float, RepeatFloat, 1.0f32 / 3.0f32}
167 test_primitive! {test_primitive_double, RepeatDouble, 1.0f64 / 3.0f64}
168 test_primitive! {test_primitive_byte_constant, RepeatByte, ITestService::BYTE_CONSTANT}
169 test_primitive! {test_primitive_constant1, RepeatInt, ITestService::CONSTANT}
170 test_primitive! {test_primitive_constant2, RepeatInt, ITestService::CONSTANT2}
171 test_primitive! {test_primitive_constant3, RepeatInt, ITestService::CONSTANT3}
172 test_primitive! {test_primitive_constant4, RepeatInt, ITestService::CONSTANT4}
173 test_primitive! {test_primitive_constant5, RepeatInt, ITestService::CONSTANT5}
174 test_primitive! {test_primitive_constant6, RepeatInt, ITestService::CONSTANT6}
175 test_primitive! {test_primitive_constant7, RepeatInt, ITestService::CONSTANT7}
176 test_primitive! {test_primitive_constant8, RepeatInt, ITestService::CONSTANT8}
177 test_primitive! {test_primitive_constant9, RepeatInt, ITestService::CONSTANT9}
178 test_primitive! {test_primitive_constant10, RepeatInt, ITestService::CONSTANT10}
179 test_primitive! {test_primitive_constant11, RepeatInt, ITestService::CONSTANT11}
180 test_primitive! {test_primitive_constant12, RepeatInt, ITestService::CONSTANT12}
181 test_primitive! {test_primitive_long_constant, RepeatLong, ITestService::LONG_CONSTANT}
182 test_primitive! {test_primitive_byte_enum, RepeatByteEnum, ByteEnum::FOO}
183 test_primitive! {test_primitive_int_enum, RepeatIntEnum, IntEnum::BAR}
184 test_primitive! {test_primitive_long_enum, RepeatLongEnum, LongEnum::FOO}
185 test_primitive! {test_primitive_float_constant, RepeatFloat, ITestService::FLOAT_CONSTANT}
186 test_primitive! {test_primitive_float_constant2, RepeatFloat, ITestService::FLOAT_CONSTANT2}
187 test_primitive! {test_primitive_float_constant3, RepeatFloat, ITestService::FLOAT_CONSTANT3}
188 test_primitive! {test_primitive_float_constant4, RepeatFloat, ITestService::FLOAT_CONSTANT4}
189 test_primitive! {test_primitive_float_constant5, RepeatFloat, ITestService::FLOAT_CONSTANT5}
190 test_primitive! {test_primitive_float_constant6, RepeatFloat, ITestService::FLOAT_CONSTANT6}
191 test_primitive! {test_primitive_float_constant7, RepeatFloat, ITestService::FLOAT_CONSTANT7}
192 test_primitive! {test_primitive_double_constant, RepeatDouble, ITestService::DOUBLE_CONSTANT}
193 test_primitive! {test_primitive_double_constant2, RepeatDouble, ITestService::DOUBLE_CONSTANT2}
194 test_primitive! {test_primitive_double_constant3, RepeatDouble, ITestService::DOUBLE_CONSTANT3}
195 test_primitive! {test_primitive_double_constant4, RepeatDouble, ITestService::DOUBLE_CONSTANT4}
196 test_primitive! {test_primitive_double_constant5, RepeatDouble, ITestService::DOUBLE_CONSTANT5}
197 test_primitive! {test_primitive_double_constant6, RepeatDouble, ITestService::DOUBLE_CONSTANT6}
198 test_primitive! {test_primitive_double_constant7, RepeatDouble, ITestService::DOUBLE_CONSTANT7}
199 
200 #[test]
test_repeat_string()201 fn test_repeat_string() {
202     let service = get_test_service();
203     let inputs = [
204         "typical string".into(),
205         String::new(),
206         "\0\0".into(),
207         // This is actually two unicode code points:
208         //   U+10437: The 'small letter yee' character in the deseret alphabet
209         //   U+20AC: A euro sign
210         String::from_utf16(&[0xD801, 0xDC37, 0x20AC]).expect("error converting string"),
211         ITestService::STRING_CONSTANT.into(),
212         ITestService::STRING_CONSTANT2.into(),
213     ];
214     for input in &inputs {
215         let result = service.RepeatString(input);
216         assert_eq!(result.as_ref(), Ok(input));
217     }
218 }
219 
220 #[test]
test_repeat_parcelable()221 fn test_repeat_parcelable() {
222     let service = get_test_service();
223     let input = SimpleParcelable { name: "foo".to_string(), number: 42 };
224     let mut out_param = SimpleParcelable::default();
225     let returned = service.RepeatSimpleParcelable(&input, &mut out_param);
226     assert_eq!(returned, Ok(input.clone()));
227     assert_eq!(out_param, input);
228 }
229 
230 macro_rules! test_reverse_array {
231     ($test:ident, $func:ident, $array:expr) => {
232         #[test]
233         fn $test() {
234             let mut array = $array.to_vec();
235 
236             // Java needs initial values here (can't resize arrays)
237             let mut repeated = vec![Default::default(); array.len()];
238 
239             let result = get_test_service().$func(&array, &mut repeated);
240             assert_eq!(repeated, array);
241             array.reverse();
242             assert_eq!(result, Ok(array));
243         }
244     };
245 }
246 
247 test_reverse_array! {test_array_boolean, ReverseBoolean, [true, false, false]}
248 test_reverse_array! {test_array_byte, ReverseByte, [255u8, 0u8, 127u8]}
249 test_reverse_array! {
250     service,
251     ReverseChar,
252     ['A' as u16, 'B' as u16, 'C' as u16]
253 }
254 test_reverse_array! {test_array_int, ReverseInt, [1, 2, 3]}
255 test_reverse_array! {test_array_long, ReverseLong, [-1i64, 0i64, 1i64 << 60]}
256 test_reverse_array! {test_array_float, ReverseFloat, [-0.3f32, -0.7f32, 8.0f32]}
257 test_reverse_array! {
258     test_array_double,
259     ReverseDouble,
260     [1.0f64 / 3.0f64, 1.0f64 / 7.0f64, 42.0f64]
261 }
262 test_reverse_array! {
263     test_array_string,
264     ReverseString,
265     ["f".into(), "a".into(), "b".into()]
266 }
267 test_reverse_array! {
268     test_array_byte_enum,
269     ReverseByteEnum,
270     [ByteEnum::FOO, ByteEnum::BAR, ByteEnum::BAR]
271 }
272 test_reverse_array! {
273     test_array_byte_enum_values,
274     ReverseByteEnum,
275     ByteEnum::enum_values()
276 }
277 test_reverse_array! {
278     test_array_byte_enum_v2,
279     ReverseByteEnum,
280     [ByteEnum::FOO, ByteEnum::BAR, ByteEnum::BAZ]
281 }
282 test_reverse_array! {
283     test_array_int_enum,
284     ReverseIntEnum,
285     [IntEnum::FOO, IntEnum::BAR, IntEnum::BAR]
286 }
287 test_reverse_array! {
288     test_array_long_enum,
289     ReverseLongEnum,
290     [LongEnum::FOO, LongEnum::BAR, LongEnum::BAR]
291 }
292 test_reverse_array! {
293     test_array_string_list,
294     ReverseStringList,
295     ["f".into(), "a".into(), "b".into()]
296 }
297 test_reverse_array! {
298     test_array_utf8_string,
299     ReverseUtf8CppString,
300     [
301         "a".into(),
302         String::new(),
303         std::str::from_utf8(&[0xC3, 0xB8])
304             .expect("error converting string")
305             .into(),
306     ]
307 }
308 test_reverse_array! {
309     test_reverse_parcelable,
310     ReverseSimpleParcelables,
311     [
312         SimpleParcelable {name: "a".to_string(), number: 1 },
313         SimpleParcelable {name: "b".to_string(), number: 2 },
314         SimpleParcelable {name: "c".to_string(), number: 3 },
315     ]
316 }
317 
318 #[test]
test_binder_exchange()319 fn test_binder_exchange() {
320     const NAME: &str = "Smythe";
321     let service = get_test_service();
322     let got = service.GetOtherTestService(NAME).expect("error calling GetOtherTestService");
323     assert_eq!(got.GetName().as_ref().map(String::as_ref), Ok(NAME));
324     assert_eq!(service.VerifyName(&got, NAME), Ok(true));
325 }
326 
327 #[test]
test_binder_array_exchange()328 fn test_binder_array_exchange() {
329     let names = vec!["Fizz".into(), "Buzz".into()];
330     let service = get_test_service();
331     let got = service.GetInterfaceArray(&names).expect("error calling GetInterfaceArray");
332     assert_eq!(got.iter().map(|s| s.GetName()).collect::<Result<Vec<_>, _>>(), Ok(names.clone()));
333     assert_eq!(service.VerifyNamesWithInterfaceArray(&got, &names), Ok(true));
334 }
335 
336 #[test]
test_binder_nullable_array_exchange()337 fn test_binder_nullable_array_exchange() {
338     let names = vec![Some("Fizz".into()), None, Some("Buzz".into())];
339     let service = get_test_service();
340     let got = service
341         .GetNullableInterfaceArray(Some(&names))
342         .expect("error calling GetNullableInterfaceArray");
343     assert_eq!(
344         got.as_ref().map(|arr| arr
345             .iter()
346             .map(|opt_s| opt_s.as_ref().map(|s| s.GetName().expect("error calling GetName")))
347             .collect::<Vec<_>>()),
348         Some(names.clone())
349     );
350     assert_eq!(
351         service.VerifyNamesWithNullableInterfaceArray(got.as_ref().map(|v| &v[..]), Some(&names)),
352         Ok(true)
353     );
354 }
355 
356 #[test]
test_interface_list_exchange()357 fn test_interface_list_exchange() {
358     let names = vec![Some("Fizz".into()), None, Some("Buzz".into())];
359     let service = get_test_service();
360     let got = service.GetInterfaceList(Some(&names)).expect("error calling GetInterfaceList");
361     assert_eq!(
362         got.as_ref().map(|arr| arr
363             .iter()
364             .map(|opt_s| opt_s.as_ref().map(|s| s.GetName().expect("error calling GetName")))
365             .collect::<Vec<_>>()),
366         Some(names.clone())
367     );
368     assert_eq!(
369         service.VerifyNamesWithInterfaceList(got.as_ref().map(|v| &v[..]), Some(&names)),
370         Ok(true)
371     );
372 }
373 
build_pipe() -> (OwnedFd, OwnedFd)374 fn build_pipe() -> (OwnedFd, OwnedFd) {
375     // Safety: we get two file descriptors from pipe()
376     // and pass them after checking if the function returned
377     // without an error, so the descriptors should be valid
378     // by that point
379     unsafe {
380         let mut fds = [0, 0];
381         if libc::pipe(fds.as_mut_ptr()) != 0 {
382             panic!("pipe() error");
383         }
384         (OwnedFd::from_raw_fd(fds[0]), OwnedFd::from_raw_fd(fds[1]))
385     }
386 }
387 
388 /// Helper function that constructs a `File` from a `ParcelFileDescriptor`.
389 ///
390 /// This is needed because `File` is currently the way to read and write
391 /// to pipes using the `Read` and `Write` traits.
file_from_pfd(fd: &binder::ParcelFileDescriptor) -> File392 fn file_from_pfd(fd: &binder::ParcelFileDescriptor) -> File {
393     fd.as_ref().try_clone().expect("failed to clone file descriptor").into()
394 }
395 
396 #[test]
test_parcel_file_descriptor()397 fn test_parcel_file_descriptor() {
398     let service = get_test_service();
399     let (read_fd, write_fd) = build_pipe();
400     let mut read_file = File::from(read_fd);
401 
402     let write_pfd = binder::ParcelFileDescriptor::new(write_fd);
403     let result_pfd = service
404         .RepeatParcelFileDescriptor(&write_pfd)
405         .expect("error calling RepeatParcelFileDescriptor");
406 
407     const TEST_DATA: &[u8] = b"FrazzleSnazzleFlimFlamFlibbityGumboChops";
408     file_from_pfd(&result_pfd).write_all(TEST_DATA).expect("error writing to pipe");
409 
410     let mut buf = [0u8; TEST_DATA.len()];
411     read_file.read_exact(&mut buf).expect("error reading from pipe");
412     assert_eq!(&buf[..], TEST_DATA);
413 }
414 
415 #[test]
test_parcel_file_descriptor_array()416 fn test_parcel_file_descriptor_array() {
417     let service = get_test_service();
418 
419     let (read_fd, write_fd) = build_pipe();
420     let input =
421         [binder::ParcelFileDescriptor::new(read_fd), binder::ParcelFileDescriptor::new(write_fd)];
422 
423     let mut repeated = vec![];
424 
425     let backend = service.getBackendType().expect("error getting backend type");
426     if backend == BackendType::JAVA {
427         // Java needs initial values here (can't resize arrays)
428         // Other backends can't accept 'None', but we can use it in Java for convenience, rather
429         // than creating file descriptors.
430         repeated = vec![None, None];
431     }
432 
433     let result = service
434         .ReverseParcelFileDescriptorArray(&input[..], &mut repeated)
435         .expect("error calling ReverseParcelFileDescriptorArray");
436 
437     file_from_pfd(&input[1]).write_all(b"First").expect("error writing to pipe");
438     file_from_pfd(repeated[1].as_ref().expect("received None for ParcelFileDescriptor"))
439         .write_all(b"Second")
440         .expect("error writing to pipe");
441     file_from_pfd(&result[0]).write_all(b"Third").expect("error writing to pipe");
442 
443     const TEST_DATA: &[u8] = b"FirstSecondThird";
444     let mut buf = [0u8; TEST_DATA.len()];
445     file_from_pfd(&input[0]).read_exact(&mut buf).expect("error reading from pipe");
446     assert_eq!(&buf[..], TEST_DATA);
447 }
448 
449 #[test]
test_service_specific_exception()450 fn test_service_specific_exception() {
451     let service = get_test_service();
452 
453     for i in -1..2 {
454         let result = service.ThrowServiceException(i);
455         assert!(result.is_err());
456 
457         let status = result.unwrap_err();
458         assert_eq!(status.exception_code(), binder::ExceptionCode::SERVICE_SPECIFIC);
459         assert_eq!(status.service_specific_error(), i);
460     }
461 }
462 
463 macro_rules! test_nullable {
464     ($test:ident, $func:ident, $value:expr) => {
465         #[test]
466         fn $test() {
467             let service = get_test_service();
468             let value = Some($value);
469             let result = service.$func(value.as_deref());
470             assert_eq!(result, Ok(value));
471 
472             let result = service.$func(None);
473             assert_eq!(result, Ok(None));
474         }
475     };
476 }
477 
478 test_nullable! {test_nullable_array_int, RepeatNullableIntArray, vec![1, 2, 3]}
479 test_nullable! {
480     test_nullable_array_byte_enum,
481     RepeatNullableByteEnumArray,
482     vec![ByteEnum::FOO, ByteEnum::BAR]
483 }
484 test_nullable! {
485     test_nullable_array_int_enum,
486     RepeatNullableIntEnumArray,
487     vec![IntEnum::FOO, IntEnum::BAR]
488 }
489 test_nullable! {
490     test_nullable_array_long_enum,
491     RepeatNullableLongEnumArray,
492     vec![LongEnum::FOO, LongEnum::BAR]
493 }
494 test_nullable! {test_nullable_string, RepeatNullableString, "Blooob".into()}
495 test_nullable! {
496     test_nullable_string_list,
497     RepeatNullableStringList,
498     vec![
499         Some("Wat".into()),
500         Some("Blooob".into()),
501         Some("Wat".into()),
502         None,
503         Some("YEAH".into()),
504         Some("OKAAAAY".into()),
505     ]
506 }
507 
508 #[test]
test_nullable_parcelable()509 fn test_nullable_parcelable() {
510     let value = Empty {};
511 
512     let service = get_test_service();
513     let value = Some(value);
514     let result = service.RepeatNullableParcelable(value.as_ref());
515     assert_eq!(result, Ok(value));
516 
517     let result = service.RepeatNullableParcelable(None);
518     assert_eq!(result, Ok(None));
519 }
520 
521 test_nullable! {
522     test_nullable_parcelable_array,
523     RepeatNullableParcelableArray,
524     vec![
525         Some(Empty {}),
526         None,
527     ]
528 }
529 
530 test_nullable! {
531     test_nullable_parcelable_list,
532     RepeatNullableParcelableList,
533     vec![
534         Some(Empty {}),
535         None,
536     ]
537 }
538 
539 #[test]
test_binder()540 fn test_binder() {
541     let service = get_test_service();
542     assert!(service.GetCallback(true).expect("error calling GetCallback").is_none());
543     let callback = service
544         .GetCallback(false)
545         .expect("error calling GetCallback")
546         .expect("expected Some from GetCallback");
547 
548     // We don't have any place to get a fresh `SpIBinder`, so we
549     // reuse the interface for the binder tests
550     let binder = callback.as_binder();
551     assert_eq!(service.TakesAnIBinder(&binder), Ok(()));
552     assert_eq!(service.TakesANullableIBinder(None), Ok(()));
553     assert_eq!(service.TakesANullableIBinder(Some(&binder)), Ok(()));
554 }
555 
556 macro_rules! test_reverse_null_array {
557     ($service:expr, $func:ident, $expect_repeated:expr) => {{
558         let mut repeated = None;
559         let result = $service.$func(None, &mut repeated);
560         assert_eq!(repeated, $expect_repeated);
561         assert_eq!(result, Ok(None));
562     }};
563 }
564 
565 macro_rules! test_reverse_nullable_array {
566     ($service:expr, $func:ident, $array:expr) => {{
567         let mut array = $array;
568         // Java needs initial values here (can't resize arrays)
569         let mut repeated = Some(vec![Default::default(); array.len()]);
570         let result = $service.$func(Some(&array[..]), &mut repeated);
571         assert_eq!(repeated.as_ref(), Some(&array));
572         array.reverse();
573         assert_eq!(result, Ok(Some(array)));
574     }};
575 }
576 
577 #[test]
test_utf8_string()578 fn test_utf8_string() {
579     let service = get_test_service();
580     let inputs = [
581         "typical string",
582         "",
583         "\0\0",
584         std::str::from_utf8(&[0xF0, 0x90, 0x90, 0xB7, 0xE2, 0x82, 0xAC])
585             .expect("error converting string"),
586         ITestService::STRING_CONSTANT_UTF8,
587     ];
588     for input in &inputs {
589         let result = service.RepeatUtf8CppString(input);
590         assert_eq!(result.as_ref().map(String::as_str), Ok(*input));
591 
592         let result = service.RepeatNullableUtf8CppString(Some(input));
593         assert_eq!(result.as_ref().map(Option::as_deref), Ok(Some(*input)));
594     }
595 
596     let result = service.RepeatNullableUtf8CppString(None);
597     assert_eq!(result, Ok(None));
598 
599     let inputs = vec![
600         Some("typical string".into()),
601         Some(String::new()),
602         None,
603         Some(
604             std::str::from_utf8(&[0xF0, 0x90, 0x90, 0xB7, 0xE2, 0x82, 0xAC])
605                 .expect("error converting string")
606                 .into(),
607         ),
608         Some(ITestService::STRING_CONSTANT_UTF8.into()),
609     ];
610 
611     // Java can't return a null list as a parameter
612     let backend = service.getBackendType().expect("error getting backend type");
613     let null_output = if backend == BackendType::JAVA { Some(vec![]) } else { None };
614     test_reverse_null_array!(service, ReverseUtf8CppStringList, null_output);
615 
616     test_reverse_null_array!(service, ReverseNullableUtf8CppString, None);
617 
618     test_reverse_nullable_array!(service, ReverseUtf8CppStringList, inputs.clone());
619     test_reverse_nullable_array!(service, ReverseNullableUtf8CppString, inputs);
620 }
621 
622 #[allow(clippy::approx_constant)]
623 #[allow(clippy::float_cmp)]
624 #[test]
test_parcelable()625 fn test_parcelable() {
626     let service = get_test_service();
627     let mut parcelable = StructuredParcelable::StructuredParcelable::default();
628 
629     const DESIRED_VALUE: i32 = 23;
630     parcelable.f = DESIRED_VALUE;
631 
632     assert_eq!(parcelable.stringDefaultsToFoo, "foo");
633     assert_eq!(parcelable.byteDefaultsToFour, 4);
634     assert_eq!(parcelable.intDefaultsToFive, 5);
635     assert_eq!(parcelable.longDefaultsToNegativeSeven, -7);
636     assert!(parcelable.booleanDefaultsToTrue);
637     assert_eq!(parcelable.charDefaultsToC, 'C' as u16);
638     assert_eq!(parcelable.floatDefaultsToPi, 3.14f32);
639     assert_eq!(parcelable.doubleWithDefault, -3.14e17f64);
640     assert!(!parcelable.boolDefault);
641     assert_eq!(parcelable.byteDefault, 0);
642     assert_eq!(parcelable.intDefault, 0);
643     assert_eq!(parcelable.longDefault, 0);
644     assert_eq!(parcelable.floatDefault, 0.0f32);
645     assert_eq!(parcelable.doubleDefault, 0.0f64);
646     assert_eq!(parcelable.arrayDefaultsTo123, &[1, 2, 3]);
647     assert!(parcelable.arrayDefaultsToEmpty.is_empty());
648 
649     let result = service.FillOutStructuredParcelable(&mut parcelable);
650     assert_eq!(result, Ok(()));
651 
652     assert_eq!(parcelable.shouldContainThreeFs, [DESIRED_VALUE, DESIRED_VALUE, DESIRED_VALUE]);
653     assert_eq!(parcelable.shouldBeJerry, "Jerry");
654     assert_eq!(parcelable.int32_min, i32::MIN);
655     assert_eq!(parcelable.int32_max, i32::MAX);
656     assert_eq!(parcelable.int64_max, i64::MAX);
657     assert_eq!(parcelable.hexInt32_neg_1, -1);
658     for i in parcelable.int8_1 {
659         assert_eq!(i, 1);
660     }
661     for i in parcelable.int32_1 {
662         assert_eq!(i, 1);
663     }
664     for i in parcelable.int64_1 {
665         assert_eq!(i, 1);
666     }
667     assert_eq!(parcelable.hexInt32_pos_1, 1);
668     assert_eq!(parcelable.hexInt64_pos_1, 1);
669     assert_eq!(parcelable.const_exprs_1.0, 1);
670     assert_eq!(parcelable.const_exprs_2.0, 1);
671     assert_eq!(parcelable.const_exprs_3.0, 1);
672     assert_eq!(parcelable.const_exprs_4.0, 1);
673     assert_eq!(parcelable.const_exprs_5.0, 1);
674     assert_eq!(parcelable.const_exprs_6.0, 1);
675     assert_eq!(parcelable.const_exprs_7.0, 1);
676     assert_eq!(parcelable.const_exprs_8.0, 1);
677     assert_eq!(parcelable.const_exprs_9.0, 1);
678     assert_eq!(parcelable.const_exprs_10.0, 1);
679     assert_eq!(parcelable.addString1, "hello world!");
680     assert_eq!(parcelable.addString2, "The quick brown fox jumps over the lazy dog.");
681 
682     assert_eq!(
683         parcelable.shouldSetBit0AndBit2,
684         StructuredParcelable::BIT0 | StructuredParcelable::BIT2
685     );
686 
687     assert_eq!(parcelable.u, Some(Union::Union::Ns(vec![1, 2, 3])));
688     assert_eq!(parcelable.shouldBeConstS1, Some(Union::Union::S(Union::S1.to_string())))
689 }
690 
691 #[test]
test_repeat_extendable_parcelable()692 fn test_repeat_extendable_parcelable() {
693     let service = get_test_service();
694 
695     let ext = Arc::new(MyExt { a: 42, b: "EXT".into() });
696     let mut ep = ExtendableParcelable { a: 1, b: "a".into(), c: 42, ..Default::default() };
697     ep.ext.set_parcelable(Arc::clone(&ext)).expect("error setting parcelable");
698 
699     let mut ep2 = ExtendableParcelable::default();
700     let result = service.RepeatExtendableParcelable(&ep, &mut ep2);
701     assert_eq!(result, Ok(()));
702     assert_eq!(ep2.a, ep.a);
703     assert_eq!(ep2.b, ep.b);
704 
705     let ret_ext = ep2.ext.get_parcelable::<MyExt>().expect("error getting parcelable");
706     assert!(ret_ext.is_some());
707 
708     let ret_ext = ret_ext.unwrap();
709     assert_eq!(ret_ext.a, ext.a);
710     assert_eq!(ret_ext.b, ext.b);
711 }
712 
713 #[test]
test_repeat_extendable_parcelable_vintf()714 fn test_repeat_extendable_parcelable_vintf() {
715     let service = get_test_service();
716 
717     let inner_vintf = Arc::new(VintfParcelable { a: 5 });
718 
719     let mut vintf_ext = VintfExtendableParcelable::default();
720     vintf_ext.ext.set_parcelable(inner_vintf.clone()).unwrap();
721     let vintf_ext = Arc::new(vintf_ext);
722 
723     let mut ep = ExtendableParcelable { a: 1, b: "a".into(), c: 42, ..Default::default() };
724     ep.ext.set_parcelable(Arc::clone(&vintf_ext)).expect("error setting parcelable");
725 
726     let mut ep2 = ExtendableParcelable::default();
727     let result = service.RepeatExtendableParcelableVintf(&ep, &mut ep2);
728     assert_eq!(result, Ok(()));
729     assert_eq!(ep2.a, ep.a);
730     assert_eq!(ep2.b, ep.b);
731 
732     let ret_ext = ep2
733         .ext
734         .get_parcelable::<VintfExtendableParcelable>()
735         .expect("error getting parcelable")
736         .expect("get_parcelable returned None");
737     let ret_inner = ret_ext
738         .ext
739         .get_parcelable::<VintfParcelable>()
740         .expect("error getting parcelable")
741         .expect("get_parcelable returned None");
742     assert_eq!(ret_inner.a, inner_vintf.a);
743 }
744 
745 macro_rules! test_parcelable_holder_stability {
746     ($test:ident, $holder:path, $parcelable:path) => {
747         #[test]
748         fn $test() {
749             let mut holder = <$holder>::default();
750             let parcelable = Arc::new(<$parcelable>::default());
751             let result = holder.ext.set_parcelable(Arc::clone(&parcelable));
752             assert_eq!(result, Ok(()));
753 
754             let parcelable2 = holder.ext.get_parcelable::<$parcelable>().unwrap().unwrap();
755             assert!(Arc::ptr_eq(&parcelable, &parcelable2));
756         }
757     };
758 }
759 
760 test_parcelable_holder_stability! {
761     test_vintf_parcelable_holder_can_contain_vintf_parcelable,
762     VintfExtendableParcelable,
763     VintfParcelable
764 }
765 test_parcelable_holder_stability! {
766     test_stable_parcelable_holder_can_contain_vintf_parcelable,
767     NonVintfExtendableParcelable,
768     VintfParcelable
769 }
770 test_parcelable_holder_stability! {
771     test_stable_parcelable_holder_can_contain_non_vintf_parcelable,
772     NonVintfExtendableParcelable,
773     NonVintfParcelable
774 }
775 test_parcelable_holder_stability! {
776     test_stable_parcelable_holder_can_contain_unstable_parcelable,
777     NonVintfExtendableParcelable,
778     UnstableParcelable
779 }
780 test_parcelable_holder_stability! {
781     test_unstable_parcelable_holder_can_contain_vintf_parcelable,
782     UnstableExtendableParcelable,
783     VintfParcelable
784 }
785 test_parcelable_holder_stability! {
786     test_unstable_parcelable_holder_can_contain_non_vintf_parcelable,
787     UnstableExtendableParcelable,
788     NonVintfParcelable
789 }
790 test_parcelable_holder_stability! {
791     test_unstable_parcelable_holder_can_contain_unstable_parcelable,
792     UnstableExtendableParcelable,
793     UnstableParcelable
794 }
795 
796 #[test]
test_vintf_parcelable_holder_cannot_contain_not_vintf_parcelable()797 fn test_vintf_parcelable_holder_cannot_contain_not_vintf_parcelable() {
798     let mut holder = VintfExtendableParcelable::default();
799     let parcelable = Arc::new(NonVintfParcelable::default());
800     let result = holder.ext.set_parcelable(Arc::clone(&parcelable));
801     assert_eq!(result, Err(binder::StatusCode::BAD_VALUE));
802 
803     let parcelable2 = holder.ext.get_parcelable::<NonVintfParcelable>();
804     assert!(parcelable2.unwrap().is_none());
805 }
806 
807 #[test]
test_vintf_parcelable_holder_cannot_contain_unstable_parcelable()808 fn test_vintf_parcelable_holder_cannot_contain_unstable_parcelable() {
809     let mut holder = VintfExtendableParcelable::default();
810     let parcelable = Arc::new(UnstableParcelable::default());
811     let result = holder.ext.set_parcelable(Arc::clone(&parcelable));
812     assert_eq!(result, Err(binder::StatusCode::BAD_VALUE));
813 
814     let parcelable2 = holder.ext.get_parcelable::<UnstableParcelable>();
815     assert!(parcelable2.unwrap().is_none());
816 }
817 
818 #[test]
test_read_write_extension()819 fn test_read_write_extension() {
820     let ext = Arc::new(MyExt { a: 42, b: "EXT".into() });
821     let ext2 = Arc::new(MyExt2 { a: 42, b: MyExt { a: 24, b: "INEXT".into() }, c: "EXT2".into() });
822 
823     let mut ep = ExtendableParcelable { a: 1, b: "a".into(), c: 42, ..Default::default() };
824 
825     ep.ext.set_parcelable(Arc::clone(&ext)).unwrap();
826     ep.ext2.set_parcelable(Arc::clone(&ext2)).unwrap();
827 
828     let ext_like = ep.ext.get_parcelable::<MyExtLike>();
829     assert_eq!(ext_like.unwrap_err(), binder::StatusCode::BAD_VALUE);
830 
831     let actual_ext = ep.ext.get_parcelable::<MyExt>();
832     assert!(actual_ext.unwrap().is_some());
833     let actual_ext2 = ep.ext2.get_parcelable::<MyExt2>();
834     assert!(actual_ext2.unwrap().is_some());
835 
836     check_extension_content(&ep, &ext, &ext2);
837 
838     let mut parcel = Parcel::new();
839     ep.write_to_parcel(&mut parcel.borrowed()).unwrap();
840 
841     // SAFETY: 0 is less than the current size of the parcel data buffer, because the parcel is not
842     // empty.
843     unsafe {
844         parcel.set_data_position(0).unwrap();
845     }
846     let mut ep1 = ExtendableParcelable::default();
847     ep1.read_from_parcel(parcel.borrowed_ref()).unwrap();
848 
849     // SAFETY: 0 is less than the current size of the parcel data buffer, because the parcel is not
850     // empty.
851     unsafe {
852         parcel.set_data_position(0).unwrap();
853     }
854     ep1.write_to_parcel(&mut parcel.borrowed()).unwrap();
855 
856     // SAFETY: 0 is less than the current size of the parcel data buffer, because the parcel is not
857     // empty.
858     unsafe {
859         parcel.set_data_position(0).unwrap();
860     }
861     let mut ep2 = ExtendableParcelable::default();
862     ep2.read_from_parcel(parcel.borrowed_ref()).unwrap();
863 
864     let ext_like = ep2.ext.get_parcelable::<MyExtLike>();
865     assert!(ext_like.unwrap().is_none());
866 
867     let actual_ext = ep2.ext.get_parcelable::<MyExt>();
868     assert!(actual_ext.unwrap().is_some());
869 
870     let new_ext2 =
871         Arc::new(MyExt2 { a: 79, b: MyExt { a: 42, b: "INNEWEXT".into() }, c: "NEWEXT2".into() });
872     ep2.ext2.set_parcelable(Arc::clone(&new_ext2)).unwrap();
873 
874     check_extension_content(&ep1, &ext, &ext2);
875     check_extension_content(&ep2, &ext, &new_ext2);
876 }
877 
check_extension_content(ep: &ExtendableParcelable, ext: &MyExt, ext2: &MyExt2)878 fn check_extension_content(ep: &ExtendableParcelable, ext: &MyExt, ext2: &MyExt2) {
879     assert_eq!(ep.a, 1);
880     assert_eq!(ep.b, "a");
881     assert_eq!(ep.c, 42);
882 
883     let actual_ext = ep.ext.get_parcelable::<MyExt>().unwrap().unwrap();
884     assert_eq!(ext.a, actual_ext.a);
885     assert_eq!(ext.b, actual_ext.b);
886 
887     let actual_ext2 = ep.ext2.get_parcelable::<MyExt2>().unwrap().unwrap();
888     assert_eq!(ext2.a, actual_ext2.a);
889     assert_eq!(ext2.b.a, actual_ext2.b.a);
890     assert_eq!(ext2.b.b, actual_ext2.b.b);
891     assert_eq!(ext2.c, actual_ext2.c);
892 }
893 
894 #[test]
test_reverse_recursive_list()895 fn test_reverse_recursive_list() {
896     let service = get_test_service();
897 
898     let mut head = None;
899     for n in 0..10 {
900         let node = RecursiveList { value: n, next: head };
901         head = Some(Box::new(node));
902     }
903     // head = [9, 8, .., 0]
904     let result = service.ReverseList(head.as_ref().unwrap());
905     assert!(result.is_ok());
906 
907     // reversed should be [0, 1, ... 9]
908     let mut reversed: Option<&RecursiveList> = result.as_ref().ok();
909     for n in 0..10 {
910         assert_eq!(reversed.map(|inner| inner.value), Some(n));
911         reversed = reversed.unwrap().next.as_ref().map(|n| n.as_ref());
912     }
913     assert!(reversed.is_none())
914 }
915 
916 #[test]
test_get_union_tags()917 fn test_get_union_tags() {
918     let service = get_test_service();
919     let result = service.GetUnionTags(&[]);
920     assert_eq!(result, Ok(vec![]));
921     let result = service.GetUnionTags(&[Union::Union::N(0), Union::Union::Ns(vec![])]);
922     assert_eq!(result, Ok(vec![Union::Tag::Tag::n, Union::Tag::Tag::ns]));
923 }
924 
925 #[test]
test_unions()926 fn test_unions() {
927     assert_eq!(Union::Union::default(), Union::Union::Ns(vec![]));
928     assert_eq!(EnumUnion::default(), EnumUnion::IntEnum(IntEnum::FOO));
929 }
930 
931 const EXPECTED_ARG_VALUE: i32 = 100;
932 const EXPECTED_RETURN_VALUE: i32 = 200;
933 
934 struct TestDefaultImpl;
935 
936 impl binder::Interface for TestDefaultImpl {}
937 
938 impl ITestServiceDefault for TestDefaultImpl {
UnimplementedMethod(&self, arg: i32) -> binder::Result<i32>939     fn UnimplementedMethod(&self, arg: i32) -> binder::Result<i32> {
940         assert_eq!(arg, EXPECTED_ARG_VALUE);
941         Ok(EXPECTED_RETURN_VALUE)
942     }
943 }
944 
945 #[test]
test_default_impl()946 fn test_default_impl() {
947     let service = get_test_service();
948     let di: ITestServiceDefaultRef = Some(Arc::new(TestDefaultImpl));
949     <BpTestService as ITestService::ITestService>::setDefaultImpl(di);
950 
951     let result = service.UnimplementedMethod(EXPECTED_ARG_VALUE);
952     assert_eq!(result, Ok(EXPECTED_RETURN_VALUE));
953 }
954 
955 #[test]
test_versioned_interface_version()956 fn test_versioned_interface_version() {
957     let service: binder::Strong<dyn IFooInterface::IFooInterface> = binder::wait_for_interface(
958         <BpFooInterface as IFooInterface::IFooInterface>::get_descriptor(),
959     )
960     .expect("did not get binder service");
961 
962     let version = service.getInterfaceVersion();
963     assert_eq!(version, Ok(1));
964 }
965 
966 #[test]
test_versioned_interface_hash()967 fn test_versioned_interface_hash() {
968     let service: binder::Strong<dyn IFooInterface::IFooInterface> = binder::wait_for_interface(
969         <BpFooInterface as IFooInterface::IFooInterface>::get_descriptor(),
970     )
971     .expect("did not get binder service");
972 
973     let hash = service.getInterfaceHash();
974     assert_eq!(hash.as_ref().map(String::as_str), Ok("9e7be1859820c59d9d55dd133e71a3687b5d2e5b"));
975 }
976 
977 #[test]
test_versioned_known_union_field_is_ok()978 fn test_versioned_known_union_field_is_ok() {
979     let service: binder::Strong<dyn IFooInterface::IFooInterface> = binder::wait_for_interface(
980         <BpFooInterface as IFooInterface::IFooInterface>::get_descriptor(),
981     )
982     .expect("did not get binder service");
983 
984     assert_eq!(service.acceptUnionAndReturnString(&BazUnion::IntNum(42)), Ok(String::from("42")));
985 }
986 
987 #[test]
test_versioned_unknown_union_field_triggers_error()988 fn test_versioned_unknown_union_field_triggers_error() {
989     let service: binder::Strong<dyn IFooInterface::IFooInterface> = binder::wait_for_interface(
990         <BpFooInterface as IFooInterface::IFooInterface>::get_descriptor(),
991     )
992     .expect("did not get binder service");
993 
994     let ret = service.acceptUnionAndReturnString(&BazUnion::LongNum(42));
995     assert!(ret.is_err());
996 
997     let main_service = get_test_service();
998     let backend = main_service.getBackendType().expect("error getting backend type");
999 
1000     // b/173458620 - for investigation of fixing difference
1001     if backend == BackendType::JAVA {
1002         assert_eq!(ret.unwrap_err().exception_code(), binder::ExceptionCode::ILLEGAL_ARGUMENT);
1003     } else {
1004         assert_eq!(ret.unwrap_err().transaction_error(), binder::StatusCode::BAD_VALUE);
1005     }
1006 }
1007 
1008 #[test]
test_array_of_parcelable_with_new_field()1009 fn test_array_of_parcelable_with_new_field() {
1010     let service: binder::Strong<dyn IFooInterface::IFooInterface> = binder::wait_for_interface(
1011         <BpFooInterface as IFooInterface::IFooInterface>::get_descriptor(),
1012     )
1013     .expect("did not get binder service");
1014 
1015     let foos = [Default::default(), Default::default(), Default::default()];
1016     let ret = service.returnsLengthOfFooArray(&foos);
1017     assert_eq!(ret, Ok(foos.len() as i32));
1018 }
1019 
1020 #[test]
test_read_data_correctly_after_parcelable_with_new_field()1021 fn test_read_data_correctly_after_parcelable_with_new_field() {
1022     let service: binder::Strong<dyn IFooInterface::IFooInterface> = binder::wait_for_interface(
1023         <BpFooInterface as IFooInterface::IFooInterface>::get_descriptor(),
1024     )
1025     .expect("did not get binder service");
1026 
1027     let in_foo = Default::default();
1028     let mut inout_foo = Foo { intDefault42: 0 };
1029     let mut out_foo = Foo { intDefault42: 0 };
1030     let ret = service.ignoreParcelablesAndRepeatInt(&in_foo, &mut inout_foo, &mut out_foo, 43);
1031     assert_eq!(ret, Ok(43));
1032     assert_eq!(inout_foo.intDefault42, 0);
1033     assert_eq!(out_foo.intDefault42, 0);
1034 }
1035 
1036 #[test]
test_calling_v2_api_triggers_error()1037 fn test_calling_v2_api_triggers_error() {
1038     let service: binder::Strong<dyn IFooInterface::IFooInterface> = binder::wait_for_interface(
1039         <BpFooInterface as IFooInterface::IFooInterface>::get_descriptor(),
1040     )
1041     .expect("did not get binder service");
1042 
1043     let ret = service.newApi();
1044 
1045     assert_eq!(ret.unwrap_err().transaction_error(), binder::StatusCode::UNKNOWN_TRANSACTION);
1046 }
1047 
test_renamed_interface<F>(f: F) where F: FnOnce(binder::Strong<dyn IOldName::IOldName>, binder::Strong<dyn INewName::INewName>),1048 fn test_renamed_interface<F>(f: F)
1049 where
1050     F: FnOnce(binder::Strong<dyn IOldName::IOldName>, binder::Strong<dyn INewName::INewName>),
1051 {
1052     let service = get_test_service();
1053     let old_name = service.GetOldNameInterface();
1054     assert!(old_name.is_ok());
1055 
1056     let new_name = service.GetNewNameInterface();
1057     assert!(new_name.is_ok());
1058 
1059     f(old_name.unwrap(), new_name.unwrap());
1060 }
1061 
1062 #[test]
test_renamed_interface_old_as_old()1063 fn test_renamed_interface_old_as_old() {
1064     test_renamed_interface(|old_name, _| {
1065         assert_eq!(
1066             <BpOldName as IOldName::IOldName>::get_descriptor(),
1067             "android.aidl.tests.IOldName"
1068         );
1069 
1070         let real_name = old_name.RealName();
1071         assert_eq!(real_name.as_ref().map(String::as_str), Ok("OldName"));
1072     });
1073 }
1074 
1075 #[test]
test_renamed_interface_new_as_new()1076 fn test_renamed_interface_new_as_new() {
1077     test_renamed_interface(|_, new_name| {
1078         assert_eq!(
1079             <BpNewName as INewName::INewName>::get_descriptor(),
1080             "android.aidl.tests.IOldName"
1081         );
1082 
1083         let real_name = new_name.RealName();
1084         assert_eq!(real_name.as_ref().map(String::as_str), Ok("NewName"));
1085     });
1086 }
1087 
1088 #[test]
test_renamed_interface_old_as_new()1089 fn test_renamed_interface_old_as_new() {
1090     test_renamed_interface(|old_name, _| {
1091         let new_name = old_name.as_binder().into_interface::<dyn INewName::INewName>();
1092         assert!(new_name.is_ok());
1093 
1094         let real_name = new_name.unwrap().RealName();
1095         assert_eq!(real_name.as_ref().map(String::as_str), Ok("OldName"));
1096     });
1097 }
1098 
1099 #[test]
test_renamed_interface_new_as_old()1100 fn test_renamed_interface_new_as_old() {
1101     test_renamed_interface(|_, new_name| {
1102         let old_name = new_name.as_binder().into_interface::<dyn IOldName::IOldName>();
1103         assert!(old_name.is_ok());
1104 
1105         let real_name = old_name.unwrap().RealName();
1106         assert_eq!(real_name.as_ref().map(String::as_str), Ok("NewName"));
1107     });
1108 }
1109 
1110 #[derive(Debug, Default)]
1111 struct Callback {
1112     received: Arc<Mutex<Option<ParcelableWithNested::Status::Status>>>,
1113 }
1114 
1115 impl Interface for Callback {}
1116 
1117 impl INestedService::ICallback::ICallback for Callback {
done(&self, st: ParcelableWithNested::Status::Status) -> binder::Result<()>1118     fn done(&self, st: ParcelableWithNested::Status::Status) -> binder::Result<()> {
1119         *self.received.lock().unwrap() = Some(st);
1120         Ok(())
1121     }
1122 }
1123 
1124 #[test]
test_nested_type()1125 fn test_nested_type() {
1126     let service: binder::Strong<dyn INestedService::INestedService> = binder::wait_for_interface(
1127         <INestedService::BpNestedService as INestedService::INestedService>::get_descriptor(),
1128     )
1129     .expect("did not get binder service");
1130 
1131     let p = ParcelableWithNested::ParcelableWithNested {
1132         status: ParcelableWithNested::Status::Status::OK,
1133     };
1134     // OK -> NOT_OK
1135     let ret = service.flipStatus(&p);
1136     assert_eq!(
1137         ret,
1138         Ok(INestedService::Result::Result { status: ParcelableWithNested::Status::Status::NOT_OK })
1139     );
1140     let received = Arc::new(Mutex::new(None));
1141     // NOT_OK -> OK with nested callback interface
1142     let cb = INestedService::ICallback::BnCallback::new_binder(
1143         Callback { received: Arc::clone(&received) },
1144         BinderFeatures::default(),
1145     );
1146     let ret = service.flipStatusWithCallback(ParcelableWithNested::Status::Status::NOT_OK, &cb);
1147     assert_eq!(ret, Ok(()));
1148     let received = received.lock().unwrap();
1149     assert_eq!(*received, Some(ParcelableWithNested::Status::Status::OK))
1150 }
1151 
1152 #[test]
test_nonnull_binder()1153 fn test_nonnull_binder() {
1154     let service = get_test_service();
1155     let result = service.TakesAnIBinder(&service.as_binder());
1156     assert!(result.is_ok());
1157 }
1158 
1159 #[test]
test_binder_list_without_null()1160 fn test_binder_list_without_null() {
1161     let service = get_test_service();
1162     let result = service.TakesAnIBinderList(&[service.as_binder()]);
1163     assert!(result.is_ok());
1164 }
1165 
1166 #[test]
test_null_binder_to_annotated_method()1167 fn test_null_binder_to_annotated_method() {
1168     let service = get_test_service();
1169     let result = service.TakesANullableIBinder(None);
1170     assert!(result.is_ok());
1171 }
1172 
1173 #[test]
test_binder_list_with_null_to_annotated_method()1174 fn test_binder_list_with_null_to_annotated_method() {
1175     let service = get_test_service();
1176     let result = service.TakesANullableIBinderList(Some(&[Some(service.as_binder()), None]));
1177     assert!(result.is_ok());
1178 }
1179 
1180 #[test]
test_binder_array()1181 fn test_binder_array() {
1182     let service = get_test_service();
1183     let callback = service
1184         .GetCallback(false)
1185         .expect("error calling GetCallback")
1186         .expect("expected Some from GetCallback");
1187 
1188     let mut array = vec![service.as_binder(), callback.as_binder()];
1189 
1190     // Java needs initial values here (can't resize arrays)
1191     let mut repeated = vec![Default::default(); array.len()];
1192 
1193     let result = service.ReverseIBinderArray(&array, &mut repeated);
1194     assert_eq!(repeated.into_iter().collect::<Option<Vec<_>>>().as_ref(), Some(&array));
1195     array.reverse();
1196     assert_eq!(result, Ok(array));
1197 }
1198 
1199 #[test]
test_nullable_binder_array()1200 fn test_nullable_binder_array() {
1201     let service = get_test_service();
1202     let mut array = vec![Some(service.as_binder()), None];
1203 
1204     // Java needs initial values here (can't resize arrays)
1205     let mut repeated = Some(vec![Default::default(); array.len()]);
1206 
1207     let result = service.ReverseNullableIBinderArray(Some(&array[..]), &mut repeated);
1208     assert_eq!(repeated.as_ref(), Some(&array));
1209     array.reverse();
1210     assert_eq!(result, Ok(Some(array)));
1211 }
1212 
1213 #[test]
test_read_write_fixed_size_array()1214 fn test_read_write_fixed_size_array() {
1215     let mut parcel = Parcel::new();
1216     let mut p: FixedSizeArrayExample = Default::default();
1217     p.byteMatrix[0][0] = 0;
1218     p.byteMatrix[0][1] = 1;
1219     p.byteMatrix[1][0] = 2;
1220     p.byteMatrix[1][1] = 3;
1221 
1222     p.floatMatrix[0][0] = 0.0;
1223     p.floatMatrix[0][1] = 1.0;
1224     p.floatMatrix[1][0] = 2.0;
1225     p.floatMatrix[1][1] = 3.0;
1226 
1227     p.boolNullableArray = Some([true, false]);
1228     p.byteNullableArray = Some([42, 0]);
1229     p.stringNullableArray = Some([Some("hello".into()), Some("world".into())]);
1230 
1231     p.boolNullableMatrix = Some([[true, false], Default::default()]);
1232     p.byteNullableMatrix = Some([[42, 0], Default::default()]);
1233     p.stringNullableMatrix =
1234         Some([[Some("hello".into()), Some("world".into())], Default::default()]);
1235 
1236     assert_eq!(parcel.write(&p), Ok(()));
1237     // SAFETY: 0 is less than the current size of the parcel data buffer, because the parcel is not
1238     // empty.
1239     unsafe {
1240         parcel.set_data_position(0).unwrap();
1241     }
1242     assert_eq!(p, parcel.read::<FixedSizeArrayExample>().unwrap());
1243 }
1244 
1245 #[test]
test_fixed_size_array_uses_array_optimization()1246 fn test_fixed_size_array_uses_array_optimization() {
1247     let mut parcel = Parcel::new();
1248     let byte_array = [[1u8, 2u8, 3u8], [4u8, 5u8, 6u8]];
1249     assert_eq!(parcel.write(&byte_array), Ok(()));
1250     // SAFETY: 0 is less than the current size of the parcel data buffer, because the parcel is not
1251     // empty.
1252     unsafe {
1253         parcel.set_data_position(0).unwrap();
1254     }
1255     assert_eq!(parcel.read::<i32>(), Ok(2i32));
1256     assert_eq!(parcel.read::<Vec<u8>>(), Ok(vec![1u8, 2u8, 3u8]));
1257     assert_eq!(parcel.read::<Vec<u8>>(), Ok(vec![4u8, 5u8, 6u8]));
1258 }
1259 
1260 macro_rules! test_repeat_fixed_size_array {
1261     ($service:ident, $func:ident, $value:expr) => {
1262         let array = $value;
1263         let mut repeated = Default::default();
1264         let result = $service.$func(&array, &mut repeated).unwrap();
1265         assert_eq!(repeated, array);
1266         assert_eq!(result, array);
1267     };
1268 }
1269 
1270 macro_rules! test_repeat_fixed_size_array_1d_binder {
1271     ($service:ident, $func:ident, $value:expr) => {
1272         let array = $value;
1273         let mut repeated = Default::default();
1274         let result = $service.$func(&array, &mut repeated).unwrap();
1275         assert_eq!(result, array.clone());
1276         assert_eq!(repeated, array.map(Some));
1277     };
1278 }
1279 
1280 macro_rules! test_repeat_fixed_size_array_2d_binder {
1281     ($service:ident, $func:ident, $value:expr) => {
1282         let array = $value;
1283         let mut repeated = Default::default();
1284         let result = $service.$func(&array, &mut repeated).unwrap();
1285         assert_eq!(result, array.clone());
1286         assert_eq!(repeated, array.map(|row| row.map(Some)));
1287     };
1288 }
1289 
1290 #[test]
test_fixed_size_array_over_binder()1291 fn test_fixed_size_array_over_binder() {
1292     let test_service = get_test_service();
1293     let service: binder::Strong<dyn IRepeatFixedSizeArray> = binder::wait_for_interface(
1294         <BpRepeatFixedSizeArray as IRepeatFixedSizeArray>::get_descriptor(),
1295     )
1296     .expect("did not get binder service");
1297 
1298     test_repeat_fixed_size_array!(service, RepeatBytes, [1u8, 2u8, 3u8]);
1299     test_repeat_fixed_size_array!(service, RepeatInts, [1i32, 2i32, 3i32]);
1300 
1301     let binder1 = test_service.as_binder();
1302     let binder2 = test_service
1303         .GetCallback(false)
1304         .expect("error calling GetCallback")
1305         .expect("expected Some from GetCallback")
1306         .as_binder();
1307     let binder3 = service.as_binder();
1308     test_repeat_fixed_size_array_1d_binder!(
1309         service,
1310         RepeatBinders,
1311         [binder1.clone(), binder2.clone(), binder3.clone()]
1312     );
1313 
1314     let p1 = IntParcelable { value: 1 };
1315     let p2 = IntParcelable { value: 2 };
1316     let p3 = IntParcelable { value: 3 };
1317     test_repeat_fixed_size_array!(service, RepeatParcelables, [p1, p2, p3]);
1318 
1319     test_repeat_fixed_size_array!(service, Repeat2dBytes, [[1u8, 2u8, 3u8], [1u8, 2u8, 3u8]]);
1320     test_repeat_fixed_size_array!(service, Repeat2dInts, [[1i32, 2i32, 3i32], [1i32, 2i32, 3i32]]);
1321 
1322     test_repeat_fixed_size_array_2d_binder!(
1323         service,
1324         Repeat2dBinders,
1325         [[binder1.clone(), binder2.clone(), binder3.clone()], [binder1, binder2, binder3]]
1326     );
1327 
1328     test_repeat_fixed_size_array!(service, Repeat2dParcelables, [[p1, p2, p3], [p1, p2, p3]]);
1329 }
1330 
1331 #[test]
test_ping()1332 fn test_ping() {
1333     let test_service = get_test_service();
1334     assert_eq!(test_service.as_binder().ping_binder(), Ok(()));
1335 }
1336 
1337 #[test]
test_trunk_stable_parcelable()1338 fn test_trunk_stable_parcelable() {
1339     let service = get_test_trunk_stable_service();
1340     let res = service.getInterfaceVersion();
1341     assert!(res.is_ok());
1342     let version = res.unwrap();
1343 
1344     let p1 = MyParcelable { a: 12, b: 13, c: 14 };
1345     let result = service.repeatParcelable(&p1);
1346     assert!(result.is_ok());
1347     let p2 = result.unwrap();
1348     assert_eq!(p1.a, p2.a);
1349     assert_eq!(p1.b, p2.b);
1350     if version == 1 {
1351         assert_ne!(p1.c, p2.c);
1352         assert_eq!(0, p2.c);
1353     } else {
1354         assert_eq!(p1.c, p2.c);
1355     }
1356 }
1357 
1358 #[test]
test_trunk_stable_enum()1359 fn test_trunk_stable_enum() {
1360     let service = get_test_trunk_stable_service();
1361     let e1 = MyEnum::THREE;
1362     let result = service.repeatEnum(e1);
1363     assert!(result.is_ok());
1364     assert_eq!(result.unwrap(), e1);
1365 }
1366 #[test]
test_trunk_stable_union()1367 fn test_trunk_stable_union() {
1368     let service = get_test_trunk_stable_service();
1369     let res = service.getInterfaceVersion();
1370     assert!(res.is_ok());
1371     let version = res.unwrap();
1372 
1373     let u1 = MyUnion::C(14);
1374     let result = service.repeatUnion(&u1);
1375     if version == 1 {
1376         assert!(result.is_err());
1377     } else {
1378         assert!(result.is_ok());
1379     }
1380 }
1381 #[test]
test_trunk_stable_unimplemented()1382 fn test_trunk_stable_unimplemented() {
1383     let service = get_test_trunk_stable_service();
1384     let res = service.getInterfaceVersion();
1385     assert!(res.is_ok());
1386     let version = res.unwrap();
1387 
1388     let p1 = MyOtherParcelable { a: 12, b: 13 };
1389     let result = service.repeatOtherParcelable(&p1);
1390     if version == 1 {
1391         assert!(result.is_err());
1392     } else {
1393         assert!(result.is_ok());
1394     }
1395 }
1396 
1397 #[test]
test_trunk_stable_hash()1398 fn test_trunk_stable_hash() {
1399     let service = get_test_trunk_stable_service();
1400     let res = service.getInterfaceVersion();
1401     assert!(res.is_ok());
1402     let version = res.unwrap();
1403 
1404     let hash = service.getInterfaceHash();
1405     if version == 1 {
1406         assert_eq!(
1407             hash.as_ref().map(String::as_str),
1408             Ok("88311b9118fb6fe9eff4a2ca19121de0587f6d5f")
1409         );
1410         // Check local values of version and hash
1411         assert_eq!(
1412             android_aidl_test_trunk::aidl::android::aidl::test::trunk::ITrunkStableTest::VERSION,
1413             1
1414         );
1415         assert_eq!(
1416             android_aidl_test_trunk::aidl::android::aidl::test::trunk::ITrunkStableTest::HASH,
1417             "88311b9118fb6fe9eff4a2ca19121de0587f6d5f"
1418         );
1419     } else {
1420         assert_eq!(hash.as_ref().map(String::as_str), Ok("notfrozen"));
1421         // Check local values of version and hash
1422         assert_eq!(
1423             android_aidl_test_trunk::aidl::android::aidl::test::trunk::ITrunkStableTest::VERSION,
1424             2
1425         );
1426         assert_eq!(
1427             android_aidl_test_trunk::aidl::android::aidl::test::trunk::ITrunkStableTest::HASH,
1428             "notfrozen"
1429         );
1430     }
1431 }
1432 
1433 #[derive(Debug, Default)]
1434 pub struct MyCallback {
1435     pub repeat_parcelable_called: Arc<Mutex<bool>>,
1436     pub repeat_enum_called: Arc<Mutex<bool>>,
1437     pub repeat_union_called: Arc<Mutex<bool>>,
1438     pub repeat_other_parcelable_called: Arc<Mutex<bool>>,
1439 }
1440 
1441 impl Interface for MyCallback {}
1442 
1443 impl IMyCallback::IMyCallback for MyCallback {
repeatParcelable(&self, in_parcel: &MyParcelable) -> binder::Result<MyParcelable>1444     fn repeatParcelable(&self, in_parcel: &MyParcelable) -> binder::Result<MyParcelable> {
1445         *self.repeat_parcelable_called.lock().unwrap() = true;
1446         let tmp: MyParcelable = MyParcelable { a: in_parcel.a, b: in_parcel.b, c: in_parcel.c };
1447         Ok(tmp)
1448     }
repeatEnum(&self, in_enum: MyEnum) -> binder::Result<MyEnum>1449     fn repeatEnum(&self, in_enum: MyEnum) -> binder::Result<MyEnum> {
1450         *self.repeat_enum_called.lock().unwrap() = true;
1451         Ok(in_enum)
1452     }
repeatUnion(&self, in_union: &MyUnion) -> binder::Result<MyUnion>1453     fn repeatUnion(&self, in_union: &MyUnion) -> binder::Result<MyUnion> {
1454         *self.repeat_union_called.lock().unwrap() = true;
1455         match in_union {
1456             MyUnion::A(n) => Ok(MyUnion::A(*n)),
1457             MyUnion::B(n) => Ok(MyUnion::B(*n)),
1458             MyUnion::C(n) => Ok(MyUnion::C(*n)),
1459         }
1460     }
repeatOtherParcelable( &self, in_parcel: &MyOtherParcelable, ) -> binder::Result<MyOtherParcelable>1461     fn repeatOtherParcelable(
1462         &self,
1463         in_parcel: &MyOtherParcelable,
1464     ) -> binder::Result<MyOtherParcelable> {
1465         *self.repeat_other_parcelable_called.lock().unwrap() = true;
1466         let tmp: MyOtherParcelable = MyOtherParcelable { a: in_parcel.a, b: in_parcel.b };
1467         Ok(tmp)
1468     }
1469 }
1470 
1471 #[test]
test_trunk_stable_callback()1472 fn test_trunk_stable_callback() {
1473     let service = get_test_trunk_stable_service();
1474     let res = service.getInterfaceVersion();
1475     assert!(res.is_ok());
1476     let version = res.unwrap();
1477 
1478     let repeat_parcelable_called = Arc::new(Mutex::new(false));
1479     let repeat_enum_called = Arc::new(Mutex::new(false));
1480     let repeat_union_called = Arc::new(Mutex::new(false));
1481     let repeat_other_parcelable_called = Arc::new(Mutex::new(false));
1482     let cb = IMyCallback::BnMyCallback::new_binder(
1483         MyCallback {
1484             repeat_parcelable_called: Arc::clone(&repeat_parcelable_called),
1485             repeat_enum_called: Arc::clone(&repeat_enum_called),
1486             repeat_union_called: Arc::clone(&repeat_union_called),
1487             repeat_other_parcelable_called: Arc::clone(&repeat_other_parcelable_called),
1488         },
1489         BinderFeatures::default(),
1490     );
1491     let result = service.callMyCallback(&cb);
1492     assert!(result.is_ok());
1493     assert!(*repeat_parcelable_called.lock().unwrap());
1494     assert!(*repeat_enum_called.lock().unwrap());
1495     assert!(*repeat_union_called.lock().unwrap());
1496     if version == 1 {
1497         assert!(!*repeat_other_parcelable_called.lock().unwrap());
1498     } else {
1499         assert!(*repeat_other_parcelable_called.lock().unwrap());
1500     }
1501 }
1502