1 /*
2 * Copyright (c) 2021-2022 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 <thread>
17
18 #include "ecmascript/builtins/builtins_arraybuffer.h"
19 #include "ecmascript/ecma_vm.h"
20 #include "ecmascript/global_env.h"
21 #include "ecmascript/js_array.h"
22 #include "ecmascript/js_arraybuffer.h"
23 #include "ecmascript/js_hclass.h"
24 #include "ecmascript/js_regexp.h"
25 #include "ecmascript/js_serializer.h"
26 #include "ecmascript/js_set.h"
27 #include "ecmascript/js_thread.h"
28 #include "ecmascript/js_typed_array.h"
29 #include "ecmascript/linked_hash_table.h"
30 #include "ecmascript/object_factory.h"
31 #include "ecmascript/tests/test_helper.h"
32
33 using namespace panda::ecmascript;
34 using namespace testing::ext;
35 using namespace panda::ecmascript::builtins;
36
37 namespace panda::test {
38 class JSDeserializerTest {
39 public:
JSDeserializerTest()40 JSDeserializerTest() : ecmaVm(nullptr), scope(nullptr), thread(nullptr) {}
Init()41 void Init()
42 {
43 JSRuntimeOptions options;
44 options.SetEnableForceGC(true);
45 ecmaVm = JSNApi::CreateEcmaVM(options);
46 ecmaVm->SetEnableForceGC(true);
47 EXPECT_TRUE(ecmaVm != nullptr) << "Cannot create Runtime";
48 thread = ecmaVm->GetJSThread();
49 scope = new EcmaHandleScope(thread);
50 }
Destroy()51 void Destroy()
52 {
53 delete scope;
54 scope = nullptr;
55 ecmaVm->SetEnableForceGC(false);
56 thread->ClearException();
57 JSNApi::DestroyJSVM(ecmaVm);
58 }
JSSpecialValueTest(std::pair<uint8_t *,size_t> data)59 void JSSpecialValueTest(std::pair<uint8_t *, size_t> data)
60 {
61 Init();
62 JSHandle<JSTaggedValue> jsTrue(thread, JSTaggedValue::True());
63 JSHandle<JSTaggedValue> jsFalse(thread, JSTaggedValue::False());
64 JSHandle<JSTaggedValue> jsUndefined(thread, JSTaggedValue::Undefined());
65 JSHandle<JSTaggedValue> jsNull(thread, JSTaggedValue::Null());
66 JSHandle<JSTaggedValue> jsHole(thread, JSTaggedValue::Hole());
67
68 JSDeserializer deserializer(thread, data.first, data.second);
69 JSHandle<JSTaggedValue> retTrue = deserializer.DeserializeJSTaggedValue();
70 EXPECT_TRUE(JSTaggedValue::SameValue(jsTrue, retTrue)) << "Not same value for JS_TRUE";
71 JSHandle<JSTaggedValue> retFalse = deserializer.DeserializeJSTaggedValue();
72 EXPECT_TRUE(JSTaggedValue::SameValue(jsFalse, retFalse)) << "Not same value for JS_FALSE";
73 JSHandle<JSTaggedValue> retUndefined = deserializer.DeserializeJSTaggedValue();
74 JSHandle<JSTaggedValue> retNull = deserializer.DeserializeJSTaggedValue();
75 JSHandle<JSTaggedValue> retHole = deserializer.DeserializeJSTaggedValue();
76
77 EXPECT_TRUE(JSTaggedValue::SameValue(jsUndefined, retUndefined)) << "Not same value for JS_UNDEFINED";
78 EXPECT_TRUE(JSTaggedValue::SameValue(jsNull, retNull)) << "Not same value for JS_NULL";
79 EXPECT_TRUE(JSTaggedValue::SameValue(jsHole, retHole)) << "Not same value for JS_HOLE";
80 Destroy();
81 }
82
JSPlainObjectTest(std::pair<uint8_t *,size_t> data)83 void JSPlainObjectTest(std::pair<uint8_t *, size_t> data)
84 {
85 Init();
86 JSDeserializer deserializer(thread, data.first, data.second);
87 JSHandle<JSTaggedValue> objValue1 = deserializer.DeserializeJSTaggedValue();
88 JSHandle<JSTaggedValue> objValue2 = deserializer.DeserializeJSTaggedValue();
89
90 JSHandle<JSObject> retObj1 = JSHandle<JSObject>::Cast(objValue1);
91 JSHandle<JSObject> retObj2 = JSHandle<JSObject>::Cast(objValue2);
92 EXPECT_FALSE(retObj1.IsEmpty());
93 EXPECT_FALSE(retObj2.IsEmpty());
94
95 JSHandle<TaggedArray> array1 = JSObject::GetOwnPropertyKeys(thread, retObj1);
96 uint32_t length1 = array1->GetLength();
97 EXPECT_EQ(length1, 4U); // 4 : test case
98 double sum1 = 0.0;
99 for (uint32_t i = 0; i < length1; i++) {
100 JSHandle<JSTaggedValue> key(thread, array1->Get(i));
101 double a = JSObject::GetProperty(thread, JSHandle<JSTaggedValue>(retObj1), key).GetValue()->GetNumber();
102 sum1 += a;
103 }
104 EXPECT_EQ(sum1, 10); // 10 : test case
105
106 JSHandle<TaggedArray> array2 = JSObject::GetOwnPropertyKeys(thread, retObj2);
107 uint32_t length2 = array2->GetLength();
108 EXPECT_EQ(length2, 4U); // 4 : test case
109 double sum2 = 0.0;
110 for (uint32_t i = 0; i < length2; i++) {
111 JSHandle<JSTaggedValue> key(thread, array2->Get(i));
112 double a = JSObject::GetProperty(thread, JSHandle<JSTaggedValue>(retObj2), key).GetValue()->GetNumber();
113 sum2 += a;
114 }
115 EXPECT_EQ(sum2, 26); // 26 : test case
116 Destroy();
117 }
118
JSPlainObjectTest01(std::pair<uint8_t *,size_t> data)119 void JSPlainObjectTest01(std::pair<uint8_t *, size_t> data)
120 {
121 Init();
122 ObjectFactory *factory = ecmaVm->GetFactory();
123 JSDeserializer deserializer(thread, data.first, data.second);
124 JSHandle<JSTaggedValue> objValue1 = deserializer.DeserializeJSTaggedValue();
125
126 JSHandle<JSTaggedValue> key1(factory->NewFromASCII("detectResultItems"));
127 JSHandle<JSTaggedValue> key2(factory->NewFromASCII("adviceId"));
128 OperationResult result = JSObject::GetProperty(thread, objValue1, key1);
129 JSHandle<JSTaggedValue> value1 = result.GetRawValue();
130 EXPECT_TRUE(value1->IsJSArray());
131 JSHandle<JSTaggedValue> value2 = JSArray::FastGetPropertyByValue(thread, value1, 0);
132 JSHandle<JSObject> obj = JSHandle<JSObject>::Cast(value2);
133 bool res = JSObject::HasProperty(thread, obj, key2);
134 EXPECT_TRUE(res);
135 OperationResult result1 = JSObject::GetProperty(thread, value2, key2);
136 JSHandle<JSTaggedValue> value3 = result1.GetRawValue();
137 JSHandle<JSTaggedValue> value4 = JSHandle<JSTaggedValue>::Cast(factory->GetEmptyString());
138 EXPECT_EQ(value3, value4);
139 Destroy();
140 }
141
NativeBindingObjectTest(std::pair<uint8_t *,size_t> data)142 void NativeBindingObjectTest(std::pair<uint8_t *, size_t> data)
143 {
144 Init();
145 JSDeserializer deserializer(thread, data.first, data.second);
146 [[maybe_unused]] JSHandle<JSTaggedValue> objValue1 = deserializer.DeserializeJSTaggedValue();
147 JSHandle<JSTaggedValue> objValue2 = deserializer.DeserializeJSTaggedValue();
148 [[maybe_unused]] JSHandle<JSTaggedValue> objValue3 = deserializer.DeserializeJSTaggedValue();
149
150 JSHandle<JSObject> retObj2 = JSHandle<JSObject>::Cast(objValue2);
151 EXPECT_FALSE(retObj2.IsEmpty());
152
153 JSHandle<TaggedArray> array2 = JSObject::GetOwnPropertyKeys(thread, retObj2);
154 uint32_t length2 = array2->GetLength();
155 EXPECT_EQ(length2, 6U); // 6 : test case
156
157 Destroy();
158 }
159
DescriptionTest(std::pair<uint8_t *,size_t> data)160 void DescriptionTest(std::pair<uint8_t *, size_t> data)
161 {
162 Init();
163 ObjectFactory *factory = ecmaVm->GetFactory();
164 JSHandle<JSTaggedValue> key1(factory->NewFromASCII("x"));
165 JSHandle<JSTaggedValue> key2(thread->GetEcmaVM()->GetFactory()->NewFromASCII("y"));
166 JSHandle<JSTaggedValue> value1(thread, JSTaggedValue(1));
167 JSHandle<JSTaggedValue> value2(thread, JSTaggedValue(2)); // 2 : test case
168
169 JSDeserializer deserializer(thread, data.first, data.second);
170 JSHandle<JSTaggedValue> objValue = deserializer.DeserializeJSTaggedValue();
171 JSHandle<JSObject> retObj = JSHandle<JSObject>::Cast(objValue);
172
173 PropertyDescriptor desc3(thread);
174 PropertyDescriptor desc4(thread);
175
176 JSHandle<TaggedArray> array1 = JSObject::GetOwnPropertyKeys(thread, retObj);
177 JSHandle<JSTaggedValue> retKey1(thread, array1->Get(0));
178 JSHandle<JSTaggedValue> retKey2(thread, array1->Get(1));
179 JSObject::GetOwnProperty(thread, retObj, retKey1, desc3);
180 JSObject::GetOwnProperty(thread, retObj, retKey2, desc4);
181 EXPECT_EQ(key1.GetTaggedValue().GetRawData(), retKey1.GetTaggedValue().GetRawData());
182
183 EXPECT_EQ(desc3.GetValue().GetTaggedValue().GetRawData(), value1.GetTaggedValue().GetRawData());
184 EXPECT_TRUE(desc3.IsWritable());
185 EXPECT_FALSE(desc3.IsEnumerable());
186 EXPECT_TRUE(desc3.IsConfigurable());
187
188 EXPECT_EQ(desc4.GetValue().GetTaggedValue().GetRawData(), value2.GetTaggedValue().GetRawData());
189 EXPECT_FALSE(desc4.IsWritable());
190 EXPECT_TRUE(desc4.IsEnumerable());
191 EXPECT_FALSE(desc4.IsConfigurable());
192 Destroy();
193 }
194
JSSetTest(std::pair<uint8_t *,size_t> data)195 void JSSetTest(std::pair<uint8_t *, size_t> data)
196 {
197 Init();
198 ObjectFactory *factory = ecmaVm->GetFactory();
199 JSHandle<JSTaggedValue> value1(thread, JSTaggedValue(7)); // 7 : test case
200 JSHandle<JSTaggedValue> value2(thread, JSTaggedValue(9)); // 9 : test case
201 JSHandle<JSTaggedValue> value3(factory->NewFromASCII("x"));
202 JSHandle<JSTaggedValue> value4(factory->NewFromASCII("y"));
203
204 JSDeserializer deserializer(thread, data.first, data.second);
205 JSHandle<JSTaggedValue> setValue = deserializer.DeserializeJSTaggedValue();
206 EXPECT_TRUE(!setValue.IsEmpty());
207 JSHandle<JSSet> retSet = JSHandle<JSSet>::Cast(setValue);
208 JSHandle<TaggedArray> array = JSObject::GetOwnPropertyKeys(thread, JSHandle<JSObject>::Cast(retSet));
209 uint32_t propertyLength = array->GetLength();
210 EXPECT_EQ(propertyLength, 2U); // 2 : test case
211 int sum = 0;
212 for (uint32_t i = 0; i < propertyLength; i++) {
213 JSHandle<JSTaggedValue> key(thread, array->Get(i));
214 double a = JSObject::GetProperty(thread, JSHandle<JSTaggedValue>(retSet), key).GetValue()->GetNumber();
215 sum += a;
216 }
217 EXPECT_EQ(sum, 16); // 16 : test case
218
219 EXPECT_EQ(retSet->GetSize(), 4); // 4 : test case
220 EXPECT_TRUE(retSet->Has(value1.GetTaggedValue()));
221 EXPECT_TRUE(retSet->Has(value2.GetTaggedValue()));
222 EXPECT_TRUE(retSet->Has(value3.GetTaggedValue()));
223 EXPECT_TRUE(retSet->Has(value4.GetTaggedValue()));
224 Destroy();
225 }
226
JSArrayTest(std::pair<uint8_t *,size_t> data)227 void JSArrayTest(std::pair<uint8_t *, size_t> data)
228 {
229 Init();
230 JSDeserializer deserializer(thread, data.first, data.second);
231 JSHandle<JSTaggedValue> arrayValue = deserializer.DeserializeJSTaggedValue();
232 EXPECT_TRUE(!arrayValue.IsEmpty());
233
234 JSHandle<JSArray> retArray = JSHandle<JSArray>::Cast(arrayValue);
235
236 JSHandle<TaggedArray> keyArray = JSObject::GetOwnPropertyKeys(thread, JSHandle<JSObject>(retArray));
237 uint32_t propertyLength = keyArray->GetLength();
238 EXPECT_EQ(propertyLength, 23U); // 23 : test case
239 int sum = 0;
240 for (uint32_t i = 0; i < propertyLength; i++) {
241 JSHandle<JSTaggedValue> key(thread, keyArray->Get(i));
242 double a = JSObject::GetProperty(thread, JSHandle<JSTaggedValue>(retArray), key).GetValue()->GetNumber();
243 sum += a;
244 }
245 EXPECT_EQ(sum, 226); // 226 : test case
246
247 // test get value from array
248 for (int i = 0; i < 20; i++) { // 20 : test case
249 JSHandle<JSTaggedValue> value = JSArray::FastGetPropertyByValue(thread, arrayValue, i);
250 EXPECT_EQ(i, value.GetTaggedValue().GetInt());
251 }
252 Destroy();
253 }
254
ObjectsPropertyReferenceTest(std::pair<uint8_t *,size_t> data)255 void ObjectsPropertyReferenceTest(std::pair<uint8_t *, size_t> data)
256 {
257 Init();
258 JSDeserializer deserializer(thread, data.first, data.second);
259 JSHandle<JSTaggedValue> objValue1 = deserializer.DeserializeJSTaggedValue();
260 JSHandle<JSTaggedValue> objValue2 = deserializer.DeserializeJSTaggedValue();
261 EXPECT_TRUE(!objValue1.IsEmpty()) << "[Empty] Deserialize obj1 fail";
262 EXPECT_TRUE(!objValue2.IsEmpty()) << "[Empty] Deserialize obj2 fail";
263 Destroy();
264 }
265
EcmaStringTest1(std::pair<uint8_t *,size_t> data)266 void EcmaStringTest1(std::pair<uint8_t *, size_t> data)
267 {
268 Init();
269 const char *rawStr = "this is a test ecmaString";
270 JSHandle<EcmaString> ecmaString = thread->GetEcmaVM()->GetFactory()->NewFromASCII(rawStr);
271
272 JSDeserializer deserializer(thread, data.first, data.second);
273 JSHandle<JSTaggedValue> res = deserializer.DeserializeJSTaggedValue();
274 EXPECT_TRUE(!res.IsEmpty()) << "[Empty] Deserialize ecmaString fail";
275 EXPECT_TRUE(res->IsString()) << "[NotString] Deserialize ecmaString fail";
276 JSHandle<EcmaString> resEcmaString = JSHandle<EcmaString>::Cast(res);
277 auto ecmaStringCode = EcmaStringAccessor(ecmaString).GetHashcode();
278 auto resEcmaStringCode = EcmaStringAccessor(resEcmaString).GetHashcode();
279 EXPECT_TRUE(ecmaStringCode == resEcmaStringCode) << "Not same HashCode";
280 EXPECT_TRUE(EcmaStringAccessor::StringsAreEqual(*ecmaString, *resEcmaString)) << "Not same EcmaString";
281 Destroy();
282 }
283
EcmaStringTest2(std::pair<uint8_t *,size_t> data)284 void EcmaStringTest2(std::pair<uint8_t *, size_t> data)
285 {
286 Init();
287 const char *rawStr = "ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"\
288 "sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"\
289 "sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"\
290 "ssssss";
291 JSHandle<EcmaString> ecmaString = thread->GetEcmaVM()->GetFactory()->NewFromASCII(rawStr);
292
293 JSDeserializer deserializer(thread, data.first, data.second);
294 JSHandle<JSTaggedValue> res = deserializer.DeserializeJSTaggedValue();
295 EXPECT_TRUE(!res.IsEmpty()) << "[Empty] Deserialize ecmaString fail";
296 EXPECT_TRUE(res->IsString()) << "[NotString] Deserialize ecmaString fail";
297 JSHandle<EcmaString> resEcmaString = JSHandle<EcmaString>::Cast(res);
298 auto ecmaStringCode = EcmaStringAccessor(ecmaString).GetHashcode();
299 auto resEcmaStringCode = EcmaStringAccessor(resEcmaString).GetHashcode();
300 EXPECT_TRUE(ecmaStringCode == resEcmaStringCode) << "Not same HashCode";
301 EXPECT_TRUE(EcmaStringAccessor::StringsAreEqual(*ecmaString, *resEcmaString)) << "Not same EcmaString";
302 Destroy();
303 }
304
EcmaStringTest3(std::pair<uint8_t *,size_t> data)305 void EcmaStringTest3(std::pair<uint8_t *, size_t> data)
306 {
307 Init();
308 JSHandle<EcmaString> ecmaString = thread->GetEcmaVM()->GetFactory()->GetEmptyString();
309
310 JSDeserializer deserializer(thread, data.first, data.second);
311 JSHandle<JSTaggedValue> res = deserializer.DeserializeJSTaggedValue();
312 EXPECT_TRUE(res->IsString()) << "[NotString] Deserialize ecmaString fail";
313 JSHandle<EcmaString> resEcmaString = JSHandle<EcmaString>::Cast(res);
314 auto ecmaStringCode = EcmaStringAccessor(ecmaString).GetHashcode();
315 auto resEcmaStringCode = EcmaStringAccessor(resEcmaString).GetHashcode();
316 EXPECT_TRUE(ecmaStringCode == resEcmaStringCode) << "Not same HashCode";
317 EXPECT_TRUE(EcmaStringAccessor::StringsAreEqual(*ecmaString, *resEcmaString)) << "Not same EcmaString";
318 Destroy();
319 }
320
EcmaStringTest4(std::pair<uint8_t *,size_t> data)321 void EcmaStringTest4(std::pair<uint8_t *, size_t> data)
322 {
323 Init();
324 JSHandle<EcmaString> ecmaString = thread->GetEcmaVM()->GetFactory()->NewFromStdString("你好,世界");
325 JSHandle<EcmaString> ecmaString1 = thread->GetEcmaVM()->GetFactory()->NewFromStdString("你好,世界");
326 auto ecmaStringCode = EcmaStringAccessor(ecmaString).GetHashcode();
327 auto ecmaString1Code = EcmaStringAccessor(ecmaString1).GetHashcode();
328 EXPECT_TRUE(ecmaStringCode == ecmaString1Code) << "Not same HashCode";
329 EXPECT_TRUE(EcmaStringAccessor::StringsAreEqual(*ecmaString, *ecmaString1)) << "Not same EcmaString";
330
331 JSDeserializer deserializer(thread, data.first, data.second);
332 JSHandle<JSTaggedValue> res = deserializer.DeserializeJSTaggedValue();
333 EXPECT_TRUE(!res.IsEmpty()) << "[Empty] Deserialize ecmaString fail";
334 EXPECT_TRUE(res->IsString()) << "[NotString] Deserialize ecmaString fail";
335 JSHandle<EcmaString> resEcmaString = JSHandle<EcmaString>::Cast(res);
336 auto ecmaStringCode2 = EcmaStringAccessor(ecmaString).GetHashcode();
337 auto resEcmaStringCode = EcmaStringAccessor(resEcmaString).GetHashcode();
338 EXPECT_TRUE(ecmaStringCode2 == resEcmaStringCode) << "Not same HashCode";
339 EXPECT_TRUE(EcmaStringAccessor::StringsAreEqual(*ecmaString, *resEcmaString)) << "Not same EcmaString";
340 Destroy();
341 }
342
Int32Test(std::pair<uint8_t *,size_t> data)343 void Int32Test(std::pair<uint8_t *, size_t> data)
344 {
345 Init();
346 int32_t a = 64;
347 int32_t min = -2147483648;
348 int32_t b = -63;
349 JSDeserializer deserializer(thread, data.first, data.second);
350 JSHandle<JSTaggedValue> resA = deserializer.DeserializeJSTaggedValue();
351 JSHandle<JSTaggedValue> resMin = deserializer.DeserializeJSTaggedValue();
352 JSHandle<JSTaggedValue> resB = deserializer.DeserializeJSTaggedValue();
353 EXPECT_TRUE(!resA.IsEmpty() && !resMin.IsEmpty() && !resB.IsEmpty()) << "[Empty] Deserialize Int32 fail";
354 EXPECT_TRUE(resA->IsInt() && resMin->IsInt() && resB->IsInt()) << "[NotInt] Deserialize Int32 fail";
355 EXPECT_TRUE(JSTaggedValue::ToInt32(thread, resA) == a) << "Not Same Value";
356 EXPECT_TRUE(JSTaggedValue::ToInt32(thread, resMin) == min) << "Not Same Value";
357 EXPECT_TRUE(JSTaggedValue::ToInt32(thread, resB) == b) << "Not Same Value";
358 Destroy();
359 }
360
DoubleTest(std::pair<uint8_t *,size_t> data)361 void DoubleTest(std::pair<uint8_t *, size_t> data)
362 {
363 Init();
364 double a = 3.1415926535;
365 double b = -3.1415926535;
366 JSDeserializer deserializer(thread, data.first, data.second);
367 JSHandle<JSTaggedValue> resA = deserializer.DeserializeJSTaggedValue();
368 JSHandle<JSTaggedValue> resB = deserializer.DeserializeJSTaggedValue();
369 EXPECT_TRUE(!resA.IsEmpty() && !resB.IsEmpty()) << "[Empty] Deserialize double fail";
370 EXPECT_TRUE(resA->IsDouble() && resB->IsDouble()) << "[NotInt] Deserialize double fail";
371 EXPECT_TRUE(resA->GetDouble() == a) << "Not Same Value";
372 EXPECT_TRUE(resB->GetDouble() == b) << "Not Same Value";
373 Destroy();
374 }
375
JSDateTest(std::pair<uint8_t *,size_t> data)376 void JSDateTest(std::pair<uint8_t *, size_t> data)
377 {
378 Init();
379 double tm = 28 * 60 * 60 * 1000; // 28 * 60 * 60 * 1000 : test case
380 JSDeserializer deserializer(thread, data.first, data.second);
381 JSHandle<JSTaggedValue> res = deserializer.DeserializeJSTaggedValue();
382 EXPECT_TRUE(!res.IsEmpty()) << "[Empty] Deserialize JSDate fail";
383 EXPECT_TRUE(res->IsDate()) << "[NotJSDate] Deserialize JSDate fail";
384 JSHandle<JSDate> resDate = JSHandle<JSDate>(res);
385 EXPECT_TRUE(resDate->GetTimeValue() == JSTaggedValue(tm)) << "Not Same Time Value";
386 Destroy();
387 }
388
JSMapTest(std::pair<uint8_t *,size_t> data,const JSHandle<JSMap> & originMap)389 void JSMapTest(std::pair<uint8_t *, size_t> data, const JSHandle<JSMap> &originMap)
390 {
391 Init();
392 JSDeserializer deserializer(thread, data.first, data.second);
393 JSHandle<JSTaggedValue> res = deserializer.DeserializeJSTaggedValue();
394 EXPECT_TRUE(!res.IsEmpty()) << "[Empty] Deserialize JSMap fail";
395 EXPECT_TRUE(res->IsJSMap()) << "[NotJSMap] Deserialize JSMap fail";
396 JSHandle<JSMap> resMap = JSHandle<JSMap>::Cast(res);
397 EXPECT_TRUE(originMap->GetSize() == resMap->GetSize()) << "the map size Not equal";
398 uint32_t resSize = static_cast<uint32_t>(resMap->GetSize());
399 for (uint32_t i = 0; i < resSize; i++) {
400 JSHandle<JSTaggedValue> resKey(thread, resMap->GetKey(i));
401 JSHandle<JSTaggedValue> resValue(thread, resMap->GetValue(i));
402 JSHandle<JSTaggedValue> key(thread, originMap->GetKey(i));
403 JSHandle<JSTaggedValue> value(thread, originMap->GetValue(i));
404
405 JSHandle<EcmaString> resKeyStr = JSHandle<EcmaString>::Cast(resKey);
406 JSHandle<EcmaString> keyStr = JSHandle<EcmaString>::Cast(key);
407 EXPECT_TRUE(EcmaStringAccessor::StringsAreEqual(*resKeyStr, *keyStr)) << "Not same map key";
408 EXPECT_TRUE(JSTaggedValue::ToInt32(thread, resValue) == JSTaggedValue::ToInt32(thread, value))
409 << "Not same map value";
410 }
411 Destroy();
412 }
413
JSArrayBufferTest(std::pair<uint8_t *,size_t> data,const JSHandle<JSArrayBuffer> & originArrayBuffer,int32_t byteLength,const char * msg)414 void JSArrayBufferTest(std::pair<uint8_t *, size_t> data,
415 const JSHandle<JSArrayBuffer> &originArrayBuffer, int32_t byteLength, const char *msg)
416 {
417 Init();
418 JSDeserializer deserializer(thread, data.first, data.second);
419 JSHandle<JSTaggedValue> res = deserializer.DeserializeJSTaggedValue();
420 EXPECT_TRUE(!res.IsEmpty()) << "[Empty] Deserialize JSArrayBuffer fail";
421 EXPECT_TRUE(res->IsArrayBuffer()) << "[NotJSArrayBuffer] Deserialize JSArrayBuffer fail";
422 JSHandle<JSArrayBuffer> resJSArrayBuffer = JSHandle<JSArrayBuffer>::Cast(res);
423 int32_t resByteLength = static_cast<int32_t>(resJSArrayBuffer->GetArrayBufferByteLength());
424 EXPECT_TRUE(resByteLength == byteLength) << "Not Same ByteLength"; // 10 : test case
425
426 JSHandle<JSTaggedValue> bufferData(thread, originArrayBuffer->GetArrayBufferData());
427 auto np = JSHandle<JSNativePointer>::Cast(bufferData);
428 void *buffer = np->GetExternalPointer();
429 ASSERT_NE(buffer, nullptr);
430 JSHandle<JSTaggedValue> resBufferData(thread, resJSArrayBuffer->GetArrayBufferData());
431 JSHandle<JSNativePointer> resNp = JSHandle<JSNativePointer>::Cast(resBufferData);
432 void *resBuffer = resNp->GetExternalPointer();
433 ASSERT_NE(resBuffer, nullptr);
434
435 for (int32_t i = 0; i < resByteLength; i++) {
436 EXPECT_TRUE(static_cast<char *>(resBuffer)[i] == static_cast<char *>(buffer)[i]) << "Not Same Buffer";
437 }
438
439 if (msg != nullptr) {
440 if (memcpy_s(resBuffer, byteLength, msg, byteLength) != EOK) {
441 EXPECT_TRUE(false) << " memcpy error!";
442 }
443 }
444 Destroy();
445 }
446
JSSharedArrayBufferTest(std::pair<uint8_t *,size_t> data,const JSHandle<JSArrayBuffer> & originArrayBuffer,int32_t byteLength,const char * msg)447 void JSSharedArrayBufferTest(std::pair<uint8_t *, size_t> data,
448 const JSHandle<JSArrayBuffer> &originArrayBuffer, int32_t byteLength, const char *msg)
449 {
450 Init();
451 JSDeserializer deserializer(thread, data.first, data.second);
452 JSHandle<JSTaggedValue> res = deserializer.DeserializeJSTaggedValue();
453 EXPECT_TRUE(!res.IsEmpty()) << "[Empty] Deserialize JSArrayBuffer fail";
454 EXPECT_TRUE(res->IsSharedArrayBuffer()) << "[NotJSArrayBuffer] Deserialize JSArrayBuffer fail";
455 JSHandle<JSArrayBuffer> resJSArrayBuffer = JSHandle<JSArrayBuffer>::Cast(res);
456 int32_t resByteLength = static_cast<int32_t>(resJSArrayBuffer->GetArrayBufferByteLength());
457 EXPECT_TRUE(resByteLength == byteLength) << "Not Same ByteLength";
458 JSHandle<JSTaggedValue> bufferData(thread, originArrayBuffer->GetArrayBufferData());
459 auto np = JSHandle<JSNativePointer>::Cast(bufferData);
460 void *buffer = np->GetExternalPointer();
461 ASSERT_NE(buffer, nullptr);
462 JSHandle<JSTaggedValue> resBufferData(thread, resJSArrayBuffer->GetArrayBufferData());
463 JSHandle<JSNativePointer> resNp = JSHandle<JSNativePointer>::Cast(resBufferData);
464 void *resBuffer = resNp->GetExternalPointer();
465 ASSERT_NE(resBuffer, nullptr);
466 EXPECT_TRUE((uint64_t)buffer == (uint64_t)resBuffer) << "Not Same pointer!";
467 for (int32_t i = 0; i < resByteLength; i++) {
468 EXPECT_TRUE(static_cast<char *>(resBuffer)[i] == static_cast<char *>(buffer)[i]) << "Not Same Buffer";
469 }
470
471 if (msg != nullptr) {
472 if (memcpy_s(resBuffer, byteLength, msg, byteLength) != EOK) {
473 EXPECT_TRUE(false) << " memcpy error!";
474 }
475 }
476 Destroy();
477 }
478
JSSharedArrayBufferTest1(std::pair<uint8_t *,size_t> data,int32_t byteLength,const char * msg)479 void JSSharedArrayBufferTest1(std::pair<uint8_t *, size_t> data, int32_t byteLength, const char *msg)
480 {
481 Init();
482 JSDeserializer deserializer(thread, data.first, data.second);
483 JSHandle<JSTaggedValue> res = deserializer.DeserializeJSTaggedValue();
484 EXPECT_TRUE(!res.IsEmpty()) << "[Empty] Deserialize JSArrayBuffer fail";
485 EXPECT_TRUE(res->IsSharedArrayBuffer()) << "[NotJSArrayBuffer] Deserialize JSArrayBuffer fail";
486 JSHandle<JSArrayBuffer> resJSArrayBuffer = JSHandle<JSArrayBuffer>::Cast(res);
487 JSHandle<JSTaggedValue> resBufferData(thread, resJSArrayBuffer->GetArrayBufferData());
488 JSHandle<JSNativePointer> resNp = JSHandle<JSNativePointer>::Cast(resBufferData);
489 void *resBuffer = resNp->GetExternalPointer();
490 if (msg != nullptr) {
491 if (memcpy_s(resBuffer, byteLength, msg, byteLength) != EOK) {
492 EXPECT_TRUE(false) << " memcpy error!";
493 }
494 }
495 Destroy();
496 }
497
JSRegexpTest(std::pair<uint8_t *,size_t> data)498 void JSRegexpTest(std::pair<uint8_t *, size_t> data)
499 {
500 Init();
501 JSHandle<EcmaString> pattern = thread->GetEcmaVM()->GetFactory()->NewFromASCII("key2");
502 JSHandle<EcmaString> flags = thread->GetEcmaVM()->GetFactory()->NewFromASCII("i");
503 char buffer[] = "1234567"; // use char buffer to simulate byteCodeBuffer
504 uint32_t bufferSize = 7;
505
506 JSDeserializer deserializer(thread, data.first, data.second);
507 JSHandle<JSTaggedValue> res = deserializer.DeserializeJSTaggedValue();
508 EXPECT_TRUE(!res.IsEmpty()) << "[Empty] Deserialize JSRegExp fail";
509 EXPECT_TRUE(res->IsJSRegExp()) << "[NotJSRegexp] Deserialize JSRegExp fail";
510 JSHandle<JSRegExp> resJSRegexp(res);
511
512 uint32_t resBufferSize = resJSRegexp->GetLength();
513 EXPECT_TRUE(resBufferSize == bufferSize) << "Not Same Length";
514 JSHandle<JSTaggedValue> originalSource(thread, resJSRegexp->GetOriginalSource());
515 EXPECT_TRUE(originalSource->IsString());
516 JSHandle<JSTaggedValue> originalFlags(thread, resJSRegexp->GetOriginalFlags());
517 EXPECT_TRUE(originalFlags->IsString());
518 EXPECT_TRUE(EcmaStringAccessor::StringsAreEqual(*JSHandle<EcmaString>(originalSource), *pattern));
519 EXPECT_TRUE(EcmaStringAccessor::StringsAreEqual(*JSHandle<EcmaString>(originalFlags), *flags));
520
521 JSHandle<JSTaggedValue> resBufferData(thread, resJSRegexp->GetByteCodeBuffer());
522 JSHandle<JSNativePointer> resNp = JSHandle<JSNativePointer>::Cast(resBufferData);
523 void *resBuffer = resNp->GetExternalPointer();
524 ASSERT_NE(resBuffer, nullptr);
525
526 for (uint32_t i = 0; i < resBufferSize; i++) {
527 EXPECT_TRUE(static_cast<char *>(resBuffer)[i] == buffer[i]) << "Not Same ByteCode";
528 }
529 Destroy();
530 }
531
TypedArrayTest1(std::pair<uint8_t *,size_t> data,const JSHandle<JSTypedArray> & originTypedArray)532 void TypedArrayTest1(std::pair<uint8_t *, size_t> data, const JSHandle<JSTypedArray> &originTypedArray)
533 {
534 Init();
535 JSHandle<JSTaggedValue> originTypedArrayName(thread, originTypedArray->GetTypedArrayName());
536 JSDeserializer deserializer(thread, data.first, data.second);
537 JSHandle<JSTaggedValue> res = deserializer.DeserializeJSTaggedValue();
538 EXPECT_TRUE(!res.IsEmpty()) << "[Empty] Deserialize TypedArray fail";
539 EXPECT_TRUE(res->IsJSInt8Array()) << "[NotJSInt8Array] Deserialize TypedArray fail";
540 JSHandle<JSTypedArray> resJSInt8Array = JSHandle<JSTypedArray>::Cast(res);
541
542 JSHandle<JSTaggedValue> typedArrayName(thread, resJSInt8Array->GetTypedArrayName());
543 JSTaggedNumber byteLength(resJSInt8Array->GetByteLength());
544 JSTaggedNumber byteOffset(resJSInt8Array->GetByteOffset());
545 JSTaggedNumber arrayLength(resJSInt8Array->GetArrayLength());
546 ContentType contentType = resJSInt8Array->GetContentType();
547 JSHandle<JSTaggedValue> viewedArrayBuffer(thread, resJSInt8Array->GetViewedArrayBuffer());
548
549 EXPECT_TRUE(typedArrayName->IsString());
550 EXPECT_TRUE(EcmaStringAccessor::StringsAreEqual(*JSHandle<EcmaString>(typedArrayName),
551 *JSHandle<EcmaString>(originTypedArrayName)));
552 EXPECT_TRUE(byteLength.ToUint32() == originTypedArray->GetByteLength()) << "Not Same ByteLength";
553 EXPECT_TRUE(byteOffset.ToUint32() == originTypedArray->GetByteOffset()) << "Not Same ByteOffset";
554 EXPECT_TRUE(arrayLength.ToUint32() == originTypedArray->GetArrayLength()) << "Not Same ArrayLength";
555 EXPECT_TRUE(contentType == originTypedArray->GetContentType()) << "Not Same ContentType";
556
557 // check arrayBuffer
558 EXPECT_TRUE(viewedArrayBuffer->IsArrayBuffer());
559 JSHandle<JSArrayBuffer> resJSArrayBuffer(viewedArrayBuffer);
560 JSHandle<JSArrayBuffer> originArrayBuffer(thread, originTypedArray->GetViewedArrayBuffer());
561 uint32_t resTaggedLength = resJSArrayBuffer->GetArrayBufferByteLength();
562 uint32_t originTaggedLength = originArrayBuffer->GetArrayBufferByteLength();
563 EXPECT_TRUE(resTaggedLength == originTaggedLength) << "Not same viewedBuffer length";
564 JSHandle<JSTaggedValue> bufferData(thread, originArrayBuffer->GetArrayBufferData());
565 JSHandle<JSNativePointer> np = JSHandle<JSNativePointer>::Cast(bufferData);
566 void *buffer = np->GetExternalPointer();
567 JSHandle<JSTaggedValue> resBufferData(thread, resJSArrayBuffer->GetArrayBufferData());
568 JSHandle<JSNativePointer> resNp = JSHandle<JSNativePointer>::Cast(resBufferData);
569 void *resBuffer = resNp->GetExternalPointer();
570 for (uint32_t i = 0; i < resTaggedLength; i++) {
571 EXPECT_TRUE(static_cast<char *>(resBuffer)[i] == static_cast<char *>(buffer)[i]) << "Not same viewedBuffer";
572 }
573 Destroy();
574 }
575
TypedArrayTest2(std::pair<uint8_t *,size_t> data,const JSHandle<JSTypedArray> & originTypedArray)576 void TypedArrayTest2(std::pair<uint8_t *, size_t> data, const JSHandle<JSTypedArray> &originTypedArray)
577 {
578 Init();
579 JSHandle<JSTaggedValue> originTypedArrayName(thread, originTypedArray->GetTypedArrayName());
580 JSDeserializer deserializer(thread, data.first, data.second);
581 JSHandle<JSTaggedValue> res = deserializer.DeserializeJSTaggedValue();
582 EXPECT_TRUE(!res.IsEmpty()) << "[Empty] Deserialize TypedArray fail";
583 EXPECT_TRUE(res->IsJSInt8Array()) << "[NotJSInt8Array] Deserialize TypedArray fail";
584 JSHandle<JSTypedArray> resJSInt8Array = JSHandle<JSTypedArray>::Cast(res);
585
586 JSHandle<JSTaggedValue> typedArrayName(thread, resJSInt8Array->GetTypedArrayName());
587 JSTaggedNumber byteLength(resJSInt8Array->GetByteLength());
588 JSTaggedNumber byteOffset(resJSInt8Array->GetByteOffset());
589 JSTaggedNumber arrayLength(resJSInt8Array->GetArrayLength());
590 ContentType contentType = resJSInt8Array->GetContentType();
591 JSHandle<JSTaggedValue> byteArray(thread, resJSInt8Array->GetViewedArrayBuffer());
592
593 EXPECT_TRUE(typedArrayName->IsString());
594 EXPECT_TRUE(EcmaStringAccessor::StringsAreEqual(*JSHandle<EcmaString>(typedArrayName),
595 *JSHandle<EcmaString>(originTypedArrayName)));
596 EXPECT_TRUE(byteLength.ToUint32() == originTypedArray->GetByteLength()) << "Not Same ByteLength";
597 EXPECT_TRUE(byteOffset.ToUint32() == originTypedArray->GetByteOffset()) << "Not Same ByteOffset";
598 EXPECT_TRUE(arrayLength.ToUint32() == originTypedArray->GetArrayLength()) << "Not Same ArrayLength";
599 EXPECT_TRUE(contentType == originTypedArray->GetContentType()) << "Not Same ContentType";
600
601 // check byteArray
602 EXPECT_TRUE(byteArray->IsByteArray());
603 JSHandle<ByteArray> resByteArray(byteArray);
604 JSHandle<ByteArray> originByteArray(thread, originTypedArray->GetViewedArrayBuffer());
605 uint32_t resTaggedLength = resByteArray->GetLength();
606 uint32_t originTaggedLength = originByteArray->GetLength();
607 EXPECT_TRUE(resTaggedLength == originTaggedLength) << "Not same byteArray length";
608 uint32_t resElementSize = resByteArray->GetSize();
609 uint32_t originElementSize = originByteArray->GetSize();
610 EXPECT_TRUE(resElementSize == originElementSize) << "Not same byteArray size";
611 for (uint32_t i = 0; i < resTaggedLength; i++) {
612 JSTaggedValue resByteArrayVal = resByteArray->Get(thread, i, DataViewType::UINT8);
613 JSTaggedValue originByteArrayVal = originByteArray->Get(thread, i, DataViewType::UINT8);
614 EXPECT_TRUE(resByteArrayVal == originByteArrayVal) << "Not same viewedBuffer";
615 }
616 Destroy();
617 }
618
TaggedArrayTest(std::pair<uint8_t *,size_t> data)619 void TaggedArrayTest(std::pair<uint8_t *, size_t> data)
620 {
621 Init();
622 JSDeserializer deserializer(thread, data.first, data.second);
623 JSHandle<JSTaggedValue> res = deserializer.DeserializeJSTaggedValue();
624 EXPECT_TRUE(!res.IsEmpty()) << "[Empty] Deserialize TaggedArray fail";
625 EXPECT_TRUE(res.GetTaggedValue().IsTaggedArray()) << "[NotTaggedArray] Deserialize TaggedArray fail";
626
627 // check taggedArray
628 JSHandle<TaggedArray> taggedArray = JSHandle<TaggedArray>::Cast(res);
629 EXPECT_EQ(taggedArray->GetLength(), 4U);
630 EcmaString *str11 = reinterpret_cast<EcmaString *>(taggedArray->Get(0).GetTaggedObject());
631 EcmaString *str22 = reinterpret_cast<EcmaString *>(taggedArray->Get(1).GetTaggedObject());
632 EXPECT_EQ(std::strcmp(EcmaStringAccessor(str11).ToCString().c_str(), "str11"), 0);
633 EXPECT_EQ(std::strcmp(EcmaStringAccessor(str22).ToCString().c_str(), "str22"), 0);
634 EXPECT_TRUE(taggedArray->Get(2).IsUndefined()); // 2: the second index
635 Destroy();
636 }
637
FunctionTest(std::pair<uint8_t *,size_t> data)638 void FunctionTest(std::pair<uint8_t *, size_t> data)
639 {
640 Init();
641 JSDeserializer deserializer(thread, data.first, data.second);
642 JSHandle<JSTaggedValue> res = deserializer.DeserializeJSTaggedValue();
643 EXPECT_TRUE(!res.IsEmpty()) << "[Empty] Deserialize JSFunction fail";
644 EXPECT_TRUE(res->IsJSFunction()) << "[NotJSFunction] Deserialize JSFunction fail";
645 Destroy();
646 }
647
ObjectWithFunctionTest(std::pair<uint8_t *,size_t> data)648 void ObjectWithFunctionTest(std::pair<uint8_t *, size_t> data)
649 {
650 Init();
651 ObjectFactory *factory = ecmaVm->GetFactory();
652 JSDeserializer deserializer(thread, data.first, data.second);
653 JSHandle<JSTaggedValue> res = deserializer.DeserializeJSTaggedValue();
654 EXPECT_TRUE(!res.IsEmpty()) << "[Empty] Deserialize ObjectWithFunction fail";
655 EXPECT_TRUE(res->IsObject()) << "[NotObjectWithFunction] Deserialize ObjectWithFunction fail";
656
657 JSHandle<JSTaggedValue> key1(factory->NewFromASCII("2"));
658 OperationResult result1 = JSObject::GetProperty(thread, res, key1);
659 JSHandle<JSTaggedValue> value1 = result1.GetRawValue();
660 EXPECT_TRUE(value1->IsJSFunction());
661 JSHandle<JSTaggedValue> key2(factory->NewFromASCII("abc"));
662 OperationResult result2 = JSObject::GetProperty(thread, res, key2);
663 JSHandle<JSTaggedValue> value2 = result2.GetRawValue();
664 EXPECT_TRUE(value2->IsString());
665 JSHandle<JSTaggedValue> key3(factory->NewFromASCII("4"));
666 OperationResult result3 = JSObject::GetProperty(thread, res, key3);
667 JSHandle<JSTaggedValue> value3 = result3.GetRawValue();
668 EXPECT_TRUE(value3->IsJSFunction());
669 JSHandle<JSTaggedValue> key4(factory->NewFromASCII("key"));
670 OperationResult result4 = JSObject::GetProperty(thread, res, key4);
671 JSHandle<JSTaggedValue> value4 = result4.GetRawValue();
672 EXPECT_TRUE(value4->IsString());
673 Destroy();
674 }
675
676 private:
677 EcmaVM *ecmaVm = nullptr;
678 EcmaHandleScope *scope = nullptr;
679 JSThread *thread = nullptr;
680 };
681
682 class JSSerializerTest : public testing::Test {
683 public:
SetUpTestCase()684 static void SetUpTestCase()
685 {
686 GTEST_LOG_(INFO) << "SetUpTestCase";
687 }
688
TearDownTestCase()689 static void TearDownTestCase()
690 {
691 GTEST_LOG_(INFO) << "TearDownCase";
692 }
693
SetUp()694 void SetUp() override
695 {
696 TestHelper::CreateEcmaVMWithScope(ecmaVm, thread, scope);
697 }
698
TearDown()699 void TearDown() override
700 {
701 TestHelper::DestroyEcmaVMWithScope(ecmaVm, scope);
702 }
703
704 JSThread *thread {nullptr};
705 EcmaVM *ecmaVm {nullptr};
706 EcmaHandleScope *scope {nullptr};
707 };
708
HWTEST_F_L0(JSSerializerTest,SerializeJSSpecialValue)709 HWTEST_F_L0(JSSerializerTest, SerializeJSSpecialValue)
710 {
711 JSSerializer *serializer = new JSSerializer(thread);
712 JSHandle<JSTaggedValue> jsTrue(thread, JSTaggedValue::True());
713 JSHandle<JSTaggedValue> jsFalse(thread, JSTaggedValue::False());
714 JSHandle<JSTaggedValue> jsUndefined(thread, JSTaggedValue::Undefined());
715 JSHandle<JSTaggedValue> jsNull(thread, JSTaggedValue::Null());
716 JSHandle<JSTaggedValue> jsHole(thread, JSTaggedValue::Hole());
717 serializer->SerializeJSTaggedValue(jsTrue);
718 serializer->SerializeJSTaggedValue(jsFalse);
719 serializer->SerializeJSTaggedValue(jsUndefined);
720 serializer->SerializeJSTaggedValue(jsNull);
721 serializer->SerializeJSTaggedValue(jsHole);
722 std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
723 JSDeserializerTest jsDeserializerTest;
724 std::thread t1(&JSDeserializerTest::JSSpecialValueTest, jsDeserializerTest, data);
725 t1.join();
726 delete serializer;
727 };
728
HWTEST_F_L0(JSSerializerTest,SerializeJSPlainObject)729 HWTEST_F_L0(JSSerializerTest, SerializeJSPlainObject)
730 {
731 ObjectFactory *factory = ecmaVm->GetFactory();
732 JSHandle<JSObject> obj1 = factory->NewEmptyJSObject();
733 JSHandle<JSObject> obj2 = factory->NewEmptyJSObject();
734
735 JSHandle<JSTaggedValue> key1(factory->NewFromASCII("2"));
736 JSHandle<JSTaggedValue> key2(factory->NewFromASCII("3"));
737 JSHandle<JSTaggedValue> key3(factory->NewFromASCII("x"));
738 JSHandle<JSTaggedValue> key4(factory->NewFromASCII("y"));
739 JSHandle<JSTaggedValue> key5(factory->NewFromASCII("a"));
740 JSHandle<JSTaggedValue> key6(factory->NewFromASCII("b"));
741 JSHandle<JSTaggedValue> key7(factory->NewFromASCII("5"));
742 JSHandle<JSTaggedValue> key8(factory->NewFromASCII("6"));
743 JSHandle<JSTaggedValue> value1(thread, JSTaggedValue(1));
744 JSHandle<JSTaggedValue> value2(thread, JSTaggedValue(2));
745 JSHandle<JSTaggedValue> value3(thread, JSTaggedValue(3));
746 JSHandle<JSTaggedValue> value4(thread, JSTaggedValue(4));
747 JSHandle<JSTaggedValue> value5(thread, JSTaggedValue(5));
748 JSHandle<JSTaggedValue> value6(thread, JSTaggedValue(6));
749 JSHandle<JSTaggedValue> value7(thread, JSTaggedValue(7));
750 JSHandle<JSTaggedValue> value8(thread, JSTaggedValue(8));
751
752 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj1), key1, value1);
753 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj1), key2, value2);
754 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj1), key3, value3);
755 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj1), key4, value4);
756 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj2), key5, value5);
757 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj2), key6, value6);
758 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj2), key7, value7);
759 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj2), key8, value8);
760
761 JSSerializer *serializer = new JSSerializer(thread);
762 bool success1 = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>::Cast(obj1));
763 bool success2 = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>::Cast(obj2));
764
765 EXPECT_TRUE(success1);
766 EXPECT_TRUE(success2);
767 std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
768 JSDeserializerTest jsDeserializerTest;
769 std::thread t1(&JSDeserializerTest::JSPlainObjectTest, jsDeserializerTest, data);
770 t1.join();
771 delete serializer;
772 };
773
HWTEST_F_L0(JSSerializerTest,SerializeJSPlainObject01)774 HWTEST_F_L0(JSSerializerTest, SerializeJSPlainObject01)
775 {
776 ObjectFactory *factory = ecmaVm->GetFactory();
777 JSHandle<JSObject> obj1 = factory->NewEmptyJSObject();
778 JSHandle<JSObject> obj2 = factory->NewEmptyJSObject();
779
780 JSHandle<JSTaggedValue> key1(factory->NewFromASCII("diagnosisItem"));
781 JSHandle<JSTaggedValue> key2(factory->NewFromASCII("detectStatus"));
782 JSHandle<JSTaggedValue> key3(factory->NewFromASCII("detectResultItems"));
783 JSHandle<JSTaggedValue> key4(factory->NewFromASCII("faultId"));
784 JSHandle<JSTaggedValue> key5(factory->NewFromASCII("faultContent"));
785 JSHandle<JSTaggedValue> key6(factory->NewFromASCII("faultContentParams"));
786 JSHandle<JSTaggedValue> key7(factory->NewFromASCII("adviceId"));
787 JSHandle<JSTaggedValue> key8(factory->NewFromASCII("adviceContent"));
788 JSHandle<JSTaggedValue> key9(factory->NewFromASCII("adviceContentParams"));
789 JSHandle<JSTaggedValue> value1 = JSHandle<JSTaggedValue>::Cast(factory->NewFromASCII("VoiceDetect1"));
790 JSHandle<JSTaggedValue> value2(thread, JSTaggedValue(1));
791 JSHandle<JSTaggedValue> value3 = JSHandle<JSTaggedValue>::Cast(factory->NewJSArray());
792 JSHandle<JSTaggedValue> value4 = JSHandle<JSTaggedValue>::Cast(factory->NewFromASCII("80000001"));
793 JSHandle<JSTaggedValue> value5 = JSHandle<JSTaggedValue>::Cast(factory->GetEmptyString());
794 JSHandle<JSTaggedValue> value6 = JSHandle<JSTaggedValue>::Cast(factory->NewJSArray());
795 JSHandle<JSTaggedValue> value7 = JSHandle<JSTaggedValue>::Cast(factory->GetEmptyString());
796 JSHandle<JSTaggedValue> value8 = JSHandle<JSTaggedValue>::Cast(factory->GetEmptyString());
797 JSHandle<JSTaggedValue> value9 = JSHandle<JSTaggedValue>::Cast(factory->NewJSArray());
798
799 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj2), key4, value4);
800 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj2), key5, value5);
801 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj2), key6, value6);
802 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj2), key7, value7);
803 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj2), key8, value8);
804 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj2), key9, value9);
805 JSArray::FastSetPropertyByValue(thread, value3, 0, JSHandle<JSTaggedValue>(obj2));
806
807 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj1), key1, value1);
808 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj1), key2, value2);
809 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj1), key3, value3);
810
811 JSSerializer *serializer = new JSSerializer(thread);
812 bool success1 = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>::Cast(obj1));
813
814 EXPECT_TRUE(success1);
815 std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
816 JSDeserializerTest jsDeserializerTest;
817 std::thread t1(&JSDeserializerTest::JSPlainObjectTest01, jsDeserializerTest, data);
818 t1.join();
819 delete serializer;
820 };
821
detach(void * param1,void * param2,void * hint)822 static void* detach(void *param1, void *param2, void *hint)
823 {
824 GTEST_LOG_(INFO) << "detach is running";
825 if (param1 == nullptr && param2 == nullptr) {
826 GTEST_LOG_(INFO) << "detach: two params is nullptr";
827 }
828 if (hint == nullptr) {
829 GTEST_LOG_(INFO) << "detach: hint is nullptr";
830 }
831 return nullptr;
832 }
833
attach(void * enginePointer,void * buffer,void * hint)834 static void* attach([[maybe_unused]] void *enginePointer, [[maybe_unused]] void *buffer, [[maybe_unused]] void *hint)
835 {
836 GTEST_LOG_(INFO) << "attach is running";
837 return nullptr;
838 }
839
HWTEST_F_L0(JSSerializerTest,SerializeNativeBindingObject)840 HWTEST_F_L0(JSSerializerTest, SerializeNativeBindingObject)
841 {
842 ObjectFactory *factory = ecmaVm->GetFactory();
843 JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv();
844 JSHandle<JSObject> obj1 = factory->NewEmptyJSObject();
845 JSHandle<JSObject> obj2 = factory->NewEmptyJSObject();
846 JSHandle<JSObject> obj3 = factory->NewEmptyJSObject();
847
848 JSHandle<JSTaggedValue> key1 = env->GetDetachSymbol();
849 JSHandle<JSTaggedValue> key2 = env->GetAttachSymbol();
850 JSHandle<JSTaggedValue> key3(factory->NewFromASCII("x"));
851 JSHandle<JSTaggedValue> key4(factory->NewFromASCII("y"));
852 JSHandle<JSTaggedValue> key5(factory->NewFromASCII("a"));
853 JSHandle<JSTaggedValue> key6(factory->NewFromASCII("b"));
854 JSHandle<JSTaggedValue> key7(factory->NewFromASCII("5"));
855 JSHandle<JSTaggedValue> key8(factory->NewFromASCII("6"));
856 JSHandle<JSTaggedValue> value1(factory->NewJSNativePointer(reinterpret_cast<void*>(detach)));
857 JSHandle<JSTaggedValue> value2(factory->NewJSNativePointer(reinterpret_cast<void*>(attach)));
858 JSHandle<JSTaggedValue> value3(thread, JSTaggedValue(1));
859 JSHandle<JSTaggedValue> value4(thread, JSTaggedValue(2));
860 JSHandle<JSTaggedValue> value5(thread, JSTaggedValue(3));
861 JSHandle<JSTaggedValue> value6(thread, JSTaggedValue(4));
862 JSHandle<JSTaggedValue> value7(thread, JSTaggedValue(5));
863 JSHandle<JSTaggedValue> value8(thread, JSTaggedValue(6));
864
865 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj1), key1, value1);
866 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj1), key2, value2);
867 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj2), key3, value3);
868 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj2), key4, value4);
869 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj2), key5, value5);
870 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj2), key6, value6);
871 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj2), key7, value7);
872 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj2), key8, value8);
873 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj3), key1, value1);
874 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj3), key2, value2);
875 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj3), key3, value3);
876 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj3), key4, value4);
877
878 JSSerializer *serializer = new JSSerializer(thread);
879 bool success1 = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>::Cast(obj1));
880 bool success2 = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>::Cast(obj2));
881 bool success3 = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>::Cast(obj3));
882
883 EXPECT_TRUE(success1);
884 EXPECT_TRUE(success2);
885 EXPECT_TRUE(success3);
886 std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
887 JSDeserializerTest jsDeserializerTest;
888 std::thread t1(&JSDeserializerTest::NativeBindingObjectTest, jsDeserializerTest, data);
889 t1.join();
890 delete serializer;
891 }
892
HWTEST_F_L0(JSSerializerTest,TestSerializeDescription)893 HWTEST_F_L0(JSSerializerTest, TestSerializeDescription)
894 {
895 ObjectFactory *factory = ecmaVm->GetFactory();
896 JSHandle<JSObject> obj = factory->NewEmptyJSObject();
897
898 JSHandle<JSTaggedValue> key1(factory->NewFromASCII("x"));
899 JSHandle<JSTaggedValue> key2(thread->GetEcmaVM()->GetFactory()->NewFromASCII("y"));
900
901 PropertyDescriptor desc1(thread);
902 JSHandle<JSTaggedValue> value1(thread, JSTaggedValue(1));
903 desc1.SetValue(value1);
904 desc1.SetWritable(true);
905 desc1.SetEnumerable(false);
906 desc1.SetConfigurable(true);
907 JSObject::DefineOwnProperty(thread, obj, key1, desc1);
908
909 PropertyDescriptor desc2(thread);
910 JSHandle<JSTaggedValue> value2(thread, JSTaggedValue(2));
911 desc2.SetValue(value2);
912 desc2.SetWritable(false);
913 desc2.SetEnumerable(true);
914 desc2.SetConfigurable(false);
915 JSObject::DefineOwnProperty(thread, obj, key2, desc2);
916
917 JSSerializer *serializer = new JSSerializer(thread);
918 bool success = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>::Cast(obj));
919 EXPECT_TRUE(success);
920 std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
921 JSDeserializerTest jsDeserializerTest;
922 std::thread t1(&JSDeserializerTest::DescriptionTest, jsDeserializerTest, data);
923 t1.join();
924 delete serializer;
925 };
926
HWTEST_F_L0(JSSerializerTest,TestSerializeJSSet)927 HWTEST_F_L0(JSSerializerTest, TestSerializeJSSet)
928 {
929 ObjectFactory *factory = ecmaVm->GetFactory();
930 JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv();
931
932 JSHandle<JSTaggedValue> constructor = env->GetBuiltinsSetFunction();
933 JSHandle<JSSet> set =
934 JSHandle<JSSet>::Cast(factory->NewJSObjectByConstructor(JSHandle<JSFunction>(constructor), constructor));
935 JSHandle<LinkedHashSet> linkedSet = LinkedHashSet::Create(thread);
936 set->SetLinkedSet(thread, linkedSet);
937 // set property to set
938 JSHandle<JSTaggedValue> value1(thread, JSTaggedValue(7));
939 JSHandle<JSTaggedValue> value2(thread, JSTaggedValue(9));
940 JSHandle<JSTaggedValue> value3(factory->NewFromASCII("x"));
941 JSHandle<JSTaggedValue> value4(factory->NewFromASCII("y"));
942
943 JSSet::Add(thread, set, value1);
944 JSSet::Add(thread, set, value2);
945 JSSet::Add(thread, set, value3);
946 JSSet::Add(thread, set, value4);
947
948 // set property to object
949 JSHandle<JSTaggedValue> key1(factory->NewFromASCII("5"));
950 JSHandle<JSTaggedValue> key2(factory->NewFromASCII("6"));
951
952 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(set), key1, value1);
953 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(set), key2, value2);
954
955 JSSerializer *serializer = new JSSerializer(thread);
956 bool success = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>::Cast(set));
957 EXPECT_TRUE(success);
958 std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
959 JSDeserializerTest jsDeserializerTest;
960 std::thread t1(&JSDeserializerTest::JSSetTest, jsDeserializerTest, data);
961 t1.join();
962 delete serializer;
963 };
964
HWTEST_F_L0(JSSerializerTest,TestSerializeJSArray)965 HWTEST_F_L0(JSSerializerTest, TestSerializeJSArray)
966 {
967 ObjectFactory *factory = ecmaVm->GetFactory();
968 JSHandle<JSArray> array = factory->NewJSArray();
969
970 // set property to object
971 JSHandle<JSTaggedValue> key1(factory->NewFromASCII("abasd"));
972 JSHandle<JSTaggedValue> key2(factory->NewFromASCII("qweqwedasd"));
973
974 JSHandle<JSTaggedValue> value1(thread, JSTaggedValue(7));
975 JSHandle<JSTaggedValue> value2(thread, JSTaggedValue(9));
976
977 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(array), key1, value1);
978 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(array), key2, value2);
979
980 // set value to array
981 array->SetArrayLength(thread, 20);
982 for (int i = 0; i < 20; i++) {
983 JSHandle<JSTaggedValue> data(thread, JSTaggedValue(i));
984 JSArray::FastSetPropertyByValue(thread, JSHandle<JSTaggedValue>::Cast(array), i, data);
985 }
986
987 JSSerializer *serializer = new JSSerializer(thread);
988 bool success = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>::Cast(array));
989 EXPECT_TRUE(success);
990 std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
991 JSDeserializerTest jsDeserializerTest;
992 std::thread t1(&JSDeserializerTest::JSArrayTest, jsDeserializerTest, data);
993 t1.join();
994 delete serializer;
995 };
996
997 // Test the situation that Objects' properties stores values that reference with each other
HWTEST_F_L0(JSSerializerTest,TestObjectsPropertyReference)998 HWTEST_F_L0(JSSerializerTest, TestObjectsPropertyReference)
999 {
1000 ObjectFactory *factory = ecmaVm->GetFactory();
1001 JSHandle<JSObject> obj1 = factory->NewEmptyJSObject();
1002 JSHandle<JSObject> obj2 = factory->NewEmptyJSObject();
1003 [[maybe_unused]] JSHandle<JSObject> obj3 = factory->NewEmptyJSObject();
1004
1005 JSHandle<JSTaggedValue> key1(factory->NewFromASCII("abc"));
1006 JSHandle<JSTaggedValue> key2(factory->NewFromASCII("def"));
1007 JSHandle<JSTaggedValue> key3(factory->NewFromASCII("dgsdgf"));
1008 JSHandle<JSTaggedValue> key4(factory->NewFromASCII("qwjhrf"));
1009
1010 JSHandle<JSTaggedValue> value3(thread, JSTaggedValue(10));
1011 JSHandle<JSTaggedValue> value4(thread, JSTaggedValue(5));
1012
1013 // set property to obj1
1014 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>::Cast(obj1), key1, JSHandle<JSTaggedValue>::Cast(obj2));
1015 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>::Cast(obj1), key3, value3);
1016
1017 // set property to obj2
1018 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>::Cast(obj2), key2, JSHandle<JSTaggedValue>::Cast(obj1));
1019 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>::Cast(obj2), key4, value4);
1020
1021 JSSerializer *serializer = new JSSerializer(thread);
1022 bool success1 = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>::Cast(obj1));
1023 bool success2 = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>::Cast(obj2));
1024 EXPECT_TRUE(success1) << "Serialize obj1 fail";
1025 EXPECT_TRUE(success2) << "Serialize obj2 fail";
1026 std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
1027 JSDeserializerTest jsDeserializerTest;
1028 std::thread t1(&JSDeserializerTest::ObjectsPropertyReferenceTest, jsDeserializerTest, data);
1029 t1.join();
1030 delete serializer;
1031 };
1032
HWTEST_F_L0(JSSerializerTest,SerializeEcmaString1)1033 HWTEST_F_L0(JSSerializerTest, SerializeEcmaString1)
1034 {
1035 const char *rawStr = "this is a test ecmaString";
1036 JSHandle<EcmaString> ecmaString = thread->GetEcmaVM()->GetFactory()->NewFromASCII(rawStr);
1037 JSSerializer *serializer = new JSSerializer(thread);
1038 bool success = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>(ecmaString));
1039 EXPECT_TRUE(success) << "Serialize EcmaString fail";
1040 std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
1041 JSDeserializerTest jsDeserializerTest;
1042 std::thread t1(&JSDeserializerTest::EcmaStringTest1, jsDeserializerTest, data);
1043 t1.join();
1044 delete serializer;
1045 };
1046
HWTEST_F_L0(JSSerializerTest,SerializeEcmaString2)1047 HWTEST_F_L0(JSSerializerTest, SerializeEcmaString2)
1048 {
1049 const char *rawStr = "ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"\
1050 "sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"\
1051 "sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"\
1052 "ssssss";
1053 JSHandle<EcmaString> ecmaString = thread->GetEcmaVM()->GetFactory()->NewFromASCII(rawStr);
1054 JSSerializer *serializer = new JSSerializer(thread);
1055 bool success = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>(ecmaString));
1056 EXPECT_TRUE(success) << "Serialize EcmaString fail";
1057 std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
1058 JSDeserializerTest jsDeserializerTest;
1059 std::thread t1(&JSDeserializerTest::EcmaStringTest2, jsDeserializerTest, data);
1060 t1.join();
1061 delete serializer;
1062 };
1063
HWTEST_F_L0(JSSerializerTest,SerializeEcmaString3)1064 HWTEST_F_L0(JSSerializerTest, SerializeEcmaString3)
1065 {
1066 JSHandle<EcmaString> ecmaString = thread->GetEcmaVM()->GetFactory()->GetEmptyString();
1067 JSSerializer *serializer = new JSSerializer(thread);
1068 bool success = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>(ecmaString));
1069 EXPECT_TRUE(success) << "Serialize EcmaString fail";
1070 std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
1071 JSDeserializerTest jsDeserializerTest;
1072 std::thread t1(&JSDeserializerTest::EcmaStringTest3, jsDeserializerTest, data);
1073 t1.join();
1074 delete serializer;
1075 };
1076
1077 // Test EcmaString contains Chinese Text
HWTEST_F_L0(JSSerializerTest,SerializeEcmaString4)1078 HWTEST_F_L0(JSSerializerTest, SerializeEcmaString4)
1079 {
1080 std::string rawStr = "你好,世界";
1081 JSHandle<EcmaString> ecmaString = thread->GetEcmaVM()->GetFactory()->NewFromStdString(rawStr);
1082 JSSerializer *serializer = new JSSerializer(thread);
1083 bool success = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>(ecmaString));
1084 EXPECT_TRUE(success) << "Serialize EcmaString fail";
1085 std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
1086 JSDeserializerTest jsDeserializerTest;
1087 std::thread t1(&JSDeserializerTest::EcmaStringTest4, jsDeserializerTest, data);
1088 t1.join();
1089 delete serializer;
1090 };
1091
HWTEST_F_L0(JSSerializerTest,SerializeInt32_t)1092 HWTEST_F_L0(JSSerializerTest, SerializeInt32_t)
1093 {
1094 JSSerializer *serializer = new JSSerializer(thread);
1095 int32_t a = 64, min = -2147483648, b = -63;
1096 JSTaggedValue aTag(a), minTag(min), bTag(b);
1097 bool success1 = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>(thread, aTag));
1098 bool success2 = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>(thread, minTag));
1099 bool success3 = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>(thread, bTag));
1100 EXPECT_TRUE(success1 && success2 && success3) << "Serialize Int32 fail";
1101 std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
1102 JSDeserializerTest jsDeserializerTest;
1103 std::thread t1(&JSDeserializerTest::Int32Test, jsDeserializerTest, data);
1104 t1.join();
1105 delete serializer;
1106 };
1107
HWTEST_F_L0(JSSerializerTest,SerializeDouble)1108 HWTEST_F_L0(JSSerializerTest, SerializeDouble)
1109 {
1110 JSSerializer *serializer = new JSSerializer(thread);
1111 double a = 3.1415926535, b = -3.1415926535;
1112 JSTaggedValue aTag(a), bTag(b);
1113 bool success1 = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>(thread, aTag));
1114 bool success2 = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>(thread, bTag));
1115 EXPECT_TRUE(success1 && success2) << "Serialize Double fail";
1116 std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
1117 JSDeserializerTest jsDeserializerTest;
1118 std::thread t1(&JSDeserializerTest::DoubleTest, jsDeserializerTest, data);
1119 t1.join();
1120 delete serializer;
1121 };
1122
JSDateCreate(EcmaVM * ecmaVM)1123 JSDate *JSDateCreate(EcmaVM *ecmaVM)
1124 {
1125 ObjectFactory *factory = ecmaVM->GetFactory();
1126 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
1127 JSHandle<JSTaggedValue> dateFunction = globalEnv->GetDateFunction();
1128 JSHandle<JSDate> dateObject =
1129 JSHandle<JSDate>::Cast(factory->NewJSObjectByConstructor(JSHandle<JSFunction>(dateFunction), dateFunction));
1130 return *dateObject;
1131 }
1132
HWTEST_F_L0(JSSerializerTest,SerializeDate)1133 HWTEST_F_L0(JSSerializerTest, SerializeDate)
1134 {
1135 double tm = 28 * 60 * 60 * 1000;
1136 JSHandle<JSDate> jsDate(thread, JSDateCreate(ecmaVm));
1137 jsDate->SetTimeValue(thread, JSTaggedValue(tm));
1138 JSSerializer *serializer = new JSSerializer(thread);
1139 bool success = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>::Cast(jsDate));
1140 EXPECT_TRUE(success) << "Serialize JSDate fail";
1141 std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
1142 JSDeserializerTest jsDeserializerTest;
1143 std::thread t1(&JSDeserializerTest::JSDateTest, jsDeserializerTest, data);
1144 t1.join();
1145 delete serializer;
1146 };
1147
CreateMap(JSThread * thread)1148 JSMap *CreateMap(JSThread *thread)
1149 {
1150 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
1151 JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv();
1152 JSHandle<JSTaggedValue> constructor = env->GetBuiltinsMapFunction();
1153 JSHandle<JSMap> map =
1154 JSHandle<JSMap>::Cast(factory->NewJSObjectByConstructor(JSHandle<JSFunction>(constructor), constructor));
1155 JSHandle<LinkedHashMap> linkedMap = LinkedHashMap::Create(thread);
1156 map->SetLinkedMap(thread, linkedMap);
1157 return *map;
1158 }
1159
HWTEST_F_L0(JSSerializerTest,SerializeJSMap)1160 HWTEST_F_L0(JSSerializerTest, SerializeJSMap)
1161 {
1162 JSHandle<JSMap> map(thread, CreateMap(thread));
1163 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
1164 JSHandle<JSTaggedValue> key1(factory->NewFromASCII("3"));
1165 JSHandle<JSTaggedValue> value1(thread, JSTaggedValue(12345));
1166 JSMap::Set(thread, map, key1, value1);
1167 JSHandle<JSTaggedValue> key2(factory->NewFromASCII("key1"));
1168 JSHandle<JSTaggedValue> value2(thread, JSTaggedValue(34567));
1169 JSMap::Set(thread, map, key2, value2);
1170
1171 JSSerializer *serializer = new JSSerializer(thread);
1172 bool success = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>::Cast(map));
1173 EXPECT_TRUE(success) << "Serialize JSMap fail";
1174 std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
1175 JSDeserializerTest jsDeserializerTest;
1176 std::thread t1(&JSDeserializerTest::JSMapTest, jsDeserializerTest, data, map);
1177 t1.join();
1178 delete serializer;
1179 };
1180
CreateJSArrayBuffer(JSThread * thread)1181 JSArrayBuffer *CreateJSArrayBuffer(JSThread *thread)
1182 {
1183 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
1184 JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv();
1185 JSHandle<JSTaggedValue> target = env->GetArrayBufferFunction();
1186 JSHandle<JSArrayBuffer> jsArrayBuffer =
1187 JSHandle<JSArrayBuffer>::Cast(factory->NewJSObjectByConstructor(JSHandle<JSFunction>(target), target));
1188 return *jsArrayBuffer;
1189 }
1190
HWTEST_F_L0(JSSerializerTest,SerializeJSArrayBuffer)1191 HWTEST_F_L0(JSSerializerTest, SerializeJSArrayBuffer)
1192 {
1193 JSHandle<JSArrayBuffer> jsArrayBuffer(thread, CreateJSArrayBuffer(thread));
1194 int32_t byteLength = 10;
1195 thread->GetEcmaVM()->GetFactory()->NewJSArrayBufferData(jsArrayBuffer, byteLength);
1196 jsArrayBuffer->SetArrayBufferByteLength(byteLength);
1197 JSHandle<JSTaggedValue> obj = JSHandle<JSTaggedValue>(jsArrayBuffer);
1198 JSHandle<JSTaggedValue> number(thread, JSTaggedValue(7));
1199 BuiltinsArrayBuffer::SetValueInBuffer(thread, obj.GetTaggedValue(), 1, DataViewType::UINT8,
1200 number, true);
1201 number = JSHandle<JSTaggedValue>(thread, JSTaggedValue(17));
1202 BuiltinsArrayBuffer::SetValueInBuffer(thread, obj.GetTaggedValue(), 3, DataViewType::UINT8, // 3:index
1203 number, true);
1204
1205 JSSerializer *serializer = new JSSerializer(thread);
1206 bool success = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>::Cast(jsArrayBuffer));
1207 EXPECT_TRUE(success) << "Serialize JSArrayBuffer fail";
1208 std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
1209 JSDeserializerTest jsDeserializerTest;
1210 std::thread t1(&JSDeserializerTest::JSArrayBufferTest, jsDeserializerTest, data, jsArrayBuffer, 10, nullptr);
1211 t1.join();
1212 delete serializer;
1213 };
1214
HWTEST_F_L0(JSSerializerTest,SerializeJSArrayBufferShared)1215 HWTEST_F_L0(JSSerializerTest, SerializeJSArrayBufferShared)
1216 {
1217 std::string msg = "hello world";
1218 uint32_t msgBufferLen = msg.length() + 1U;
1219 char* msgBuffer = new char[msgBufferLen] { 0 };
1220 if (memcpy_s(msgBuffer, msgBufferLen, msg.c_str(), msgBufferLen) != EOK) {
1221 delete[] msgBuffer;
1222 EXPECT_TRUE(false) << " memcpy error";
1223 }
1224
1225 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
1226 JSHandle<JSArrayBuffer> jsArrayBuffer = factory->NewJSArrayBuffer(msgBuffer, msgBufferLen, nullptr, nullptr);
1227
1228 JSSerializer *serializer = new JSSerializer(thread);
1229 bool success = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>::Cast(jsArrayBuffer));
1230 EXPECT_TRUE(success) << "Serialize JSArrayBuffer fail";
1231 std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
1232 JSDeserializerTest jsDeserializerTest;
1233 std::thread t1(&JSDeserializerTest::JSArrayBufferTest, jsDeserializerTest, data, jsArrayBuffer, 12, nullptr);
1234 t1.join();
1235 delete serializer;
1236 delete[] msgBuffer;
1237 };
1238
HWTEST_F_L0(JSSerializerTest,SerializeJSArrayBufferShared2)1239 HWTEST_F_L0(JSSerializerTest, SerializeJSArrayBufferShared2)
1240 {
1241 std::string msg = "hello world";
1242 int msgBufferLen = static_cast<int>(msg.length()) + 1;
1243 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
1244 JSHandle<JSArrayBuffer> jsArrayBuffer = factory->NewJSSharedArrayBuffer(msgBufferLen);
1245 JSHandle<JSTaggedValue> BufferData(thread, jsArrayBuffer->GetArrayBufferData());
1246 JSHandle<JSNativePointer> resNp = JSHandle<JSNativePointer>::Cast(BufferData);
1247 void *Buffer = resNp->GetExternalPointer();
1248 if (memcpy_s(Buffer, msgBufferLen, msg.c_str(), msgBufferLen) != EOK) {
1249 EXPECT_TRUE(false) << " memcpy error";
1250 }
1251 JSSerializer *serializer = new JSSerializer(thread);
1252 bool success = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>::Cast(jsArrayBuffer));
1253 EXPECT_TRUE(success) << "Serialize JSArrayBuffer fail";
1254 std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
1255 JSDeserializerTest jsDeserializerTest;
1256 std::string changeStr = "world hello";
1257 std::thread t1(&JSDeserializerTest::JSSharedArrayBufferTest,
1258 jsDeserializerTest, data, jsArrayBuffer, 12, changeStr.c_str());
1259 t1.join();
1260 EXPECT_TRUE(strcmp((char *)Buffer, "world hello") == 0) << "Serialize JSArrayBuffer fail";
1261 delete serializer;
1262 };
1263
HWTEST_F_L0(JSSerializerTest,SerializeJSArrayBufferShared3)1264 HWTEST_F_L0(JSSerializerTest, SerializeJSArrayBufferShared3)
1265 {
1266 std::string msg = "hello world";
1267 int msgBufferLen = static_cast<int>(msg.length()) + 1;
1268 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
1269 JSHandle<JSArrayBuffer> jsArrayBuffer = factory->NewJSSharedArrayBuffer(msgBufferLen);
1270 JSHandle<JSTaggedValue> BufferData(thread, jsArrayBuffer->GetArrayBufferData());
1271 JSHandle<JSNativePointer> resNp = JSHandle<JSNativePointer>::Cast(BufferData);
1272 void *Buffer = resNp->GetExternalPointer();
1273 if (memcpy_s(Buffer, msgBufferLen, msg.c_str(), msgBufferLen) != EOK) {
1274 EXPECT_TRUE(false) << " memcpy error";
1275 }
1276 JSSerializer *serializer = new JSSerializer(thread);
1277 bool success = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>::Cast(jsArrayBuffer));
1278 EXPECT_TRUE(success) << "Serialize JSArrayBuffer fail";
1279 std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
1280 JSDeserializerTest jsDeserializerTest;
1281 std::string changeStr = "aaaaaaaaaa";
1282 std::thread t1(&JSDeserializerTest::JSSharedArrayBufferTest1, jsDeserializerTest, data, 5, changeStr.c_str());
1283 t1.join();
1284 EXPECT_TRUE(strcmp((char *)Buffer, "aaaaa world") == 0) << "Serialize JSArrayBuffer fail";
1285 JSSerializer *serializer2 = new JSSerializer(thread);
1286 bool success2 = serializer2->SerializeJSTaggedValue(JSHandle<JSTaggedValue>::Cast(jsArrayBuffer));
1287 EXPECT_TRUE(success2) << "Serialize JSArrayBuffer fail";
1288 std::pair<uint8_t *, size_t> data2 = serializer2->ReleaseBuffer();
1289 JSDeserializerTest jsDeserializerTest2;
1290 std::string changeStr2 = "bbbbbbbbbbb";
1291 std::thread t2(&JSDeserializerTest::JSSharedArrayBufferTest1, jsDeserializerTest2, data2, 6, changeStr2.c_str());
1292 t2.join();
1293 EXPECT_TRUE(strcmp((char *)Buffer, "bbbbbbworld") == 0) << "Serialize JSArrayBuffer fail";
1294 delete serializer;
1295 delete serializer2;
1296 };
1297
HWTEST_F_L0(JSSerializerTest,SerializeJSRegExp)1298 HWTEST_F_L0(JSSerializerTest, SerializeJSRegExp)
1299 {
1300 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
1301 JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv();
1302 JSHandle<JSTaggedValue> target = env->GetRegExpFunction();
1303 JSHandle<JSRegExp> jsRegexp =
1304 JSHandle<JSRegExp>::Cast(factory->NewJSObjectByConstructor(JSHandle<JSFunction>(target), target));
1305 JSHandle<EcmaString> pattern = thread->GetEcmaVM()->GetFactory()->NewFromASCII("key2");
1306 JSHandle<EcmaString> flags = thread->GetEcmaVM()->GetFactory()->NewFromASCII("i");
1307 char buffer[] = "1234567"; // use char to simulate bytecode
1308 uint32_t bufferSize = 7;
1309 factory->NewJSRegExpByteCodeData(jsRegexp, static_cast<void *>(buffer), bufferSize);
1310 jsRegexp->SetOriginalSource(thread, JSHandle<JSTaggedValue>(pattern));
1311 jsRegexp->SetOriginalFlags(thread, JSHandle<JSTaggedValue>(flags));
1312
1313 JSSerializer *serializer = new JSSerializer(thread);
1314 bool success = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>::Cast(jsRegexp));
1315 EXPECT_TRUE(success) << "Serialize JSRegExp fail";
1316 std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
1317 JSDeserializerTest jsDeserializerTest;
1318 std::thread t1(&JSDeserializerTest::JSRegexpTest, jsDeserializerTest, data);
1319 t1.join();
1320 delete serializer;
1321 };
1322
CreateTestJSArrayBuffer(JSThread * thread)1323 JSArrayBuffer *CreateTestJSArrayBuffer(JSThread *thread)
1324 {
1325 JSHandle<JSArrayBuffer> jsArrayBuffer(thread, CreateJSArrayBuffer(thread));
1326 int32_t byteLength = 10;
1327 thread->GetEcmaVM()->GetFactory()->NewJSArrayBufferData(jsArrayBuffer, byteLength);
1328 jsArrayBuffer->SetArrayBufferByteLength(byteLength);
1329 JSHandle<JSTaggedValue> obj = JSHandle<JSTaggedValue>(jsArrayBuffer);
1330 // 7 : test case
1331 JSHandle<JSTaggedValue> number(thread, JSTaggedValue(7));
1332 BuiltinsArrayBuffer::SetValueInBuffer(thread, obj.GetTaggedValue(), 1, DataViewType::UINT8,
1333 number, true);
1334 // 3, 17 : test case
1335 number = JSHandle<JSTaggedValue>(thread, JSTaggedValue(17));
1336 BuiltinsArrayBuffer::SetValueInBuffer(thread, obj.GetTaggedValue(), 3, DataViewType::UINT8, // 3:index
1337 number, true);
1338 return *jsArrayBuffer;
1339 }
1340
HWTEST_F_L0(JSSerializerTest,SerializeJSTypedArray1)1341 HWTEST_F_L0(JSSerializerTest, SerializeJSTypedArray1)
1342 {
1343 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
1344 JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv();
1345 JSHandle<JSTaggedValue> target = env->GetInt8ArrayFunction();
1346 JSHandle<JSTypedArray> int8Array =
1347 JSHandle<JSTypedArray>::Cast(factory->NewJSObjectByConstructor(JSHandle<JSFunction>(target), target));
1348 JSHandle<JSTaggedValue> viewedArrayBuffer(thread, CreateTestJSArrayBuffer(thread));
1349 int8Array->SetViewedArrayBuffer(thread, viewedArrayBuffer);
1350 int byteLength = 10;
1351 int byteOffset = 0;
1352 int arrayLength = (byteLength - byteOffset) / (sizeof(int8_t));
1353 int8Array->SetByteLength(byteLength);
1354 int8Array->SetByteOffset(byteOffset);
1355 int8Array->SetTypedArrayName(thread, thread->GlobalConstants()->GetInt8ArrayString());
1356 int8Array->SetArrayLength(arrayLength);
1357 int8Array->SetContentType(ContentType::Number);
1358 JSSerializer *serializer = new JSSerializer(thread);
1359 bool success = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>::Cast(int8Array));
1360 EXPECT_TRUE(success);
1361 std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
1362 JSDeserializerTest jsDeserializerTest;
1363 std::thread t1(&JSDeserializerTest::TypedArrayTest1, jsDeserializerTest, data, int8Array);
1364 t1.join();
1365 delete serializer;
1366 };
1367
HWTEST_F_L0(JSSerializerTest,SerializeJSTypedArray2)1368 HWTEST_F_L0(JSSerializerTest, SerializeJSTypedArray2)
1369 {
1370 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
1371 JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv();
1372 JSHandle<JSTaggedValue> target = env->GetInt8ArrayFunction();
1373 JSHandle<JSTypedArray> int8Array =
1374 JSHandle<JSTypedArray>::Cast(factory->NewJSObjectByConstructor(JSHandle<JSFunction>(target), target));
1375 uint8_t value = 255; // 255 : test case
1376 JSTaggedType val = JSTaggedValue(value).GetRawData();
1377 JSHandle<ByteArray> byteArray = factory->NewByteArray(3, sizeof(value));
1378 byteArray->Set(1, DataViewType::UINT8, val);
1379 int8Array->SetViewedArrayBuffer(thread, byteArray);
1380 int byteLength = 10;
1381 int byteOffset = 0;
1382 int arrayLength = (byteLength - byteOffset) / (sizeof(int8_t));
1383 int8Array->SetByteLength(byteLength);
1384 int8Array->SetByteOffset(byteOffset);
1385 int8Array->SetTypedArrayName(thread, thread->GlobalConstants()->GetInt8ArrayString());
1386 int8Array->SetArrayLength(arrayLength);
1387 int8Array->SetContentType(ContentType::Number);
1388 JSSerializer *serializer = new JSSerializer(thread);
1389 bool success = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>::Cast(int8Array));
1390 EXPECT_TRUE(success);
1391 std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
1392 JSDeserializerTest jsDeserializerTest;
1393 std::thread t1(&JSDeserializerTest::TypedArrayTest2, jsDeserializerTest, data, int8Array);
1394 t1.join();
1395 delete serializer;
1396 };
1397
HWTEST_F_L0(JSSerializerTest,SerializeTaggedArray)1398 HWTEST_F_L0(JSSerializerTest, SerializeTaggedArray)
1399 {
1400 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
1401 JSHandle<TaggedArray> taggedArray(factory->NewTaggedArray(4));
1402 JSHandle<EcmaString> str1 = factory->NewFromASCII("str11");
1403 JSHandle<EcmaString> str2 = factory->NewFromASCII("str22");
1404 // set value to the taggedarray
1405 taggedArray->Set(thread, 0, str1.GetTaggedValue());
1406 taggedArray->Set(thread, 1, str2.GetTaggedValue());
1407 taggedArray->Set(thread, 2, JSHandle<JSTaggedValue>(thread, JSTaggedValue::Undefined()));
1408
1409 JSSerializer *serializer = new JSSerializer(thread);
1410 bool success = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>::Cast(taggedArray));
1411 EXPECT_TRUE(success);
1412 std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
1413 JSDeserializerTest jsDeserializerTest;
1414 std::thread t1(&JSDeserializerTest::TaggedArrayTest, jsDeserializerTest, data);
1415 t1.join();
1416 delete serializer;
1417 };
1418
HWTEST_F_L0(JSSerializerTest,SerializeFunction)1419 HWTEST_F_L0(JSSerializerTest, SerializeFunction)
1420 {
1421 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
1422 JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv();
1423 JSHandle<JSFunction> jsFunction = factory->NewJSFunction(env, nullptr, FunctionKind::CONCURRENT_FUNCTION);
1424 EXPECT_TRUE(jsFunction->IsJSFunction());
1425
1426 JSSerializer *serializer = new JSSerializer(thread);
1427 bool success = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>::Cast(jsFunction));
1428 EXPECT_TRUE(success);
1429 std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
1430 JSDeserializerTest jsDeserializerTest;
1431 std::thread t1(&JSDeserializerTest::FunctionTest, jsDeserializerTest, data);
1432 t1.join();
1433 delete serializer;
1434 };
1435
1436 // not support function
HWTEST_F_L0(JSSerializerTest,SerializeObjectWithFunction)1437 HWTEST_F_L0(JSSerializerTest, SerializeObjectWithFunction)
1438 {
1439 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
1440 JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv();
1441 JSHandle<JSFunction> function1 = factory->NewJSFunction(env, nullptr, FunctionKind::CONCURRENT_FUNCTION);
1442 EXPECT_TRUE(function1->IsJSFunction());
1443 JSHandle<JSFunction> function2 = factory->NewJSFunction(env, nullptr, FunctionKind::CONCURRENT_FUNCTION);
1444 EXPECT_TRUE(function2->IsJSFunction());
1445 JSHandle<JSTaggedValue> key1(factory->NewFromASCII("1"));
1446 JSHandle<JSTaggedValue> key2(factory->NewFromASCII("2"));
1447 JSHandle<JSTaggedValue> key3(factory->NewFromASCII("abc"));
1448 JSHandle<JSTaggedValue> key4(factory->NewFromASCII("4"));
1449 JSHandle<JSTaggedValue> key5(factory->NewFromASCII("key"));
1450 JSHandle<JSTaggedValue> value1(thread, JSTaggedValue(12345));
1451 JSHandle<JSTaggedValue> value2(factory->NewFromASCII("def"));
1452 JSHandle<JSTaggedValue> value3(factory->NewFromASCII("value"));
1453 JSHandle<JSObject> obj = factory->NewEmptyJSObject();
1454 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj), key1, value1);
1455 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj), key2, JSHandle<JSTaggedValue>(function1));
1456 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj), key3, value2);
1457 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj), key4, JSHandle<JSTaggedValue>(function2));
1458 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(obj), key5, value3);
1459
1460 JSSerializer *serializer = new JSSerializer(thread);
1461 bool success = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>(obj));
1462 EXPECT_TRUE(success);
1463 std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
1464 JSDeserializerTest jsDeserializerTest;
1465 std::thread t1(&JSDeserializerTest::ObjectWithFunctionTest, jsDeserializerTest, data);
1466 t1.join();
1467 delete serializer;
1468 };
1469
1470 // not support symbol
HWTEST_F_L0(JSSerializerTest,SerializeSymbolWithProperty)1471 HWTEST_F_L0(JSSerializerTest, SerializeSymbolWithProperty)
1472 {
1473 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
1474 JSHandle<JSSymbol> jsSymbol = factory->NewJSSymbol();
1475 JSHandle<JSTaggedValue> key1(factory->NewFromASCII("2"));
1476 JSHandle<JSTaggedValue> key2(factory->NewFromASCII("x"));
1477 JSHandle<JSTaggedValue> value1(thread, JSTaggedValue(1));
1478 JSHandle<JSTaggedValue> value2(thread, JSTaggedValue(8));
1479 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(jsSymbol), key1, value1);
1480 JSObject::SetProperty(thread, JSHandle<JSTaggedValue>(jsSymbol), key2, value2);
1481
1482 JSSerializer *serializer = new JSSerializer(thread);
1483 bool success = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>(jsSymbol));
1484 EXPECT_FALSE(success);
1485 std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
1486 JSDeserializer deserializer(thread, data.first, data.second);
1487 JSHandle<JSTaggedValue> ret = deserializer.DeserializeJSTaggedValue();
1488 EXPECT_TRUE(ret.IsEmpty());
1489 delete serializer;
1490 };
1491 } // namespace panda::test
1492