1 /*
2 * Copyright (c) 2024-2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "ipc_rust_test.h"
17
18 #include <climits>
19 #include <cstdint>
20 #include <iostream>
21 #include <memory>
22 #include <string>
23 #include <vector>
24
25 #include "ipc_skeleton.h"
26 #include "message_parcel.h"
27 #include "refbase.h"
28
29 namespace OHOS {
30 const int VEC_NUM = 3;
31
32 const int TEST_BUFFER_LENGTH = 4;
33 const float TEST_FLOAT = 7.02;
34 const double TEST_DOUBLE = 7.03;
35 const int32_t TEST_STR_LEN = 2;
36 const int32_t TEST_INVALID_CHARACTER = 0xFFFF;
37
WriteTestVector(Parcel * parcel,T testValue,bool (Parcel::* Write)(const std::vector<T> &))38 template<typename T> void WriteTestVector(Parcel *parcel, T testValue, bool (Parcel::*Write)(const std::vector<T> &))
39 {
40 std::vector<T> v;
41 for (int i = 0; i < VEC_NUM; i++) {
42 v.push_back(testValue);
43 }
44 (parcel->*Write)(v);
45 }
46
WriteTestVec(MessageParcel * parcel)47 void WriteTestVec(MessageParcel *parcel)
48 {
49 WriteTestVector(parcel, true, &Parcel::WriteBoolVector);
50 WriteTestVector<uint8_t>(parcel, UCHAR_MAX, &Parcel::WriteUInt8Vector);
51 WriteTestVector<uint16_t>(parcel, USHRT_MAX, &Parcel::WriteUInt16Vector);
52 WriteTestVector<uint32_t>(parcel, UINT_MAX, &Parcel::WriteUInt32Vector);
53 WriteTestVector<uint64_t>(parcel, ULLONG_MAX, &Parcel::WriteUInt64Vector);
54
55 WriteTestVector<int8_t>(parcel, SCHAR_MAX, &Parcel::WriteInt8Vector);
56 WriteTestVector<int16_t>(parcel, SHRT_MAX, &Parcel::WriteInt16Vector);
57 WriteTestVector<int32_t>(parcel, INT_MAX, &Parcel::WriteInt32Vector);
58 WriteTestVector<int64_t>(parcel, LLONG_MAX, &Parcel::WriteInt64Vector);
59
60 WriteTestVector<int8_t>(parcel, SCHAR_MIN, &Parcel::WriteInt8Vector);
61 WriteTestVector<int16_t>(parcel, SHRT_MIN, &Parcel::WriteInt16Vector);
62 WriteTestVector<int32_t>(parcel, INT_MIN, &Parcel::WriteInt32Vector);
63 WriteTestVector<int64_t>(parcel, LLONG_MIN, &Parcel::WriteInt64Vector);
64
65 WriteTestVector<float>(parcel, TEST_FLOAT, &Parcel::WriteFloatVector);
66 WriteTestVector<double>(parcel, TEST_DOUBLE, &Parcel::WriteDoubleVector);
67
68 WriteTestVector<std::string>(parcel, "TEST", &Parcel::WriteStringVector);
69 WriteTestVector<std::u16string>(parcel, u"TEST", &Parcel::WriteString16Vector);
70 }
71
GetTestMessageParcel()72 MessageParcel *GetTestMessageParcel()
73 {
74 MessageParcel *parcel = new MessageParcel();
75 if (parcel == nullptr) {
76 return nullptr;
77 }
78
79 std::u16string interface = std::u16string(u"TEST");
80 parcel->WriteInterfaceToken(interface);
81
82 auto data = std::string("TEST");
83
84 parcel->WriteBuffer(data.data(), data.size());
85
86 parcel->WriteBool(true);
87
88 parcel->WriteUint8(UCHAR_MAX);
89 parcel->WriteUint16(USHRT_MAX);
90 parcel->WriteUint32(UINT_MAX);
91 parcel->WriteUint64(ULLONG_MAX);
92
93 parcel->WriteInt8(SCHAR_MAX);
94 parcel->WriteInt16(SHRT_MAX);
95 parcel->WriteInt32(INT_MAX);
96 parcel->WriteInt64(LLONG_MAX);
97
98 parcel->WriteInt8(SCHAR_MIN);
99 parcel->WriteInt16(SHRT_MIN);
100 parcel->WriteInt32(INT_MIN);
101 parcel->WriteInt64(LLONG_MIN);
102
103 parcel->WriteFloat(TEST_FLOAT);
104 parcel->WriteDouble(TEST_DOUBLE);
105
106 WriteTestVec(parcel);
107 return parcel;
108 }
109
110 template<typename T>
ReadAndWriteV(MessageParcel * parcel,MessageParcel & data,bool (Parcel::* Write)(const std::vector<T> &),bool (Parcel::* Read)(std::vector<T> *))111 void ReadAndWriteV(MessageParcel *parcel, MessageParcel &data, bool (Parcel::*Write)(const std::vector<T> &),
112 bool (Parcel::*Read)(std::vector<T> *))
113 {
114 std::vector<T> v;
115 (data.*Read)(&v);
116 (parcel->*Write)(v);
117 }
118
ReadAndWrite(MessageParcel & data)119 MessageParcel *ReadAndWrite(MessageParcel &data)
120 {
121 MessageParcel *parcel = new MessageParcel();
122 if (parcel == nullptr) {
123 return nullptr;
124 }
125
126 parcel->WriteInterfaceToken(data.ReadInterfaceToken());
127 parcel->WriteBuffer(data.ReadBuffer(TEST_BUFFER_LENGTH), TEST_BUFFER_LENGTH);
128
129 parcel->WriteBool(data.ReadBool());
130 parcel->WriteUint8(data.ReadUint8());
131 parcel->WriteUint16(data.ReadUint16());
132 parcel->WriteUint32(data.ReadUint32());
133 parcel->WriteUint64(data.ReadUint64());
134
135 parcel->WriteInt8(data.ReadInt8());
136 parcel->WriteInt16(data.ReadInt16());
137 parcel->WriteInt32(data.ReadInt32());
138 parcel->WriteInt64(data.ReadInt64());
139
140 parcel->WriteInt8(data.ReadInt8());
141 parcel->WriteInt16(data.ReadInt16());
142 parcel->WriteInt32(data.ReadInt32());
143 parcel->WriteInt64(data.ReadInt64());
144
145 parcel->WriteFloat(data.ReadFloat());
146 parcel->WriteDouble(data.ReadDouble());
147
148 ReadAndWriteV(parcel, data, &Parcel::WriteBoolVector, &Parcel::ReadBoolVector);
149 ReadAndWriteV(parcel, data, &Parcel::WriteUInt8Vector, &Parcel::ReadUInt8Vector);
150 ReadAndWriteV(parcel, data, &Parcel::WriteUInt16Vector, &Parcel::ReadUInt16Vector);
151 ReadAndWriteV(parcel, data, &Parcel::WriteUInt32Vector, &Parcel::ReadUInt32Vector);
152 ReadAndWriteV(parcel, data, &Parcel::WriteUInt64Vector, &Parcel::ReadUInt64Vector);
153
154 ReadAndWriteV(parcel, data, &Parcel::WriteInt8Vector, &Parcel::ReadInt8Vector);
155 ReadAndWriteV(parcel, data, &Parcel::WriteInt16Vector, &Parcel::ReadInt16Vector);
156 ReadAndWriteV(parcel, data, &Parcel::WriteInt32Vector, &Parcel::ReadInt32Vector);
157 ReadAndWriteV(parcel, data, &Parcel::WriteInt64Vector, &Parcel::ReadInt64Vector);
158
159 ReadAndWriteV(parcel, data, &Parcel::WriteInt8Vector, &Parcel::ReadInt8Vector);
160 ReadAndWriteV(parcel, data, &Parcel::WriteInt16Vector, &Parcel::ReadInt16Vector);
161 ReadAndWriteV(parcel, data, &Parcel::WriteInt32Vector, &Parcel::ReadInt32Vector);
162 ReadAndWriteV(parcel, data, &Parcel::WriteInt64Vector, &Parcel::ReadInt64Vector);
163
164 ReadAndWriteV(parcel, data, &Parcel::WriteFloatVector, &Parcel::ReadFloatVector);
165 ReadAndWriteV(parcel, data, &Parcel::WriteDoubleVector, &Parcel::ReadDoubleVector);
166
167 ReadAndWriteV(parcel, data, &Parcel::WriteStringVector, &Parcel::ReadStringVector);
168 ReadAndWriteV(parcel, data, &Parcel::WriteString16Vector, &Parcel::ReadString16Vector);
169
170 return parcel;
171 }
172
GetMessageParcelContainingInvalidString()173 MessageParcel *GetMessageParcelContainingInvalidString()
174 {
175 MessageParcel *parcel = new MessageParcel();
176 if (parcel == nullptr) {
177 return nullptr;
178 }
179 parcel->WriteInt32(TEST_STR_LEN);
180 parcel->WriteInt32(TEST_INVALID_CHARACTER);
181 parcel->WriteString("B");
182 return parcel;
183 }
184
CStringWrapper(std::string * s)185 CStringWrapper::CStringWrapper(std::string *s) : raw(s->data()), len(s->length())
186 {
187 }
188
GetCallingDeviceID()189 CStringWrapper *GetCallingDeviceID()
190 {
191 auto s = new std::string;
192 *s = IPCSkeleton::GetCallingDeviceID();
193 return new CStringWrapper(s);
194 }
195
GetCallingFullTokenID()196 uint64_t GetCallingFullTokenID()
197 {
198 return IPCSkeleton::GetCallingFullTokenID();
199 }
GetCallingPid()200 uint64_t GetCallingPid()
201 {
202 return IPCSkeleton::GetCallingPid();
203 }
GetCallingRealPid()204 uint64_t GetCallingRealPid()
205 {
206 return IPCSkeleton::GetCallingRealPid();
207 }
GetCallingTokenID()208 uint32_t GetCallingTokenID()
209 {
210 return IPCSkeleton::GetCallingTokenID();
211 }
GetCallingUid()212 uint64_t GetCallingUid()
213 {
214 return IPCSkeleton::GetCallingUid();
215 }
GetFirstFullTokenID()216 uint64_t GetFirstFullTokenID()
217 {
218 return IPCSkeleton::GetFirstFullTokenID();
219 }
220
GetFirstTokenID()221 uint32_t GetFirstTokenID()
222 {
223 return IPCSkeleton::GetFirstTokenID();
224 }
225
SelfTokenID()226 uint64_t SelfTokenID()
227 {
228 return IPCSkeleton::GetSelfTokenID();
229 }
230
IsLocalCalling()231 bool IsLocalCalling()
232 {
233 return IPCSkeleton::IsLocalCalling();
234 }
LocalDeviceID()235 CStringWrapper *LocalDeviceID()
236 {
237 auto s = new std::string;
238 *s = IPCSkeleton::GetLocalDeviceID();
239 return new CStringWrapper(s);
240 }
ResetCallingIdentity()241 CStringWrapper *ResetCallingIdentity()
242 {
243 auto s = new std::string;
244 *s = IPCSkeleton::ResetCallingIdentity();
245 return new CStringWrapper(s);
246 }
247
248 } // namespace OHOS