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