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
23static jerry_value_t
24callback_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 */
38class AportTest : public testing::Test{
39public:
40    static void SetUpTestCase()
41    {
42        GTEST_LOG_(INFO) << "AportTest SetUpTestCase";
43    }
44
45    static void TearDownTestCase()
46    {
47        GTEST_LOG_(INFO) << "AportTest TearDownTestCase";
48    }
49
50    void SetUp() override {}
51    void TearDown() override {}
52
53};
54
55static constexpr size_t JERRY_SCRIPT_MEM_SIZE = 50 * 1024 * 1024;
56static 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
63HWTEST_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