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 use ipc::cxx_share::MessageParcel;
15 use ipc::parcel::MsgParcel;
16
17 const TEST_FLOAT: f32 = 7.02;
18 const TEST_DOUBLE: f64 = 7.03;
19
check_parcel(msg: &mut MsgParcel)20 fn check_parcel(msg: &mut MsgParcel) {
21 assert_eq!(msg.read_interface_token().unwrap(), "TEST");
22 assert_eq!(msg.read_buffer("TEST".len()).unwrap(), "TEST".as_bytes());
23 assert!(msg.read::<bool>().unwrap());
24 assert_eq!(msg.read::<u8>().unwrap(), u8::MAX);
25 assert_eq!(msg.read::<u16>().unwrap(), u16::MAX);
26 assert_eq!(msg.read::<u32>().unwrap(), u32::MAX);
27 assert_eq!(msg.read::<u64>().unwrap(), u64::MAX);
28
29 assert_eq!(msg.read::<i8>().unwrap(), i8::MAX);
30 assert_eq!(msg.read::<i16>().unwrap(), i16::MAX);
31 assert_eq!(msg.read::<i32>().unwrap(), i32::MAX);
32 assert_eq!(msg.read::<i64>().unwrap(), i64::MAX);
33
34 assert_eq!(msg.read::<i8>().unwrap(), i8::MIN);
35 assert_eq!(msg.read::<i16>().unwrap(), i16::MIN);
36 assert_eq!(msg.read::<i32>().unwrap(), i32::MIN);
37 assert_eq!(msg.read::<i64>().unwrap(), i64::MIN);
38
39 assert_eq!(msg.read::<f32>().unwrap(), 7.02);
40 assert_eq!(msg.read::<f64>().unwrap(), 7.03);
41
42 assert_eq!(msg.read::<Vec<bool>>().unwrap(), vec![true; 3]);
43
44 assert_eq!(msg.read::<Vec<u8>>().unwrap(), vec![u8::MAX; 3]);
45 assert_eq!(msg.read::<Vec<u16>>().unwrap(), vec![u16::MAX; 3]);
46 assert_eq!(msg.read::<Vec<u32>>().unwrap(), vec![u32::MAX; 3]);
47 assert_eq!(msg.read::<Vec<u64>>().unwrap(), vec![u64::MAX; 3]);
48
49 assert_eq!(msg.read::<Vec<i8>>().unwrap(), vec![i8::MAX; 3]);
50 assert_eq!(msg.read::<Vec<i16>>().unwrap(), vec![i16::MAX; 3]);
51 assert_eq!(msg.read::<Vec<i32>>().unwrap(), vec![i32::MAX; 3]);
52 assert_eq!(msg.read::<Vec<i64>>().unwrap(), vec![i64::MAX; 3]);
53
54 assert_eq!(msg.read::<Vec<i8>>().unwrap(), vec![i8::MIN; 3]);
55 assert_eq!(msg.read::<Vec<i16>>().unwrap(), vec![i16::MIN; 3]);
56 assert_eq!(msg.read::<Vec<i32>>().unwrap(), vec![i32::MIN; 3]);
57 assert_eq!(msg.read::<Vec<i64>>().unwrap(), vec![i64::MIN; 3]);
58
59 assert_eq!(msg.read::<Vec<f32>>().unwrap(), vec![TEST_FLOAT; 3]);
60 assert_eq!(msg.read::<Vec<f64>>().unwrap(), vec![TEST_DOUBLE; 3]);
61
62 assert_eq!(
63 msg.read::<Vec<String>>().unwrap(),
64 vec![String::from("TEST"); 3]
65 );
66
67 assert_eq!(
68 msg.read_string16_vec().unwrap(),
69 vec![String::from("TEST"); 3]
70 );
71 }
72
73 #[test]
interactive_msg_parcel_read()74 fn interactive_msg_parcel_read() {
75 let mut msg = unsafe { MsgParcel::from_ptr(GetTestMessageParcel()) };
76 check_parcel(&mut msg);
77 }
78
79 #[test]
interactive_msg_parcel_write()80 fn interactive_msg_parcel_write() {
81 let mut msg = MsgParcel::new();
82 msg.write_interface_token("TEST").unwrap();
83
84 let data = String::from("TEST");
85 msg.write_buffer(data.as_bytes()).unwrap();
86
87 msg.write(&true).unwrap();
88 msg.write(&u8::MAX).unwrap();
89 msg.write(&u16::MAX).unwrap();
90 msg.write(&u32::MAX).unwrap();
91 msg.write(&u64::MAX).unwrap();
92
93 msg.write(&i8::MAX).unwrap();
94 msg.write(&i16::MAX).unwrap();
95 msg.write(&i32::MAX).unwrap();
96 msg.write(&i64::MAX).unwrap();
97
98 msg.write(&i8::MIN).unwrap();
99 msg.write(&i16::MIN).unwrap();
100 msg.write(&i32::MIN).unwrap();
101 msg.write(&i64::MIN).unwrap();
102
103 msg.write(&7.02f32).unwrap();
104 msg.write(&7.03f64).unwrap();
105
106 msg.write(&vec![true; 3]).unwrap();
107 msg.write(&vec![u8::MAX; 3]).unwrap();
108 msg.write(&vec![u16::MAX; 3]).unwrap();
109 msg.write(&vec![u32::MAX; 3]).unwrap();
110 msg.write(&vec![u64::MAX; 3]).unwrap();
111
112 msg.write(&vec![i8::MAX; 3]).unwrap();
113 msg.write(&vec![i16::MAX; 3]).unwrap();
114 msg.write(&vec![i32::MAX; 3]).unwrap();
115 msg.write(&vec![i64::MAX; 3]).unwrap();
116
117 msg.write(&vec![i8::MIN; 3]).unwrap();
118 msg.write(&vec![i16::MIN; 3]).unwrap();
119 msg.write(&vec![i32::MIN; 3]).unwrap();
120 msg.write(&vec![i64::MIN; 3]).unwrap();
121
122 msg.write(&vec![TEST_FLOAT; 3]).unwrap();
123 msg.write(&vec![TEST_DOUBLE; 3]).unwrap();
124
125 msg.write(&vec![String::from("TEST"); 3]).unwrap();
126
127 msg.write_string16_vec(&[
128 String::from("TEST"),
129 String::from("TEST"),
130 String::from("TEST"),
131 ])
132 .unwrap();
133
134 let mut reply = unsafe { MsgParcel::from_ptr(ReadAndWrite(msg.into_raw())) };
135 check_parcel(&mut reply);
136 }
137
138 #[link(name = "ipc_rust_test_c")]
139 extern "C" {
GetTestMessageParcel() -> *mut MessageParcel140 fn GetTestMessageParcel() -> *mut MessageParcel;
ReadAndWrite(parcel: *mut MessageParcel) -> *mut MessageParcel141 fn ReadAndWrite(parcel: *mut MessageParcel) -> *mut MessageParcel;
142 }
143