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