• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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