1 // Copyright (C) 2024 Huawei Device Co., Ltd.
2 // Licensed under the Apache License, Version 2.0 (the "License");
3 // you may not use this file except in compliance with the License.
4 // You may obtain a copy of the License at
5 //
6 //     http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13 
14 #![allow(missing_docs, unused)]
15 use std::fs::OpenOptions;
16 use std::io::{Read, Seek, SeekFrom, Write};
17 use std::sync::Once;
18 
19 use ipc::parcel::{Deserialize, MsgOption, MsgParcel, Serialize};
20 use ipc::remote::{RemoteObj, RemoteStub};
21 use ipc::{IpcResult, Skeleton};
22 use samgr::manage::SystemAbilityManager;
23 
24 const TEST_SYSTEM_ABILITY_ID: i32 = 1012;
25 const TEST_FLOAT: f32 = 7.02;
26 const TEST_DOUBLE: f64 = 7.03;
27 
28 const TEST_LEN: usize = 10;
29 
30 struct TestRemoteStub;
31 
32 impl RemoteStub for TestRemoteStub {
on_remote_request(&self, code: u32, data: &mut MsgParcel, reply: &mut MsgParcel) -> i3233     fn on_remote_request(&self, code: u32, data: &mut MsgParcel, reply: &mut MsgParcel) -> i32 {
34         match code {
35             0 => {
36                 parcel_remote_primitive(data, reply);
37                 parcel_remote_vec(data, reply);
38             }
39             _ => unreachable!(),
40         }
41         0
42     }
43 }
44 
init()45 fn init() {
46     #[cfg(gn_test)]
47     super::init_access_token();
48 
49     static ONCE: Once = Once::new();
50 
51     ONCE.call_once(|| {
52         SystemAbilityManager::add_systemability(TEST_SYSTEM_ABILITY_ID, TestRemoteStub);
53     });
54 }
55 
parcel_remote_primitive(data: &mut MsgParcel, reply: &mut MsgParcel)56 fn parcel_remote_primitive(data: &mut MsgParcel, reply: &mut MsgParcel) {
57     reply
58         .write_interface_token(data.read_interface_token().unwrap().as_str())
59         .unwrap();
60     let w = data.read_buffer(TEST_LEN).unwrap();
61     reply.write_buffer(&w);
62 
63     reply.write_file(data.read_file().unwrap());
64 
65     reply.write(&data.read::<bool>().unwrap());
66     reply.write(&data.read::<bool>().unwrap());
67     reply.write(&data.read::<i8>().unwrap());
68     reply.write(&data.read::<i8>().unwrap());
69     reply.write(&data.read::<i16>().unwrap());
70     reply.write(&data.read::<i16>().unwrap());
71     reply.write(&data.read::<i32>().unwrap());
72     reply.write(&data.read::<i32>().unwrap());
73     reply.write(&data.read::<i64>().unwrap());
74     reply.write(&data.read::<i64>().unwrap());
75 
76     reply.write(&data.read::<u8>().unwrap());
77     reply.write(&data.read::<u8>().unwrap());
78     reply.write(&data.read::<u16>().unwrap());
79     reply.write(&data.read::<u16>().unwrap());
80     reply.write(&data.read::<u32>().unwrap());
81     reply.write(&data.read::<u32>().unwrap());
82     reply.write(&data.read::<u64>().unwrap());
83     reply.write(&data.read::<u64>().unwrap());
84 
85     reply.write(&data.read::<usize>().unwrap());
86     reply.write(&data.read::<usize>().unwrap());
87 }
88 
parcel_remote_vec(data: &mut MsgParcel, reply: &mut MsgParcel)89 fn parcel_remote_vec(data: &mut MsgParcel, reply: &mut MsgParcel) {
90     reply.write(&data.read::<Vec<bool>>().unwrap());
91     reply.write(&data.read::<Vec<i8>>().unwrap());
92     reply.write(&data.read::<Vec<i16>>().unwrap());
93     reply.write(&data.read::<Vec<i32>>().unwrap());
94     reply.write(&data.read::<Vec<i64>>().unwrap());
95 
96     reply.write(&data.read::<Vec<i8>>().unwrap());
97     reply.write(&data.read::<Vec<i16>>().unwrap());
98     reply.write(&data.read::<Vec<i32>>().unwrap());
99     reply.write(&data.read::<Vec<i64>>().unwrap());
100 
101     reply.write(&data.read::<Vec<u8>>().unwrap());
102     reply.write(&data.read::<Vec<u16>>().unwrap());
103     reply.write(&data.read::<Vec<u32>>().unwrap());
104     reply.write(&data.read::<Vec<u64>>().unwrap());
105 
106     reply.write(&data.read::<Vec<u8>>().unwrap());
107     reply.write(&data.read::<Vec<u16>>().unwrap());
108     reply.write(&data.read::<Vec<u32>>().unwrap());
109     reply.write(&data.read::<Vec<u64>>().unwrap());
110 
111     reply.write(&data.read::<Vec<f32>>().unwrap());
112     reply.write(&data.read::<Vec<f64>>().unwrap());
113 
114     reply.write(&data.read::<String>().unwrap());
115     reply.write(&data.read::<String>().unwrap());
116     reply.write(&data.read::<Vec<String>>().unwrap());
117     reply.write_string16(&data.read_string16().unwrap());
118     reply.write_string16_vec(&data.read_string16_vec().unwrap());
119 }
120 
read_and_write(msg: &mut MsgParcel)121 fn read_and_write(msg: &mut MsgParcel) {
122     msg.write_interface_token("hello ipc").unwrap();
123     msg.write_buffer(&[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
124 
125     let mut file = std::fs::OpenOptions::new()
126         .read(true)
127         .write(true)
128         .create(true)
129         .truncate(true)
130         .open("ipc_rust_test_temp1")
131         .unwrap();
132     file.write_all("hello ipc".as_bytes());
133     msg.write_file(file);
134 
135     msg.write(&true).unwrap();
136     msg.write(&false).unwrap();
137     msg.write(&i8::MAX).unwrap();
138     msg.write(&i8::MIN).unwrap();
139     msg.write(&i16::MAX).unwrap();
140     msg.write(&i16::MIN).unwrap();
141     msg.write(&i32::MAX).unwrap();
142     msg.write(&i32::MIN).unwrap();
143     msg.write(&i64::MAX).unwrap();
144     msg.write(&i64::MIN).unwrap();
145     msg.write(&u8::MAX).unwrap();
146     msg.write(&u8::MIN).unwrap();
147 
148     msg.write(&u16::MAX).unwrap();
149     msg.write(&u16::MIN).unwrap();
150     msg.write(&u32::MAX).unwrap();
151     msg.write(&u32::MIN).unwrap();
152     msg.write(&u64::MAX).unwrap();
153     msg.write(&u64::MIN).unwrap();
154     msg.write(&usize::MAX).unwrap();
155     msg.write(&usize::MIN).unwrap();
156 }
157 
read_and_write_vec(msg: &mut MsgParcel)158 fn read_and_write_vec(msg: &mut MsgParcel) {
159     msg.write(&vec![true; 3]).unwrap();
160     msg.write(&vec![i8::MIN; 3]).unwrap();
161     msg.write(&vec![i16::MIN; 3]).unwrap();
162     msg.write(&vec![i32::MIN; 3]).unwrap();
163     msg.write(&vec![i64::MIN; 3]).unwrap();
164 
165     msg.write(&vec![i8::MAX; 3]).unwrap();
166     msg.write(&vec![i16::MAX; 3]).unwrap();
167     msg.write(&vec![i32::MAX; 3]).unwrap();
168     msg.write(&vec![i64::MAX; 3]).unwrap();
169 
170     msg.write(&vec![u8::MIN; 3]).unwrap();
171     msg.write(&vec![u16::MIN; 3]).unwrap();
172     msg.write(&vec![u32::MIN; 3]).unwrap();
173     msg.write(&vec![u64::MIN; 3]).unwrap();
174 
175     msg.write(&vec![u8::MAX; 3]).unwrap();
176     msg.write(&vec![u16::MAX; 3]).unwrap();
177     msg.write(&vec![u32::MAX; 3]).unwrap();
178     msg.write(&vec![u64::MAX; 3]).unwrap();
179 
180     msg.write(&vec![TEST_FLOAT; 3]).unwrap();
181     msg.write(&vec![TEST_DOUBLE; 3]).unwrap();
182 
183     msg.write("hello ipc").unwrap();
184     let s = String::from("hello ipc");
185     msg.write(&s).unwrap();
186 }
187 
188 #[test]
parcel_read_and_write()189 fn parcel_read_and_write() {
190     init();
191 
192     let test_service = SystemAbilityManager::get_system_ability(TEST_SYSTEM_ABILITY_ID).unwrap();
193     let mut msg = MsgParcel::new();
194 
195     read_and_write(&mut msg);
196     read_and_write_vec(&mut msg);
197 
198     let s = String::from("ipc hello");
199     let v = vec![s.clone(), s.clone(), s.clone()];
200     msg.write(&v).unwrap();
201 
202     msg.write_string16(&s);
203     msg.write_string16_vec(&v);
204 
205     let mut reply = test_service.send_request(0, &mut msg).unwrap();
206 
207     assert_eq!(reply.read_interface_token().unwrap(), "hello ipc");
208 
209     assert_eq!(
210         reply.read_buffer(TEST_LEN).unwrap(),
211         vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
212     );
213 
214     let mut file = reply.read_file().unwrap();
215     file.rewind();
216     let mut res = vec![];
217     file.read_to_end(&mut res);
218     let s = String::from_utf8(res).unwrap();
219     assert_eq!(s, "hello ipc");
220 
221 }
222 
assert_read_and_write(reply: &mut MsgParcel)223 fn assert_read_and_write(reply: &mut MsgParcel) {
224     assert!(reply.read::<bool>().unwrap());
225     assert!(!reply.read::<bool>().unwrap());
226     assert_eq!(i8::MAX, reply.read().unwrap());
227     assert_eq!(i8::MIN, reply.read().unwrap());
228 
229     assert_eq!(i16::MAX, reply.read().unwrap());
230     assert_eq!(i16::MIN, reply.read().unwrap());
231     assert_eq!(i32::MAX, reply.read().unwrap());
232     assert_eq!(i32::MIN, reply.read().unwrap());
233     assert_eq!(i64::MAX, reply.read().unwrap());
234     assert_eq!(i64::MIN, reply.read().unwrap());
235     assert_eq!(u8::MAX, reply.read().unwrap());
236     assert_eq!(u8::MIN, reply.read().unwrap());
237 
238     assert_eq!(u16::MAX, reply.read().unwrap());
239     assert_eq!(u16::MIN, reply.read().unwrap());
240     assert_eq!(u32::MAX, reply.read().unwrap());
241     assert_eq!(u32::MIN, reply.read().unwrap());
242     assert_eq!(u64::MAX, reply.read().unwrap());
243     assert_eq!(u64::MIN, reply.read().unwrap());
244     assert_eq!(usize::MAX, reply.read().unwrap());
245     assert_eq!(usize::MIN, reply.read().unwrap());
246 }
247 
assert_read_and_write_vec(reply: &mut MsgParcel)248 fn assert_read_and_write_vec(reply: &mut MsgParcel) {
249     assert_eq!(reply.read::<Vec<bool>>().unwrap(), vec![true; 3]);
250     assert_eq!(reply.read::<Vec<i8>>().unwrap(), vec![i8::MIN; 3]);
251     assert_eq!(reply.read::<Vec<i16>>().unwrap(), vec![i16::MIN; 3]);
252     assert_eq!(reply.read::<Vec<i32>>().unwrap(), vec![i32::MIN; 3]);
253     assert_eq!(reply.read::<Vec<i64>>().unwrap(), vec![i64::MIN; 3]);
254 
255     assert_eq!(reply.read::<Vec<i8>>().unwrap(), vec![i8::MAX; 3]);
256     assert_eq!(reply.read::<Vec<i16>>().unwrap(), vec![i16::MAX; 3]);
257     assert_eq!(reply.read::<Vec<i32>>().unwrap(), vec![i32::MAX; 3]);
258     assert_eq!(reply.read::<Vec<i64>>().unwrap(), vec![i64::MAX; 3]);
259 
260     assert_eq!(reply.read::<Vec<u8>>().unwrap(), vec![u8::MIN; 3]);
261     assert_eq!(reply.read::<Vec<u16>>().unwrap(), vec![u16::MIN; 3]);
262     assert_eq!(reply.read::<Vec<u32>>().unwrap(), vec![u32::MIN; 3]);
263     assert_eq!(reply.read::<Vec<u64>>().unwrap(), vec![u64::MIN; 3]);
264 
265     assert_eq!(reply.read::<Vec<u8>>().unwrap(), vec![u8::MAX; 3]);
266     assert_eq!(reply.read::<Vec<u16>>().unwrap(), vec![u16::MAX; 3]);
267     assert_eq!(reply.read::<Vec<u32>>().unwrap(), vec![u32::MAX; 3]);
268     assert_eq!(reply.read::<Vec<u64>>().unwrap(), vec![u64::MAX; 3]);
269 
270     assert_eq!(reply.read::<Vec<f32>>().unwrap(), vec![TEST_FLOAT; 3]);
271     assert_eq!(reply.read::<Vec<f64>>().unwrap(), vec![TEST_DOUBLE; 3]);
272 }
273