1a3e0fd82Sopenharmony_ci/*
2a3e0fd82Sopenharmony_ci * Copyright (c) 2020-2022 Huawei Device Co., Ltd.
3a3e0fd82Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4a3e0fd82Sopenharmony_ci * you may not use this file except in compliance with the License.
5a3e0fd82Sopenharmony_ci * You may obtain a copy of the License at
6a3e0fd82Sopenharmony_ci *
7a3e0fd82Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8a3e0fd82Sopenharmony_ci *
9a3e0fd82Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10a3e0fd82Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11a3e0fd82Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12a3e0fd82Sopenharmony_ci * See the License for the specific language governing permissions and
13a3e0fd82Sopenharmony_ci * limitations under the License.
14a3e0fd82Sopenharmony_ci */
15a3e0fd82Sopenharmony_ci
16a3e0fd82Sopenharmony_ci#include "ui_auto_test.h"
17a3e0fd82Sopenharmony_ci
18a3e0fd82Sopenharmony_ci#include <sys/time.h>
19a3e0fd82Sopenharmony_ci#include "auto_test_manager.h"
20a3e0fd82Sopenharmony_ci#include "components/root_view.h"
21a3e0fd82Sopenharmony_ci#include "components/ui_view_group.h"
22a3e0fd82Sopenharmony_ci#include "dfx/event_injector.h"
23a3e0fd82Sopenharmony_ci#include "ui_test_app.h"
24a3e0fd82Sopenharmony_ci#include "ui_test_group.h"
25a3e0fd82Sopenharmony_ci
26a3e0fd82Sopenharmony_cinamespace OHOS {
27a3e0fd82Sopenharmony_ciUIAutoTest::UIAutoTest()
28a3e0fd82Sopenharmony_ci{
29a3e0fd82Sopenharmony_ci}
30a3e0fd82Sopenharmony_ci
31a3e0fd82Sopenharmony_ciUIAutoTest::~UIAutoTest()
32a3e0fd82Sopenharmony_ci{
33a3e0fd82Sopenharmony_ci}
34a3e0fd82Sopenharmony_ci
35a3e0fd82Sopenharmony_civoid UIAutoTest::Reset(std::string testID) const
36a3e0fd82Sopenharmony_ci{
37a3e0fd82Sopenharmony_ci    ResetMainMenu();
38a3e0fd82Sopenharmony_ci    ClickViewById(testID.c_str());
39a3e0fd82Sopenharmony_ci}
40a3e0fd82Sopenharmony_ci
41a3e0fd82Sopenharmony_civoid UIAutoTest::ResetMainMenu() const
42a3e0fd82Sopenharmony_ci{
43a3e0fd82Sopenharmony_ci    while (RootView::GetInstance()->GetChildById(UI_TEST_MAIN_LIST_ID) == nullptr) {
44a3e0fd82Sopenharmony_ci        ClickViewById(UI_TEST_BACK_BUTTON_ID);
45a3e0fd82Sopenharmony_ci    }
46a3e0fd82Sopenharmony_ci}
47a3e0fd82Sopenharmony_ci
48a3e0fd82Sopenharmony_civoid UIAutoTest::EnterSubMenu(const char* id) const
49a3e0fd82Sopenharmony_ci{
50a3e0fd82Sopenharmony_ci    if (id == nullptr) {
51a3e0fd82Sopenharmony_ci        return;
52a3e0fd82Sopenharmony_ci    }
53a3e0fd82Sopenharmony_ci
54a3e0fd82Sopenharmony_ci    UIView* view = RootView::GetInstance()->GetChildById(id);
55a3e0fd82Sopenharmony_ci    if (view == nullptr) {
56a3e0fd82Sopenharmony_ci        UIView* listView = RootView::GetInstance()->GetChildById(UI_TEST_MAIN_LIST_ID);
57a3e0fd82Sopenharmony_ci        if (listView == nullptr) {
58a3e0fd82Sopenharmony_ci            return;
59a3e0fd82Sopenharmony_ci        }
60a3e0fd82Sopenharmony_ci        ListNode<TestCaseInfo>* node = UITestGroup::GetTestCase().Begin();
61a3e0fd82Sopenharmony_ci        while (node != UITestGroup::GetTestCase().End()) {
62a3e0fd82Sopenharmony_ci            if ((node->data_.sliceId != nullptr) && (strcmp(id, node->data_.sliceId) == 0)) {
63a3e0fd82Sopenharmony_ci                UITestGroup::GetTestCase().PushFront(node->data_);
64a3e0fd82Sopenharmony_ci                UITestGroup::GetTestCase().Remove(node);
65a3e0fd82Sopenharmony_ci                break;
66a3e0fd82Sopenharmony_ci            }
67a3e0fd82Sopenharmony_ci            node = node->next_;
68a3e0fd82Sopenharmony_ci        }
69a3e0fd82Sopenharmony_ci        reinterpret_cast<UIList*>(listView)->RefreshList();
70a3e0fd82Sopenharmony_ci        CompareTools::WaitSuspend();
71a3e0fd82Sopenharmony_ci    }
72a3e0fd82Sopenharmony_ci
73a3e0fd82Sopenharmony_ci    ClickViewById(id);
74a3e0fd82Sopenharmony_ci}
75a3e0fd82Sopenharmony_ci
76a3e0fd82Sopenharmony_civoid UIAutoTest::ClickViewById(const char* id) const
77a3e0fd82Sopenharmony_ci{
78a3e0fd82Sopenharmony_ci    if (id == nullptr) {
79a3e0fd82Sopenharmony_ci        return;
80a3e0fd82Sopenharmony_ci    }
81a3e0fd82Sopenharmony_ci    UIView* view = RootView::GetInstance()->GetChildById(id);
82a3e0fd82Sopenharmony_ci    if (view == nullptr) {
83a3e0fd82Sopenharmony_ci        return;
84a3e0fd82Sopenharmony_ci    }
85a3e0fd82Sopenharmony_ci    Point point;
86a3e0fd82Sopenharmony_ci    point.x = view->GetOrigRect().GetX();
87a3e0fd82Sopenharmony_ci    point.y = view->GetOrigRect().GetY();
88a3e0fd82Sopenharmony_ci    EventInjector::GetInstance()->SetClickEvent(point);
89a3e0fd82Sopenharmony_ci    CompareTools::WaitSuspend();
90a3e0fd82Sopenharmony_ci}
91a3e0fd82Sopenharmony_ci
92a3e0fd82Sopenharmony_civoid UIAutoTest::DragViewToHead(const char* id) const
93a3e0fd82Sopenharmony_ci{
94a3e0fd82Sopenharmony_ci    if (id == nullptr) {
95a3e0fd82Sopenharmony_ci        return;
96a3e0fd82Sopenharmony_ci    }
97a3e0fd82Sopenharmony_ci    UIView* view = RootView::GetInstance()->GetChildById(id);
98a3e0fd82Sopenharmony_ci    if (view == nullptr) {
99a3e0fd82Sopenharmony_ci        return;
100a3e0fd82Sopenharmony_ci    }
101a3e0fd82Sopenharmony_ci    Point startPoint;
102a3e0fd82Sopenharmony_ci    startPoint.x = view->GetOrigRect().GetX();
103a3e0fd82Sopenharmony_ci    startPoint.y = view->GetOrigRect().GetY();
104a3e0fd82Sopenharmony_ci
105a3e0fd82Sopenharmony_ci    Point endPoint;
106a3e0fd82Sopenharmony_ci    endPoint.x = 100; // 100 :end point x position;
107a3e0fd82Sopenharmony_ci    endPoint.y = 100; // 100 :end point y position;
108a3e0fd82Sopenharmony_ci    EventInjector::GetInstance()->SetDragEvent(startPoint, endPoint, 100); // 100: drag time
109a3e0fd82Sopenharmony_ci    CompareTools::WaitSuspend();
110a3e0fd82Sopenharmony_ci}
111a3e0fd82Sopenharmony_ci
112a3e0fd82Sopenharmony_civoid UIAutoTest::DrageToView(const char* id, int16_t x, int16_t y) const
113a3e0fd82Sopenharmony_ci{
114a3e0fd82Sopenharmony_ci    if (id == nullptr) {
115a3e0fd82Sopenharmony_ci        return;
116a3e0fd82Sopenharmony_ci    }
117a3e0fd82Sopenharmony_ci    UIView* view = RootView::GetInstance()->GetChildById(id);
118a3e0fd82Sopenharmony_ci    if (view == nullptr) {
119a3e0fd82Sopenharmony_ci        return;
120a3e0fd82Sopenharmony_ci    }
121a3e0fd82Sopenharmony_ci    Point startPoint;
122a3e0fd82Sopenharmony_ci    startPoint.x = view->GetOrigRect().GetX();
123a3e0fd82Sopenharmony_ci    startPoint.y = view->GetOrigRect().GetY();
124a3e0fd82Sopenharmony_ci
125a3e0fd82Sopenharmony_ci    Point endPoint;
126a3e0fd82Sopenharmony_ci    endPoint.x = x;
127a3e0fd82Sopenharmony_ci    endPoint.y = y;
128a3e0fd82Sopenharmony_ci    EventInjector::GetInstance()->SetDragEvent(startPoint, endPoint, 100); // 100: drag time
129a3e0fd82Sopenharmony_ci
130a3e0fd82Sopenharmony_ci    uint16_t waitTime = std::abs((std::abs(x) > std::abs(y) ? x : y) * WAIT_TIME_MUBLITE) + DRAGE_DEFAULT_WAIT_TIME;
131a3e0fd82Sopenharmony_ci    CompareTools::WaitSuspend(waitTime);
132a3e0fd82Sopenharmony_ci}
133a3e0fd82Sopenharmony_ci
134a3e0fd82Sopenharmony_cibool UIAutoTest::CompareByBinary(const char* fileName) const
135a3e0fd82Sopenharmony_ci{
136a3e0fd82Sopenharmony_ci    if (fileName == nullptr) {
137a3e0fd82Sopenharmony_ci        return false;
138a3e0fd82Sopenharmony_ci    }
139a3e0fd82Sopenharmony_ci    char filePath[DEFAULT_FILE_NAME_MAX_LENGTH] = {0};
140a3e0fd82Sopenharmony_ci    CompareTools::StrnCatPath(filePath, DEFAULT_FILE_NAME_MAX_LENGTH, fileName, strlen(fileName));
141a3e0fd82Sopenharmony_ci    if (CompareTools::CheckFileExist(filePath, sizeof(filePath))) {
142a3e0fd82Sopenharmony_ci        return CompareTools::CompareFile(filePath, sizeof(filePath));
143a3e0fd82Sopenharmony_ci    } else {
144a3e0fd82Sopenharmony_ci        return CompareTools::SaveFile(filePath, sizeof(filePath));
145a3e0fd82Sopenharmony_ci    }
146a3e0fd82Sopenharmony_ci}
147a3e0fd82Sopenharmony_ci
148a3e0fd82Sopenharmony_civoid UIAutoTest::RunTest(std::vector<std::shared_ptr<TestMsgInfo>> msgInfo)
149a3e0fd82Sopenharmony_ci{
150a3e0fd82Sopenharmony_ci    printf("UIAutoTest::RunTest----testInfo.size=[%d]\n", msgInfo.size());
151a3e0fd82Sopenharmony_ci    fflush(stdout);
152a3e0fd82Sopenharmony_ci    for (auto it: msgInfo) {
153a3e0fd82Sopenharmony_ci        OnTest(it);
154a3e0fd82Sopenharmony_ci    }
155a3e0fd82Sopenharmony_ci
156a3e0fd82Sopenharmony_ci    AutoTestManager::GetInstance()->SendMsg(C_S_MAIN_ID_TEST_FINISH_INFO);
157a3e0fd82Sopenharmony_ci}
158a3e0fd82Sopenharmony_ci
159a3e0fd82Sopenharmony_civoid UIAutoTest::OnTest(std::shared_ptr<TestMsgInfo> info)
160a3e0fd82Sopenharmony_ci{
161a3e0fd82Sopenharmony_ci    ResetMainMenu();
162a3e0fd82Sopenharmony_ci    OnEnterPage(info->pageNav);
163a3e0fd82Sopenharmony_ci    OnTestBySteps(info->steps, info->className);
164a3e0fd82Sopenharmony_ci}
165a3e0fd82Sopenharmony_ci
166a3e0fd82Sopenharmony_civoid UIAutoTest::OnTestBySteps(std::vector<TestSteps> steps, std::string className)
167a3e0fd82Sopenharmony_ci{
168a3e0fd82Sopenharmony_ci    if (steps.empty()) {
169a3e0fd82Sopenharmony_ci        return;
170a3e0fd82Sopenharmony_ci    }
171a3e0fd82Sopenharmony_ci
172a3e0fd82Sopenharmony_ci    int stepIndex = 0;
173a3e0fd82Sopenharmony_ci    for (auto it: steps) {
174a3e0fd82Sopenharmony_ci        OnTestOneStep(it, className, stepIndex++);
175a3e0fd82Sopenharmony_ci    }
176a3e0fd82Sopenharmony_ci}
177a3e0fd82Sopenharmony_ci
178a3e0fd82Sopenharmony_civoid UIAutoTest::OnTestOneStep(TestSteps step, std::string className, size_t stepIndex)
179a3e0fd82Sopenharmony_ci{
180a3e0fd82Sopenharmony_ci    if (step.eventID == TestEventID::TEST_CLICK_EVENT) {
181a3e0fd82Sopenharmony_ci        ClickViewById(step.viewID.c_str());
182a3e0fd82Sopenharmony_ci    } else if (step.eventID == TestEventID::TEST_MOVE_EVENT) {
183a3e0fd82Sopenharmony_ci        if (step.eventValue.size() < EVENT_VALUE_SIZE_TWO) {
184a3e0fd82Sopenharmony_ci            return;
185a3e0fd82Sopenharmony_ci        }
186a3e0fd82Sopenharmony_ci
187a3e0fd82Sopenharmony_ci        int16_t x = static_cast<int16_t>(step.eventValue[0]);
188a3e0fd82Sopenharmony_ci        int16_t y = static_cast<int16_t>(step.eventValue[1]);
189a3e0fd82Sopenharmony_ci        DrageToView(step.viewID.c_str(), x, y);
190a3e0fd82Sopenharmony_ci    }
191a3e0fd82Sopenharmony_ci
192a3e0fd82Sopenharmony_ci    if (step.saveCheckPoint) {
193a3e0fd82Sopenharmony_ci        OnSaveFile(className, step.viewID, stepIndex);
194a3e0fd82Sopenharmony_ci    }
195a3e0fd82Sopenharmony_ci}
196a3e0fd82Sopenharmony_ci
197a3e0fd82Sopenharmony_civoid UIAutoTest::OnEnterPage(std::vector<std::string> pageNav)
198a3e0fd82Sopenharmony_ci{
199a3e0fd82Sopenharmony_ci    if (pageNav.empty()) {
200a3e0fd82Sopenharmony_ci        return;
201a3e0fd82Sopenharmony_ci    }
202a3e0fd82Sopenharmony_ci
203a3e0fd82Sopenharmony_ci    for (auto it: pageNav) {
204a3e0fd82Sopenharmony_ci        EnterSubMenu(it.c_str());
205a3e0fd82Sopenharmony_ci    }
206a3e0fd82Sopenharmony_ci}
207a3e0fd82Sopenharmony_ci
208a3e0fd82Sopenharmony_civoid UIAutoTest::OnSaveFile(std::string className, std::string viewID, size_t stepIndex)
209a3e0fd82Sopenharmony_ci{
210a3e0fd82Sopenharmony_ci    std::string fileName = className + "@" + viewID + "@" + std::to_string(stepIndex) + ".bmp";
211a3e0fd82Sopenharmony_ci    fileNames_.push_back(fileName);
212a3e0fd82Sopenharmony_ci
213a3e0fd82Sopenharmony_ci    std::string filePath;
214a3e0fd82Sopenharmony_ci    std::shared_ptr<TestConfigInfo> config = AutoTestManager::GetInstance()->GetConfigInfo();
215a3e0fd82Sopenharmony_ci    if (config->testMode == TestMode::TEST_MODE_BASE) {
216a3e0fd82Sopenharmony_ci        filePath =  config->baseDir + fileName;
217a3e0fd82Sopenharmony_ci    } else if (config->testMode == TestMode::TEST_MODE_RUN) {
218a3e0fd82Sopenharmony_ci        filePath =  config->runDir + fileName;
219a3e0fd82Sopenharmony_ci    }
220a3e0fd82Sopenharmony_ci
221a3e0fd82Sopenharmony_ci    printf("OnSaveFile, filePath = %s\n", filePath.c_str());
222a3e0fd82Sopenharmony_ci    fflush(stdout);
223a3e0fd82Sopenharmony_ci    CompareTools::SaveFile(filePath.c_str(), strlen(filePath.c_str()));
224a3e0fd82Sopenharmony_ci}
225a3e0fd82Sopenharmony_ci
226a3e0fd82Sopenharmony_civoid UIAutoTest::TestComplete() const
227a3e0fd82Sopenharmony_ci{
228a3e0fd82Sopenharmony_ci    printf("UIAutoTest::TestComplete");
229a3e0fd82Sopenharmony_ci    fflush(stdout);
230a3e0fd82Sopenharmony_ci    std::shared_ptr<TestConfigInfo> config = AutoTestManager::GetInstance()->GetConfigInfo();
231a3e0fd82Sopenharmony_ci    if (!config) {
232a3e0fd82Sopenharmony_ci        return;
233a3e0fd82Sopenharmony_ci    }
234a3e0fd82Sopenharmony_ci    if (config->testMode != TestMode::TEST_MODE_RUN) {
235a3e0fd82Sopenharmony_ci        return;
236a3e0fd82Sopenharmony_ci    }
237a3e0fd82Sopenharmony_ci
238a3e0fd82Sopenharmony_ci    config->logDir += OnGetSystemTime();
239a3e0fd82Sopenharmony_ci    config->logDir += ".txt";
240a3e0fd82Sopenharmony_ci    printf("UIAutoTest::OnCompareFile--logDir=[%s]\n", config->logDir.c_str());
241a3e0fd82Sopenharmony_ci    fflush(stdout);
242a3e0fd82Sopenharmony_ci    for (auto it: fileNames_) {
243a3e0fd82Sopenharmony_ci        OnCompareFile(it);
244a3e0fd82Sopenharmony_ci    }
245a3e0fd82Sopenharmony_ci}
246a3e0fd82Sopenharmony_ci
247a3e0fd82Sopenharmony_civoid UIAutoTest::OnCompareFile(std::string fileName) const
248a3e0fd82Sopenharmony_ci{
249a3e0fd82Sopenharmony_ci    std::shared_ptr<TestConfigInfo> config = AutoTestManager::GetInstance()->GetConfigInfo();
250a3e0fd82Sopenharmony_ci    if (!config) {
251a3e0fd82Sopenharmony_ci        return;
252a3e0fd82Sopenharmony_ci    }
253a3e0fd82Sopenharmony_ci
254a3e0fd82Sopenharmony_ci    std::string fileBasePath = config->baseDir + fileName;
255a3e0fd82Sopenharmony_ci    std::string fileRunPath = config->runDir + fileName;
256a3e0fd82Sopenharmony_ci
257a3e0fd82Sopenharmony_ci    std::string log;
258a3e0fd82Sopenharmony_ci    if (!CompareTools::CompareFile(fileBasePath.c_str(), fileRunPath.c_str())) {
259a3e0fd82Sopenharmony_ci        printf("UIAutoTest::OnCompareFile----different\n");
260a3e0fd82Sopenharmony_ci        fflush(stdout);
261a3e0fd82Sopenharmony_ci        log = "[FAIL]:[" + fileName + "]\n";
262a3e0fd82Sopenharmony_ci    } else {
263a3e0fd82Sopenharmony_ci        log = "[SUCESS]:[" + fileName + "]\n";
264a3e0fd82Sopenharmony_ci    }
265a3e0fd82Sopenharmony_ci
266a3e0fd82Sopenharmony_ci    CompareTools::SaveResultLog(config->logDir.c_str(), log.c_str(), strlen(log.c_str()));
267a3e0fd82Sopenharmony_ci}
268a3e0fd82Sopenharmony_ci
269a3e0fd82Sopenharmony_cistd::string UIAutoTest::OnGetSystemTime() const
270a3e0fd82Sopenharmony_ci{
271a3e0fd82Sopenharmony_ci    time_t t = time(0);
272a3e0fd82Sopenharmony_ci    char tmp[32] = { 0 };
273a3e0fd82Sopenharmony_ci    strftime(tmp, sizeof(tmp), "%Y-%m-%d-%H-%M-%S", localtime(&t));
274a3e0fd82Sopenharmony_ci
275a3e0fd82Sopenharmony_ci    std::string loctime = tmp;
276a3e0fd82Sopenharmony_ci
277a3e0fd82Sopenharmony_ci    return loctime;
278a3e0fd82Sopenharmony_ci}
279a3e0fd82Sopenharmony_ci} // namespace OHOS
280