xref: /aosp_15_r20/system/libfmq/tests/fmq_test.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 //! Crate to wrap tests of libfmq rust bindings with a trivial C-ABI interface
18*be431cd8SAndroid Build Coastguard Worker //! to test them from C++.
19*be431cd8SAndroid Build Coastguard Worker 
20*be431cd8SAndroid Build Coastguard Worker use fmq::MessageQueue;
21*be431cd8SAndroid Build Coastguard Worker 
22*be431cd8SAndroid Build Coastguard Worker macro_rules! assert_return {
23*be431cd8SAndroid Build Coastguard Worker     ($e: expr) => {
24*be431cd8SAndroid Build Coastguard Worker         if !$e {
25*be431cd8SAndroid Build Coastguard Worker             eprintln!(stringify!($e));
26*be431cd8SAndroid Build Coastguard Worker             return false;
27*be431cd8SAndroid Build Coastguard Worker         }
28*be431cd8SAndroid Build Coastguard Worker     };
29*be431cd8SAndroid Build Coastguard Worker     ($e: expr, $msg: expr) => {
30*be431cd8SAndroid Build Coastguard Worker         if !$e {
31*be431cd8SAndroid Build Coastguard Worker             eprintln!($msg);
32*be431cd8SAndroid Build Coastguard Worker             return false;
33*be431cd8SAndroid Build Coastguard Worker         }
34*be431cd8SAndroid Build Coastguard Worker     };
35*be431cd8SAndroid Build Coastguard Worker }
36*be431cd8SAndroid Build Coastguard Worker 
test_body() -> bool37*be431cd8SAndroid Build Coastguard Worker fn test_body() -> bool {
38*be431cd8SAndroid Build Coastguard Worker     let mut mq = MessageQueue::<u8>::new(500, false);
39*be431cd8SAndroid Build Coastguard Worker 
40*be431cd8SAndroid Build Coastguard Worker     match mq.write_many(4) {
41*be431cd8SAndroid Build Coastguard Worker         Some(mut wc) => {
42*be431cd8SAndroid Build Coastguard Worker             wc.write(200).unwrap();
43*be431cd8SAndroid Build Coastguard Worker             wc.write(201).unwrap();
44*be431cd8SAndroid Build Coastguard Worker             wc.write(202).unwrap();
45*be431cd8SAndroid Build Coastguard Worker             wc.write(203).unwrap();
46*be431cd8SAndroid Build Coastguard Worker         }
47*be431cd8SAndroid Build Coastguard Worker         None => {
48*be431cd8SAndroid Build Coastguard Worker             eprintln!("failed to write_many(4)");
49*be431cd8SAndroid Build Coastguard Worker             return false;
50*be431cd8SAndroid Build Coastguard Worker         }
51*be431cd8SAndroid Build Coastguard Worker     };
52*be431cd8SAndroid Build Coastguard Worker 
53*be431cd8SAndroid Build Coastguard Worker     let desc = mq.dupe_desc();
54*be431cd8SAndroid Build Coastguard Worker     let join_handle = std::thread::spawn(move || {
55*be431cd8SAndroid Build Coastguard Worker         let mut mq2 = MessageQueue::from_desc(&desc, false);
56*be431cd8SAndroid Build Coastguard Worker         match mq2.read_many(1) {
57*be431cd8SAndroid Build Coastguard Worker             Some(mut rc) => {
58*be431cd8SAndroid Build Coastguard Worker                 assert_return!(rc.read() == Some(200));
59*be431cd8SAndroid Build Coastguard Worker             }
60*be431cd8SAndroid Build Coastguard Worker             None => {
61*be431cd8SAndroid Build Coastguard Worker                 eprintln!("failed to read_many(1)");
62*be431cd8SAndroid Build Coastguard Worker                 return false;
63*be431cd8SAndroid Build Coastguard Worker             }
64*be431cd8SAndroid Build Coastguard Worker         };
65*be431cd8SAndroid Build Coastguard Worker         true
66*be431cd8SAndroid Build Coastguard Worker     });
67*be431cd8SAndroid Build Coastguard Worker 
68*be431cd8SAndroid Build Coastguard Worker     assert_return!(join_handle.join().ok() == Some(true));
69*be431cd8SAndroid Build Coastguard Worker 
70*be431cd8SAndroid Build Coastguard Worker     match mq.read_many(3) {
71*be431cd8SAndroid Build Coastguard Worker         Some(mut rc) => {
72*be431cd8SAndroid Build Coastguard Worker             assert_return!(rc.read() == Some(201));
73*be431cd8SAndroid Build Coastguard Worker             assert_return!(rc.read() == Some(202));
74*be431cd8SAndroid Build Coastguard Worker             assert_return!(rc.read() == Some(203));
75*be431cd8SAndroid Build Coastguard Worker             drop(rc);
76*be431cd8SAndroid Build Coastguard Worker         }
77*be431cd8SAndroid Build Coastguard Worker         None => {
78*be431cd8SAndroid Build Coastguard Worker             eprintln!("failed to read_many(4)");
79*be431cd8SAndroid Build Coastguard Worker             return false;
80*be431cd8SAndroid Build Coastguard Worker         }
81*be431cd8SAndroid Build Coastguard Worker     };
82*be431cd8SAndroid Build Coastguard Worker 
83*be431cd8SAndroid Build Coastguard Worker     true
84*be431cd8SAndroid Build Coastguard Worker }
85*be431cd8SAndroid Build Coastguard Worker 
86*be431cd8SAndroid Build Coastguard Worker /// Test fmq from Rust. Returns 0 on failure, 1 on success.
87*be431cd8SAndroid Build Coastguard Worker #[no_mangle]
fmq_rust_test() -> u888*be431cd8SAndroid Build Coastguard Worker pub extern "C" fn fmq_rust_test() -> u8 {
89*be431cd8SAndroid Build Coastguard Worker     test_body() as u8
90*be431cd8SAndroid Build Coastguard Worker }
91