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