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