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
parcel_write() -> MsgParcel188 fn parcel_write() -> MsgParcel {
189 init();
190
191 let test_service = SystemAbilityManager::get_system_ability(TEST_SYSTEM_ABILITY_ID).unwrap();
192 let mut msg = MsgParcel::new();
193
194 read_and_write(&mut msg);
195 read_and_write_vec(&mut msg);
196
197 let s = String::from("ipc hello");
198 let v = vec![s.clone(), s.clone(), s.clone()];
199 msg.write(&v).unwrap();
200
201 msg.write_string16(&s);
202 msg.write_string16_vec(&v);
203
204 test_service.send_request(0, &mut msg).unwrap()
205 }
206
207 #[test]
parcel_read()208 fn parcel_read() {
209
210 let mut reply = parcel_write();
211
212 assert_eq!(reply.read_interface_token().unwrap(), "hello ipc");
213
214 assert_eq!(
215 reply.read_buffer(TEST_LEN).unwrap(),
216 vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
217 );
218
219 let mut file = reply.read_file().unwrap();
220 file.rewind();
221 let mut res = vec![];
222 file.read_to_end(&mut res);
223 let s = String::from_utf8(res).unwrap();
224 assert_eq!(s, "hello ipc");
225
226 }
227
228 #[test]
parcel_read_from_raw_fd()229 fn parcel_read_from_raw_fd() {
230
231 let mut reply = parcel_write();
232
233 assert_eq!(reply.read_interface_token().unwrap(), "hello ipc");
234
235 assert_eq!(
236 reply.read_buffer(TEST_LEN).unwrap(),
237 vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
238 );
239 let raw_fd = unsafe { reply.read_raw_fd() };
240 let mut file = unsafe { File::from_raw_fd(raw_fd) };
241 file.rewind();
242 let mut res = vec![];
243 file.read_to_end(&mut res);
244 let s = String::from_utf8(res).unwrap();
245 assert_eq!(s, "hello ipc");
246
247 }
248
assert_read_and_write(reply: &mut MsgParcel)249 fn assert_read_and_write(reply: &mut MsgParcel) {
250 assert!(reply.read::<bool>().unwrap());
251 assert!(!reply.read::<bool>().unwrap());
252 assert_eq!(i8::MAX, reply.read().unwrap());
253 assert_eq!(i8::MIN, reply.read().unwrap());
254
255 assert_eq!(i16::MAX, reply.read().unwrap());
256 assert_eq!(i16::MIN, reply.read().unwrap());
257 assert_eq!(i32::MAX, reply.read().unwrap());
258 assert_eq!(i32::MIN, reply.read().unwrap());
259 assert_eq!(i64::MAX, reply.read().unwrap());
260 assert_eq!(i64::MIN, reply.read().unwrap());
261 assert_eq!(u8::MAX, reply.read().unwrap());
262 assert_eq!(u8::MIN, reply.read().unwrap());
263
264 assert_eq!(u16::MAX, reply.read().unwrap());
265 assert_eq!(u16::MIN, reply.read().unwrap());
266 assert_eq!(u32::MAX, reply.read().unwrap());
267 assert_eq!(u32::MIN, reply.read().unwrap());
268 assert_eq!(u64::MAX, reply.read().unwrap());
269 assert_eq!(u64::MIN, reply.read().unwrap());
270 assert_eq!(usize::MAX, reply.read().unwrap());
271 assert_eq!(usize::MIN, reply.read().unwrap());
272 }
273
assert_read_and_write_vec(reply: &mut MsgParcel)274 fn assert_read_and_write_vec(reply: &mut MsgParcel) {
275 assert_eq!(reply.read::<Vec<bool>>().unwrap(), vec![true; 3]);
276 assert_eq!(reply.read::<Vec<i8>>().unwrap(), vec![i8::MIN; 3]);
277 assert_eq!(reply.read::<Vec<i16>>().unwrap(), vec![i16::MIN; 3]);
278 assert_eq!(reply.read::<Vec<i32>>().unwrap(), vec![i32::MIN; 3]);
279 assert_eq!(reply.read::<Vec<i64>>().unwrap(), vec![i64::MIN; 3]);
280
281 assert_eq!(reply.read::<Vec<i8>>().unwrap(), vec![i8::MAX; 3]);
282 assert_eq!(reply.read::<Vec<i16>>().unwrap(), vec![i16::MAX; 3]);
283 assert_eq!(reply.read::<Vec<i32>>().unwrap(), vec![i32::MAX; 3]);
284 assert_eq!(reply.read::<Vec<i64>>().unwrap(), vec![i64::MAX; 3]);
285
286 assert_eq!(reply.read::<Vec<u8>>().unwrap(), vec![u8::MIN; 3]);
287 assert_eq!(reply.read::<Vec<u16>>().unwrap(), vec![u16::MIN; 3]);
288 assert_eq!(reply.read::<Vec<u32>>().unwrap(), vec![u32::MIN; 3]);
289 assert_eq!(reply.read::<Vec<u64>>().unwrap(), vec![u64::MIN; 3]);
290
291 assert_eq!(reply.read::<Vec<u8>>().unwrap(), vec![u8::MAX; 3]);
292 assert_eq!(reply.read::<Vec<u16>>().unwrap(), vec![u16::MAX; 3]);
293 assert_eq!(reply.read::<Vec<u32>>().unwrap(), vec![u32::MAX; 3]);
294 assert_eq!(reply.read::<Vec<u64>>().unwrap(), vec![u64::MAX; 3]);
295
296 assert_eq!(reply.read::<Vec<f32>>().unwrap(), vec![TEST_FLOAT; 3]);
297 assert_eq!(reply.read::<Vec<f64>>().unwrap(), vec![TEST_DOUBLE; 3]);
298 }
299