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 Workerfn 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 Workerpub extern "C" fn fmq_rust_test() -> u8 { 89*be431cd8SAndroid Build Coastguard Worker test_body() as u8 90*be431cd8SAndroid Build Coastguard Worker } 91