1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #ifdef TEST_TRIGGER_GC
16 #include <iostream>
17
18 #include "jsvmtest.h"
19
20 static bool g_beforeFlag1 = false;
21 static bool g_beforeFlag2 = false;
22 static bool g_beforeFlag3 = false;
23 static bool g_afterFlag1 = false;
24 static bool g_afterFlag2 = false;
25 static int g_nativeData = 2024;
26
OnBeforeGC(JSVM_VM vm,JSVM_GCType gcType,JSVM_GCCallbackFlags flags,void * data)27 void OnBeforeGC(JSVM_VM vm, JSVM_GCType gcType, JSVM_GCCallbackFlags flags, void *data)
28 {
29 g_beforeFlag1 = true;
30 }
31
OnBeforeGC2(JSVM_VM vm,JSVM_GCType gcType,JSVM_GCCallbackFlags flags,void * data)32 void OnBeforeGC2(JSVM_VM vm, JSVM_GCType gcType, JSVM_GCCallbackFlags flags, void *data)
33 {
34 if (*(int*)data == g_nativeData) {
35 g_beforeFlag2 = true;
36 }
37 }
38
OnBeforeGC3(JSVM_VM vm,JSVM_GCType gcType,JSVM_GCCallbackFlags flags,void * data)39 void OnBeforeGC3(JSVM_VM vm, JSVM_GCType gcType, JSVM_GCCallbackFlags flags, void *data)
40 {
41 g_beforeFlag3 = true;
42 }
43
OnAfterGC(JSVM_VM vm,JSVM_GCType gcType,JSVM_GCCallbackFlags flags,void * data)44 void OnAfterGC(JSVM_VM vm, JSVM_GCType gcType, JSVM_GCCallbackFlags flags, void *data)
45 {
46 g_afterFlag1 = true;
47 }
48
OnAfterGC2(JSVM_VM vm,JSVM_GCType gcType,JSVM_GCCallbackFlags flags,void * data)49 void OnAfterGC2(JSVM_VM vm, JSVM_GCType gcType, JSVM_GCCallbackFlags flags, void *data)
50 {
51 g_afterFlag2 = true;
52 }
53
TEST(ForwardUsageApplicationScenariosOfGCCB)54 TEST(ForwardUsageApplicationScenariosOfGCCB)
55 {
56 g_beforeFlag1 = false;
57 g_beforeFlag2 = false;
58 g_beforeFlag3 = false;
59 g_afterFlag1 = false;
60 g_afterFlag2 = false;
61 int data = g_nativeData;
62 JSVMTEST_CALL(OH_JSVM_AddHandlerForGC(vm, JSVM_CB_TRIGGER_BEFORE_GC, OnBeforeGC, JSVM_GC_TYPE_ALL, NULL));
63 JSVMTEST_CALL(OH_JSVM_AddHandlerForGC(vm, JSVM_CB_TRIGGER_BEFORE_GC,
64 OnBeforeGC2, JSVM_GC_TYPE_ALL, (void*)(&data)));
65 JSVMTEST_CALL(OH_JSVM_AddHandlerForGC(vm, JSVM_CB_TRIGGER_BEFORE_GC, OnBeforeGC3,
66 JSVM_GC_TYPE_SCAVENGE, NULL));
67 JSVMTEST_CALL(OH_JSVM_AddHandlerForGC(vm, JSVM_CB_TRIGGER_AFTER_GC, OnAfterGC, JSVM_GC_TYPE_ALL, NULL));
68 JSVMTEST_CALL(OH_JSVM_AddHandlerForGC(vm, JSVM_CB_TRIGGER_AFTER_GC, OnAfterGC2, JSVM_GC_TYPE_ALL, NULL));
69
70 JSVMTEST_CALL(OH_JSVM_RemoveHandlerForGC(vm, JSVM_CB_TRIGGER_AFTER_GC, OnAfterGC2, NULL));
71
72 // can not remove handler that has not been added.
73 CHECK(OH_JSVM_RemoveHandlerForGC(vm, JSVM_CB_TRIGGER_AFTER_GC, OnAfterGC2, new int(12)) != JSVM_OK);
74
75 jsvm::TryTriggerGC();
76 CHECK(g_beforeFlag1 == true);
77 CHECK(g_beforeFlag2 == true);
78 CHECK(g_beforeFlag3 == false);
79 CHECK(g_afterFlag1 == true);
80 CHECK(g_afterFlag2 == false);
81 }
82
TEST(NegativeApplicationScenariosOfGCCB)83 TEST(NegativeApplicationScenariosOfGCCB) {
84 JSVMTEST_CALL(OH_JSVM_AddHandlerForGC(vm, JSVM_CB_TRIGGER_BEFORE_GC, OnBeforeGC, JSVM_GC_TYPE_ALL, NULL));
85 // 1. Repeatedly register the same handler and native-data.
86 CHECK(OH_JSVM_AddHandlerForGC(vm, JSVM_CB_TRIGGER_BEFORE_GC, OnBeforeGC, JSVM_GC_TYPE_ALL, NULL)
87 == JSVM_INVALID_ARG);
88 // 2. Register an empty handler.
89 CHECK(OH_JSVM_AddHandlerForGC(vm, JSVM_CB_TRIGGER_BEFORE_GC, NULL, JSVM_GC_TYPE_ALL, NULL)
90 == JSVM_INVALID_ARG);
91 // 3. Remove unregistered handlers.
92 CHECK(OH_JSVM_RemoveHandlerForGC(vm, JSVM_CB_TRIGGER_BEFORE_GC, OnBeforeGC2, NULL) == JSVM_INVALID_ARG);
93 // 4. Remove the same handler and native-data repeatedly.
94 CHECK(OH_JSVM_RemoveHandlerForGC(vm, JSVM_CB_TRIGGER_BEFORE_GC, OnBeforeGC, NULL) == JSVM_OK);
95 CHECK(OH_JSVM_RemoveHandlerForGC(vm, JSVM_CB_TRIGGER_BEFORE_GC, OnBeforeGC, NULL) == JSVM_INVALID_ARG);
96 }
97 #endif // TEST_TRIGGER_GC
98