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 }