1 /*
2 * Copyright (c) 2024 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
WriteTestVector(Parcel * parcel,T testValue,bool (Parcel::* Write)(const std::vector<T> &))36 template<typename T> void WriteTestVector(Parcel *parcel, T testValue, bool (Parcel::*Write)(const std::vector<T> &))
37 {
38 std::vector<T> v;
39 for (int i = 0; i < VEC_NUM; i++) {
40 v.push_back(testValue);
41 }
42 (parcel->*Write)(v);
43 }
44
WriteTestVec(MessageParcel * parcel)45 void WriteTestVec(MessageParcel *parcel)
46 {
47 WriteTestVector(parcel, true, &Parcel::WriteBoolVector);
48 WriteTestVector<uint8_t>(parcel, UCHAR_MAX, &Parcel::WriteUInt8Vector);
49 WriteTestVector<uint16_t>(parcel, USHRT_MAX, &Parcel::WriteUInt16Vector);
50 WriteTestVector<uint32_t>(parcel, UINT_MAX, &Parcel::WriteUInt32Vector);
51 WriteTestVector<uint64_t>(parcel, ULLONG_MAX, &Parcel::WriteUInt64Vector);
52
53 WriteTestVector<int8_t>(parcel, SCHAR_MAX, &Parcel::WriteInt8Vector);
54 WriteTestVector<int16_t>(parcel, SHRT_MAX, &Parcel::WriteInt16Vector);
55 WriteTestVector<int32_t>(parcel, INT_MAX, &Parcel::WriteInt32Vector);
56 WriteTestVector<int64_t>(parcel, LLONG_MAX, &Parcel::WriteInt64Vector);
57
58 WriteTestVector<int8_t>(parcel, SCHAR_MIN, &Parcel::WriteInt8Vector);
59 WriteTestVector<int16_t>(parcel, SHRT_MIN, &Parcel::WriteInt16Vector);
60 WriteTestVector<int32_t>(parcel, INT_MIN, &Parcel::WriteInt32Vector);
61 WriteTestVector<int64_t>(parcel, LLONG_MIN, &Parcel::WriteInt64Vector);
62
63 WriteTestVector<float>(parcel, TEST_FLOAT, &Parcel::WriteFloatVector);
64 WriteTestVector<double>(parcel, TEST_DOUBLE, &Parcel::WriteDoubleVector);
65
66 WriteTestVector<std::string>(parcel, "TEST", &Parcel::WriteStringVector);
67 WriteTestVector<std::u16string>(parcel, u"TEST", &Parcel::WriteString16Vector);
68 }
69
GetTestMessageParcel()70 MessageParcel *GetTestMessageParcel()
71 {
72 MessageParcel *parcel = new MessageParcel();
73 std::u16string interface = std::u16string(u"TEST");
74 parcel->WriteInterfaceToken(interface);
75
76 auto data = std::string("TEST");
77
78 parcel->WriteBuffer(data.data(), data.size());
79
80 parcel->WriteBool(true);
81
82 parcel->WriteUint8(UCHAR_MAX);
83 parcel->WriteUint16(USHRT_MAX);
84 parcel->WriteUint32(UINT_MAX);
85 parcel->WriteUint64(ULLONG_MAX);
86
87 parcel->WriteInt8(SCHAR_MAX);
88 parcel->WriteInt16(SHRT_MAX);
89 parcel->WriteInt32(INT_MAX);
90 parcel->WriteInt64(LLONG_MAX);
91
92 parcel->WriteInt8(SCHAR_MIN);
93 parcel->WriteInt16(SHRT_MIN);
94 parcel->WriteInt32(INT_MIN);
95 parcel->WriteInt64(LLONG_MIN);
96
97 parcel->WriteFloat(TEST_FLOAT);
98 parcel->WriteDouble(TEST_DOUBLE);
99
100 WriteTestVec(parcel);
101 return parcel;
102 }
103
104 template<typename T>
ReadAndWriteV(MessageParcel * parcel,MessageParcel & data,bool (Parcel::* Write)(const std::vector<T> &),bool (Parcel::* Read)(std::vector<T> *))105 void ReadAndWriteV(MessageParcel *parcel, MessageParcel &data, bool (Parcel::*Write)(const std::vector<T> &),
106 bool (Parcel::*Read)(std::vector<T> *))
107 {
108 std::vector<T> v;
109 (data.*Read)(&v);
110 (parcel->*Write)(v);
111 }
112
ReadAndWrite(MessageParcel & data)113 MessageParcel *ReadAndWrite(MessageParcel &data)
114 {
115 MessageParcel *parcel = new MessageParcel();
116
117 parcel->WriteInterfaceToken(data.ReadInterfaceToken());
118 parcel->WriteBuffer(data.ReadBuffer(TEST_BUFFER_LENGTH), TEST_BUFFER_LENGTH);
119
120 parcel->WriteBool(data.ReadBool());
121 parcel->WriteUint8(data.ReadUint8());
122 parcel->WriteUint16(data.ReadUint16());
123 parcel->WriteUint32(data.ReadUint32());
124 parcel->WriteUint64(data.ReadUint64());
125
126 parcel->WriteInt8(data.ReadInt8());
127 parcel->WriteInt16(data.ReadInt16());
128 parcel->WriteInt32(data.ReadInt32());
129 parcel->WriteInt64(data.ReadInt64());
130
131 parcel->WriteInt8(data.ReadInt8());
132 parcel->WriteInt16(data.ReadInt16());
133 parcel->WriteInt32(data.ReadInt32());
134 parcel->WriteInt64(data.ReadInt64());
135
136 parcel->WriteFloat(data.ReadFloat());
137 parcel->WriteDouble(data.ReadDouble());
138
139 ReadAndWriteV(parcel, data, &Parcel::WriteBoolVector, &Parcel::ReadBoolVector);
140 ReadAndWriteV(parcel, data, &Parcel::WriteUInt8Vector, &Parcel::ReadUInt8Vector);
141 ReadAndWriteV(parcel, data, &Parcel::WriteUInt16Vector, &Parcel::ReadUInt16Vector);
142 ReadAndWriteV(parcel, data, &Parcel::WriteUInt32Vector, &Parcel::ReadUInt32Vector);
143 ReadAndWriteV(parcel, data, &Parcel::WriteUInt64Vector, &Parcel::ReadUInt64Vector);
144
145 ReadAndWriteV(parcel, data, &Parcel::WriteInt8Vector, &Parcel::ReadInt8Vector);
146 ReadAndWriteV(parcel, data, &Parcel::WriteInt16Vector, &Parcel::ReadInt16Vector);
147 ReadAndWriteV(parcel, data, &Parcel::WriteInt32Vector, &Parcel::ReadInt32Vector);
148 ReadAndWriteV(parcel, data, &Parcel::WriteInt64Vector, &Parcel::ReadInt64Vector);
149
150 ReadAndWriteV(parcel, data, &Parcel::WriteInt8Vector, &Parcel::ReadInt8Vector);
151 ReadAndWriteV(parcel, data, &Parcel::WriteInt16Vector, &Parcel::ReadInt16Vector);
152 ReadAndWriteV(parcel, data, &Parcel::WriteInt32Vector, &Parcel::ReadInt32Vector);
153 ReadAndWriteV(parcel, data, &Parcel::WriteInt64Vector, &Parcel::ReadInt64Vector);
154
155 ReadAndWriteV(parcel, data, &Parcel::WriteFloatVector, &Parcel::ReadFloatVector);
156 ReadAndWriteV(parcel, data, &Parcel::WriteDoubleVector, &Parcel::ReadDoubleVector);
157
158 ReadAndWriteV(parcel, data, &Parcel::WriteStringVector, &Parcel::ReadStringVector);
159 ReadAndWriteV(parcel, data, &Parcel::WriteString16Vector, &Parcel::ReadString16Vector);
160
161 return parcel;
162 }
163
CStringWrapper(std::string * s)164 CStringWrapper::CStringWrapper(std::string *s) : raw(s->data()), len(s->length())
165 {
166 }
167
GetCallingDeviceID()168 CStringWrapper *GetCallingDeviceID()
169 {
170 auto s = new std::string;
171 *s = IPCSkeleton::GetCallingDeviceID();
172 return new CStringWrapper(s);
173 }
174
GetCallingFullTokenID()175 uint64_t GetCallingFullTokenID()
176 {
177 return IPCSkeleton::GetCallingFullTokenID();
178 }
GetCallingPid()179 uint64_t GetCallingPid()
180 {
181 return IPCSkeleton::GetCallingPid();
182 }
GetCallingRealPid()183 uint64_t GetCallingRealPid()
184 {
185 return IPCSkeleton::GetCallingRealPid();
186 }
GetCallingTokenID()187 uint32_t GetCallingTokenID()
188 {
189 return IPCSkeleton::GetCallingTokenID();
190 }
GetCallingUid()191 uint64_t GetCallingUid()
192 {
193 return IPCSkeleton::GetCallingUid();
194 }
GetFirstFullTokenID()195 uint64_t GetFirstFullTokenID()
196 {
197 return IPCSkeleton::GetFirstFullTokenID();
198 }
199
GetFirstTokenID()200 uint32_t GetFirstTokenID()
201 {
202 return IPCSkeleton::GetFirstTokenID();
203 }
204
SelfTokenID()205 uint64_t SelfTokenID()
206 {
207 return IPCSkeleton::GetSelfTokenID();
208 }
209
IsLocalCalling()210 bool IsLocalCalling()
211 {
212 return IPCSkeleton::IsLocalCalling();
213 }
LocalDeviceID()214 CStringWrapper *LocalDeviceID()
215 {
216 auto s = new std::string;
217 *s = IPCSkeleton::GetLocalDeviceID();
218 return new CStringWrapper(s);
219 }
ResetCallingIdentity()220 CStringWrapper *ResetCallingIdentity()
221 {
222 auto s = new std::string;
223 *s = IPCSkeleton::ResetCallingIdentity();
224 return new CStringWrapper(s);
225 }
226
227 } // namespace OHOS