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#文 件 名: TestWorkerBasicFuncWithGPSOff.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 TestWorkerBasicFuncWithGPSOff(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': 15806, 50 'debugger_server_port': 15807, 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.disable_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", 40, (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='testDebug')] 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.removeBreakpointsByUrl 345 ################################################################################################################ 346 params = debugger.RemoveBreakpointsUrl(self.config['file_path']['drop_frame']) 347 await self.debugger_impl.send("Debugger.removeBreakpointsByUrl", worker_thread, params) 348 ################################################################################################################ 349 # worker thread: Debugger.getPossibleAndSetBreakpointByUrl 350 ################################################################################################################ 351 locations = [debugger.BreakLocationUrl(url=self.config['file_path']['drop_frame'], line_number=4)] 352 params = debugger.SetBreakpointsLocations(locations) 353 response = await self.debugger_impl.send("Debugger.getPossibleAndSetBreakpointsByUrl", 354 worker_thread, params) 355 self.common_utils.assert_equal(response['result']['locations'][0]['id'], 356 'id:4:0:' + self.config['file_path']['drop_frame']) 357 ################################################################################################################ 358 # worker thread: Debugger.resume 359 ################################################################################################################ 360 await self.debugger_impl.send("Debugger.resume", worker_thread) 361 ################################################################################################################ 362 # worker thread: Debugger.scriptParsed 363 ################################################################################################################ 364 start_time = datetime.now() 365 await self.debugger_impl.recv("Debugger.scriptParsed", worker_thread) 366 response = await self.debugger_impl.recv("Debugger.paused", worker_thread) 367 end_time = datetime.now() 368 self.performance_utils.add_time_data("ScriptParsed(Worker)", 5, (end_time - start_time).microseconds // 1000) 369 self.common_utils.assert_equal(response['params']['callFrames'][0]['url'], 370 self.config['file_path']['calculate']) 371 self.common_utils.assert_equal(response['params']['reason'], 'Break on start') 372 ################################################################################################################ 373 # worker thread: Debugger.resume 374 ################################################################################################################ 375 await self.debugger_impl.send("Debugger.resume", worker_thread) 376 ################################################################################################################ 377 # worker thread: Debugger.scriptParsed 378 ################################################################################################################ 379 start_time = datetime.now() 380 await self.debugger_impl.recv("Debugger.scriptParsed", worker_thread) 381 response = await self.debugger_impl.recv("Debugger.paused", worker_thread) 382 end_time = datetime.now() 383 self.performance_utils.add_time_data("ScriptParsed(Worker)", 5, (end_time - start_time).microseconds // 1000) 384 self.common_utils.assert_equal(response['params']['callFrames'][0]['url'], self.config['file_path']['step']) 385 self.common_utils.assert_equal(response['params']['reason'], 'Break on start') 386 ################################################################################################################ 387 # worker thread: Debugger.removeBreakpointsByUrl 388 ################################################################################################################ 389 params = debugger.RemoveBreakpointsUrl(self.config['file_path']['step']) 390 await self.debugger_impl.send("Debugger.removeBreakpointsByUrl", worker_thread, params) 391 ################################################################################################################ 392 # worker thread: Debugger.getPossibleAndSetBreakpointByUrl 393 ################################################################################################################ 394 locations = [debugger.BreakLocationUrl(url=self.config['file_path']['step'], line_number=3)] 395 params = debugger.SetBreakpointsLocations(locations) 396 response = await self.debugger_impl.send("Debugger.getPossibleAndSetBreakpointsByUrl", 397 worker_thread, params) 398 self.common_utils.assert_equal(response['result']['locations'][0]['id'], 399 'id:3:0:' + self.config['file_path']['step']) 400 ################################################################################################################ 401 # worker thread: Debugger.resume 402 ################################################################################################################ 403 await self.debugger_impl.send("Debugger.resume", worker_thread) 404 ################################################################################################################ 405 # worker thread: Debugger.scriptParsed 406 ################################################################################################################ 407 start_time = datetime.now() 408 await self.debugger_impl.recv("Debugger.scriptParsed", worker_thread) 409 response = await self.debugger_impl.recv("Debugger.paused", worker_thread) 410 end_time = datetime.now() 411 self.performance_utils.add_time_data("ScriptParsed(Worker)", 5, (end_time - start_time).microseconds // 1000) 412 self.common_utils.assert_equal(response['params']['callFrames'][0]['url'], self.config['file_path']['worker']) 413 self.common_utils.assert_equal(response['params']['reason'], 'Break on start') 414 ################################################################################################################ 415 # worker thread: Debugger.resume 416 ################################################################################################################ 417 await self.debugger_impl.send("Debugger.resume", worker_thread) 418 ################################################################################################################ 419 # worker thread: Debugger.paused, hit breakpoint 420 ################################################################################################################ 421 response = await self.debugger_impl.recv("Debugger.paused", worker_thread) 422 self.common_utils.assert_equal(response['params']['hitBreakpoints'], 423 ['id:3:19:' + self.config['file_path']['step']]) 424 ################################################################################################################ 425 # worker thread: Debugger.stepOut 426 ################################################################################################################ 427 for i in range(500): 428 # Debugger.stepInto 429 start_time = datetime.now() 430 await self.debugger_impl.send("Debugger.stepInto", worker_thread) 431 await self.debugger_impl.recv("Debugger.paused", worker_thread) 432 end_time = datetime.now() 433 self.performance_utils.add_time_data("StepInto(worker)", 8, (end_time - start_time).microseconds // 1000) 434 # Debugger.stepOver 435 start_time = datetime.now() 436 await self.debugger_impl.send("Debugger.stepOver", worker_thread) 437 await self.debugger_impl.recv("Debugger.paused", worker_thread) 438 end_time = datetime.now() 439 self.performance_utils.add_time_data("StepOver(worker)", 8, (end_time - start_time).microseconds // 1000) 440 # Debugger.stepInto 441 start_time = datetime.now() 442 await self.debugger_impl.send("Debugger.stepInto", worker_thread) 443 await self.debugger_impl.recv("Debugger.paused", worker_thread) 444 end_time = datetime.now() 445 self.performance_utils.add_time_data("StepInto(worker)", 8, (end_time - start_time).microseconds // 1000) 446 # Debugger.stepOver 447 start_time = datetime.now() 448 await self.debugger_impl.send("Debugger.stepOver", worker_thread) 449 await self.debugger_impl.recv("Debugger.paused", worker_thread) 450 end_time = datetime.now() 451 self.performance_utils.add_time_data("StepOver(worker)", 8, (end_time - start_time).microseconds // 1000) 452 # Debugger.smartStepInto 453 params = debugger.SmartStepIntoParams(url=self.config['file_path']['calculate'], line_number=1) 454 start_time = datetime.now() 455 await self.debugger_impl.send("Debugger.smartStepInto", worker_thread, params) 456 await self.debugger_impl.send("Debugger.resume", worker_thread) 457 response = await self.debugger_impl.recv("Debugger.paused", worker_thread) 458 end_time = datetime.now() 459 self.performance_utils.add_time_data("SmartStepInto(worker)", 15, 460 (end_time - start_time).microseconds // 1000) 461 self.common_utils.assert_equal(response['params']['callFrames'][0]['functionName'], 'add') 462 # Debugger.stepOut 463 start_time = datetime.now() 464 await self.debugger_impl.send("Debugger.stepOut", worker_thread) 465 await self.debugger_impl.recv("Debugger.paused", worker_thread) 466 end_time = datetime.now() 467 self.performance_utils.add_time_data("StepOut(worker)", 8, (end_time - start_time).microseconds // 1000) 468 # Debugger.smartStepInto 469 params = debugger.SmartStepIntoParams(url=self.config['file_path']['calculate'], line_number=4) 470 start_time = datetime.now() 471 await self.debugger_impl.send("Debugger.smartStepInto", worker_thread, params) 472 await self.debugger_impl.send("Debugger.resume", worker_thread) 473 response = await self.debugger_impl.recv("Debugger.paused", worker_thread) 474 end_time = datetime.now() 475 self.performance_utils.add_time_data("SmartStepInto(worker)", 15, 476 (end_time - start_time).microseconds // 1000) 477 self.common_utils.assert_equal(response['params']['callFrames'][0]['functionName'], 'sub') 478 # Debugger.stepOut 479 start_time = datetime.now() 480 await self.debugger_impl.send("Debugger.stepOut", worker_thread) 481 await self.debugger_impl.recv("Debugger.paused", worker_thread) 482 end_time = datetime.now() 483 self.performance_utils.add_time_data("StepOut(worker)", 8, (end_time - start_time).microseconds // 1000) 484 # Debugger.resume 485 await self.debugger_impl.send("Debugger.resume", worker_thread) 486 await self.debugger_impl.recv("Debugger.paused", worker_thread) 487 ################################################################################################################ 488 # worker thread: Debugger.dropFrame 489 ################################################################################################################ 490 params = debugger.DropFrameParams() 491 for i in range(1000): 492 start_time = datetime.now() 493 await self.debugger_impl.send("Debugger.dropFrame", worker_thread, params) 494 await self.debugger_impl.recv("Debugger.paused", worker_thread) 495 end_time = datetime.now() 496 self.performance_utils.add_time_data("DropFrame(worker)", 8, (end_time - start_time).microseconds // 1000) 497 start_time = datetime.now() 498 await self.debugger_impl.send("Debugger.resume", worker_thread) 499 await self.debugger_impl.recv("Debugger.paused", worker_thread) 500 end_time = datetime.now() 501 self.performance_utils.add_time_data("ResumeAndPaused(worker)", 8, 502 (end_time - start_time).microseconds // 1000) 503 ################################################################################################################ 504 # worker thread: Debugger.removeBreakpointsByUrl 505 ################################################################################################################ 506 params = debugger.RemoveBreakpointsUrl(self.config['file_path']['drop_frame']) 507 await self.debugger_impl.send("Debugger.removeBreakpointsByUrl", worker_thread, params) 508 ################################################################################################################ 509 # worker thread: Debugger.resume 510 ################################################################################################################ 511 await self.debugger_impl.send("Debugger.resume", worker_thread) 512 ################################################################################################################ 513 # worker thread: Debugger.paused, hit breakpoint 514 ################################################################################################################ 515 response = await self.debugger_impl.recv("Debugger.paused", worker_thread) 516 self.common_utils.assert_equal(response['params']['hitBreakpoints'], 517 ['id:84:4:' + self.config['file_path']['params']]) 518 ################################################################################################################ 519 # worker thread: Debugger.GetProperties 520 ################################################################################################################ 521 params = runtime.GetPropertiesParams('0') 522 for i in range(1000): 523 start_time = datetime.now() 524 response = await self.runtime_impl.send("Runtime.getProperties", worker_thread, params) 525 end_time = datetime.now() 526 self.performance_utils.add_time_data("GetLocalProperties(worker)", 15, 527 (end_time - start_time).microseconds // 1000) 528 variables = CommonUtils.get_variables_from_properties(response['result']['result'], 'local') 529 expected_variables = {'localArrayList': 'ArrayList', 'localBigInt64Array': 'BigInt64Array', 530 'localBigUint64Array': 'BigUint64Array', 'localDataView': 'DataView(20)', 531 'localDeque': 'Deque', 'localFloat32Array': 'Float32Array', 532 'localFloat64Array': 'Float64Array', 'localHashMap': 'HashMap', 533 'localHashSet': 'HashSet', 534 'localInt16Array': 'Int16Array(0)', 'localInt32Array': 'Int32Array(0)', 535 'localInt8Array': 'Int8Array(0)', 'localLightWeightMap': 'LightWeightMap', 536 'localLightWeightSet': 'LightWeightSet', 'localLinkedList': 'LinkedList', 537 'localList': 'List', 'localMapIter': 'function entries( { [native code] }', 538 'localNull': 'null', 'localPerson': 'Person', 'localPlainArray': 'PlainArray', 539 'localPromise': 'Promise', 'localProxy': 'Proxy', 'localQueue': 'Queue', 540 'localSendableClass': 'SendableClass[Sendable]', 541 'localSharedArrayBuffer': 'SharedArrayBuffer(32)', 'localStack': 'Stack', 542 'localTreeMap': 'TreeMap', 'localTreeSet': 'TreeSet', 543 'localUint16Array': 'Uint16Array', 544 'localUint32Array': 'Uint32Array', 'localUint8Array': 'Uint8Array(3)', 545 'localUint8ClampedArray': 'Uint8ClampedArray', 'localUndefined': 'undefined', 546 'localWeakMap': 'WeakMap(0)', 'localWeakRef': 'WeakRef {}', 547 'localWeakSet': 'WeakSet(0)'} 548 self.common_utils.assert_equal(variables, expected_variables) 549 ################################################################################################################ 550 # worker thread: Debugger.GetProperties 551 ################################################################################################################ 552 params = runtime.GetPropertiesParams('1') 553 for i in range(1000): 554 start_time = datetime.now() 555 response = await self.runtime_impl.send("Runtime.getProperties", worker_thread, params) 556 end_time = datetime.now() 557 self.performance_utils.add_time_data("GetClosureProperties(worker)", 6, 558 (end_time - start_time).microseconds // 1000) 559 variables = CommonUtils.get_variables_from_properties(response['result']['result'], 'closure') 560 expected_variables = {'closureArray': 'Array(3)', 'closureArrayBuffer': 'Arraybuffer(20)', 561 'closureMap': 'Map(0)', 'closureNum': '20', 'closureRegExp': '/^ab+c/g', 562 'closureSet': "Set(1) {'closure'}", 'closureString': 'closure'} 563 self.common_utils.assert_equal(variables, expected_variables) 564 ################################################################################################################ 565 # worker thread: Debugger.GetProperties 566 ################################################################################################################ 567 params = runtime.GetPropertiesParams('2') 568 for i in range(1000): 569 start_time = datetime.now() 570 response = await self.runtime_impl.send("Runtime.getProperties", worker_thread, params) 571 end_time = datetime.now() 572 self.performance_utils.add_time_data("GetModuleProperties(worker)", 15, 573 (end_time - start_time).microseconds // 1000) 574 variables = CommonUtils.get_variables_from_properties(response['result']['result'], '') 575 expected_variables = {'LocalParams': 'function LocalParams( { [js code] }', 576 'ArrayList': 'function ArrayList( { [native code] }', 577 'Deque': 'function Deque( { [native code] }', 578 'HashMap': 'function HashMap( { [native code] }', 579 'HashSet': 'function HashSet( { [native code] }', 580 'LightWeightMap': 'function LightWeightMap( { [native code] }', 581 'LightWeightSet': 'function LightWeightSet( { [native code] }', 582 'LinkedList': 'function LinkedList( { [native code] }', 583 'List': 'function List( { [native code] }', 584 'Person': 'function Person( { [js code] }', 585 'PersonHandler': 'function PersonHandler( { [js code] }', 586 'PlainArray': 'function PlainArray( { [native code] }', 587 'Queue': 'function Queue( { [native code] }', 588 'SendableClass': 'function SendableClass( { [js code] }[Sendable]', 589 'Stack': 'function Stack( { [native code] }', 590 'TreeMap': 'function TreeMap( { [native code] }', 591 'TreeSet': 'function TreeSet( { [native code] }'} 592 self.common_utils.assert_equal(variables, expected_variables) 593 ################################################################################################################ 594 # worker thread: Debugger.GetProperties 595 ################################################################################################################ 596 params = runtime.GetPropertiesParams('3') 597 for i in range(1000): 598 start_time = datetime.now() 599 response = await self.runtime_impl.send("Runtime.getProperties", worker_thread, params) 600 end_time = datetime.now() 601 self.performance_utils.add_time_data("GetGlobalProperties(worker)", 50, 602 (end_time - start_time).microseconds // 1000) 603 variables = CommonUtils.get_variables_from_properties(response['result']['result'], 'global') 604 expected_variables = {'globalArray': 'Array(3)', 'globalBigInt': '9007199254740991n', 605 'globalBool': 'Boolean{[[PrimitiveValue]]: false}', 606 'globalDate': 'Wed Aug 28 2024 02:41:00 GMT+0800', 607 'globalNum': 'Number{[[PrimitiveValue]]: 20}', 608 'globalObject': 'String{[[PrimitiveValue]]: globalObject}', 609 'globalStr': 'String{[[PrimitiveValue]]: globalStr}', 'globalThis': 'Object'} 610 self.common_utils.assert_equal(variables, expected_variables) 611 ################################################################################################################ 612 # worker thread: Debugger.evaluateOnCallFrame 613 ################################################################################################################ 614 SET_LOCALPERSON_AGE_22 = ( 615 'UEFOREEAAAAAAAAADAACAGQBAAAAAAAAAAAAAAIAAAA8AAAAAQAAAGABAAAAAAAARAAAAAEAAABEAAAApAAAANcAAACAAAAAZAEAAAIAAA' 616 'BsAAAAAwAAAHQAAAD/////////////////////pAAAANcAAACAAAAAhQAAAJcAAAAHYWdlACFkZWJ1Z2dlckdldFZhbHVlABdsb2NhbFBl' 617 'cnNvbgAzTF9FU1Nsb3ROdW1iZXJBbm5vdGF0aW9uOwAAAAAAgUAAAAIAABdmdW5jX21haW5fMAATTF9HTE9CQUw7AAAAAAABAAECAAABAP' 618 '//ygAAAIgCASEBAAACAAVWAQAABhQBAAAAFVNsb3ROdW1iZXIAAAABAAgBAAAGAAAANwkDLABEkEShRLJtYQVgBUIAAQBhBj4CAGEHAmEI' 619 'YAYrAgcIYQRiFgAAAEMEAAAEZAtrAQ8A/////w8AAgAlAFEBAAA=') 620 params = debugger.EvaluateOnCallFrameParams(SET_LOCALPERSON_AGE_22) 621 for i in range(1000): 622 start_time = datetime.now() 623 response = await self.debugger_impl.send("Debugger.evaluateOnCallFrame", worker_thread, params) 624 end_time = datetime.now() 625 self.performance_utils.add_time_data("SetLocalParam(worker)", 6, 626 (end_time - start_time).microseconds // 1000) 627 self.common_utils.assert_equal(response['result']['result'], 628 {"type": "number", "unserializableValue": "22", "description": "22"}) 629 ################################################################################################################ 630 # worker thread: Debugger.evaluateOnCallFrame 631 ################################################################################################################ 632 params = debugger.EvaluateOnCallFrameParams('closureString = "modified"') 633 for i in range(1000): 634 start_time = datetime.now() 635 response = await self.debugger_impl.send("Debugger.evaluateOnCallFrame", worker_thread, params) 636 end_time = datetime.now() 637 self.performance_utils.add_time_data("SetClosureParam(worker)", 6, 638 (end_time - start_time).microseconds // 1000) 639 self.common_utils.assert_equal(response['result']['result'], 640 {"type": "string", "unserializableValue": "modified", "description": "modified"}) 641 ################################################################################################################ 642 # worker thread: Debugger.evaluateOnCallFrame 643 ################################################################################################################ 644 SET_LIST_LENGTH_1 = ( 645 'UEFOREEAAAAAAAAADAACAGABAAAAAAAAAAAAAAIAAAA8AAAAAQAAAFwBAAAAAAAARAAAAAEAAABEAAAAoAAAANMAAACAAAAAYAEAAAIAAA' 646 'BsAAAAAwAAAHQAAAD/////////////////////oAAAANMAAACAAAAAhgAAAJgAAAAJTGlzdAAhZGVidWdnZXJHZXRWYWx1ZQANbGVuZ3Ro' 647 'ADNMX0VTU2xvdE51bWJlckFubm90YXRpb247AAAAAACBQAAAAgAAF2Z1bmNfbWFpbl8wABNMX0dMT0JBTDsAAAAAAAEAAQIAAAEA///GAA' 648 'AAiAIBHQEAAAIABVIBAAAGEAEAAAAVU2xvdE51bWJlcgAAAAEABAEAAAYAAAA3CQMsAESQRKFEsm1hBWAFQgABAGEGPgAAYQcCYQhgBisC' 649 'BwhhBGIBAAAAQwQCAARkC2sBDwD/////DwACACUATQEAAA==') 650 params = debugger.EvaluateOnCallFrameParams(SET_LIST_LENGTH_1) 651 for i in range(1000): 652 start_time = datetime.now() 653 response = await self.debugger_impl.send("Debugger.evaluateOnCallFrame", worker_thread, params) 654 end_time = datetime.now() 655 self.performance_utils.add_time_data("SetModuleParam(worker)", 6, 656 (end_time - start_time).microseconds // 1000) 657 self.common_utils.assert_equal(response['result'], 658 {"code": 1, "message": "TypeError: Cannot assign to read only property"}) 659 ################################################################################################################ 660 # worker thread: Debugger.evaluateOnCallFrame 661 ################################################################################################################ 662 SET_GLOBALARRAY_INDEX_2_999 = ( 663 'UEFOREEAAAAAAAAADAACAGQBAAAAAAAAAAAAAAIAAAA8AAAAAQAAAGABAAAAAAAARAAAAAEAAABEAAAAmwAAAM4AAAB8AAAAZAEAAAIAAA' 664 'BsAAAAAgAAAHQAAAD/////////////////////mwAAAM4AAAB8AAAAjgAAACFkZWJ1Z2dlckdldFZhbHVlABdnbG9iYWxBcnJheQAzTF9F' 665 'U1Nsb3ROdW1iZXJBbm5vdGF0aW9uOwAAAAAAgUAAAAIAABdmdW5jX21haW5fMAATTF9HTE9CQUw7AAAAAAABAAECAAABAP//wQAAAIgCAR' 666 'gBAAACAAVTAQAABgsBAAAAFVNsb3ROdW1iZXIAAAABAP8AAAAGAAAANwkDMgBEkEShRLJtYQVgBUIAAABhBj4BAGEHAmEIYAYrAgcIYQRi' 667 'AgAAAGEFYucDAAA4BAQFZAtrAQ8A/////w8AAgArAAAAAE4BAAA=') 668 params = debugger.EvaluateOnCallFrameParams(SET_GLOBALARRAY_INDEX_2_999) 669 for i in range(1000): 670 start_time = datetime.now() 671 response = await self.debugger_impl.send("Debugger.evaluateOnCallFrame", worker_thread, params) 672 end_time = datetime.now() 673 self.performance_utils.add_time_data("SetGlobalParam(worker)", 6, 674 (end_time - start_time).microseconds // 1000) 675 self.common_utils.assert_equal(response['result']['result'], 676 {"type": "number", "unserializableValue": "999", "description": "999"}) 677 ################################################################################################################ 678 # worker thread: Debugger.evaluateOnCallFrame 679 ################################################################################################################ 680 LOCALPERSON_AGE = ( 681 'UEFOREEAAAAAAAAADAACAGABAAAAAAAAAAAAAAIAAAA8AAAAAQAAAFwBAAAAAAAARAAAAAEAAABEAAAApAAAANcAAACAAAAAYAEAAAIAAA' 682 'BsAAAAAwAAAHQAAAD/////////////////////pAAAANcAAACAAAAAhQAAAJcAAAAHYWdlACFkZWJ1Z2dlckdldFZhbHVlABdsb2NhbFBl' 683 'cnNvbgAzTF9FU1Nsb3ROdW1iZXJBbm5vdGF0aW9uOwAAAAAAgUAAAAIAABdmdW5jX21haW5fMAATTF9HTE9CQUw7AAAAAAABAAECAAABAP' 684 '//ygAAAIgCASEBAAACAAVSAQAABhQBAAAAFVNsb3ROdW1iZXIAAAABAAgBAAAGAAAANwkDKABEkEShRLJtYQVgBUIAAQBhBj4CAGEHAmEI' 685 'YAYrAgcIYQRgBEIEAABkC2sBDwD/////DwACACEATQEAAA==') 686 params = debugger.EvaluateOnCallFrameParams(LOCALPERSON_AGE) 687 for i in range(1000): 688 start_time = datetime.now() 689 response = await self.debugger_impl.send("Debugger.evaluateOnCallFrame", worker_thread, params) 690 end_time = datetime.now() 691 self.performance_utils.add_time_data("GetLocalParam(worker)", 6, 692 (end_time - start_time).microseconds // 1000) 693 self.common_utils.assert_equal(response['result']['result'], 694 {"type": "number", "unserializableValue": "22", "description": "22"}) 695 ################################################################################################################ 696 # worker thread: Debugger.evaluateOnCallFrame 697 ################################################################################################################ 698 params = debugger.EvaluateOnCallFrameParams('closureString') 699 for i in range(1000): 700 start_time = datetime.now() 701 response = await self.debugger_impl.send("Debugger.evaluateOnCallFrame", worker_thread, params) 702 end_time = datetime.now() 703 self.performance_utils.add_time_data("GetClosureParam(worker)", 6, 704 (end_time - start_time).microseconds // 1000) 705 self.common_utils.assert_equal(response['result']['result'], 706 {"type": "string", "unserializableValue": "modified", "description": "modified"}) 707 ################################################################################################################ 708 # worker thread: Debugger.evaluateOnCallFrame 709 ################################################################################################################ 710 LIST_LENGTH = ( 711 'UEFOREEAAAAAAAAADAACAFwBAAAAAAAAAAAAAAIAAAA8AAAAAQAAAFgBAAAAAAAARAAAAAEAAABEAAAAoAAAANMAAACAAAAAXAEAAAIAAA' 712 'BsAAAAAwAAAHQAAAD/////////////////////oAAAANMAAACAAAAAhgAAAJgAAAAJTGlzdAAhZGVidWdnZXJHZXRWYWx1ZQANbGVuZ3Ro' 713 'ADNMX0VTU2xvdE51bWJlckFubm90YXRpb247AAAAAACBQAAAAgAAF2Z1bmNfbWFpbl8wABNMX0dMT0JBTDsAAAAAAAEAAQIAAAEA///GAA' 714 'AAiAIBHQEAAAIABU4BAAAGEAEAAAAVU2xvdE51bWJlcgAAAAEABAEAAAYAAAA3CQMoAESQRKFEsm1hBWAFQgABAGEGPgAAYQcCYQhgBisC' 715 'BwhhBGAEQgQCAGQLawEPAP////8PAAIAIQBJAQAA') 716 params = debugger.EvaluateOnCallFrameParams(LIST_LENGTH) 717 for i in range(1000): 718 start_time = datetime.now() 719 response = await self.debugger_impl.send("Debugger.evaluateOnCallFrame", worker_thread, params) 720 end_time = datetime.now() 721 self.performance_utils.add_time_data("GetModuleParam(worker)", 6, 722 (end_time - start_time).microseconds // 1000) 723 self.common_utils.assert_equal(response['result']['result'], 724 {"type": "number", "unserializableValue": "0", "description": "0"}) 725 ################################################################################################################ 726 # worker thread: Debugger.evaluateOnCallFrame 727 ################################################################################################################ 728 GLOBALARRAY_INDEX_2 = ( 729 'UEFOREEAAAAAAAAADAACAGABAAAAAAAAAAAAAAIAAAA8AAAAAQAAAFwBAAAAAAAARAAAAAEAAABEAAAAmwAAAM4AAAB8AAAAYAEAAAIAAA' 730 'BsAAAAAgAAAHQAAAD/////////////////////mwAAAM4AAAB8AAAAjgAAACFkZWJ1Z2dlckdldFZhbHVlABdnbG9iYWxBcnJheQAzTF9F' 731 'U1Nsb3ROdW1iZXJBbm5vdGF0aW9uOwAAAAAAgUAAAAIAABdmdW5jX21haW5fMAATTF9HTE9CQUw7AAAAAAABAAECAAABAP//wQAAAIgCAR' 732 'gBAAACAAVPAQAABgsBAAAAFVNsb3ROdW1iZXIAAAABAP8AAAAGAAAANwkDLgBEkEShRLJtYQVgBUIAAABhBj4BAGEHAmEIYAYrAgcIYQRi' 733 'AgAAAGEFYAU3BARkC2sBDwD/////DwACACcAAAAASgEAAA==') 734 params = debugger.EvaluateOnCallFrameParams(GLOBALARRAY_INDEX_2) 735 for i in range(1000): 736 start_time = datetime.now() 737 response = await self.debugger_impl.send("Debugger.evaluateOnCallFrame", worker_thread, params) 738 end_time = datetime.now() 739 self.performance_utils.add_time_data("GetGlobalParam(worker)", 6, 740 (end_time - start_time).microseconds // 1000) 741 self.common_utils.assert_equal(response['result']['result'], 742 {"type": "number", "unserializableValue": "999", "description": "999"}) 743 ################################################################################################################ 744 # worker thread: Debugger.getPossibleAndSetBreakpointByUrl 745 ################################################################################################################ 746 breakpoints_url = debugger.RemoveBreakpointsUrl(self.config['file_path']['params']) 747 locations = [] 748 for i in range(1, 101): 749 locations.append(debugger.BreakLocationUrl(url=self.config['file_path']['params'], line_number=i)) 750 breakpoints_locations = debugger.SetBreakpointsLocations(locations) 751 for i in range(1000): 752 start_time = datetime.now() 753 await self.debugger_impl.send("Debugger.removeBreakpointsByUrl", worker_thread, breakpoints_url) 754 end_time = datetime.now() 755 self.performance_utils.add_time_data("RemoveBreakpoints(worker)", 6, 756 (end_time - start_time).microseconds // 1000) 757 start_time = datetime.now() 758 await self.debugger_impl.send("Debugger.getPossibleAndSetBreakpointsByUrl", worker_thread, 759 breakpoints_locations) 760 end_time = datetime.now() 761 self.performance_utils.add_time_data("SetManyBreakpoints(worker)", 50, 762 (end_time - start_time).microseconds // 1000) 763 ################################################################################################################ 764 # worker thread: Debugger.removeBreakpointsByUrl 765 ################################################################################################################ 766 params = debugger.RemoveBreakpointsUrl(self.config['file_path']['params']) 767 await self.debugger_impl.send("Debugger.removeBreakpointsByUrl", worker_thread, params) 768 ################################################################################################################ 769 # main thread: Debugger.removeSymbolicBreakpoints 770 ################################################################################################################ 771 symbolicBreakpoints = [debugger.SymbolicBreakpoint(functionName='testDebug')] 772 for i in range(1, 51): 773 symbolicBreakpoints.append(debugger.SymbolicBreakpoint(functionName='testDebug' + str(i))) 774 params = debugger.SymbolicBreakpoints(symbolicBreakpoints) 775 start_time = datetime.now() 776 await self.debugger_impl.send("Debugger.removeSymbolicBreakpoints", worker_thread, params) 777 end_time = datetime.now() 778 self.performance_utils.add_time_data("RemoveSymbolicBreakpoints", 10, 779 (end_time - start_time).microseconds // 1000) 780 for i in range(999): 781 start_time = datetime.now() 782 await self.debugger_impl.send("Debugger.SetSymbolicBreakpoints", worker_thread, params) 783 end_time = datetime.now() 784 self.performance_utils.add_time_data("setSymbolicBreakpoints", 10, 785 (end_time - start_time).microseconds // 1000) 786 start_time = datetime.now() 787 await self.debugger_impl.send("Debugger.removeSymbolicBreakpoints", worker_thread, params) 788 end_time = datetime.now() 789 self.performance_utils.add_time_data("RemoveSymbolicBreakpoints", 10, 790 (end_time - start_time).microseconds // 1000) 791 ################################################################################################################ 792 # worker thread: Debugger.resume 793 ################################################################################################################ 794 await self.debugger_impl.send("Debugger.resume", worker_thread) 795 ################################################################################################################ 796 # worker thread: Debugger.disable 797 ################################################################################################################ 798 await self.debugger_impl.send("Debugger.disable", worker_thread) 799 ################################################################################################################ 800 # main thread: Debugger.disable 801 ################################################################################################################ 802 await self.debugger_impl.send("Debugger.disable", main_thread) 803 ################################################################################################################ 804 # close the websocket connections 805 ################################################################################################################ 806 await websocket.send_msg_to_debugger_server(worker_thread.instance_id, worker_thread.send_msg_queue, 'close') 807 await websocket.send_msg_to_debugger_server(main_thread.instance_id, main_thread.send_msg_queue, 'close') 808 await websocket.send_msg_to_connect_server('close') 809 ################################################################################################################