xref: /aosp_15_r20/system/libfmq/tests/msgq_rust_test_client.rs (revision be431cd81a9a2349eaea34eb56fcf6d1608da596)
1*be431cd8SAndroid Build Coastguard Worker /*
2*be431cd8SAndroid Build Coastguard Worker  * Copyright (C) 2024 The Android Open Source Project
3*be431cd8SAndroid Build Coastguard Worker  *
4*be431cd8SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*be431cd8SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*be431cd8SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*be431cd8SAndroid Build Coastguard Worker  *
8*be431cd8SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*be431cd8SAndroid Build Coastguard Worker  *
10*be431cd8SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*be431cd8SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*be431cd8SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*be431cd8SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*be431cd8SAndroid Build Coastguard Worker  * limitations under the License.
15*be431cd8SAndroid Build Coastguard Worker  */
16*be431cd8SAndroid Build Coastguard Worker 
17*be431cd8SAndroid Build Coastguard Worker use android_fmq_test::aidl::android::fmq::test::ITestAidlMsgQ::ITestAidlMsgQ;
18*be431cd8SAndroid Build Coastguard Worker use binder::Strong;
19*be431cd8SAndroid Build Coastguard Worker use fmq::MessageQueue;
20*be431cd8SAndroid Build Coastguard Worker 
wait_get_test_service() -> Result<Strong<dyn ITestAidlMsgQ>, String>21*be431cd8SAndroid Build Coastguard Worker fn wait_get_test_service() -> Result<Strong<dyn ITestAidlMsgQ>, String> {
22*be431cd8SAndroid Build Coastguard Worker     const SERVICE_IDENTIFIER: &str = "android.fmq.test.ITestAidlMsgQ/default";
23*be431cd8SAndroid Build Coastguard Worker     let service = binder::get_interface::<dyn ITestAidlMsgQ>(SERVICE_IDENTIFIER)
24*be431cd8SAndroid Build Coastguard Worker         .map_err(|e| format!("Failed to connect to service {SERVICE_IDENTIFIER}: {e}"))?;
25*be431cd8SAndroid Build Coastguard Worker     Ok(service)
26*be431cd8SAndroid Build Coastguard Worker }
27*be431cd8SAndroid Build Coastguard Worker 
setup_test_service() -> (MessageQueue<i32>, Strong<dyn ITestAidlMsgQ>)28*be431cd8SAndroid Build Coastguard Worker fn setup_test_service() -> (MessageQueue<i32>, Strong<dyn ITestAidlMsgQ>) {
29*be431cd8SAndroid Build Coastguard Worker     let service = wait_get_test_service().expect("failed to obtain test service");
30*be431cd8SAndroid Build Coastguard Worker 
31*be431cd8SAndroid Build Coastguard Worker     /* SAFETY: `sysconf` simply returns an integer. */
32*be431cd8SAndroid Build Coastguard Worker     let page_size: usize = unsafe { libc::sysconf(libc::_SC_PAGESIZE) }.try_into().unwrap();
33*be431cd8SAndroid Build Coastguard Worker     let num_elements_in_sync_queue: usize = (page_size - 16) / std::mem::size_of::<i32>();
34*be431cd8SAndroid Build Coastguard Worker 
35*be431cd8SAndroid Build Coastguard Worker     /* Create a queue on the client side. */
36*be431cd8SAndroid Build Coastguard Worker     let mq = MessageQueue::<i32>::new(
37*be431cd8SAndroid Build Coastguard Worker         num_elements_in_sync_queue,
38*be431cd8SAndroid Build Coastguard Worker         true, /* configure event flag word */
39*be431cd8SAndroid Build Coastguard Worker     );
40*be431cd8SAndroid Build Coastguard Worker     let desc = mq.dupe_desc();
41*be431cd8SAndroid Build Coastguard Worker 
42*be431cd8SAndroid Build Coastguard Worker     let result = service.configureFmqSyncReadWrite(&desc);
43*be431cd8SAndroid Build Coastguard Worker     assert!(result.is_ok(), "configuring event queue failed");
44*be431cd8SAndroid Build Coastguard Worker 
45*be431cd8SAndroid Build Coastguard Worker     (mq, service)
46*be431cd8SAndroid Build Coastguard Worker }
47*be431cd8SAndroid Build Coastguard Worker 
48*be431cd8SAndroid Build Coastguard Worker mod synchronized_read_write_client {
49*be431cd8SAndroid Build Coastguard Worker     use super::*;
50*be431cd8SAndroid Build Coastguard Worker 
51*be431cd8SAndroid Build Coastguard Worker     /*
52*be431cd8SAndroid Build Coastguard Worker      * Write a small number of messages to FMQ. Request
53*be431cd8SAndroid Build Coastguard Worker      * mService to read and verify that the write was successful.
54*be431cd8SAndroid Build Coastguard Worker      */
55*be431cd8SAndroid Build Coastguard Worker     #[test]
small_input_writer_test()56*be431cd8SAndroid Build Coastguard Worker     fn small_input_writer_test() {
57*be431cd8SAndroid Build Coastguard Worker         let (mut mq, service) = setup_test_service();
58*be431cd8SAndroid Build Coastguard Worker         const DATA_LEN: usize = 16;
59*be431cd8SAndroid Build Coastguard Worker 
60*be431cd8SAndroid Build Coastguard Worker         let data: [i32; DATA_LEN] = init_data();
61*be431cd8SAndroid Build Coastguard Worker         let mut wc = mq.write_many(DATA_LEN).expect("write_many(DATA_LEN) failed");
62*be431cd8SAndroid Build Coastguard Worker         for x in data {
63*be431cd8SAndroid Build Coastguard Worker             wc.write(x).expect("writing i32 failed");
64*be431cd8SAndroid Build Coastguard Worker         }
65*be431cd8SAndroid Build Coastguard Worker         drop(wc);
66*be431cd8SAndroid Build Coastguard Worker         let ret = service.requestReadFmqSync(DATA_LEN as _);
67*be431cd8SAndroid Build Coastguard Worker         assert!(ret.is_ok());
68*be431cd8SAndroid Build Coastguard Worker     }
69*be431cd8SAndroid Build Coastguard Worker }
70*be431cd8SAndroid Build Coastguard Worker 
init_data<const N: usize>() -> [i32; N]71*be431cd8SAndroid Build Coastguard Worker fn init_data<const N: usize>() -> [i32; N] {
72*be431cd8SAndroid Build Coastguard Worker     let mut data = [0; N];
73*be431cd8SAndroid Build Coastguard Worker     for (i, elem) in data.iter_mut().enumerate() {
74*be431cd8SAndroid Build Coastguard Worker         *elem = i as _;
75*be431cd8SAndroid Build Coastguard Worker     }
76*be431cd8SAndroid Build Coastguard Worker     data
77*be431cd8SAndroid Build Coastguard Worker }
78