1 /* Copyright JS Foundation and other contributors, http://js.foundation
2 *
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 "config.h"
17 #include "jerryscript.h"
18 #include "jerryscript-port.h"
19 #include "jerryscript-port-default.h"
20 #include "test-common.h"
21 #include <gtest/gtest.h>
22
23 static jerry_value_t
callback_func(const jerry_value_t function_obj,const jerry_value_t this_val,const jerry_value_t args_p[],const jerry_length_t args_count)24 callback_func (const jerry_value_t function_obj,
25 const jerry_value_t this_val,
26 const jerry_value_t args_p[],
27 const jerry_length_t args_count)
28 {
29 JERRY_UNUSED (function_obj);
30 JERRY_UNUSED (this_val);
31 JERRY_UNUSED (args_p);
32 JERRY_UNUSED (args_count);
33
34 jerry_value_t value = jerry_create_string ((jerry_char_t *) "Abort run!");
35 value = jerry_create_abort_from_value (value, true);
36 return value;
37 } /* callback_func */
38 class AportTest : public testing::Test{
39 public:
SetUpTestCase()40 static void SetUpTestCase()
41 {
42 GTEST_LOG_(INFO) << "AportTest SetUpTestCase";
43 }
44
TearDownTestCase()45 static void TearDownTestCase()
46 {
47 GTEST_LOG_(INFO) << "AportTest TearDownTestCase";
48 }
49
SetUp()50 void SetUp() override {}
TearDown()51 void TearDown() override {}
52
53 };
54
55 static constexpr size_t JERRY_SCRIPT_MEM_SIZE = 50 * 1024 * 1024;
context_alloc_fn(size_t size,void * cb_data)56 static void* context_alloc_fn(size_t size, void* cb_data)
57 {
58 (void)cb_data;
59 size_t newSize = size > JERRY_SCRIPT_MEM_SIZE ? JERRY_SCRIPT_MEM_SIZE : size;
60 return malloc(newSize);
61 }
62
63 HWTEST_F(AportTest, Test001, testing::ext::TestSize.Level1)
64 {
65 jerry_context_t* ctx_p = jerry_create_context(1024 * 1024 * 50, context_alloc_fn, NULL);
66 jerry_port_default_set_current_context(ctx_p);
67 TEST_INIT ();
68
69 jerry_init (JERRY_INIT_EMPTY);
70
71 jerry_value_t global = jerry_get_global_object ();
72 jerry_value_t callback_name = jerry_create_string ((jerry_char_t *) "callback");
73 jerry_value_t func = jerry_create_external_function (callback_func);
74 jerry_value_t res = jerry_set_property (global, callback_name, func);
75 TEST_ASSERT (!jerry_value_is_error (res));
76
77 jerry_release_value (res);
78 jerry_release_value (func);
79 jerry_release_value (callback_name);
80 jerry_release_value (global);
81
82 const jerry_char_t inf_loop_code_src1[] = TEST_STRING_LITERAL (
83 "while(true) {\n"
84 " with ({}) {\n"
85 " try {\n"
86 " callback();\n"
87 " } catch (e) {\n"
88 " } finally {\n"
89 " }\n"
90 " }\n"
91 "}"
92 );
93
94 jerry_value_t parsed_code_val = jerry_parse (NULL,
95 0,
96 inf_loop_code_src1,
97 sizeof (inf_loop_code_src1) - 1,
98 JERRY_PARSE_NO_OPTS);
99
100 TEST_ASSERT (!jerry_value_is_error (parsed_code_val));
101 res = jerry_run (parsed_code_val);
102
103 TEST_ASSERT (jerry_value_is_abort (res));
104
105 jerry_release_value (res);
106 jerry_release_value (parsed_code_val);
107
108 const jerry_char_t inf_loop_code_src2[] = TEST_STRING_LITERAL (
109 "function f() {"
110 " while(true) {\n"
111 " with ({}) {\n"
112 " try {\n"
113 " callback();\n"
114 " } catch (e) {\n"
115 " } finally {\n"
116 " }\n"
117 " }\n"
118 " }"
119 "}\n"
120 "function g() {\n"
121 " for (a in { x:5 })\n"
122 " f();\n"
123 "}\n"
124 "\n"
125 "with({})\n"
126 " f();\n"
127 );
128
129 parsed_code_val = jerry_parse (NULL,
130 0,
131 inf_loop_code_src2,
132 sizeof (inf_loop_code_src2) - 1,
133 JERRY_PARSE_NO_OPTS);
134
135 TEST_ASSERT (!jerry_value_is_error (parsed_code_val));
136 res = jerry_run (parsed_code_val);
137
138 TEST_ASSERT (jerry_value_is_abort (res));
139
140 jerry_release_value (res);
141 jerry_release_value (parsed_code_val);
142
143 /* Test flag overwrites. */
144 jerry_value_t value = jerry_create_string ((jerry_char_t *) "Error description");
145 TEST_ASSERT (!jerry_value_is_abort (value));
146 TEST_ASSERT (!jerry_value_is_error (value));
147
148 value = jerry_create_abort_from_value (value, true);
149 TEST_ASSERT (jerry_value_is_abort (value));
150 TEST_ASSERT (jerry_value_is_error (value));
151
152 value = jerry_create_error_from_value (value, true);
153 TEST_ASSERT (!jerry_value_is_abort (value));
154 TEST_ASSERT (jerry_value_is_error (value));
155
156 value = jerry_create_abort_from_value (value, true);
157 TEST_ASSERT (jerry_value_is_abort (value));
158 TEST_ASSERT (jerry_value_is_error (value));
159
160 jerry_release_value (value);
161
162 jerry_cleanup ();
163 free (ctx_p);
164 }
165