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