blob: 7c5afde85c7b43d98306fbb9daa268e5c0f143a5 [file] [log] [blame]
Stephen Crane2a3c2502020-06-16 17:48:35 -07001/*
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//! Rust Binder crate integration tests
18
Stephen Crane7bca1052021-10-25 17:52:51 -070019use binder::{declare_binder_enum, declare_binder_interface};
Stephen Cranef2735b42022-01-19 17:49:46 +000020use binder::{BinderFeatures, Interface, StatusCode, ThreadState};
21// Import from internal API for testing only, do not use this module in
22// production.
23use binder::binder_impl::{
24 Binder, BorrowedParcel, IBinderInternal, TransactionCode, FIRST_CALL_TRANSACTION,
Andrew Walbran12400d82021-03-04 17:04:34 +000025};
Stephen Cranef2735b42022-01-19 17:49:46 +000026
Janis Danisevskis798a09a2020-08-18 08:35:38 -070027use std::convert::{TryFrom, TryInto};
Stephen Crane2a3297f2021-06-11 16:48:10 -070028use std::ffi::CStr;
29use std::fs::File;
30use std::sync::Mutex;
Stephen Crane2a3c2502020-06-16 17:48:35 -070031
32/// Name of service runner.
33///
34/// Must match the binary name in Android.bp
35const RUST_SERVICE_BINARY: &str = "rustBinderTestService";
36
37/// Binary to run a test service.
38///
39/// This needs to be in a separate process from the tests, so we spawn this
40/// binary as a child, providing the service name as an argument.
41fn main() -> Result<(), &'static str> {
42 // Ensure that we can handle all transactions on the main thread.
43 binder::ProcessState::set_thread_pool_max_thread_count(0);
44 binder::ProcessState::start_thread_pool();
45
46 let mut args = std::env::args().skip(1);
47 if args.len() < 1 || args.len() > 2 {
48 print_usage();
49 return Err("");
50 }
51 let service_name = args.next().ok_or_else(|| {
52 print_usage();
53 "Missing SERVICE_NAME argument"
54 })?;
55 let extension_name = args.next();
56
57 {
Stephen Crane2a3297f2021-06-11 16:48:10 -070058 let mut service = Binder::new(BnTest(Box::new(TestService::new(&service_name))));
Janis Danisevskis798a09a2020-08-18 08:35:38 -070059 service.set_requesting_sid(true);
Stephen Crane2a3c2502020-06-16 17:48:35 -070060 if let Some(extension_name) = extension_name {
Andrew Walbran88eca4f2021-04-13 14:26:01 +000061 let extension =
Stephen Crane2a3297f2021-06-11 16:48:10 -070062 BnTest::new_binder(TestService::new(&extension_name), BinderFeatures::default());
Stephen Crane2a3c2502020-06-16 17:48:35 -070063 service
64 .set_extension(&mut extension.as_binder())
65 .expect("Could not add extension");
66 }
67 binder::add_service(&service_name, service.as_binder())
68 .expect("Could not register service");
69 }
70
71 binder::ProcessState::join_thread_pool();
72 Err("Unexpected exit after join_thread_pool")
73}
74
75fn print_usage() {
76 eprintln!(
77 "Usage: {} SERVICE_NAME [EXTENSION_NAME]",
78 RUST_SERVICE_BINARY
79 );
80 eprintln!(concat!(
81 "Spawn a Binder test service identified by SERVICE_NAME,",
82 " optionally with an extesion named EXTENSION_NAME",
83 ));
84}
85
Stephen Crane2a3c2502020-06-16 17:48:35 -070086struct TestService {
87 s: String,
Stephen Crane2a3297f2021-06-11 16:48:10 -070088 dump_args: Mutex<Vec<String>>,
89}
90
91impl TestService {
92 fn new(s: &str) -> Self {
93 Self {
94 s: s.to_string(),
95 dump_args: Mutex::new(Vec::new()),
96 }
97 }
Stephen Crane2a3c2502020-06-16 17:48:35 -070098}
99
Janis Danisevskis798a09a2020-08-18 08:35:38 -0700100#[repr(u32)]
101enum TestTransactionCode {
Andrew Walbran12400d82021-03-04 17:04:34 +0000102 Test = FIRST_CALL_TRANSACTION,
Stephen Crane2a3297f2021-06-11 16:48:10 -0700103 GetDumpArgs,
Janis Danisevskis798a09a2020-08-18 08:35:38 -0700104 GetSelinuxContext,
Alice Ryhl29a50262021-12-10 11:14:32 +0000105 GetIsHandlingTransaction,
Janis Danisevskis798a09a2020-08-18 08:35:38 -0700106}
107
108impl TryFrom<u32> for TestTransactionCode {
109 type Error = StatusCode;
110
111 fn try_from(c: u32) -> Result<Self, Self::Error> {
112 match c {
113 _ if c == TestTransactionCode::Test as u32 => Ok(TestTransactionCode::Test),
Stephen Crane2a3297f2021-06-11 16:48:10 -0700114 _ if c == TestTransactionCode::GetDumpArgs as u32 => Ok(TestTransactionCode::GetDumpArgs),
Janis Danisevskis798a09a2020-08-18 08:35:38 -0700115 _ if c == TestTransactionCode::GetSelinuxContext as u32 => {
116 Ok(TestTransactionCode::GetSelinuxContext)
117 }
Alice Ryhl29a50262021-12-10 11:14:32 +0000118 _ if c == TestTransactionCode::GetIsHandlingTransaction as u32 => Ok(TestTransactionCode::GetIsHandlingTransaction),
Janis Danisevskis798a09a2020-08-18 08:35:38 -0700119 _ => Err(StatusCode::UNKNOWN_TRANSACTION),
120 }
121 }
122}
123
Stephen Crane2a3297f2021-06-11 16:48:10 -0700124impl Interface for TestService {
Stephen Cranef2735b42022-01-19 17:49:46 +0000125 fn dump(&self, _file: &File, args: &[&CStr]) -> Result<(), StatusCode> {
Stephen Crane2a3297f2021-06-11 16:48:10 -0700126 let mut dump_args = self.dump_args.lock().unwrap();
127 dump_args.extend(args.iter().map(|s| s.to_str().unwrap().to_owned()));
128 Ok(())
129 }
130}
Stephen Crane2a3c2502020-06-16 17:48:35 -0700131
132impl ITest for TestService {
Stephen Cranef2735b42022-01-19 17:49:46 +0000133 fn test(&self) -> Result<String, StatusCode> {
Stephen Crane2a3c2502020-06-16 17:48:35 -0700134 Ok(self.s.clone())
135 }
Janis Danisevskis798a09a2020-08-18 08:35:38 -0700136
Stephen Cranef2735b42022-01-19 17:49:46 +0000137 fn get_dump_args(&self) -> Result<Vec<String>, StatusCode> {
Stephen Crane2a3297f2021-06-11 16:48:10 -0700138 let args = self.dump_args.lock().unwrap().clone();
139 Ok(args)
140 }
141
Stephen Cranef2735b42022-01-19 17:49:46 +0000142 fn get_selinux_context(&self) -> Result<String, StatusCode> {
Janis Danisevskis798a09a2020-08-18 08:35:38 -0700143 let sid =
144 ThreadState::with_calling_sid(|sid| sid.map(|s| s.to_string_lossy().into_owned()));
145 sid.ok_or(StatusCode::UNEXPECTED_NULL)
146 }
Alice Ryhl29a50262021-12-10 11:14:32 +0000147
Stephen Cranef2735b42022-01-19 17:49:46 +0000148 fn get_is_handling_transaction(&self) -> Result<bool, StatusCode> {
Alice Ryhl29a50262021-12-10 11:14:32 +0000149 Ok(binder::is_handling_transaction())
150 }
Stephen Crane2a3c2502020-06-16 17:48:35 -0700151}
152
153/// Trivial testing binder interface
154pub trait ITest: Interface {
155 /// Returns a test string
Stephen Cranef2735b42022-01-19 17:49:46 +0000156 fn test(&self) -> Result<String, StatusCode>;
Janis Danisevskis798a09a2020-08-18 08:35:38 -0700157
Stephen Crane2a3297f2021-06-11 16:48:10 -0700158 /// Return the arguments sent via dump
Stephen Cranef2735b42022-01-19 17:49:46 +0000159 fn get_dump_args(&self) -> Result<Vec<String>, StatusCode>;
Stephen Crane2a3297f2021-06-11 16:48:10 -0700160
Janis Danisevskis798a09a2020-08-18 08:35:38 -0700161 /// Returns the caller's SELinux context
Stephen Cranef2735b42022-01-19 17:49:46 +0000162 fn get_selinux_context(&self) -> Result<String, StatusCode>;
Alice Ryhl29a50262021-12-10 11:14:32 +0000163
164 /// Returns the value of calling `is_handling_transaction`.
Stephen Cranef2735b42022-01-19 17:49:46 +0000165 fn get_is_handling_transaction(&self) -> Result<bool, StatusCode>;
Stephen Crane2a3c2502020-06-16 17:48:35 -0700166}
167
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000168/// Async trivial testing binder interface
169pub trait IATest<P>: Interface {
170 /// Returns a test string
Stephen Cranef2735b42022-01-19 17:49:46 +0000171 fn test(&self) -> binder::BoxFuture<'static, Result<String, StatusCode>>;
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000172
173 /// Return the arguments sent via dump
Stephen Cranef2735b42022-01-19 17:49:46 +0000174 fn get_dump_args(&self) -> binder::BoxFuture<'static, Result<Vec<String>, StatusCode>>;
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000175
176 /// Returns the caller's SELinux context
Stephen Cranef2735b42022-01-19 17:49:46 +0000177 fn get_selinux_context(&self) -> binder::BoxFuture<'static, Result<String, StatusCode>>;
Alice Ryhl29a50262021-12-10 11:14:32 +0000178
179 /// Returns the value of calling `is_handling_transaction`.
Stephen Cranef2735b42022-01-19 17:49:46 +0000180 fn get_is_handling_transaction(&self) -> binder::BoxFuture<'static, Result<bool, StatusCode>>;
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000181}
182
Stephen Crane2a3c2502020-06-16 17:48:35 -0700183declare_binder_interface! {
184 ITest["android.os.ITest"] {
185 native: BnTest(on_transact),
186 proxy: BpTest {
187 x: i32 = 100
188 },
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000189 async: IATest,
Stephen Crane2a3c2502020-06-16 17:48:35 -0700190 }
191}
192
193fn on_transact(
194 service: &dyn ITest,
Janis Danisevskis798a09a2020-08-18 08:35:38 -0700195 code: TransactionCode,
Alice Ryhl8618c482021-11-09 15:35:35 +0000196 _data: &BorrowedParcel<'_>,
197 reply: &mut BorrowedParcel<'_>,
Stephen Cranef2735b42022-01-19 17:49:46 +0000198) -> Result<(), StatusCode> {
Janis Danisevskis798a09a2020-08-18 08:35:38 -0700199 match code.try_into()? {
200 TestTransactionCode::Test => reply.write(&service.test()?),
Stephen Crane2a3297f2021-06-11 16:48:10 -0700201 TestTransactionCode::GetDumpArgs => reply.write(&service.get_dump_args()?),
Janis Danisevskis798a09a2020-08-18 08:35:38 -0700202 TestTransactionCode::GetSelinuxContext => reply.write(&service.get_selinux_context()?),
Alice Ryhl29a50262021-12-10 11:14:32 +0000203 TestTransactionCode::GetIsHandlingTransaction => reply.write(&service.get_is_handling_transaction()?),
Janis Danisevskis798a09a2020-08-18 08:35:38 -0700204 }
Stephen Crane2a3c2502020-06-16 17:48:35 -0700205}
206
207impl ITest for BpTest {
Stephen Cranef2735b42022-01-19 17:49:46 +0000208 fn test(&self) -> Result<String, StatusCode> {
Janis Danisevskis798a09a2020-08-18 08:35:38 -0700209 let reply =
210 self.binder
211 .transact(TestTransactionCode::Test as TransactionCode, 0, |_| Ok(()))?;
212 reply.read()
213 }
214
Stephen Cranef2735b42022-01-19 17:49:46 +0000215 fn get_dump_args(&self) -> Result<Vec<String>, StatusCode> {
Stephen Crane2a3297f2021-06-11 16:48:10 -0700216 let reply =
217 self.binder
218 .transact(TestTransactionCode::GetDumpArgs as TransactionCode, 0, |_| Ok(()))?;
219 reply.read()
220 }
221
Stephen Cranef2735b42022-01-19 17:49:46 +0000222 fn get_selinux_context(&self) -> Result<String, StatusCode> {
Janis Danisevskis798a09a2020-08-18 08:35:38 -0700223 let reply = self.binder.transact(
224 TestTransactionCode::GetSelinuxContext as TransactionCode,
225 0,
226 |_| Ok(()),
227 )?;
Stephen Crane2a3c2502020-06-16 17:48:35 -0700228 reply.read()
229 }
Alice Ryhl29a50262021-12-10 11:14:32 +0000230
Stephen Cranef2735b42022-01-19 17:49:46 +0000231 fn get_is_handling_transaction(&self) -> Result<bool, StatusCode> {
Alice Ryhl29a50262021-12-10 11:14:32 +0000232 let reply = self.binder.transact(
233 TestTransactionCode::GetIsHandlingTransaction as TransactionCode,
234 0,
235 |_| Ok(()),
236 )?;
237 reply.read()
238 }
Stephen Crane2a3c2502020-06-16 17:48:35 -0700239}
240
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000241impl<P: binder::BinderAsyncPool> IATest<P> for BpTest {
Stephen Cranef2735b42022-01-19 17:49:46 +0000242 fn test(&self) -> binder::BoxFuture<'static, Result<String, StatusCode>> {
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000243 let binder = self.binder.clone();
244 P::spawn(
Alice Ryhl8618c482021-11-09 15:35:35 +0000245 move || binder.transact(TestTransactionCode::Test as TransactionCode, 0, |_| Ok(())),
246 |reply| async move { reply?.read() }
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000247 )
248 }
249
Stephen Cranef2735b42022-01-19 17:49:46 +0000250 fn get_dump_args(&self) -> binder::BoxFuture<'static, Result<Vec<String>, StatusCode>> {
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000251 let binder = self.binder.clone();
252 P::spawn(
Alice Ryhl8618c482021-11-09 15:35:35 +0000253 move || binder.transact(TestTransactionCode::GetDumpArgs as TransactionCode, 0, |_| Ok(())),
254 |reply| async move { reply?.read() }
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000255 )
256 }
257
Stephen Cranef2735b42022-01-19 17:49:46 +0000258 fn get_selinux_context(&self) -> binder::BoxFuture<'static, Result<String, StatusCode>> {
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000259 let binder = self.binder.clone();
260 P::spawn(
Alice Ryhl8618c482021-11-09 15:35:35 +0000261 move || binder.transact(TestTransactionCode::GetSelinuxContext as TransactionCode, 0, |_| Ok(())),
262 |reply| async move { reply?.read() }
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000263 )
264 }
Alice Ryhl29a50262021-12-10 11:14:32 +0000265
Stephen Cranef2735b42022-01-19 17:49:46 +0000266 fn get_is_handling_transaction(&self) -> binder::BoxFuture<'static, Result<bool, StatusCode>> {
Alice Ryhl29a50262021-12-10 11:14:32 +0000267 let binder = self.binder.clone();
268 P::spawn(
269 move || binder.transact(TestTransactionCode::GetIsHandlingTransaction as TransactionCode, 0, |_| Ok(())),
270 |reply| async move { reply?.read() }
271 )
272 }
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000273}
274
Stephen Crane2a3c2502020-06-16 17:48:35 -0700275impl ITest for Binder<BnTest> {
Stephen Cranef2735b42022-01-19 17:49:46 +0000276 fn test(&self) -> Result<String, StatusCode> {
Stephen Crane2a3c2502020-06-16 17:48:35 -0700277 self.0.test()
278 }
Janis Danisevskis798a09a2020-08-18 08:35:38 -0700279
Stephen Cranef2735b42022-01-19 17:49:46 +0000280 fn get_dump_args(&self) -> Result<Vec<String>, StatusCode> {
Stephen Crane2a3297f2021-06-11 16:48:10 -0700281 self.0.get_dump_args()
282 }
283
Stephen Cranef2735b42022-01-19 17:49:46 +0000284 fn get_selinux_context(&self) -> Result<String, StatusCode> {
Janis Danisevskis798a09a2020-08-18 08:35:38 -0700285 self.0.get_selinux_context()
286 }
Alice Ryhl29a50262021-12-10 11:14:32 +0000287
Stephen Cranef2735b42022-01-19 17:49:46 +0000288 fn get_is_handling_transaction(&self) -> Result<bool, StatusCode> {
Alice Ryhl29a50262021-12-10 11:14:32 +0000289 self.0.get_is_handling_transaction()
290 }
Stephen Crane2a3c2502020-06-16 17:48:35 -0700291}
292
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000293impl<P: binder::BinderAsyncPool> IATest<P> for Binder<BnTest> {
Stephen Cranef2735b42022-01-19 17:49:46 +0000294 fn test(&self) -> binder::BoxFuture<'static, Result<String, StatusCode>> {
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000295 let res = self.0.test();
296 Box::pin(async move { res })
297 }
298
Stephen Cranef2735b42022-01-19 17:49:46 +0000299 fn get_dump_args(&self) -> binder::BoxFuture<'static, Result<Vec<String>, StatusCode>> {
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000300 let res = self.0.get_dump_args();
301 Box::pin(async move { res })
302 }
303
Stephen Cranef2735b42022-01-19 17:49:46 +0000304 fn get_selinux_context(&self) -> binder::BoxFuture<'static, Result<String, StatusCode>> {
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000305 let res = self.0.get_selinux_context();
306 Box::pin(async move { res })
307 }
Alice Ryhl29a50262021-12-10 11:14:32 +0000308
Stephen Cranef2735b42022-01-19 17:49:46 +0000309 fn get_is_handling_transaction(&self) -> binder::BoxFuture<'static, Result<bool, StatusCode>> {
Alice Ryhl29a50262021-12-10 11:14:32 +0000310 let res = self.0.get_is_handling_transaction();
311 Box::pin(async move { res })
312 }
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000313}
314
Stephen Crane669deb62020-09-10 17:31:39 -0700315/// Trivial testing binder interface
316pub trait ITestSameDescriptor: Interface {}
317
318declare_binder_interface! {
319 ITestSameDescriptor["android.os.ITest"] {
320 native: BnTestSameDescriptor(on_transact_same_descriptor),
321 proxy: BpTestSameDescriptor,
322 }
323}
324
325fn on_transact_same_descriptor(
326 _service: &dyn ITestSameDescriptor,
327 _code: TransactionCode,
Alice Ryhl8618c482021-11-09 15:35:35 +0000328 _data: &BorrowedParcel<'_>,
329 _reply: &mut BorrowedParcel<'_>,
Stephen Cranef2735b42022-01-19 17:49:46 +0000330) -> Result<(), StatusCode> {
Stephen Crane669deb62020-09-10 17:31:39 -0700331 Ok(())
332}
333
334impl ITestSameDescriptor for BpTestSameDescriptor {}
335
336impl ITestSameDescriptor for Binder<BnTestSameDescriptor> {}
337
Stephen Crane7bca1052021-10-25 17:52:51 -0700338declare_binder_enum! {
339 TestEnum : [i32; 3] {
340 FOO = 1,
341 BAR = 2,
342 BAZ = 3,
343 }
344}
345
346declare_binder_enum! {
347 #[deprecated(since = "1.0.0")]
348 TestDeprecatedEnum : [i32; 3] {
349 FOO = 1,
350 BAR = 2,
351 BAZ = 3,
352 }
353}
354
Stephen Crane2a3c2502020-06-16 17:48:35 -0700355#[cfg(test)]
356mod tests {
Janis Danisevskis798a09a2020-08-18 08:35:38 -0700357 use selinux_bindgen as selinux_sys;
358 use std::ffi::CStr;
Stephen Crane2a3c2502020-06-16 17:48:35 -0700359 use std::fs::File;
360 use std::process::{Child, Command};
Janis Danisevskis798a09a2020-08-18 08:35:38 -0700361 use std::ptr;
Stephen Crane2a3c2502020-06-16 17:48:35 -0700362 use std::sync::atomic::{AtomicBool, Ordering};
363 use std::sync::Arc;
364 use std::thread;
365 use std::time::Duration;
366
Andrew Walbran12400d82021-03-04 17:04:34 +0000367 use binder::{
Stephen Cranef2735b42022-01-19 17:49:46 +0000368 BinderFeatures, DeathRecipient, FromIBinder, IBinder, Interface, SpIBinder, StatusCode,
369 Strong,
Andrew Walbran12400d82021-03-04 17:04:34 +0000370 };
Stephen Cranef2735b42022-01-19 17:49:46 +0000371 // Import from impl API for testing only, should not be necessary as long as
372 // you are using AIDL.
373 use binder::binder_impl::{Binder, IBinderInternal, TransactionCode};
Stephen Crane2a3c2502020-06-16 17:48:35 -0700374
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000375 use binder_tokio::Tokio;
376
377 use super::{BnTest, ITest, IATest, ITestSameDescriptor, TestService, RUST_SERVICE_BINARY};
Stephen Crane2a3c2502020-06-16 17:48:35 -0700378
379 pub struct ScopedServiceProcess(Child);
380
381 impl ScopedServiceProcess {
382 pub fn new(identifier: &str) -> Self {
383 Self::new_internal(identifier, None)
384 }
385
386 pub fn new_with_extension(identifier: &str, extension: &str) -> Self {
387 Self::new_internal(identifier, Some(extension))
388 }
389
390 fn new_internal(identifier: &str, extension: Option<&str>) -> Self {
391 let mut binary_path =
392 std::env::current_exe().expect("Could not retrieve current executable path");
393 binary_path.pop();
394 binary_path.push(RUST_SERVICE_BINARY);
395 let mut command = Command::new(&binary_path);
396 command.arg(identifier);
397 if let Some(ext) = extension {
398 command.arg(ext);
399 }
400 let child = command.spawn().expect("Could not start service");
401 Self(child)
402 }
403 }
404
405 impl Drop for ScopedServiceProcess {
406 fn drop(&mut self) {
407 self.0.kill().expect("Could not kill child process");
408 self.0
409 .wait()
410 .expect("Could not wait for child process to die");
411 }
412 }
413
414 #[test]
415 fn check_services() {
416 let mut sm = binder::get_service("manager").expect("Did not get manager binder service");
417 assert!(sm.is_binder_alive());
418 assert!(sm.ping_binder().is_ok());
419
420 assert!(binder::get_service("this_service_does_not_exist").is_none());
421 assert_eq!(
422 binder::get_interface::<dyn ITest>("this_service_does_not_exist").err(),
423 Some(StatusCode::NAME_NOT_FOUND)
424 );
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000425 assert_eq!(
426 binder::get_interface::<dyn IATest<Tokio>>("this_service_does_not_exist").err(),
427 Some(StatusCode::NAME_NOT_FOUND)
428 );
Stephen Crane2a3c2502020-06-16 17:48:35 -0700429
430 // The service manager service isn't an ITest, so this must fail.
431 assert_eq!(
432 binder::get_interface::<dyn ITest>("manager").err(),
433 Some(StatusCode::BAD_TYPE)
434 );
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000435 assert_eq!(
436 binder::get_interface::<dyn IATest<Tokio>>("manager").err(),
437 Some(StatusCode::BAD_TYPE)
438 );
Stephen Crane2a3c2502020-06-16 17:48:35 -0700439 }
440
Alice Ryhl929804f2021-11-02 12:04:39 +0000441 #[tokio::test]
442 async fn check_services_async() {
443 let mut sm = binder::get_service("manager").expect("Did not get manager binder service");
444 assert!(sm.is_binder_alive());
445 assert!(sm.ping_binder().is_ok());
446
447 assert!(binder::get_service("this_service_does_not_exist").is_none());
448 assert_eq!(
449 binder_tokio::get_interface::<dyn ITest>("this_service_does_not_exist").await.err(),
450 Some(StatusCode::NAME_NOT_FOUND)
451 );
452 assert_eq!(
453 binder_tokio::get_interface::<dyn IATest<Tokio>>("this_service_does_not_exist").await.err(),
454 Some(StatusCode::NAME_NOT_FOUND)
455 );
456
457 // The service manager service isn't an ITest, so this must fail.
458 assert_eq!(
459 binder_tokio::get_interface::<dyn ITest>("manager").await.err(),
460 Some(StatusCode::BAD_TYPE)
461 );
462 assert_eq!(
463 binder_tokio::get_interface::<dyn IATest<Tokio>>("manager").await.err(),
464 Some(StatusCode::BAD_TYPE)
465 );
466 }
467
Stephen Crane2a3c2502020-06-16 17:48:35 -0700468 #[test]
Andrew Walbranc3ce5c32021-06-03 16:15:56 +0000469 fn check_wait_for_service() {
470 let mut sm =
471 binder::wait_for_service("manager").expect("Did not get manager binder service");
472 assert!(sm.is_binder_alive());
473 assert!(sm.ping_binder().is_ok());
474
475 // The service manager service isn't an ITest, so this must fail.
476 assert_eq!(
477 binder::wait_for_interface::<dyn ITest>("manager").err(),
478 Some(StatusCode::BAD_TYPE)
479 );
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000480 assert_eq!(
481 binder::wait_for_interface::<dyn IATest<Tokio>>("manager").err(),
482 Some(StatusCode::BAD_TYPE)
483 );
Andrew Walbranc3ce5c32021-06-03 16:15:56 +0000484 }
485
486 #[test]
Stephen Crane098bbc92022-02-14 13:31:53 -0800487 fn get_declared_instances() {
488 // At the time of writing this test, there is no good VINTF interface
489 // guaranteed to be on all devices. Cuttlefish has light, so this will
490 // generally test things.
491 let has_lights = binder::is_declared("android.hardware.light.ILights/default")
492 .expect("Could not check for declared interface");
493
494 let instances = binder::get_declared_instances("android.hardware.light.ILights")
495 .expect("Could not get declared instances");
496
497 let expected_defaults = if has_lights { 1 } else { 0 };
498 assert_eq!(expected_defaults, instances.iter().filter(|i| i.as_str() == "default").count());
499 }
500
501 #[test]
Stephen Crane2a3c2502020-06-16 17:48:35 -0700502 fn trivial_client() {
503 let service_name = "trivial_client_test";
504 let _process = ScopedServiceProcess::new(service_name);
Stephen Craneddb3e6d2020-12-18 13:27:22 -0800505 let test_client: Strong<dyn ITest> =
Stephen Crane2a3c2502020-06-16 17:48:35 -0700506 binder::get_interface(service_name).expect("Did not get manager binder service");
507 assert_eq!(test_client.test().unwrap(), "trivial_client_test");
508 }
509
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000510 #[tokio::test]
511 async fn trivial_client_async() {
512 let service_name = "trivial_client_test";
513 let _process = ScopedServiceProcess::new(service_name);
514 let test_client: Strong<dyn IATest<Tokio>> =
Alice Ryhl929804f2021-11-02 12:04:39 +0000515 binder_tokio::get_interface(service_name).await.expect("Did not get manager binder service");
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000516 assert_eq!(test_client.test().await.unwrap(), "trivial_client_test");
517 }
518
Janis Danisevskis798a09a2020-08-18 08:35:38 -0700519 #[test]
Andrew Walbranc3ce5c32021-06-03 16:15:56 +0000520 fn wait_for_trivial_client() {
521 let service_name = "wait_for_trivial_client_test";
522 let _process = ScopedServiceProcess::new(service_name);
523 let test_client: Strong<dyn ITest> =
524 binder::wait_for_interface(service_name).expect("Did not get manager binder service");
525 assert_eq!(test_client.test().unwrap(), "wait_for_trivial_client_test");
526 }
527
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000528 #[tokio::test]
529 async fn wait_for_trivial_client_async() {
530 let service_name = "wait_for_trivial_client_test";
531 let _process = ScopedServiceProcess::new(service_name);
532 let test_client: Strong<dyn IATest<Tokio>> =
Alice Ryhl929804f2021-11-02 12:04:39 +0000533 binder_tokio::wait_for_interface(service_name).await.expect("Did not get manager binder service");
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000534 assert_eq!(test_client.test().await.unwrap(), "wait_for_trivial_client_test");
535 }
536
537 fn get_expected_selinux_context() -> &'static str {
538 unsafe {
539 let mut out_ptr = ptr::null_mut();
540 assert_eq!(selinux_sys::getcon(&mut out_ptr), 0);
541 assert!(!out_ptr.is_null());
542 CStr::from_ptr(out_ptr)
543 .to_str()
544 .expect("context was invalid UTF-8")
545 }
546 }
547
Andrew Walbranc3ce5c32021-06-03 16:15:56 +0000548 #[test]
Janis Danisevskis798a09a2020-08-18 08:35:38 -0700549 fn get_selinux_context() {
550 let service_name = "get_selinux_context";
551 let _process = ScopedServiceProcess::new(service_name);
Stephen Craneddb3e6d2020-12-18 13:27:22 -0800552 let test_client: Strong<dyn ITest> =
Janis Danisevskis798a09a2020-08-18 08:35:38 -0700553 binder::get_interface(service_name).expect("Did not get manager binder service");
Janis Danisevskis798a09a2020-08-18 08:35:38 -0700554 assert_eq!(
555 test_client.get_selinux_context().unwrap(),
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000556 get_expected_selinux_context()
557 );
558 }
559
560 #[tokio::test]
561 async fn get_selinux_context_async() {
Alice Ryhl29a50262021-12-10 11:14:32 +0000562 let service_name = "get_selinux_context_async";
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000563 let _process = ScopedServiceProcess::new(service_name);
564 let test_client: Strong<dyn IATest<Tokio>> =
Alice Ryhl929804f2021-11-02 12:04:39 +0000565 binder_tokio::get_interface(service_name).await.expect("Did not get manager binder service");
Alice Ryhl05f5a2c2021-09-15 12:56:10 +0000566 assert_eq!(
567 test_client.get_selinux_context().await.unwrap(),
568 get_expected_selinux_context()
Janis Danisevskis798a09a2020-08-18 08:35:38 -0700569 );
570 }
571
Alice Ryhlc1736842021-11-23 12:38:51 +0000572 #[tokio::test]
573 async fn get_selinux_context_sync_to_async() {
574 let service_name = "get_selinux_context";
575 let _process = ScopedServiceProcess::new(service_name);
576 let test_client: Strong<dyn ITest> =
577 binder::get_interface(service_name).expect("Did not get manager binder service");
578 let test_client = test_client.into_async::<Tokio>();
579 assert_eq!(
580 test_client.get_selinux_context().await.unwrap(),
581 get_expected_selinux_context()
582 );
583 }
584
585 #[tokio::test]
586 async fn get_selinux_context_async_to_sync() {
587 let service_name = "get_selinux_context";
588 let _process = ScopedServiceProcess::new(service_name);
589 let test_client: Strong<dyn IATest<Tokio>> =
590 binder_tokio::get_interface(service_name).await.expect("Did not get manager binder service");
591 let test_client = test_client.into_sync();
592 assert_eq!(
593 test_client.get_selinux_context().unwrap(),
594 get_expected_selinux_context()
595 );
596 }
597
Alice Ryhlea9d9d22021-08-27 07:51:30 +0000598 struct Bools {
599 binder_died: Arc<AtomicBool>,
600 binder_dealloc: Arc<AtomicBool>,
601 }
602
603 impl Bools {
604 fn is_dead(&self) -> bool {
605 self.binder_died.load(Ordering::Relaxed)
606 }
607 fn assert_died(&self) {
608 assert!(
609 self.is_dead(),
610 "Did not receive death notification"
611 );
612 }
613 fn assert_dropped(&self) {
614 assert!(
615 self.binder_dealloc.load(Ordering::Relaxed),
616 "Did not dealloc death notification"
617 );
618 }
619 fn assert_not_dropped(&self) {
620 assert!(
621 !self.binder_dealloc.load(Ordering::Relaxed),
622 "Dealloc death notification too early"
623 );
624 }
625 }
626
627 fn register_death_notification(binder: &mut SpIBinder) -> (Bools, DeathRecipient) {
Stephen Crane2a3c2502020-06-16 17:48:35 -0700628 let binder_died = Arc::new(AtomicBool::new(false));
Alice Ryhlea9d9d22021-08-27 07:51:30 +0000629 let binder_dealloc = Arc::new(AtomicBool::new(false));
630
631 struct SetOnDrop {
632 binder_dealloc: Arc<AtomicBool>,
633 }
634 impl Drop for SetOnDrop {
635 fn drop(&mut self) {
636 self.binder_dealloc.store(true, Ordering::Relaxed);
637 }
638 }
Stephen Crane2a3c2502020-06-16 17:48:35 -0700639
640 let mut death_recipient = {
641 let flag = binder_died.clone();
Alice Ryhlea9d9d22021-08-27 07:51:30 +0000642 let set_on_drop = SetOnDrop {
643 binder_dealloc: binder_dealloc.clone(),
644 };
Stephen Crane2a3c2502020-06-16 17:48:35 -0700645 DeathRecipient::new(move || {
646 flag.store(true, Ordering::Relaxed);
Alice Ryhlea9d9d22021-08-27 07:51:30 +0000647 // Force the closure to take ownership of set_on_drop. When the closure is
648 // dropped, the destructor of `set_on_drop` will run.
649 let _ = &set_on_drop;
Stephen Crane2a3c2502020-06-16 17:48:35 -0700650 })
651 };
652
653 binder
654 .link_to_death(&mut death_recipient)
655 .expect("link_to_death failed");
656
Alice Ryhlea9d9d22021-08-27 07:51:30 +0000657 let bools = Bools {
658 binder_died,
659 binder_dealloc,
660 };
661
662 (bools, death_recipient)
Stephen Crane2a3c2502020-06-16 17:48:35 -0700663 }
664
665 /// Killing a remote service should unregister the service and trigger
666 /// death notifications.
667 #[test]
668 fn test_death_notifications() {
669 binder::ProcessState::start_thread_pool();
670
671 let service_name = "test_death_notifications";
672 let service_process = ScopedServiceProcess::new(service_name);
673 let mut remote = binder::get_service(service_name).expect("Could not retrieve service");
674
Alice Ryhlea9d9d22021-08-27 07:51:30 +0000675 let (bools, recipient) = register_death_notification(&mut remote);
Stephen Crane2a3c2502020-06-16 17:48:35 -0700676
677 drop(service_process);
678 remote
679 .ping_binder()
680 .expect_err("Service should have died already");
681
682 // Pause to ensure any death notifications get delivered
683 thread::sleep(Duration::from_secs(1));
684
Alice Ryhlea9d9d22021-08-27 07:51:30 +0000685 bools.assert_died();
686 bools.assert_not_dropped();
687
688 drop(recipient);
689
690 bools.assert_dropped();
Stephen Crane2a3c2502020-06-16 17:48:35 -0700691 }
692
693 /// Test unregistering death notifications.
694 #[test]
695 fn test_unregister_death_notifications() {
696 binder::ProcessState::start_thread_pool();
697
698 let service_name = "test_unregister_death_notifications";
699 let service_process = ScopedServiceProcess::new(service_name);
700 let mut remote = binder::get_service(service_name).expect("Could not retrieve service");
701
Alice Ryhlea9d9d22021-08-27 07:51:30 +0000702 let (bools, mut recipient) = register_death_notification(&mut remote);
Stephen Crane2a3c2502020-06-16 17:48:35 -0700703
704 remote
705 .unlink_to_death(&mut recipient)
706 .expect("Could not unlink death notifications");
707
708 drop(service_process);
709 remote
710 .ping_binder()
711 .expect_err("Service should have died already");
712
713 // Pause to ensure any death notifications get delivered
714 thread::sleep(Duration::from_secs(1));
715
716 assert!(
Alice Ryhlea9d9d22021-08-27 07:51:30 +0000717 !bools.is_dead(),
Stephen Crane2a3c2502020-06-16 17:48:35 -0700718 "Received unexpected death notification after unlinking",
719 );
Alice Ryhlea9d9d22021-08-27 07:51:30 +0000720
721 bools.assert_not_dropped();
722 drop(recipient);
723 bools.assert_dropped();
Stephen Crane2a3c2502020-06-16 17:48:35 -0700724 }
725
726 /// Dropping a remote handle should unregister any death notifications.
727 #[test]
728 fn test_death_notification_registration_lifetime() {
729 binder::ProcessState::start_thread_pool();
730
731 let service_name = "test_death_notification_registration_lifetime";
732 let service_process = ScopedServiceProcess::new(service_name);
733 let mut remote = binder::get_service(service_name).expect("Could not retrieve service");
734
Alice Ryhlea9d9d22021-08-27 07:51:30 +0000735 let (bools, recipient) = register_death_notification(&mut remote);
Stephen Crane2a3c2502020-06-16 17:48:35 -0700736
737 // This should automatically unregister our death notification.
738 drop(remote);
739
740 drop(service_process);
741
742 // Pause to ensure any death notifications get delivered
743 thread::sleep(Duration::from_secs(1));
744
745 // We dropped the remote handle, so we should not receive the death
746 // notification when the remote process dies here.
747 assert!(
Alice Ryhlea9d9d22021-08-27 07:51:30 +0000748 !bools.is_dead(),
Stephen Crane2a3c2502020-06-16 17:48:35 -0700749 "Received unexpected death notification after dropping remote handle"
750 );
Alice Ryhlea9d9d22021-08-27 07:51:30 +0000751
752 bools.assert_not_dropped();
753 drop(recipient);
754 bools.assert_dropped();
Stephen Crane2a3c2502020-06-16 17:48:35 -0700755 }
756
757 /// Test IBinder interface methods not exercised elsewhere.
758 #[test]
759 fn test_misc_ibinder() {
760 let service_name = "rust_test_ibinder";
761
762 {
763 let _process = ScopedServiceProcess::new(service_name);
764
Stephen Crane2a3297f2021-06-11 16:48:10 -0700765 let test_client: Strong<dyn ITest> =
Stephen Cranef2735b42022-01-19 17:49:46 +0000766 binder::get_interface(service_name).expect("Did not get test binder service");
Stephen Crane2a3297f2021-06-11 16:48:10 -0700767 let mut remote = test_client.as_binder();
Stephen Crane2a3c2502020-06-16 17:48:35 -0700768 assert!(remote.is_binder_alive());
769 remote.ping_binder().expect("Could not ping remote service");
770
Stephen Crane2a3297f2021-06-11 16:48:10 -0700771 let dump_args = ["dump", "args", "for", "testing"];
772
Stephen Crane2a3c2502020-06-16 17:48:35 -0700773 let null_out = File::open("/dev/null").expect("Could not open /dev/null");
774 remote
Stephen Crane2a3297f2021-06-11 16:48:10 -0700775 .dump(&null_out, &dump_args)
Stephen Crane2a3c2502020-06-16 17:48:35 -0700776 .expect("Could not dump remote service");
Stephen Crane2a3297f2021-06-11 16:48:10 -0700777
778 let remote_args = test_client.get_dump_args().expect("Could not fetched dumped args");
779 assert_eq!(dump_args, remote_args[..], "Remote args don't match call to dump");
Stephen Crane2a3c2502020-06-16 17:48:35 -0700780 }
781
782 // get/set_extensions is tested in test_extensions()
783
784 // transact is tested everywhere else, and we can't make raw
785 // transactions outside the [FIRST_CALL_TRANSACTION,
786 // LAST_CALL_TRANSACTION] range from the NDK anyway.
787
788 // link_to_death is tested in test_*_death_notification* tests.
789 }
790
791 #[test]
792 fn test_extensions() {
793 let service_name = "rust_test_extensions";
794 let extension_name = "rust_test_extensions_ext";
795
796 {
797 let _process = ScopedServiceProcess::new(service_name);
798
799 let mut remote = binder::get_service(service_name);
800 assert!(remote.is_binder_alive());
801
802 let extension = remote
803 .get_extension()
804 .expect("Could not check for an extension");
805 assert!(extension.is_none());
806 }
807
808 {
809 let _process = ScopedServiceProcess::new_with_extension(service_name, extension_name);
810
811 let mut remote = binder::get_service(service_name);
812 assert!(remote.is_binder_alive());
813
814 let maybe_extension = remote
815 .get_extension()
816 .expect("Could not check for an extension");
817
818 let extension = maybe_extension.expect("Remote binder did not have an extension");
819
Stephen Craneddb3e6d2020-12-18 13:27:22 -0800820 let extension: Strong<dyn ITest> = FromIBinder::try_from(extension)
Stephen Crane2a3c2502020-06-16 17:48:35 -0700821 .expect("Extension could not be converted to the expected interface");
822
823 assert_eq!(extension.test().unwrap(), extension_name);
824 }
825 }
Stephen Crane669deb62020-09-10 17:31:39 -0700826
827 /// Test re-associating a local binder object with a different class.
828 ///
829 /// This is needed because different binder service (e.g. NDK vs Rust)
830 /// implementations are incompatible and must not be interchanged. A local
831 /// service with the same descriptor string but a different class pointer
832 /// may have been created by an NDK service and is therefore incompatible
833 /// with the Rust service implementation. It must be treated as remote and
834 /// all API calls parceled and sent through transactions.
835 ///
836 /// Further tests of this behavior with the C NDK and Rust API are in
837 /// rust_ndk_interop.rs
838 #[test]
839 fn associate_existing_class() {
Stephen Crane2a3297f2021-06-11 16:48:10 -0700840 let service = Binder::new(BnTest(Box::new(TestService::new("testing_service"))));
Stephen Crane669deb62020-09-10 17:31:39 -0700841
842 // This should succeed although we will have to treat the service as
843 // remote.
Andrew Walbran12400d82021-03-04 17:04:34 +0000844 let _interface: Strong<dyn ITestSameDescriptor> =
845 FromIBinder::try_from(service.as_binder())
846 .expect("Could not re-interpret service as the ITestSameDescriptor interface");
Stephen Crane669deb62020-09-10 17:31:39 -0700847 }
848
849 /// Test that we can round-trip a rust service through a generic IBinder
850 #[test]
851 fn reassociate_rust_binder() {
852 let service_name = "testing_service";
Andrew Walbran88eca4f2021-04-13 14:26:01 +0000853 let service_ibinder = BnTest::new_binder(
Stephen Crane2a3297f2021-06-11 16:48:10 -0700854 TestService::new(service_name),
Andrew Walbran88eca4f2021-04-13 14:26:01 +0000855 BinderFeatures::default(),
856 )
Andrew Walbran12400d82021-03-04 17:04:34 +0000857 .as_binder();
Stephen Crane669deb62020-09-10 17:31:39 -0700858
Andrew Walbran12400d82021-03-04 17:04:34 +0000859 let service: Strong<dyn ITest> = service_ibinder
860 .into_interface()
Stephen Crane669deb62020-09-10 17:31:39 -0700861 .expect("Could not reassociate the generic ibinder");
862
863 assert_eq!(service.test().unwrap(), service_name);
864 }
Stephen Craneddb3e6d2020-12-18 13:27:22 -0800865
866 #[test]
867 fn weak_binder_upgrade() {
868 let service_name = "testing_service";
Andrew Walbran88eca4f2021-04-13 14:26:01 +0000869 let service = BnTest::new_binder(
Stephen Crane2a3297f2021-06-11 16:48:10 -0700870 TestService::new(service_name),
Andrew Walbran88eca4f2021-04-13 14:26:01 +0000871 BinderFeatures::default(),
872 );
Stephen Craneddb3e6d2020-12-18 13:27:22 -0800873
874 let weak = Strong::downgrade(&service);
875
876 let upgraded = weak.upgrade().expect("Could not upgrade weak binder");
877
878 assert_eq!(service, upgraded);
879 }
880
881 #[test]
882 fn weak_binder_upgrade_dead() {
883 let service_name = "testing_service";
884 let weak = {
Andrew Walbran88eca4f2021-04-13 14:26:01 +0000885 let service = BnTest::new_binder(
Stephen Crane2a3297f2021-06-11 16:48:10 -0700886 TestService::new(service_name),
Andrew Walbran88eca4f2021-04-13 14:26:01 +0000887 BinderFeatures::default(),
888 );
Stephen Craneddb3e6d2020-12-18 13:27:22 -0800889
890 Strong::downgrade(&service)
891 };
892
893 assert_eq!(weak.upgrade(), Err(StatusCode::DEAD_OBJECT));
894 }
895
896 #[test]
897 fn weak_binder_clone() {
898 let service_name = "testing_service";
Andrew Walbran88eca4f2021-04-13 14:26:01 +0000899 let service = BnTest::new_binder(
Stephen Crane2a3297f2021-06-11 16:48:10 -0700900 TestService::new(service_name),
Andrew Walbran88eca4f2021-04-13 14:26:01 +0000901 BinderFeatures::default(),
902 );
Stephen Craneddb3e6d2020-12-18 13:27:22 -0800903
904 let weak = Strong::downgrade(&service);
905 let cloned = weak.clone();
906 assert_eq!(weak, cloned);
907
908 let upgraded = weak.upgrade().expect("Could not upgrade weak binder");
909 let clone_upgraded = cloned.upgrade().expect("Could not upgrade weak binder");
910
911 assert_eq!(service, upgraded);
912 assert_eq!(service, clone_upgraded);
913 }
914
915 #[test]
916 #[allow(clippy::eq_op)]
917 fn binder_ord() {
Andrew Walbran88eca4f2021-04-13 14:26:01 +0000918 let service1 = BnTest::new_binder(
Stephen Crane2a3297f2021-06-11 16:48:10 -0700919 TestService::new("testing_service1"),
Andrew Walbran88eca4f2021-04-13 14:26:01 +0000920 BinderFeatures::default(),
921 );
922 let service2 = BnTest::new_binder(
Stephen Crane2a3297f2021-06-11 16:48:10 -0700923 TestService::new("testing_service2"),
Andrew Walbran88eca4f2021-04-13 14:26:01 +0000924 BinderFeatures::default(),
925 );
Stephen Craneddb3e6d2020-12-18 13:27:22 -0800926
927 assert!(!(service1 < service1));
928 assert!(!(service1 > service1));
929 assert_eq!(service1 < service2, !(service2 < service1));
930 }
Alice Ryhlfeba6ca2021-08-19 10:47:04 +0000931
932 #[test]
933 fn binder_parcel_mixup() {
934 let service1 = BnTest::new_binder(
935 TestService::new("testing_service1"),
936 BinderFeatures::default(),
937 );
938 let service2 = BnTest::new_binder(
939 TestService::new("testing_service2"),
940 BinderFeatures::default(),
941 );
942
943 let service1 = service1.as_binder();
944 let service2 = service2.as_binder();
945
946 let parcel = service1.prepare_transact().unwrap();
Stephen Cranef2735b42022-01-19 17:49:46 +0000947 let res = service2.submit_transact(super::TestTransactionCode::Test as TransactionCode, parcel, 0);
Alice Ryhlfeba6ca2021-08-19 10:47:04 +0000948
949 match res {
950 Ok(_) => panic!("submit_transact should fail"),
951 Err(err) => assert_eq!(err, binder::StatusCode::BAD_VALUE),
952 }
953 }
Alice Ryhl29a50262021-12-10 11:14:32 +0000954
955 #[test]
956 fn get_is_handling_transaction() {
957 let service_name = "get_is_handling_transaction";
958 let _process = ScopedServiceProcess::new(service_name);
959 let test_client: Strong<dyn ITest> =
960 binder::get_interface(service_name).expect("Did not get manager binder service");
961 // Should be true externally.
962 assert!(test_client.get_is_handling_transaction().unwrap());
963
964 // Should be false locally.
965 assert!(!binder::is_handling_transaction());
966
967 // Should also be false in spawned thread.
968 std::thread::spawn(|| {
969 assert!(!binder::is_handling_transaction());
970 }).join().unwrap();
971 }
972
973 #[tokio::test]
974 async fn get_is_handling_transaction_async() {
975 let service_name = "get_is_handling_transaction_async";
976 let _process = ScopedServiceProcess::new(service_name);
977 let test_client: Strong<dyn IATest<Tokio>> =
978 binder_tokio::get_interface(service_name).await.expect("Did not get manager binder service");
979 // Should be true externally.
980 assert!(test_client.get_is_handling_transaction().await.unwrap());
981
982 // Should be false locally.
983 assert!(!binder::is_handling_transaction());
984
985 // Should also be false in spawned task.
986 tokio::spawn(async {
987 assert!(!binder::is_handling_transaction());
988 }).await.unwrap();
989
990 // And in spawn_blocking task.
991 tokio::task::spawn_blocking(|| {
992 assert!(!binder::is_handling_transaction());
993 }).await.unwrap();
994 }
Stephen Crane2a3c2502020-06-16 17:48:35 -0700995}