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