• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python3
2# -*- coding: utf-8 -*-
3"""
4Copyright (c) 2024 Huawei Device Co., Ltd.
5Licensed under the Apache License, Version 2.0 (the "License");
6you may not use this file except in compliance with the License.
7You may obtain a copy of the License at
8
9    http://www.apache.org/licenses/LICENSE-2.0
10
11Unless required by applicable law or agreed to in writing, software
12distributed under the License is distributed on an "AS IS" BASIS,
13WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14See the License for the specific language governing permissions and
15limitations under the License.
16
17Description: Scenario test case.
18"""
19
20import logging
21import os
22import time
23
24import pytest
25
26from aw import Application
27from aw import Utils
28from aw import debugger, runtime
29from aw.api import debugger_api, runtime_api
30
31
32@pytest.mark.debug
33@pytest.mark.timeout(60)
34class TestDebug22:
35    """
36    测试用例:单实例Sendable类信息查看
37    测试步骤:
38        1.  连接 connect server 和主线程 debugger server
39        2.  主线程使能 Runtime 和 Debugger
40        3.  主线程运行等待的调试器
41        4.  主线程解析 entry_ability 和 index 文件
42        5.  主线程 Index.ts 文件设置断点
43        6.  主线程 resume 验证是否正确命中断点
44        7.  主线程查询类对象并验证是否携带 Sendable 标签
45        8.  关闭主线程 debugger server 和 connect server 连接
46    测试代码:
47    @Sendable
48    class TestClass {
49      desc: string = "XXXXXXXX";// 自定义设置类成员
50      taskNum: number = XXXXXXXX;
51    get getTaskNum(): number {// 自定义设置类成员方法
52      return this.taskNum;
53    }
54    }
55    const testInstance = new TestClass();
56    let taskNumber = testInstance.getTaskNum;// 实例debug22断点查询处
57    """
58
59    def setup_method(self):
60        logging.info('Start running TestDebug22: setup')
61
62        self.log_path = rf'{os.path.dirname(__file__)}\..\log'
63        self.hilog_file_name = 'test_debug_22.hilog.txt'
64        self.id_generator = Utils.message_id_generator()
65
66        # receive the hilog before the test start
67        Utils.clear_fault_log()
68        self.hilog_process, self.write_thread = Utils.save_hilog(log_path=self.log_path,
69                                                                 file_name=self.hilog_file_name,
70                                                                 debug_on=True)
71
72    def teardown_method(self):
73        Application.uninstall(self.config['bundle_name'])
74
75        # terminate the hilog receive process after the test done
76        time.sleep(3)
77        self.hilog_process.stdout.close()
78        self.hilog_process.terminate()
79        self.hilog_process.wait()
80        self.write_thread.join()
81
82        Utils.save_fault_log(log_path=self.log_path)
83        logging.info('TestDebug22 done')
84
85    def test(self, test_suite_main_instance_02_debug):
86        logging.info('Start running TestDebug22: test')
87        self.config = test_suite_main_instance_02_debug
88        websocket = self.config['websocket']
89        taskpool = self.config['taskpool']
90        pid = self.config['pid']
91        self.debugger_impl = debugger_api.DebuggerImpl(self.id_generator, websocket)
92        self.runtime_impl = runtime_api.RuntimeImpl(self.id_generator, websocket)
93
94        taskpool.submit(websocket.main_task(taskpool, self.procedure, pid))
95        taskpool.await_taskpool()
96        taskpool.task_join()
97        if taskpool.task_exception:
98            raise taskpool.task_exception
99
100    async def procedure(self, websocket):
101        ################################################################################################################
102        # main thread: connect the debugger server
103        ################################################################################################################
104        main_thread = await self.debugger_impl.connect_to_debugger_server(self.config['pid'], True)
105        logging.info(f'Connect to the debugger server of instance: {main_thread.instance_id}')
106        ################################################################################################################
107        # main thread: Runtime.enable
108        ################################################################################################################
109        await self.runtime_impl.send("Runtime.enable", main_thread)
110        ################################################################################################################
111        # main thread: Debugger.enable
112        ################################################################################################################
113        await self.debugger_impl.send("Debugger.enable", main_thread)
114        ################################################################################################################
115        # main thread: Runtime.runIfWaitingForDebugger
116        ################################################################################################################
117        await self.runtime_impl.send("Runtime.runIfWaitingForDebugger", main_thread)
118        ################################################################################################################
119        # main thread: Debugger.scriptParsed
120        ################################################################################################################
121        response = await self.debugger_impl.recv("Debugger.scriptParsed", main_thread)
122        assert response['params']['url'] == self.config['file_path']['entry_ability']
123        assert response['params']['endLine'] == 0
124        ################################################################################################################
125        # main thread: Debugger.paused
126        ################################################################################################################
127        response = await self.debugger_impl.recv("Debugger.paused", main_thread)
128        assert response['params']['callFrames'][0]['url'] == self.config['file_path']['entry_ability']
129        assert response['params']['reason'] == 'Break on start'
130        ################################################################################################################
131        # main thread: Debugger.resume
132        ################################################################################################################
133        await self.debugger_impl.send("Debugger.resume", main_thread)
134        ################################################################################################################
135        # main thread: Debugger.scriptParsed
136        ################################################################################################################
137        response = await self.debugger_impl.recv("Debugger.scriptParsed", main_thread)
138        assert response['params']['url'] == self.config['file_path']['index']
139        assert response['params']['endLine'] == 0
140        ################################################################################################################
141        # main thread: Debugger.paused
142        ################################################################################################################
143        response = await self.debugger_impl.recv("Debugger.paused", main_thread)
144        assert response['params']['callFrames'][0]['url'] == self.config['file_path']['index']
145        assert response['params']['reason'] == 'Break on start'
146        ################################################################################################################
147        # main thread: Debugger.removeBreakpointsByUrl
148        ################################################################################################################
149        params = debugger.RemoveBreakpointsUrl(self.config['file_path']['index'])
150        await self.debugger_impl.send("Debugger.removeBreakpointsByUrl", main_thread, params)
151        ################################################################################################################
152        # main thread: Debugger.getPossibleAndSetBreakpointByUrl
153        ################################################################################################################
154        locations = [debugger.BreakLocationUrl(url=self.config['file_path']['index'], line_number=78)]
155        params = debugger.SetBreakpointsLocations(locations)
156        response = await self.debugger_impl.send("Debugger.getPossibleAndSetBreakpointsByUrl",
157                                                 main_thread, params)
158        assert response['result']['locations'][0]['id'] == 'id:78:0:' + self.config['file_path']['index']
159        ################################################################################################################
160        # main thread: Debugger.resume
161        ################################################################################################################
162        await self.debugger_impl.send("Debugger.resume", main_thread)
163        ################################################################################################################
164        # main thread: Debugger.paused, hit breakpoint
165        ################################################################################################################
166        response = await self.debugger_impl.recv("Debugger.paused", main_thread)
167        assert response['params']['callFrames'][0]['url'] == self.config['file_path']['index']
168        assert response['params']['hitBreakpoints'] == ['id:78:17:' + self.config['file_path']['index']]
169        ################################################################################################################
170        # main thread: Runtime.getProperties and check sendable
171        ################################################################################################################
172        params = debugger.EvaluateOnCallFrameParams('testInstance')
173        response = await self.debugger_impl.send("Debugger.evaluateOnCallFrame", main_thread, params)
174        assert '[Sendable]' in response['result']['result']['description']
175        ################################################################################################################
176        # main thread: Debugger.resume
177        ################################################################################################################
178        await self.debugger_impl.send("Debugger.resume", main_thread)
179        ################################################################################################################
180        # main thread: click on the screen
181        ################################################################################################################
182        Application.click_on_middle()
183        ################################################################################################################
184        # main thread: Debugger.disable
185        ################################################################################################################
186        await self.debugger_impl.send("Debugger.disable", main_thread)
187        ################################################################################################################
188        # close the websocket connections
189        ################################################################################################################
190        await websocket.send_msg_to_debugger_server(main_thread.instance_id, main_thread.send_msg_queue, 'close')
191        await websocket.send_msg_to_connect_server('close')
192        ################################################################################################################