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