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