1#!/usr/bin/env python3 2# -*- coding: utf-8 -*- 3""" 4Copyright (c) 2025 Huawei Device Co., Ltd. 5Licensed under the Apache License, Version 2.0 (the "License"); 6you may not use this file except in compliance with the License. 7You may obtain a copy of the License at 8 9 http://www.apache.org/licenses/LICENSE-2.0 10 11Unless required by applicable law or agreed to in writing, software 12distributed under the License is distributed on an "AS IS" BASIS, 13WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14See the License for the specific language governing permissions and 15limitations under the License. 16 17#================================================================== 18#文 件 名: TestWorkerBasicFuncWithGPSOn.py 19#文件说明: 调试性能测试 20#!!================================================================ 21""" 22import sys 23import time 24from datetime import datetime 25from pathlib import Path 26 27root_path = Path(__file__).parent.parent.parent.parent 28resource_path = root_path / 'resource' 29sys.path.append(str(root_path / 'aw')) # add aw path to sys.path 30 31from devicetest.core.test_case import TestCase, Step 32from hypium import UiDriver 33from all_utils import CommonUtils, UiUtils, PerformanceUtils 34from cdp import debugger, runtime 35from implement_api import debugger_api, runtime_api 36 37 38class TestWorkerBasicFuncWithGPSOn(TestCase): 39 def __init__(self, controllers): 40 self.TAG = self.__class__.__name__ 41 TestCase.__init__(self, self.TAG, controllers) 42 self.driver = UiDriver(self.device1) 43 self.ui_utils = UiUtils(self.driver) 44 self.common_utils = CommonUtils(self.driver) 45 self.performance_utils = PerformanceUtils(self.driver) 46 self.id_generator = CommonUtils.message_id_generator() 47 self.config = { 48 'start_mode': '-D', 49 'connect_server_port': 15808, 50 'debugger_server_port': 15809, 51 'bundle_name': 'com.example.multiWorker09', 52 'hap_name': 'MultiWorker09.hap', 53 'hap_path': str(resource_path / 'hap' / 'MultiWorker09.hap'), 54 'file_path': { 55 'entry_ability': 'entry|entry|1.0.0|src/main/ets/entryability/EntryAbility.ts', 56 'params': 'entry|entry|1.0.0|src/main/ets/resources/Params.ts', 57 'index': 'entry|entry|1.0.0|src/main/ets/pages/Index.ts', 58 'sendable': 'entry|entry|1.0.0|src/main/ets/resources/Sendable.ts', 59 'person': 'entry|entry|1.0.0|src/main/ets/resources/Person.ts', 60 'drop_frame': 'entry|entry|1.0.0|src/main/ets/resources/DropFrame.ts', 61 'step': 'entry|entry|1.0.0|src/main/ets/resources/Step.ts', 62 'calculate': 'entry|entry|1.0.0|src/main/ets/resources/Calculate.ts', 63 'sleep': 'entry|entry|1.0.0|src/main/ets/resources/Sleep.ts', 64 'worker': 'entry|entry|1.0.0|src/main/ets/workers/Worker.ts' 65 }, 66 'print_protocol': False # 表示不会打印测试时用到的调试协议 67 } 68 69 def setup(self): 70 Step('1.锁频锁核') 71 self.performance_utils.lock_for_performance() 72 Step('2.下载应用') 73 self.driver.install_app(self.config['hap_path'], "-r") 74 Step('3.启动设置应用') 75 self.driver.start_app(package_name=self.config['bundle_name'], params=self.config['start_mode']) 76 self.config['pid'] = self.common_utils.get_pid(self.config['bundle_name']) 77 assert self.config['pid'] != 0, f'Failed to get pid of {self.config["bundle_name"]}' 78 Step('4.设置屏幕常亮') 79 self.ui_utils.keep_awake() 80 Step('5.开启位置信息') 81 self.ui_utils.enable_location() 82 Step('6.端口映射,连接server') 83 self.common_utils.connect_server(self.config) 84 self.debugger_impl = debugger_api.DebuggerImpl(self.id_generator, self.config['websocket']) 85 self.runtime_impl = runtime_api.RuntimeImpl(self.id_generator, self.config['websocket']) 86 Step('7.开启线程用于获取日志中的性能数据') 87 self.hilog_process, self.perf_records_thread = self.performance_utils.get_perf_data_from_hilog() 88 89 def process(self): 90 Step('8.初始化websocket和taskpool') 91 websocket = self.config['websocket'] 92 taskpool = self.config['taskpool'] 93 Step('9.执行测试用例') 94 taskpool.submit(websocket.main_task(taskpool, self.test, self.config['pid'])) 95 taskpool.await_taskpool() 96 taskpool.task_join() 97 if taskpool.task_exception: 98 raise taskpool.task_exception 99 Step('10.导出数据') 100 time.sleep(3) 101 self.hilog_process.stdout.close() 102 self.hilog_process.terminate() 103 self.hilog_process.wait() 104 self.perf_records_thread.join() 105 self.performance_utils.show_performance_data_in_html() 106 107 def teardown(self): 108 Step('11.关闭设置应用') 109 self.driver.stop_app(self.config['bundle_name']) 110 Step('12.卸载设置应用') 111 self.driver.uninstall_app(self.config['bundle_name']) 112 113 async def test(self, websocket): 114 ################################################################################################################ 115 # main thread: connect the debugger server 116 ################################################################################################################- 117 main_thread = await self.debugger_impl.connect_to_debugger_server(self.config['pid'], True) 118 ################################################################################################################ 119 # main thread: Runtime.enable 120 ################################################################################################################ 121 await self.runtime_impl.send("Runtime.enable", main_thread) 122 ################################################################################################################ 123 # main thread: Debugger.enable 124 ################################################################################################################ 125 await self.debugger_impl.send("Debugger.enable", main_thread) 126 ################################################################################################################ 127 # main thread: Runtime.runIfWaitingForDebugger 128 ################################################################################################################ 129 await self.runtime_impl.send("Runtime.runIfWaitingForDebugger", main_thread) 130 ################################################################################################################ 131 # main thread: Debugger.scriptParsed 132 ################################################################################################################ 133 start_time = datetime.now() 134 await self.debugger_impl.recv("Debugger.scriptParsed", main_thread) 135 response = await self.debugger_impl.recv("Debugger.paused", main_thread) 136 end_time = datetime.now() 137 self.performance_utils.add_time_data("ScriptParsed", 65, (end_time - start_time).microseconds // 1000) 138 self.common_utils.assert_equal(response['params']['callFrames'][0]['url'], 139 self.config['file_path']['entry_ability']) 140 self.common_utils.assert_equal(response['params']['reason'], 'Break on start') 141 ################################################################################################################ 142 # main thread: Debugger.resume 143 ################################################################################################################ 144 await self.debugger_impl.send("Debugger.resume", main_thread) 145 ################################################################################################################ 146 # main thread: Debugger.scriptParsed 147 ################################################################################################################ 148 start_time = datetime.now() 149 await self.debugger_impl.recv("Debugger.scriptParsed", main_thread) 150 response = await self.debugger_impl.recv("Debugger.paused", main_thread) 151 end_time = datetime.now() 152 self.performance_utils.add_time_data("ScriptParsed", 40, (end_time - start_time).microseconds // 1000) 153 self.common_utils.assert_equal(response['params']['callFrames'][0]['url'], self.config['file_path']['sendable']) 154 self.common_utils.assert_equal(response['params']['reason'], 'Break on start') 155 ################################################################################################################ 156 # main thread: Debugger.resume 157 ################################################################################################################ 158 await self.debugger_impl.send("Debugger.resume", main_thread) 159 ################################################################################################################ 160 # main thread: Debugger.scriptParsed 161 ################################################################################################################ 162 start_time = datetime.now() 163 await self.debugger_impl.recv("Debugger.scriptParsed", main_thread) 164 response = await self.debugger_impl.recv("Debugger.paused", main_thread) 165 end_time = datetime.now() 166 self.performance_utils.add_time_data("ScriptParsed", 40, (end_time - start_time).microseconds // 1000) 167 self.common_utils.assert_equal(response['params']['callFrames'][0]['url'], self.config['file_path']['person']) 168 self.common_utils.assert_equal(response['params']['reason'], 'Break on start') 169 ################################################################################################################ 170 # main thread: Debugger.resume 171 ################################################################################################################ 172 await self.debugger_impl.send("Debugger.resume", main_thread) 173 ################################################################################################################ 174 # main thread: Debugger.scriptParsed 175 ################################################################################################################ 176 start_time = datetime.now() 177 await self.debugger_impl.recv("Debugger.scriptParsed", main_thread) 178 response = await self.debugger_impl.recv("Debugger.paused", main_thread) 179 end_time = datetime.now() 180 self.performance_utils.add_time_data("ScriptParsed", 40, (end_time - start_time).microseconds // 1000) 181 self.common_utils.assert_equal(response['params']['callFrames'][0]['url'], self.config['file_path']['params']) 182 self.common_utils.assert_equal(response['params']['reason'], 'Break on start') 183 ################################################################################################################ 184 # main thread: Debugger.resume 185 ################################################################################################################ 186 await self.debugger_impl.send("Debugger.resume", main_thread) 187 ################################################################################################################ 188 # main thread: Debugger.scriptParsed 189 ################################################################################################################ 190 start_time = datetime.now() 191 await self.debugger_impl.recv("Debugger.scriptParsed", main_thread) 192 response = await self.debugger_impl.recv("Debugger.paused", main_thread) 193 end_time = datetime.now() 194 self.performance_utils.add_time_data("ScriptParsed", 40, (end_time - start_time).microseconds // 1000) 195 self.common_utils.assert_equal(response['params']['callFrames'][0]['url'], 196 self.config['file_path']['drop_frame']) 197 self.common_utils.assert_equal(response['params']['reason'], 'Break on start') 198 ################################################################################################################ 199 # main thread: Debugger.resume 200 ################################################################################################################ 201 await self.debugger_impl.send("Debugger.resume", main_thread) 202 ################################################################################################################ 203 # main thread: Debugger.scriptParsed 204 ################################################################################################################ 205 start_time = datetime.now() 206 await self.debugger_impl.recv("Debugger.scriptParsed", main_thread) 207 response = await self.debugger_impl.recv("Debugger.paused", main_thread) 208 end_time = datetime.now() 209 self.performance_utils.add_time_data("ScriptParsed", 40, (end_time - start_time).microseconds // 1000) 210 self.common_utils.assert_equal(response['params']['callFrames'][0]['url'], 211 self.config['file_path']['calculate']) 212 self.common_utils.assert_equal(response['params']['reason'], 'Break on start') 213 ################################################################################################################ 214 # main thread: Debugger.resume 215 ################################################################################################################ 216 await self.debugger_impl.send("Debugger.resume", main_thread) 217 ################################################################################################################ 218 # main thread: Debugger.scriptParsed 219 ################################################################################################################ 220 start_time = datetime.now() 221 await self.debugger_impl.recv("Debugger.scriptParsed", main_thread) 222 response = await self.debugger_impl.recv("Debugger.paused", main_thread) 223 end_time = datetime.now() 224 self.performance_utils.add_time_data("ScriptParsed", 40, (end_time - start_time).microseconds // 1000) 225 self.common_utils.assert_equal(response['params']['callFrames'][0]['url'], self.config['file_path']['step']) 226 self.common_utils.assert_equal(response['params']['reason'], 'Break on start') 227 ################################################################################################################ 228 # main thread: Debugger.resume 229 ################################################################################################################ 230 await self.debugger_impl.send("Debugger.resume", main_thread) 231 ################################################################################################################ 232 # main thread: Debugger.scriptParsed 233 ################################################################################################################ 234 start_time = datetime.now() 235 await self.debugger_impl.recv("Debugger.scriptParsed", main_thread) 236 response = await self.debugger_impl.recv("Debugger.paused", main_thread) 237 end_time = datetime.now() 238 self.performance_utils.add_time_data("ScriptParsed", 40, (end_time - start_time).microseconds // 1000) 239 self.common_utils.assert_equal(response['params']['callFrames'][0]['url'], self.config['file_path']['index']) 240 self.common_utils.assert_equal(response['params']['reason'], 'Break on start') 241 ################################################################################################################ 242 # main thread: Debugger.resume 243 ################################################################################################################ 244 await self.debugger_impl.send("Debugger.resume", main_thread) 245 ################################################################################################################ 246 # main thread: click on the screen 247 ################################################################################################################ 248 self.ui_utils.click_on_middle() 249 ################################################################################################################ 250 # worker thread: connect the debugger server 251 ################################################################################################################ 252 worker_thread = await self.debugger_impl.connect_to_debugger_server(self.config['pid'], False) 253 ################################################################################################################ 254 # worker thread: Runtime.enable 255 ################################################################################################################ 256 await self.runtime_impl.send("Runtime.enable", worker_thread) 257 ################################################################################################################ 258 # worker thread: Debugger.enable 259 ################################################################################################################ 260 await self.debugger_impl.send("Debugger.enable", worker_thread) 261 ################################################################################################################ 262 # main thread: Debugger.setSymbolicBreakpoints 263 ################################################################################################################ 264 symbolicBreakpoints = [debugger.SymbolicBreakpoint(functionName='testDropFrame')] 265 for i in range(1, 51): 266 symbolicBreakpoints.append(debugger.SymbolicBreakpoint(functionName='testDebug' + str(i))) 267 params = debugger.SymbolicBreakpoints(symbolicBreakpoints) 268 start_time = datetime.now() 269 await self.debugger_impl.send("Debugger.setSymbolicBreakpoints", worker_thread, params) 270 end_time = datetime.now() 271 self.performance_utils.add_time_data("SetSymbolicBreakpoints", 10, (end_time - start_time).microseconds // 1000) 272 ################################################################################################################ 273 # worker thread: Runtime.runIfWaitingForDebugger 274 ################################################################################################################ 275 await self.runtime_impl.send("Runtime.runIfWaitingForDebugger", worker_thread) 276 ################################################################################################################ 277 # worker thread: Debugger.scriptParsed 278 ################################################################################################################ 279 start_time = datetime.now() 280 await self.debugger_impl.recv("Debugger.scriptParsed", worker_thread) 281 response = await self.debugger_impl.recv("Debugger.paused", worker_thread) 282 end_time = datetime.now() 283 self.performance_utils.add_time_data("ScriptParsed(Worker)", 5, (end_time - start_time).microseconds // 1000) 284 self.common_utils.assert_equal(response['params']['callFrames'][0]['url'], self.config['file_path']['sendable']) 285 self.common_utils.assert_equal(response['params']['reason'], 'Break on start') 286 ################################################################################################################ 287 # worker thread: Debugger.resume 288 ################################################################################################################ 289 await self.debugger_impl.send("Debugger.resume", worker_thread) 290 ################################################################################################################ 291 # worker thread: Debugger.scriptParsed 292 ################################################################################################################ 293 start_time = datetime.now() 294 await self.debugger_impl.recv("Debugger.scriptParsed", worker_thread) 295 response = await self.debugger_impl.recv("Debugger.paused", worker_thread) 296 end_time = datetime.now() 297 self.performance_utils.add_time_data("ScriptParsed(Worker)", 5, (end_time - start_time).microseconds // 1000) 298 self.common_utils.assert_equal(response['params']['callFrames'][0]['url'], self.config['file_path']['person']) 299 self.common_utils.assert_equal(response['params']['reason'], 'Break on start') 300 ################################################################################################################ 301 # worker thread: Debugger.resume 302 ################################################################################################################ 303 await self.debugger_impl.send("Debugger.resume", worker_thread) 304 ################################################################################################################ 305 # worker thread: Debugger.scriptParsed 306 ################################################################################################################ 307 start_time = datetime.now() 308 await self.debugger_impl.recv("Debugger.scriptParsed", worker_thread) 309 response = await self.debugger_impl.recv("Debugger.paused", worker_thread) 310 end_time = datetime.now() 311 self.performance_utils.add_time_data("ScriptParsed(Worker)", 5, (end_time - start_time).microseconds // 1000) 312 self.common_utils.assert_equal(response['params']['callFrames'][0]['url'], self.config['file_path']['params']) 313 self.common_utils.assert_equal(response['params']['reason'], 'Break on start') 314 ################################################################################################################ 315 # worker thread: Debugger.removeBreakpointsByUrl 316 ################################################################################################################ 317 params = debugger.RemoveBreakpointsUrl(self.config['file_path']['params']) 318 await self.debugger_impl.send("Debugger.removeBreakpointsByUrl", worker_thread, params) 319 ################################################################################################################ 320 # worker thread: Debugger.getPossibleAndSetBreakpointByUrl 321 ################################################################################################################ 322 locations = [debugger.BreakLocationUrl(url=self.config['file_path']['params'], line_number=84)] 323 params = debugger.SetBreakpointsLocations(locations) 324 response = await self.debugger_impl.send("Debugger.getPossibleAndSetBreakpointsByUrl", 325 worker_thread, params) 326 self.common_utils.assert_equal(response['result']['locations'][0]['id'], 327 'id:84:0:' + self.config['file_path']['params']) 328 ################################################################################################################ 329 # worker thread: Debugger.resume 330 ################################################################################################################ 331 await self.debugger_impl.send("Debugger.resume", worker_thread) 332 ################################################################################################################ 333 # worker thread: Debugger.scriptParsed 334 ################################################################################################################ 335 start_time = datetime.now() 336 await self.debugger_impl.recv("Debugger.scriptParsed", worker_thread) 337 response = await self.debugger_impl.recv("Debugger.paused", worker_thread) 338 end_time = datetime.now() 339 self.performance_utils.add_time_data("ScriptParsed(Worker)", 5, (end_time - start_time).microseconds // 1000) 340 self.common_utils.assert_equal(response['params']['callFrames'][0]['url'], 341 self.config['file_path']['drop_frame']) 342 self.common_utils.assert_equal(response['params']['reason'], 'Break on start') 343 ################################################################################################################ 344 # worker thread: Debugger.resume 345 ################################################################################################################ 346 await self.debugger_impl.send("Debugger.resume", worker_thread) 347 ################################################################################################################ 348 # worker thread: Debugger.scriptParsed 349 ################################################################################################################ 350 start_time = datetime.now() 351 await self.debugger_impl.recv("Debugger.scriptParsed", worker_thread) 352 response = await self.debugger_impl.recv("Debugger.paused", worker_thread) 353 end_time = datetime.now() 354 self.performance_utils.add_time_data("ScriptParsed(Worker)", 5, (end_time - start_time).microseconds // 1000) 355 self.common_utils.assert_equal(response['params']['callFrames'][0]['url'], 356 self.config['file_path']['calculate']) 357 self.common_utils.assert_equal(response['params']['reason'], 'Break on start') 358 ################################################################################################################ 359 # worker thread: Debugger.resume 360 ################################################################################################################ 361 await self.debugger_impl.send("Debugger.resume", worker_thread) 362 ################################################################################################################ 363 # worker thread: Debugger.scriptParsed 364 ################################################################################################################ 365 start_time = datetime.now() 366 await self.debugger_impl.recv("Debugger.scriptParsed", worker_thread) 367 response = await self.debugger_impl.recv("Debugger.paused", worker_thread) 368 end_time = datetime.now() 369 self.performance_utils.add_time_data("ScriptParsed(Worker)", 5, (end_time - start_time).microseconds // 1000) 370 self.common_utils.assert_equal(response['params']['callFrames'][0]['url'], self.config['file_path']['step']) 371 self.common_utils.assert_equal(response['params']['reason'], 'Break on start') 372 ################################################################################################################ 373 # worker thread: Debugger.removeBreakpointsByUrl 374 ################################################################################################################ 375 params = debugger.RemoveBreakpointsUrl(self.config['file_path']['step']) 376 await self.debugger_impl.send("Debugger.removeBreakpointsByUrl", worker_thread, params) 377 ################################################################################################################ 378 # worker thread: Debugger.getPossibleAndSetBreakpointByUrl 379 ################################################################################################################ 380 locations = [debugger.BreakLocationUrl(url=self.config['file_path']['step'], line_number=3)] 381 params = debugger.SetBreakpointsLocations(locations) 382 response = await self.debugger_impl.send("Debugger.getPossibleAndSetBreakpointsByUrl", 383 worker_thread, params) 384 self.common_utils.assert_equal(response['result']['locations'][0]['id'], 385 'id:3:0:' + self.config['file_path']['step']) 386 ################################################################################################################ 387 # worker thread: Debugger.resume 388 ################################################################################################################ 389 await self.debugger_impl.send("Debugger.resume", worker_thread) 390 ################################################################################################################ 391 # worker thread: Debugger.scriptParsed 392 ################################################################################################################ 393 start_time = datetime.now() 394 await self.debugger_impl.recv("Debugger.scriptParsed", worker_thread) 395 response = await self.debugger_impl.recv("Debugger.paused", worker_thread) 396 end_time = datetime.now() 397 self.performance_utils.add_time_data("ScriptParsed(Worker)", 5, (end_time - start_time).microseconds // 1000) 398 self.common_utils.assert_equal(response['params']['callFrames'][0]['url'], self.config['file_path']['worker']) 399 self.common_utils.assert_equal(response['params']['reason'], 'Break on start') 400 ################################################################################################################ 401 # worker thread: Debugger.resume 402 ################################################################################################################ 403 await self.debugger_impl.send("Debugger.resume", worker_thread) 404 ################################################################################################################ 405 # worker thread: Debugger.paused, hit breakpoint 406 ################################################################################################################ 407 response = await self.debugger_impl.recv("Debugger.paused", worker_thread) 408 self.common_utils.assert_equal(response['params']['hitBreakpoints'], 409 ['id:3:19:' + self.config['file_path']['step']]) 410 ################################################################################################################ 411 # worker thread: Debugger.stepOut 412 ################################################################################################################ 413 for i in range(500): 414 # Debugger.stepInto 415 start_time = datetime.now() 416 await self.debugger_impl.send("Debugger.stepInto", worker_thread) 417 await self.debugger_impl.recv("Debugger.paused", worker_thread) 418 end_time = datetime.now() 419 self.performance_utils.add_time_data("StepInto(worker)", 8, (end_time - start_time).microseconds // 1000) 420 # Debugger.stepOver 421 start_time = datetime.now() 422 await self.debugger_impl.send("Debugger.stepOver", worker_thread) 423 await self.debugger_impl.recv("Debugger.paused", worker_thread) 424 end_time = datetime.now() 425 self.performance_utils.add_time_data("StepOver(worker)", 8, (end_time - start_time).microseconds // 1000) 426 # Debugger.stepInto 427 start_time = datetime.now() 428 await self.debugger_impl.send("Debugger.stepInto", worker_thread) 429 await self.debugger_impl.recv("Debugger.paused", worker_thread) 430 end_time = datetime.now() 431 self.performance_utils.add_time_data("StepInto(worker)", 8, (end_time - start_time).microseconds // 1000) 432 # Debugger.stepOver 433 start_time = datetime.now() 434 await self.debugger_impl.send("Debugger.stepOver", worker_thread) 435 await self.debugger_impl.recv("Debugger.paused", worker_thread) 436 end_time = datetime.now() 437 self.performance_utils.add_time_data("StepOver(worker)", 8, (end_time - start_time).microseconds // 1000) 438 # Debugger.smartStepInto 439 params = debugger.SmartStepIntoParams(url=self.config['file_path']['calculate'], line_number=1) 440 start_time = datetime.now() 441 await self.debugger_impl.send("Debugger.smartStepInto", worker_thread, params) 442 await self.debugger_impl.send("Debugger.resume", worker_thread) 443 response = await self.debugger_impl.recv("Debugger.paused", worker_thread) 444 end_time = datetime.now() 445 self.performance_utils.add_time_data("SmartStepInto(worker)", 15, 446 (end_time - start_time).microseconds // 1000) 447 self.common_utils.assert_equal(response['params']['callFrames'][0]['functionName'], 'add') 448 # Debugger.stepOut 449 start_time = datetime.now() 450 await self.debugger_impl.send("Debugger.stepOut", worker_thread) 451 await self.debugger_impl.recv("Debugger.paused", worker_thread) 452 end_time = datetime.now() 453 self.performance_utils.add_time_data("StepOut(worker)", 8, (end_time - start_time).microseconds // 1000) 454 # Debugger.smartStepInto 455 params = debugger.SmartStepIntoParams(url=self.config['file_path']['calculate'], line_number=4) 456 start_time = datetime.now() 457 await self.debugger_impl.send("Debugger.smartStepInto", worker_thread, params) 458 await self.debugger_impl.send("Debugger.resume", worker_thread) 459 response = await self.debugger_impl.recv("Debugger.paused", worker_thread) 460 end_time = datetime.now() 461 self.performance_utils.add_time_data("SmartStepInto(worker)", 15, 462 (end_time - start_time).microseconds // 1000) 463 self.common_utils.assert_equal(response['params']['callFrames'][0]['functionName'], 'sub') 464 # Debugger.stepOut 465 start_time = datetime.now() 466 await self.debugger_impl.send("Debugger.stepOut", worker_thread) 467 await self.debugger_impl.recv("Debugger.paused", worker_thread) 468 end_time = datetime.now() 469 self.performance_utils.add_time_data("StepOut(worker)", 8, (end_time - start_time).microseconds // 1000) 470 # Debugger.resume 471 await self.debugger_impl.send("Debugger.resume", worker_thread) 472 if i != 499: 473 await self.debugger_impl.recv("Debugger.paused", worker_thread) 474 else: 475 response = await self.debugger_impl.recv("Debugger.paused", worker_thread) 476 print("response is ", response) 477 self.common_utils.assert_equal(response['params']['callFrames'][0]['functionName'], 'testDropFrame') 478 self.common_utils.assert_equal(response['params']['reason'], 'Symbol') 479 ################################################################################################################ 480 # worker thread: Debugger.dropFrame 481 ################################################################################################################ 482 params = debugger.DropFrameParams() 483 for i in range(1000): 484 start_time = datetime.now() 485 await self.debugger_impl.send("Debugger.dropFrame", worker_thread, params) 486 await self.debugger_impl.recv("Debugger.paused", worker_thread) 487 end_time = datetime.now() 488 self.performance_utils.add_time_data("DropFrame(worker)", 8, (end_time - start_time).microseconds // 1000) 489 start_time = datetime.now() 490 await self.debugger_impl.send("Debugger.resume", worker_thread) 491 await self.debugger_impl.recv("Debugger.paused", worker_thread) 492 end_time = datetime.now() 493 self.performance_utils.add_time_data("ResumeAndPaused(worker)", 8, 494 (end_time - start_time).microseconds // 1000) 495 ################################################################################################################ 496 # main thread: Debugger.removeSymbolicBreakpoints 497 ################################################################################################################ 498 symbolicBreakpoints = [debugger.SymbolicBreakpoint(functionName='testDropFrame')] 499 params = debugger.SymbolicBreakpoints(symbolicBreakpoints) 500 await self.debugger_impl.send("Debugger.removeSymbolicBreakpoints", worker_thread, params) 501 ################################################################################################################ 502 # worker thread: Debugger.resume 503 ################################################################################################################ 504 await self.debugger_impl.send("Debugger.resume", worker_thread) 505 ################################################################################################################ 506 # worker thread: Debugger.paused, hit breakpoint 507 ################################################################################################################ 508 response = await self.debugger_impl.recv("Debugger.paused", worker_thread) 509 self.common_utils.assert_equal(response['params']['hitBreakpoints'], 510 ['id:84:4:' + self.config['file_path']['params']]) 511 ################################################################################################################ 512 # worker thread: Debugger.GetProperties 513 ################################################################################################################ 514 params = runtime.GetPropertiesParams('0') 515 for i in range(1000): 516 start_time = datetime.now() 517 response = await self.runtime_impl.send("Runtime.getProperties", worker_thread, params) 518 end_time = datetime.now() 519 self.performance_utils.add_time_data("GetLocalProperties(worker)", 15, 520 (end_time - start_time).microseconds // 1000) 521 variables = CommonUtils.get_variables_from_properties(response['result']['result'], 'local') 522 expected_variables = {'localArrayList': 'ArrayList', 'localBigInt64Array': 'BigInt64Array', 523 'localBigUint64Array': 'BigUint64Array', 'localDataView': 'DataView(20)', 524 'localDeque': 'Deque', 'localFloat32Array': 'Float32Array', 525 'localFloat64Array': 'Float64Array', 'localHashMap': 'HashMap', 526 'localHashSet': 'HashSet', 527 'localInt16Array': 'Int16Array(0)', 'localInt32Array': 'Int32Array(0)', 528 'localInt8Array': 'Int8Array(0)', 'localLightWeightMap': 'LightWeightMap', 529 'localLightWeightSet': 'LightWeightSet', 'localLinkedList': 'LinkedList', 530 'localList': 'List', 'localMapIter': 'function entries( { [native code] }', 531 'localNull': 'null', 'localPerson': 'Person', 'localPlainArray': 'PlainArray', 532 'localPromise': 'Promise', 'localProxy': 'Proxy', 'localQueue': 'Queue', 533 'localSendableClass': 'SendableClass[Sendable]', 534 'localSharedArrayBuffer': 'SharedArrayBuffer(32)', 'localStack': 'Stack', 535 'localTreeMap': 'TreeMap', 'localTreeSet': 'TreeSet', 536 'localUint16Array': 'Uint16Array', 537 'localUint32Array': 'Uint32Array', 'localUint8Array': 'Uint8Array(3)', 538 'localUint8ClampedArray': 'Uint8ClampedArray', 'localUndefined': 'undefined', 539 'localWeakMap': 'WeakMap(0)', 'localWeakRef': 'WeakRef {}', 540 'localWeakSet': 'WeakSet(0)'} 541 self.common_utils.assert_equal(variables, expected_variables) 542 ################################################################################################################ 543 # worker thread: Debugger.GetProperties 544 ################################################################################################################ 545 params = runtime.GetPropertiesParams('1') 546 for i in range(1000): 547 start_time = datetime.now() 548 response = await self.runtime_impl.send("Runtime.getProperties", worker_thread, params) 549 end_time = datetime.now() 550 self.performance_utils.add_time_data("GetClosureProperties(worker)", 6, 551 (end_time - start_time).microseconds // 1000) 552 variables = CommonUtils.get_variables_from_properties(response['result']['result'], 'closure') 553 expected_variables = {'closureArray': 'Array(3)', 'closureArrayBuffer': 'Arraybuffer(20)', 554 'closureMap': 'Map(0)', 'closureNum': '20', 'closureRegExp': '/^ab+c/g', 555 'closureSet': "Set(1) {'closure'}", 'closureString': 'closure'} 556 self.common_utils.assert_equal(variables, expected_variables) 557 ################################################################################################################ 558 # worker thread: Debugger.GetProperties 559 ################################################################################################################ 560 params = runtime.GetPropertiesParams('2') 561 for i in range(1000): 562 start_time = datetime.now() 563 response = await self.runtime_impl.send("Runtime.getProperties", worker_thread, params) 564 end_time = datetime.now() 565 self.performance_utils.add_time_data("GetModuleProperties(worker)", 15, 566 (end_time - start_time).microseconds // 1000) 567 variables = CommonUtils.get_variables_from_properties(response['result']['result'], '') 568 expected_variables = {'LocalParams': 'function LocalParams( { [js code] }', 569 'ArrayList': 'function ArrayList( { [native code] }', 570 'Deque': 'function Deque( { [native code] }', 571 'HashMap': 'function HashMap( { [native code] }', 572 'HashSet': 'function HashSet( { [native code] }', 573 'LightWeightMap': 'function LightWeightMap( { [native code] }', 574 'LightWeightSet': 'function LightWeightSet( { [native code] }', 575 'LinkedList': 'function LinkedList( { [native code] }', 576 'List': 'function List( { [native code] }', 577 'Person': 'function Person( { [js code] }', 578 'PersonHandler': 'function PersonHandler( { [js code] }', 579 'PlainArray': 'function PlainArray( { [native code] }', 580 'Queue': 'function Queue( { [native code] }', 581 'SendableClass': 'function SendableClass( { [js code] }[Sendable]', 582 'Stack': 'function Stack( { [native code] }', 583 'TreeMap': 'function TreeMap( { [native code] }', 584 'TreeSet': 'function TreeSet( { [native code] }'} 585 self.common_utils.assert_equal(variables, expected_variables) 586 ################################################################################################################ 587 # worker thread: Debugger.GetProperties 588 ################################################################################################################ 589 params = runtime.GetPropertiesParams('3') 590 for i in range(1000): 591 start_time = datetime.now() 592 response = await self.runtime_impl.send("Runtime.getProperties", worker_thread, params) 593 end_time = datetime.now() 594 self.performance_utils.add_time_data("GetGlobalProperties(worker)", 50, 595 (end_time - start_time).microseconds // 1000) 596 variables = CommonUtils.get_variables_from_properties(response['result']['result'], 'global') 597 expected_variables = {'globalArray': 'Array(3)', 'globalBigInt': '9007199254740991n', 598 'globalBool': 'Boolean{[[PrimitiveValue]]: false}', 599 'globalDate': 'Wed Aug 28 2024 02:41:00 GMT+0800', 600 'globalNum': 'Number{[[PrimitiveValue]]: 20}', 601 'globalObject': 'String{[[PrimitiveValue]]: globalObject}', 602 'globalStr': 'String{[[PrimitiveValue]]: globalStr}', 'globalThis': 'Object'} 603 self.common_utils.assert_equal(variables, expected_variables) 604 ################################################################################################################ 605 # worker thread: Debugger.evaluateOnCallFrame 606 ################################################################################################################ 607 SET_LOCALPERSON_AGE_22 = ( 608 'UEFOREEAAAAAAAAADAACAGQBAAAAAAAAAAAAAAIAAAA8AAAAAQAAAGABAAAAAAAARAAAAAEAAABEAAAApAAAANcAAACAAAAAZAEAAAIAAA' 609 'BsAAAAAwAAAHQAAAD/////////////////////pAAAANcAAACAAAAAhQAAAJcAAAAHYWdlACFkZWJ1Z2dlckdldFZhbHVlABdsb2NhbFBl' 610 'cnNvbgAzTF9FU1Nsb3ROdW1iZXJBbm5vdGF0aW9uOwAAAAAAgUAAAAIAABdmdW5jX21haW5fMAATTF9HTE9CQUw7AAAAAAABAAECAAABAP' 611 '//ygAAAIgCASEBAAACAAVWAQAABhQBAAAAFVNsb3ROdW1iZXIAAAABAAgBAAAGAAAANwkDLABEkEShRLJtYQVgBUIAAQBhBj4CAGEHAmEI' 612 'YAYrAgcIYQRiFgAAAEMEAAAEZAtrAQ8A/////w8AAgAlAFEBAAA=') 613 params = debugger.EvaluateOnCallFrameParams(SET_LOCALPERSON_AGE_22) 614 for i in range(1000): 615 start_time = datetime.now() 616 response = await self.debugger_impl.send("Debugger.evaluateOnCallFrame", worker_thread, params) 617 end_time = datetime.now() 618 self.performance_utils.add_time_data("SetLocalParam(worker)", 6, 619 (end_time - start_time).microseconds // 1000) 620 self.common_utils.assert_equal(response['result']['result'], 621 {"type": "number", "unserializableValue": "22", "description": "22"}) 622 ################################################################################################################ 623 # worker thread: Debugger.evaluateOnCallFrame 624 ################################################################################################################ 625 params = debugger.EvaluateOnCallFrameParams('closureString = "modified"') 626 for i in range(1000): 627 start_time = datetime.now() 628 response = await self.debugger_impl.send("Debugger.evaluateOnCallFrame", worker_thread, params) 629 end_time = datetime.now() 630 self.performance_utils.add_time_data("SetClosureParam(worker)", 6, 631 (end_time - start_time).microseconds // 1000) 632 self.common_utils.assert_equal(response['result']['result'], 633 {"type": "string", "unserializableValue": "modified", "description": "modified"}) 634 ################################################################################################################ 635 # worker thread: Debugger.evaluateOnCallFrame 636 ################################################################################################################ 637 SET_LIST_LENGTH_1 = ( 638 'UEFOREEAAAAAAAAADAACAGABAAAAAAAAAAAAAAIAAAA8AAAAAQAAAFwBAAAAAAAARAAAAAEAAABEAAAAoAAAANMAAACAAAAAYAEAAAIAAA' 639 'BsAAAAAwAAAHQAAAD/////////////////////oAAAANMAAACAAAAAhgAAAJgAAAAJTGlzdAAhZGVidWdnZXJHZXRWYWx1ZQANbGVuZ3Ro' 640 'ADNMX0VTU2xvdE51bWJlckFubm90YXRpb247AAAAAACBQAAAAgAAF2Z1bmNfbWFpbl8wABNMX0dMT0JBTDsAAAAAAAEAAQIAAAEA///GAA' 641 'AAiAIBHQEAAAIABVIBAAAGEAEAAAAVU2xvdE51bWJlcgAAAAEABAEAAAYAAAA3CQMsAESQRKFEsm1hBWAFQgABAGEGPgAAYQcCYQhgBisC' 642 'BwhhBGIBAAAAQwQCAARkC2sBDwD/////DwACACUATQEAAA==') 643 params = debugger.EvaluateOnCallFrameParams(SET_LIST_LENGTH_1) 644 for i in range(1000): 645 start_time = datetime.now() 646 response = await self.debugger_impl.send("Debugger.evaluateOnCallFrame", worker_thread, params) 647 end_time = datetime.now() 648 self.performance_utils.add_time_data("SetModuleParam(worker)", 6, 649 (end_time - start_time).microseconds // 1000) 650 self.common_utils.assert_equal(response['result'], 651 {"code": 1, "message": "TypeError: Cannot assign to read only property"}) 652 ################################################################################################################ 653 # worker thread: Debugger.evaluateOnCallFrame 654 ################################################################################################################ 655 SET_GLOBALARRAY_INDEX_2_999 = ( 656 'UEFOREEAAAAAAAAADAACAGQBAAAAAAAAAAAAAAIAAAA8AAAAAQAAAGABAAAAAAAARAAAAAEAAABEAAAAmwAAAM4AAAB8AAAAZAEAAAIAAA' 657 'BsAAAAAgAAAHQAAAD/////////////////////mwAAAM4AAAB8AAAAjgAAACFkZWJ1Z2dlckdldFZhbHVlABdnbG9iYWxBcnJheQAzTF9F' 658 'U1Nsb3ROdW1iZXJBbm5vdGF0aW9uOwAAAAAAgUAAAAIAABdmdW5jX21haW5fMAATTF9HTE9CQUw7AAAAAAABAAECAAABAP//wQAAAIgCAR' 659 'gBAAACAAVTAQAABgsBAAAAFVNsb3ROdW1iZXIAAAABAP8AAAAGAAAANwkDMgBEkEShRLJtYQVgBUIAAABhBj4BAGEHAmEIYAYrAgcIYQRi' 660 'AgAAAGEFYucDAAA4BAQFZAtrAQ8A/////w8AAgArAAAAAE4BAAA=') 661 params = debugger.EvaluateOnCallFrameParams(SET_GLOBALARRAY_INDEX_2_999) 662 for i in range(1000): 663 start_time = datetime.now() 664 response = await self.debugger_impl.send("Debugger.evaluateOnCallFrame", worker_thread, params) 665 end_time = datetime.now() 666 self.performance_utils.add_time_data("SetGlobalParam(worker)", 6, 667 (end_time - start_time).microseconds // 1000) 668 self.common_utils.assert_equal(response['result']['result'], 669 {"type": "number", "unserializableValue": "999", "description": "999"}) 670 ################################################################################################################ 671 # worker thread: Debugger.evaluateOnCallFrame 672 ################################################################################################################ 673 LOCALPERSON_AGE = ( 674 'UEFOREEAAAAAAAAADAACAGABAAAAAAAAAAAAAAIAAAA8AAAAAQAAAFwBAAAAAAAARAAAAAEAAABEAAAApAAAANcAAACAAAAAYAEAAAIAAA' 675 'BsAAAAAwAAAHQAAAD/////////////////////pAAAANcAAACAAAAAhQAAAJcAAAAHYWdlACFkZWJ1Z2dlckdldFZhbHVlABdsb2NhbFBl' 676 'cnNvbgAzTF9FU1Nsb3ROdW1iZXJBbm5vdGF0aW9uOwAAAAAAgUAAAAIAABdmdW5jX21haW5fMAATTF9HTE9CQUw7AAAAAAABAAECAAABAP' 677 '//ygAAAIgCASEBAAACAAVSAQAABhQBAAAAFVNsb3ROdW1iZXIAAAABAAgBAAAGAAAANwkDKABEkEShRLJtYQVgBUIAAQBhBj4CAGEHAmEI' 678 'YAYrAgcIYQRgBEIEAABkC2sBDwD/////DwACACEATQEAAA==') 679 params = debugger.EvaluateOnCallFrameParams(LOCALPERSON_AGE) 680 for i in range(1000): 681 start_time = datetime.now() 682 response = await self.debugger_impl.send("Debugger.evaluateOnCallFrame", worker_thread, params) 683 end_time = datetime.now() 684 self.performance_utils.add_time_data("GetLocalParam(worker)", 6, 685 (end_time - start_time).microseconds // 1000) 686 self.common_utils.assert_equal(response['result']['result'], 687 {"type": "number", "unserializableValue": "22", "description": "22"}) 688 ################################################################################################################ 689 # worker thread: Debugger.evaluateOnCallFrame 690 ################################################################################################################ 691 params = debugger.EvaluateOnCallFrameParams('closureString') 692 for i in range(1000): 693 start_time = datetime.now() 694 response = await self.debugger_impl.send("Debugger.evaluateOnCallFrame", worker_thread, params) 695 end_time = datetime.now() 696 self.performance_utils.add_time_data("GetClosureParam(worker)", 6, 697 (end_time - start_time).microseconds // 1000) 698 self.common_utils.assert_equal(response['result']['result'], 699 {"type": "string", "unserializableValue": "modified", "description": "modified"}) 700 ################################################################################################################ 701 # worker thread: Debugger.evaluateOnCallFrame 702 ################################################################################################################ 703 LIST_LENGTH = ( 704 'UEFOREEAAAAAAAAADAACAFwBAAAAAAAAAAAAAAIAAAA8AAAAAQAAAFgBAAAAAAAARAAAAAEAAABEAAAAoAAAANMAAACAAAAAXAEAAAIAAA' 705 'BsAAAAAwAAAHQAAAD/////////////////////oAAAANMAAACAAAAAhgAAAJgAAAAJTGlzdAAhZGVidWdnZXJHZXRWYWx1ZQANbGVuZ3Ro' 706 'ADNMX0VTU2xvdE51bWJlckFubm90YXRpb247AAAAAACBQAAAAgAAF2Z1bmNfbWFpbl8wABNMX0dMT0JBTDsAAAAAAAEAAQIAAAEA///GAA' 707 'AAiAIBHQEAAAIABU4BAAAGEAEAAAAVU2xvdE51bWJlcgAAAAEABAEAAAYAAAA3CQMoAESQRKFEsm1hBWAFQgABAGEGPgAAYQcCYQhgBisC' 708 'BwhhBGAEQgQCAGQLawEPAP////8PAAIAIQBJAQAA') 709 params = debugger.EvaluateOnCallFrameParams(LIST_LENGTH) 710 for i in range(1000): 711 start_time = datetime.now() 712 response = await self.debugger_impl.send("Debugger.evaluateOnCallFrame", worker_thread, params) 713 end_time = datetime.now() 714 self.performance_utils.add_time_data("GetModuleParam(worker)", 6, 715 (end_time - start_time).microseconds // 1000) 716 self.common_utils.assert_equal(response['result']['result'], 717 {"type": "number", "unserializableValue": "0", "description": "0"}) 718 ################################################################################################################ 719 # worker thread: Debugger.evaluateOnCallFrame 720 ################################################################################################################ 721 GLOBALARRAY_INDEX_2 = ( 722 'UEFOREEAAAAAAAAADAACAGABAAAAAAAAAAAAAAIAAAA8AAAAAQAAAFwBAAAAAAAARAAAAAEAAABEAAAAmwAAAM4AAAB8AAAAYAEAAAIAAA' 723 'BsAAAAAgAAAHQAAAD/////////////////////mwAAAM4AAAB8AAAAjgAAACFkZWJ1Z2dlckdldFZhbHVlABdnbG9iYWxBcnJheQAzTF9F' 724 'U1Nsb3ROdW1iZXJBbm5vdGF0aW9uOwAAAAAAgUAAAAIAABdmdW5jX21haW5fMAATTF9HTE9CQUw7AAAAAAABAAECAAABAP//wQAAAIgCAR' 725 'gBAAACAAVPAQAABgsBAAAAFVNsb3ROdW1iZXIAAAABAP8AAAAGAAAANwkDLgBEkEShRLJtYQVgBUIAAABhBj4BAGEHAmEIYAYrAgcIYQRi' 726 'AgAAAGEFYAU3BARkC2sBDwD/////DwACACcAAAAASgEAAA==') 727 params = debugger.EvaluateOnCallFrameParams(GLOBALARRAY_INDEX_2) 728 for i in range(1000): 729 start_time = datetime.now() 730 response = await self.debugger_impl.send("Debugger.evaluateOnCallFrame", worker_thread, params) 731 end_time = datetime.now() 732 self.performance_utils.add_time_data("GetGlobalParam(worker)", 6, 733 (end_time - start_time).microseconds // 1000) 734 self.common_utils.assert_equal(response['result']['result'], 735 {"type": "number", "unserializableValue": "999", "description": "999"}) 736 ################################################################################################################ 737 # worker thread: Debugger.getPossibleAndSetBreakpointByUrl 738 ################################################################################################################ 739 breakpoints_url = debugger.RemoveBreakpointsUrl(self.config['file_path']['params']) 740 locations = [] 741 for i in range(1, 101): 742 locations.append(debugger.BreakLocationUrl(url=self.config['file_path']['params'], line_number=i)) 743 breakpoints_locations = debugger.SetBreakpointsLocations(locations) 744 for i in range(1000): 745 start_time = datetime.now() 746 await self.debugger_impl.send("Debugger.removeBreakpointsByUrl", worker_thread, breakpoints_url) 747 end_time = datetime.now() 748 self.performance_utils.add_time_data("RemoveBreakpoints(worker)", 6, 749 (end_time - start_time).microseconds // 1000) 750 start_time = datetime.now() 751 await self.debugger_impl.send("Debugger.getPossibleAndSetBreakpointsByUrl", worker_thread, 752 breakpoints_locations) 753 end_time = datetime.now() 754 self.performance_utils.add_time_data("SetManyBreakpoints(worker)", 50, 755 (end_time - start_time).microseconds // 1000) 756 ################################################################################################################ 757 # worker thread: Debugger.removeBreakpointsByUrl 758 ################################################################################################################ 759 params = debugger.RemoveBreakpointsUrl(self.config['file_path']['params']) 760 await self.debugger_impl.send("Debugger.removeBreakpointsByUrl", worker_thread, params) 761 ################################################################################################################ 762 # main thread: Debugger.removeSymbolicBreakpoints 763 ################################################################################################################ 764 symbolicBreakpoints = [debugger.SymbolicBreakpoint(functionName='testDropFrame')] 765 for i in range(1, 51): 766 symbolicBreakpoints.append(debugger.SymbolicBreakpoint(functionName='testDebug' + str(i))) 767 params = debugger.SymbolicBreakpoints(symbolicBreakpoints) 768 start_time = datetime.now() 769 await self.debugger_impl.send("Debugger.removeSymbolicBreakpoints", worker_thread, params) 770 end_time = datetime.now() 771 self.performance_utils.add_time_data("RemoveSymbolicBreakpoints", 10, 772 (end_time - start_time).microseconds // 1000) 773 for i in range(999): 774 start_time = datetime.now() 775 await self.debugger_impl.send("Debugger.setSymbolicBreakpoints", worker_thread, params) 776 end_time = datetime.now() 777 self.performance_utils.add_time_data("SetSymbolicBreakpoints", 10, 778 (end_time - start_time).microseconds // 1000) 779 start_time = datetime.now() 780 await self.debugger_impl.send("Debugger.removeSymbolicBreakpoints", worker_thread, params) 781 end_time = datetime.now() 782 self.performance_utils.add_time_data("RemoveSymbolicBreakpoints", 10, 783 (end_time - start_time).microseconds // 1000) 784 ################################################################################################################ 785 # worker thread: Debugger.resume 786 ################################################################################################################ 787 await self.debugger_impl.send("Debugger.resume", worker_thread) 788 ################################################################################################################ 789 # worker thread: Debugger.disable 790 ################################################################################################################ 791 await self.debugger_impl.send("Debugger.disable", worker_thread) 792 ################################################################################################################ 793 # main thread: Debugger.disable 794 ################################################################################################################ 795 await self.debugger_impl.send("Debugger.disable", main_thread) 796 ################################################################################################################ 797 # close the websocket connections 798 ################################################################################################################ 799 await websocket.send_msg_to_debugger_server(worker_thread.instance_id, worker_thread.send_msg_queue, 'close') 800 await websocket.send_msg_to_debugger_server(main_thread.instance_id, main_thread.send_msg_queue, 'close') 801 await websocket.send_msg_to_connect_server('close') 802 ################################################################################################################