• 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 #include <ostream>
16 
17 #include "jsvm.h"
18 #include "jsvm_types.h"
19 #include "jsvm_utils.h"
20 #include "jsvmtest.h"
21 #include "test_utils.h"
22 
23 static std::string g_fakelog = "";
24 
LogFunc(JSVM_Env env,JSVM_CallbackInfo info)25 static JSVM_Value LogFunc(JSVM_Env env, JSVM_CallbackInfo info)
26 {
27     size_t argc = 1;
28     JSVM_Value argv[1];
29     JSVMTEST_CALL(OH_JSVM_GetCbInfo(env, info, &argc, argv, NULL, NULL));
30     return jsvm::Str("log");
31 }
32 
TEST(test_function_private)33 TEST(test_function_private)
34 {
35     JSVM_Data key;
36     JSVMTEST_CALL(OH_JSVM_CreatePrivate(env, nullptr, &key));
37     auto obj = jsvm::Object();
38     JSVMTEST_CALL(OH_JSVM_SetPrivate(env, obj, key, jsvm::Str("a")));
39     static JSVM_CallbackStruct cb = {LogFunc, NULL};
40     JSVM_Value log;
41     JSVMTEST_CALL(OH_JSVM_CreateFunction(env, "log", JSVM_AUTO_LENGTH, &cb, &log));
42     JSVMTEST_CALL(OH_JSVM_SetPrivate(env, obj, key, log));
43     JSVM_Value result;
44     JSVMTEST_CALL(OH_JSVM_GetPrivate(env, obj, key, &result));
45     auto ret = jsvm::Call(result);
46     CHECK(jsvm::Equals(ret, jsvm::Str("log")));
47 }
48 
TEST(test_str_private)49 TEST(test_str_private)
50 {
51     JSVM_Data key;
52     JSVMTEST_CALL(OH_JSVM_CreatePrivate(env, nullptr, &key));
53     auto obj = jsvm::Object();
54     JSVMTEST_CALL(OH_JSVM_SetPrivate(env, obj, key, jsvm::Str("a")));
55     static JSVM_CallbackStruct cb = {LogFunc, NULL};
56     JSVMTEST_CALL(OH_JSVM_SetPrivate(env, obj, key, jsvm::Str("log")));
57     JSVM_Value result;
58     JSVMTEST_CALL(OH_JSVM_GetPrivate(env, obj, key, &result));
59     CHECK(jsvm::Equals(result, jsvm::Str("log")));
60 }
61 
TEST(test_different_private_with_same_key)62 TEST(test_different_private_with_same_key)
63 {
64     JSVM_Data key;
65     JSVMTEST_CALL(OH_JSVM_CreatePrivate(env, jsvm::Str("a"), &key));
66     JSVM_Data key1;
67     JSVMTEST_CALL(OH_JSVM_CreatePrivate(env, jsvm::Str("a"), &key1));
68     auto obj = jsvm::Object();
69     JSVMTEST_CALL(OH_JSVM_SetPrivate(env, obj, key, jsvm::Str("a")));
70     JSVMTEST_CALL(OH_JSVM_SetPrivate(env, obj, key1, jsvm::Str("b")));
71     JSVM_Value result;
72     JSVMTEST_CALL(OH_JSVM_GetPrivate(env, obj, key, &result));
73     JSVM_Value result1;
74     JSVMTEST_CALL(OH_JSVM_GetPrivate(env, obj, key1, &result1));
75     CHECK(!jsvm::Equals(result, result1));
76 }
77 
TEST(test_set_private_with_nullptr_key)78 TEST(test_set_private_with_nullptr_key)
79 {
80     JSVM_Data key = nullptr;
81     auto obj = jsvm::Object();
82     auto status = OH_JSVM_SetPrivate(env, obj, key, jsvm::Str("a"));
83     CHECK(status == JSVM_INVALID_ARG);
84 }
85 
TEST(test_set_private_with_nullptr_value)86 TEST(test_set_private_with_nullptr_value)
87 {
88     JSVM_Data key = nullptr;
89     auto obj = jsvm::Object();
90     JSVMTEST_CALL(OH_JSVM_CreatePrivate(env, jsvm::Str("a"), &key));
91     auto status = OH_JSVM_SetPrivate(env, obj, key, nullptr);
92     CHECK(status == JSVM_INVALID_ARG);
93 }
94 
TEST(test_set_private_with_non_object)95 TEST(test_set_private_with_non_object)
96 {
97     JSVM_Data key = nullptr;
98     auto obj = jsvm::True();
99     JSVMTEST_CALL(OH_JSVM_CreatePrivate(env, jsvm::Str("a"), &key));
100     auto status = OH_JSVM_SetPrivate(env, obj, key, jsvm::Str("a"));
101     CHECK(status == JSVM_OBJECT_EXPECTED);
102 }
103 
TEST(test_set_private_with_non_private)104 TEST(test_set_private_with_non_private)
105 {
106     JSVM_Data key = nullptr;
107     auto obj = jsvm::Object();
108     JSVMTEST_CALL(OH_JSVM_CreateSymbol(env, jsvm::Str("a"), (JSVM_Value *)&key));
109     auto status = OH_JSVM_SetPrivate(env, obj, key, jsvm::Str("a"));
110     CHECK(status == JSVM_INVALID_ARG);
111 }
112 
TEST(test_get_non_exist_private)113 TEST(test_get_non_exist_private)
114 {
115     JSVM_Data key;
116     JSVMTEST_CALL(OH_JSVM_CreatePrivate(env, nullptr, &key));
117     auto obj = jsvm::Object();
118     JSVM_Value result;
119     JSVMTEST_CALL(OH_JSVM_GetPrivate(env, obj, key, &result));
120     CHECK(jsvm::Equals(result, jsvm::Undefined()));
121 }
122 
TEST(test_get_private_with_nullptr_key)123 TEST(test_get_private_with_nullptr_key)
124 {
125     JSVM_Data key = nullptr;
126     auto obj = jsvm::Object();
127     JSVM_Value value;
128     auto status = OH_JSVM_GetPrivate(env, obj, key, &value);
129     CHECK(status == JSVM_INVALID_ARG);
130 }
131 
TEST(test_get_private_with_nullptr_value)132 TEST(test_get_private_with_nullptr_value)
133 {
134     JSVM_Data key = nullptr;
135     auto obj = jsvm::Object();
136     JSVMTEST_CALL(OH_JSVM_CreatePrivate(env, jsvm::Str("a"), &key));
137     auto status = OH_JSVM_GetPrivate(env, obj, key, nullptr);
138     CHECK(status == JSVM_INVALID_ARG);
139 }
140 
TEST(test_get_private_with_non_object)141 TEST(test_get_private_with_non_object)
142 {
143     JSVM_Data key = nullptr;
144     auto obj = jsvm::True();
145     JSVMTEST_CALL(OH_JSVM_CreatePrivate(env, jsvm::Str("a"), &key));
146     JSVM_Value value;
147     auto status = OH_JSVM_GetPrivate(env, obj, key, &value);
148     CHECK(status == JSVM_OBJECT_EXPECTED);
149 }
150 
TEST(test_get_private_with_non_private)151 TEST(test_get_private_with_non_private)
152 {
153     JSVM_Data key = nullptr;
154     auto obj = jsvm::Object();
155     JSVMTEST_CALL(OH_JSVM_CreateSymbol(env, jsvm::Str("a"), (JSVM_Value *)&key));
156     JSVM_Value value;
157     auto status = OH_JSVM_GetPrivate(env, obj, key, &value);
158     CHECK(status == JSVM_INVALID_ARG);
159 }
160 
TEST(test_delete_non_exist_private)161 TEST(test_delete_non_exist_private)
162 {
163     JSVM_Data key;
164     JSVMTEST_CALL(OH_JSVM_CreatePrivate(env, nullptr, &key));
165     auto obj = jsvm::Object();
166     JSVMTEST_CALL(OH_JSVM_DeletePrivate(env, obj, key));
167 }
168 
TEST(test_delete_nullptr_key)169 TEST(test_delete_nullptr_key)
170 {
171     JSVM_Data key = nullptr;
172     auto obj = jsvm::Object();
173     auto status = OH_JSVM_DeletePrivate(env, obj, key);
174     CHECK(status == JSVM_INVALID_ARG);
175 }
176 
TEST(test_delete_with_non_object)177 TEST(test_delete_with_non_object)
178 {
179     JSVM_Data key = nullptr;
180     auto obj = jsvm::True();
181     JSVMTEST_CALL(OH_JSVM_CreatePrivate(env, jsvm::Str("a"), &key));
182     auto status = OH_JSVM_DeletePrivate(env, obj, key);
183     CHECK(status == JSVM_OBJECT_EXPECTED);
184 }
185 
TEST(test_delete_private_with_non_private)186 TEST(test_delete_private_with_non_private)
187 {
188     JSVM_Data key = nullptr;
189     auto obj = jsvm::Object();
190     JSVMTEST_CALL(OH_JSVM_CreateSymbol(env, jsvm::Str("a"), (JSVM_Value *)&key));
191     auto status = OH_JSVM_DeletePrivate(env, obj, key);
192     CHECK(status == JSVM_INVALID_ARG);
193 }
194 
TEST(test_GetReferenceData_create_get_checkresult)195 TEST(test_GetReferenceData_create_get_checkresult) {
196     // create obj
197     JSVM_Value obj;
198     OH_JSVM_CreateObject(env, &obj);
199 
200     // create private
201     JSVM_Data key = nullptr;
202     JSVMTEST_CALL(OH_JSVM_CreatePrivate(env, jsvm::Str("a"), &key));
203 
204     // set private
205     JSVM_Status status = OH_JSVM_SetPrivate(env, obj, key, jsvm::Str("hello"));
206     CHECK(status == JSVM_OK);
207 
208     // create ref
209     JSVM_Ref ref = nullptr;
210     status = OH_JSVM_CreateDataReference(env, key, 1, &ref);
211     CHECK(status == JSVM_OK);
212 
213     // get ref
214     JSVM_Data refResult = nullptr;
215     status = OH_JSVM_GetReferenceData(env, ref, &refResult);
216     CHECK(status == JSVM_OK);
217 
218     // use ref result check data
219     JSVM_Value result = nullptr;
220     status = OH_JSVM_GetPrivate(env, obj, refResult, &result);
221     CHECK(status == JSVM_OK);
222     CHECK(jsvm::ToString(result) == "hello");
223 }