1#!/usr/bin/env python3 2# -*- coding: utf-8 -*- 3""" 4Copyright (c) 2024 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 17Description: Scenario test case. 18""" 19 20import json 21import logging 22import os 23import time 24 25import pytest 26 27from aw import Application 28from aw import Utils 29from aw import communicate_with_debugger_server 30from aw import debugger, runtime 31 32 33@pytest.mark.debug 34@pytest.mark.timeout(30) 35class TestDebug01: 36 """ 37 测试用例:多实例调试_01 38 测试步骤: 39 1. 连接 connect server 40 2. 连接主线程 debugger server 41 3. 主线程文件 Index.ts 设置断点,恢复执行并命中断点 42 4. 连接 worker 线程 debugger server 43 5. 子线程文件 Worker.ts 设置断点 44 6. 主线程 step over,发送消息给子线程,主线程暂停在下一行,子线程命中断点 45 7. 子线程 step over,暂停在下一行,随后 getProperties 46 8. 主线程 step over,暂停在下一行 47 9. 主线程 resume,命中断点 48 10. 主线程 step over,暂停在下一行 49 11. 主线程 resume, 执行结束 50 12. 子线程销毁,对应的 debugger server 连接断开 51 13. 关闭主线程 debugger server 和 connect server 连接 52 """ 53 54 def setup_method(self): 55 logging.info('Start running TestDebug01: setup') 56 57 self.log_path = rf'{os.path.dirname(__file__)}\..\log' 58 self.hilog_file_name = 'test_debug_01.hilog.txt' 59 self.id_generator = Utils.message_id_generator() 60 61 # receive the hilog before the test start 62 Utils.clear_fault_log() 63 self.hilog_process, self.write_thread = Utils.save_hilog(log_path=self.log_path, 64 file_name=self.hilog_file_name, 65 debug_on=True) 66 67 def teardown_method(self): 68 Application.uninstall(self.config['bundle_name']) 69 70 # terminate the hilog receive process after the test done 71 time.sleep(3) 72 self.hilog_process.stdout.close() 73 self.hilog_process.terminate() 74 self.hilog_process.wait() 75 self.write_thread.join() 76 77 Utils.save_fault_log(log_path=self.log_path) 78 logging.info('TestDebug01 done') 79 80 def test(self, test_suite_debug_01): 81 logging.info('Start running TestDebug01: test') 82 self.config = test_suite_debug_01 83 websocket = self.config['websocket'] 84 taskpool = self.config['taskpool'] 85 pid = self.config['pid'] 86 87 taskpool.submit(websocket.main_task(taskpool, websocket, self.procedure, pid)) 88 taskpool.await_taskpool() 89 taskpool.task_join() 90 if taskpool.task_exception: 91 raise taskpool.task_exception 92 93 async def procedure(self, websocket): 94 ################################################################################################################ 95 # main thread: connect the debugger server 96 ################################################################################################################ 97 send_msg = {"type": "connected"} 98 await websocket.send_msg_to_connect_server(send_msg) 99 response = await websocket.recv_msg_of_connect_server() 100 response = json.loads(response) 101 assert response['type'] == 'addInstance' 102 assert response['instanceId'] == 0, logging.error('instance id of the main thread not equal to 0') 103 assert response['tid'] == self.config['pid'] 104 main_thread_instance_id = await websocket.get_instance() 105 main_thread_to_send_queue = websocket.to_send_msg_queues[main_thread_instance_id] 106 main_thread_received_queue = websocket.received_msg_queues[main_thread_instance_id] 107 logging.info(f'Connect to the debugger server of instance: {main_thread_instance_id}') 108 ################################################################################################################ 109 # main thread: runtime.enable 110 ################################################################################################################ 111 message_id = next(self.id_generator) 112 response = await communicate_with_debugger_server(main_thread_instance_id, 113 main_thread_to_send_queue, 114 main_thread_received_queue, 115 runtime.enable(), message_id) 116 assert json.loads(response) == {"id": message_id, "result": {"protocols": []}} 117 118 ################################################################################################################ 119 # main thread: debugger.enable 120 ################################################################################################################ 121 message_id = next(self.id_generator) 122 response = await communicate_with_debugger_server(main_thread_instance_id, 123 main_thread_to_send_queue, 124 main_thread_received_queue, 125 debugger.enable(), message_id) 126 assert json.loads(response) == {"id": message_id, "result": {"debuggerId": "0", 127 "protocols": Utils.get_custom_protocols()}} 128 ################################################################################################################ 129 # main thread: runtime.run_if_waiting_for_debugger 130 ################################################################################################################ 131 message_id = next(self.id_generator) 132 response = await communicate_with_debugger_server(main_thread_instance_id, 133 main_thread_to_send_queue, 134 main_thread_received_queue, 135 runtime.run_if_waiting_for_debugger(), message_id) 136 assert json.loads(response) == {"id": message_id, "result": {}} 137 ################################################################################################################ 138 # main thread: Debugger.scriptParsed 139 ################################################################################################################ 140 response = await websocket.recv_msg_of_debugger_server(main_thread_instance_id, 141 main_thread_received_queue) 142 response = json.loads(response) 143 assert response['method'] == 'Debugger.scriptParsed' 144 assert response['params']['url'] == 'entry|entry|1.0.0|src/main/ets/entryability/EntryAbility.ts' 145 assert response['params']['endLine'] == 0 146 ################################################################################################################ 147 # main thread: Debugger.paused 148 ################################################################################################################ 149 response = await websocket.recv_msg_of_debugger_server(main_thread_instance_id, 150 main_thread_received_queue) 151 response = json.loads(response) 152 assert response['method'] == 'Debugger.paused' 153 assert (response['params']['callFrames'][0]['url'] == 154 'entry|entry|1.0.0|src/main/ets/entryability/EntryAbility.ts') 155 assert response['params']['reason'] == 'Break on start' 156 ################################################################################################################ 157 # main thread: Debugger.resume 158 ################################################################################################################ 159 message_id = next(self.id_generator) 160 response = await communicate_with_debugger_server(main_thread_instance_id, 161 main_thread_to_send_queue, 162 main_thread_received_queue, 163 debugger.resume(), message_id) 164 assert json.loads(response) == {"method": "Debugger.resumed", "params": {}} 165 response = await websocket.recv_msg_of_debugger_server(main_thread_instance_id, 166 main_thread_received_queue) 167 assert json.loads(response) == {"id": message_id, "result": {}} 168 ################################################################################################################ 169 # main thread: Debugger.scriptParsed 170 ################################################################################################################ 171 response = await websocket.recv_msg_of_debugger_server(main_thread_instance_id, 172 main_thread_received_queue) 173 response = json.loads(response) 174 assert response['method'] == 'Debugger.scriptParsed' 175 assert response['params']['url'] == 'entry|entry|1.0.0|src/main/ets/pages/Index.ts' 176 assert response['params']['endLine'] == 0 177 ################################################################################################################ 178 # main thread: Debugger.paused 179 ################################################################################################################ 180 response = await websocket.recv_msg_of_debugger_server(main_thread_instance_id, 181 main_thread_received_queue) 182 response = json.loads(response) 183 assert response['method'] == 'Debugger.paused' 184 assert response['params']['callFrames'][0]['url'] == 'entry|entry|1.0.0|src/main/ets/pages/Index.ts' 185 assert response['params']['reason'] == 'Break on start' 186 ################################################################################################################ 187 # main thread: Debugger.removeBreakpointsByUrl 188 ################################################################################################################ 189 url = 'entry|entry|1.0.0|src/main/ets/pages/Index.ts' 190 message_id = next(self.id_generator) 191 response = await communicate_with_debugger_server(main_thread_instance_id, 192 main_thread_to_send_queue, 193 main_thread_received_queue, 194 debugger.remove_breakpoints_by_url(url), message_id) 195 assert json.loads(response) == {"id": message_id, "result": {}} 196 ################################################################################################################ 197 # main thread: Debugger.getPossibleAndSetBreakpointByUrl 198 ################################################################################################################ 199 message_id = next(self.id_generator) 200 locations = [debugger.BreakLocationUrl(url='entry|entry|1.0.0|src/main/ets/pages/Index.ts', line_number=22), 201 debugger.BreakLocationUrl(url='entry|entry|1.0.0|src/main/ets/pages/Index.ts', line_number=26)] 202 response = await communicate_with_debugger_server(main_thread_instance_id, 203 main_thread_to_send_queue, 204 main_thread_received_queue, 205 debugger.get_possible_and_set_breakpoint_by_url(locations), 206 message_id) 207 response = json.loads(response) 208 assert response['id'] == message_id 209 assert response['result']['locations'][0]['id'] == 'id:22:0:entry|entry|1.0.0|src/main/ets/pages/Index.ts' 210 assert response['result']['locations'][1]['id'] == 'id:26:0:entry|entry|1.0.0|src/main/ets/pages/Index.ts' 211 ################################################################################################################ 212 # main thread: Debugger.resume 213 ################################################################################################################ 214 message_id = next(self.id_generator) 215 response = await communicate_with_debugger_server(main_thread_instance_id, 216 main_thread_to_send_queue, 217 main_thread_received_queue, 218 debugger.resume(), message_id) 219 assert json.loads(response) == {"method": "Debugger.resumed", "params": {}} 220 response = await websocket.recv_msg_of_debugger_server(main_thread_instance_id, main_thread_received_queue) 221 assert json.loads(response) == {"id": message_id, "result": {}} 222 ################################################################################################################ 223 # main thread: Debugger.paused, hit breakpoint 224 ################################################################################################################ 225 response = await websocket.recv_msg_of_debugger_server(main_thread_instance_id, 226 main_thread_received_queue) 227 response = json.loads(response) 228 assert response['method'] == 'Debugger.paused' 229 assert response['params']['callFrames'][0]['url'] == 'entry|entry|1.0.0|src/main/ets/pages/Index.ts' 230 assert response['params']['hitBreakpoints'] == ["id:22:4:entry|entry|1.0.0|src/main/ets/pages/Index.ts"] 231 ################################################################################################################ 232 # worker thread: connect the debugger server 233 ################################################################################################################ 234 response = await websocket.recv_msg_of_connect_server() 235 response = json.loads(response) 236 assert response['type'] == 'addInstance' 237 assert response['instanceId'] != 0 238 assert response['tid'] != self.config['pid'] 239 assert 'workerThread_' in response['name'] 240 worker_instance_id = await websocket.get_instance() 241 worker_thread_to_send_queue = websocket.to_send_msg_queues[worker_instance_id] 242 worker_thread_received_queue = websocket.received_msg_queues[worker_instance_id] 243 logging.info(f'Connect to the debugger server of instance: {worker_instance_id}') 244 ################################################################################################################ 245 # main thread: Runtime.getProperties. 246 ################################################################################################################ 247 message_id = next(self.id_generator) 248 response = await communicate_with_debugger_server(main_thread_instance_id, 249 main_thread_to_send_queue, 250 main_thread_received_queue, 251 runtime.get_properties(object_id='0', 252 own_properties=True, 253 accessor_properties_only=False, 254 generate_preview=True), 255 message_id) 256 response = json.loads(response) 257 assert response['id'] == message_id 258 assert response['result']['result'][0]['name'] == 'newWorker' 259 assert response['result']['result'][0]['value']['type'] == 'function' 260 ################################################################################################################ 261 # worker thread: runtime.enable 262 ################################################################################################################ 263 message_id = next(self.id_generator) 264 response = await communicate_with_debugger_server(worker_instance_id, 265 worker_thread_to_send_queue, 266 worker_thread_received_queue, 267 runtime.enable(), message_id) 268 assert json.loads(response) == {"id": message_id, "result": {"protocols": []}} 269 ################################################################################################################ 270 # worker thread: debugger.enable 271 ################################################################################################################ 272 message_id = next(self.id_generator) 273 response = await communicate_with_debugger_server(worker_instance_id, 274 worker_thread_to_send_queue, 275 worker_thread_received_queue, 276 debugger.enable(), message_id) 277 assert json.loads(response) == {"id": message_id, "result": {"debuggerId": "0", 278 "protocols": Utils.get_custom_protocols()}} 279 ################################################################################################################ 280 # worker thread: runtime.run_if_waiting_for_debugger 281 ################################################################################################################ 282 message_id = next(self.id_generator) 283 response = await communicate_with_debugger_server(worker_instance_id, 284 worker_thread_to_send_queue, 285 worker_thread_received_queue, 286 runtime.run_if_waiting_for_debugger(), message_id) 287 assert json.loads(response) == {"id": message_id, "result": {}} 288 ################################################################################################################ 289 # worker thread: Debugger.scriptParsed 290 ################################################################################################################ 291 response = await websocket.recv_msg_of_debugger_server(worker_instance_id, worker_thread_received_queue) 292 response = json.loads(response) 293 assert response['method'] == 'Debugger.scriptParsed' 294 assert response['params']['url'] == 'entry|entry|1.0.0|src/main/ets/workers/Worker.ts' 295 assert response['params']['endLine'] == 0 296 ################################################################################################################ 297 # worker thread: Debugger.paused 298 ################################################################################################################ 299 response = await websocket.recv_msg_of_debugger_server(worker_instance_id, worker_thread_received_queue) 300 response = json.loads(response) 301 assert response['method'] == 'Debugger.paused' 302 assert response['params']['callFrames'][0]['url'] == 'entry|entry|1.0.0|src/main/ets/workers/Worker.ts' 303 assert response['params']['reason'] == 'Break on start' 304 ################################################################################################################ 305 # worker thread: Debugger.removeBreakpointsByUrl 306 ################################################################################################################ 307 url = 'entry|entry|1.0.0|src/main/ets/workers/Worker.ts' 308 message_id = next(self.id_generator) 309 response = await communicate_with_debugger_server(worker_instance_id, 310 worker_thread_to_send_queue, 311 worker_thread_received_queue, 312 debugger.remove_breakpoints_by_url(url), message_id) 313 assert json.loads(response) == {"id": message_id, "result": {}} 314 ################################################################################################################ 315 # worker thread: Debugger.getPossibleAndSetBreakpointByUrl 316 ################################################################################################################ 317 message_id = next(self.id_generator) 318 locations = [debugger.BreakLocationUrl(url='entry|entry|1.0.0|src/main/ets/workers/Worker.ts', line_number=17), 319 debugger.BreakLocationUrl(url='entry|entry|1.0.0|src/main/ets/workers/Worker.ts', line_number=20)] 320 response = await communicate_with_debugger_server(worker_instance_id, 321 worker_thread_to_send_queue, 322 worker_thread_received_queue, 323 debugger.get_possible_and_set_breakpoint_by_url(locations), 324 message_id) 325 response = json.loads(response) 326 assert response['id'] == message_id 327 assert response['result']['locations'][0]['id'] == 'id:17:0:entry|entry|1.0.0|src/main/ets/workers/Worker.ts' 328 assert response['result']['locations'][1]['id'] == 'id:20:0:entry|entry|1.0.0|src/main/ets/workers/Worker.ts' 329 ################################################################################################################ 330 # worker thread: Debugger.resume 331 ################################################################################################################ 332 message_id = next(self.id_generator) 333 response = await communicate_with_debugger_server(worker_instance_id, 334 worker_thread_to_send_queue, 335 worker_thread_received_queue, 336 debugger.resume(), message_id) 337 assert json.loads(response) == {"method": "Debugger.resumed", "params": {}} 338 response = await websocket.recv_msg_of_debugger_server(worker_instance_id, worker_thread_received_queue) 339 assert json.loads(response) == {"id": message_id, "result": {}} 340 ################################################################################################################ 341 # main thread: step over 342 ################################################################################################################ 343 message_id = next(self.id_generator) 344 response = await communicate_with_debugger_server(main_thread_instance_id, 345 main_thread_to_send_queue, 346 main_thread_received_queue, 347 debugger.step_over(), message_id) 348 assert json.loads(response) == {"method": "Debugger.resumed", "params": {}} 349 response = await websocket.recv_msg_of_debugger_server(main_thread_instance_id, main_thread_received_queue) 350 assert json.loads(response) == {"id": message_id, "result": {}} 351 # main thread: Debugger.paused 352 response = await websocket.recv_msg_of_debugger_server(main_thread_instance_id, main_thread_received_queue) 353 response = json.loads(response) 354 assert response['method'] == 'Debugger.paused' 355 assert response['params']['callFrames'][0]['url'] == 'entry|entry|1.0.0|src/main/ets/pages/Index.ts' 356 assert response['params']['reason'] == 'other' 357 assert response['params']['hitBreakpoints'] == [] 358 # worker thread: Debugger.paused 359 response = await websocket.recv_msg_of_debugger_server(worker_instance_id, worker_thread_received_queue) 360 response = json.loads(response) 361 assert response['method'] == 'Debugger.paused' 362 assert response['params']['callFrames'][0]['url'] == 'entry|entry|1.0.0|src/main/ets/workers/Worker.ts' 363 assert response['params']['reason'] == 'other' 364 assert response['params']['hitBreakpoints'] == ["id:17:8:entry|entry|1.0.0|src/main/ets/workers/Worker.ts"] 365 ################################################################################################################ 366 # worker thread: step over 367 ################################################################################################################ 368 message_id = next(self.id_generator) 369 response = await communicate_with_debugger_server(worker_instance_id, 370 worker_thread_to_send_queue, 371 worker_thread_received_queue, 372 debugger.step_over(), message_id) 373 assert json.loads(response) == {"method": "Debugger.resumed", "params": {}} 374 response = await websocket.recv_msg_of_debugger_server(worker_instance_id, worker_thread_received_queue) 375 assert json.loads(response) == {"id": message_id, "result": {}} 376 # worker thread: Debugger.paused 377 response = await websocket.recv_msg_of_debugger_server(worker_instance_id, worker_thread_received_queue) 378 response = json.loads(response) 379 assert response['method'] == 'Debugger.paused' 380 assert response['params']['callFrames'][0]['url'] == 'entry|entry|1.0.0|src/main/ets/workers/Worker.ts' 381 assert response['params']['reason'] == 'other' 382 assert response['params']['hitBreakpoints'] == [] 383 ################################################################################################################ 384 # worker thread: Runtime.getProperties. 385 ################################################################################################################ 386 message_id = next(self.id_generator) 387 response = await communicate_with_debugger_server(worker_instance_id, 388 worker_thread_to_send_queue, 389 worker_thread_received_queue, 390 runtime.get_properties(object_id='0', 391 own_properties=True, 392 accessor_properties_only=False, 393 generate_preview=True), 394 message_id) 395 response = json.loads(response) 396 assert response['id'] == message_id 397 assert response['result']['result'][0]['name'] == '' 398 assert response['result']['result'][0]['value']['type'] == 'function' 399 assert response['result']['result'][1]['name'] == 'str' 400 assert response['result']['result'][1]['value']['type'] == 'string' 401 assert response['result']['result'][2]['name'] == 'e' 402 assert response['result']['result'][2]['value']['type'] == 'object' 403 ################################################################################################################ 404 # main thread: step over 405 ################################################################################################################ 406 message_id = next(self.id_generator) 407 response = await communicate_with_debugger_server(main_thread_instance_id, 408 main_thread_to_send_queue, 409 main_thread_received_queue, 410 debugger.step_over(), message_id) 411 assert json.loads(response) == {"method": "Debugger.resumed", "params": {}} 412 response = await websocket.recv_msg_of_debugger_server(main_thread_instance_id, main_thread_received_queue) 413 assert json.loads(response) == {"id": message_id, "result": {}} 414 # main thread: Debugger.paused 415 response = await websocket.recv_msg_of_debugger_server(main_thread_instance_id, main_thread_received_queue) 416 response = json.loads(response) 417 assert response['method'] == 'Debugger.paused' 418 assert response['params']['callFrames'][0]['location']['lineNumber'] == 25 419 assert response['params']['callFrames'][0]['url'] == 'entry|entry|1.0.0|src/main/ets/pages/Index.ts' 420 assert response['params']['callFrames'][1]['location']['lineNumber'] == 40 421 assert response['params']['reason'] == 'other' 422 assert response['params']['hitBreakpoints'] == [] 423 ################################################################################################################ 424 # main thread: Debugger.resume 425 ################################################################################################################ 426 message_id = next(self.id_generator) 427 response = await communicate_with_debugger_server(main_thread_instance_id, 428 main_thread_to_send_queue, 429 main_thread_received_queue, 430 debugger.resume(), message_id) 431 assert json.loads(response) == {"method": "Debugger.resumed", "params": {}} 432 response = await websocket.recv_msg_of_debugger_server(main_thread_instance_id, main_thread_received_queue) 433 assert json.loads(response) == {"id": message_id, "result": {}} 434 # main thread: Debugger.paused 435 response = await websocket.recv_msg_of_debugger_server(main_thread_instance_id, main_thread_received_queue) 436 response = json.loads(response) 437 assert response['method'] == 'Debugger.paused' 438 assert response['params']['callFrames'][0]['location']['lineNumber'] == 26 439 assert response['params']['callFrames'][0]['url'] == 'entry|entry|1.0.0|src/main/ets/pages/Index.ts' 440 assert response['params']['reason'] == 'other' 441 assert response['params']['hitBreakpoints'] == ['id:26:8:entry|entry|1.0.0|src/main/ets/pages/Index.ts'] 442 ################################################################################################################ 443 # main thread: step over 444 ################################################################################################################ 445 message_id = next(self.id_generator) 446 response = await communicate_with_debugger_server(main_thread_instance_id, 447 main_thread_to_send_queue, 448 main_thread_received_queue, 449 debugger.step_over(), message_id) 450 assert json.loads(response) == {"method": "Debugger.resumed", "params": {}} 451 response = await websocket.recv_msg_of_debugger_server(main_thread_instance_id, main_thread_received_queue) 452 assert json.loads(response) == {"id": message_id, "result": {}} 453 # main thread: Debugger.paused 454 response = await websocket.recv_msg_of_debugger_server(main_thread_instance_id, main_thread_received_queue) 455 response = json.loads(response) 456 assert response['method'] == 'Debugger.paused' 457 assert response['params']['callFrames'][0]['location']['lineNumber'] == 27 458 assert response['params']['callFrames'][0]['url'] == 'entry|entry|1.0.0|src/main/ets/pages/Index.ts' 459 assert response['params']['reason'] == 'other' 460 assert response['params']['hitBreakpoints'] == [] 461 ################################################################################################################ 462 # main thread: Debugger.resume 463 ################################################################################################################ 464 message_id = next(self.id_generator) 465 response = await communicate_with_debugger_server(main_thread_instance_id, 466 main_thread_to_send_queue, 467 main_thread_received_queue, 468 debugger.resume(), message_id) 469 assert json.loads(response) == {"method": "Debugger.resumed", "params": {}} 470 response = await websocket.recv_msg_of_debugger_server(main_thread_instance_id, main_thread_received_queue) 471 assert json.loads(response) == {"id": message_id, "result": {}} 472 ################################################################################################################ 473 # worker thread: Debugger.disable 474 ################################################################################################################ 475 message_id = next(self.id_generator) 476 response = await communicate_with_debugger_server(worker_instance_id, 477 worker_thread_to_send_queue, 478 worker_thread_received_queue, 479 debugger.disable(), message_id) 480 assert json.loads(response) == {"method": "Debugger.resumed", "params": {}} 481 response = await websocket.recv_msg_of_debugger_server(worker_instance_id, worker_thread_received_queue) 482 assert json.loads(response) == {"id": message_id, "result": {}} 483 ################################################################################################################ 484 # worker thread: destroy instance 485 ################################################################################################################ 486 response = await websocket.recv_msg_of_connect_server() 487 response = json.loads(response) 488 assert response['type'] == 'destroyInstance' 489 assert response['instanceId'] == worker_instance_id 490 ################################################################################################################ 491 # main thread: Debugger.disable 492 ################################################################################################################ 493 message_id = next(self.id_generator) 494 response = await communicate_with_debugger_server(main_thread_instance_id, 495 main_thread_to_send_queue, 496 main_thread_received_queue, 497 debugger.disable(), message_id) 498 assert json.loads(response) == {"method": "Debugger.resumed", "params": {}} 499 response = await websocket.recv_msg_of_debugger_server(main_thread_instance_id, main_thread_received_queue) 500 assert json.loads(response) == {"id": message_id, "result": {}} 501 ################################################################################################################ 502 # close the websocket connections 503 ################################################################################################################ 504 await websocket.send_msg_to_debugger_server(main_thread_instance_id, main_thread_to_send_queue, 'close') 505 await websocket.send_msg_to_connect_server('close') 506 ################################################################################################################ 507