• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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        ################################################################################################################