1a3e0fd82Sopenharmony_ci/* 2a3e0fd82Sopenharmony_ci * Copyright (c) 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 "tcp_socket_manager.h" 17a3e0fd82Sopenharmony_ci 18a3e0fd82Sopenharmony_ci#include <QJsonDocument> 19a3e0fd82Sopenharmony_ci#include <QJsonObject> 20a3e0fd82Sopenharmony_ci#include <QJsonArray> 21a3e0fd82Sopenharmony_ci 22a3e0fd82Sopenharmony_ci#include "auto_test_manager.h" 23a3e0fd82Sopenharmony_ci 24a3e0fd82Sopenharmony_cinamespace OHOS { 25a3e0fd82Sopenharmony_cistatic void StartTest(std::vector<std::shared_ptr<TestMsgInfo>> msgInfo) 26a3e0fd82Sopenharmony_ci{ 27a3e0fd82Sopenharmony_ci AutoTestManager::GetInstance()->StartTest(msgInfo); 28a3e0fd82Sopenharmony_ci} 29a3e0fd82Sopenharmony_ci 30a3e0fd82Sopenharmony_cistatic void DipatchConfigMsg(std::shared_ptr<TestConfigInfo> configInfo) 31a3e0fd82Sopenharmony_ci{ 32a3e0fd82Sopenharmony_ci AutoTestManager::GetInstance()->SetConfigInfo(configInfo); 33a3e0fd82Sopenharmony_ci} 34a3e0fd82Sopenharmony_ci 35a3e0fd82Sopenharmony_cistatic void DispatchComplete() 36a3e0fd82Sopenharmony_ci{ 37a3e0fd82Sopenharmony_ci AutoTestManager::GetInstance()->TestComplete(); 38a3e0fd82Sopenharmony_ci} 39a3e0fd82Sopenharmony_ci 40a3e0fd82Sopenharmony_cistatic void SendTestMsg(size_t mainID) 41a3e0fd82Sopenharmony_ci{ 42a3e0fd82Sopenharmony_ci TcpSocketClientManager::GetInstance()->SendMsg(mainID); 43a3e0fd82Sopenharmony_ci} 44a3e0fd82Sopenharmony_ci 45a3e0fd82Sopenharmony_ciTcpSocketClientManager* TcpSocketClientManager::GetInstance() 46a3e0fd82Sopenharmony_ci{ 47a3e0fd82Sopenharmony_ci static TcpSocketClientManager instance; 48a3e0fd82Sopenharmony_ci return &instance; 49a3e0fd82Sopenharmony_ci} 50a3e0fd82Sopenharmony_ci 51a3e0fd82Sopenharmony_ciTcpSocketClientManager::~TcpSocketClientManager() 52a3e0fd82Sopenharmony_ci{ 53a3e0fd82Sopenharmony_ci if (tcpSocket_) { 54a3e0fd82Sopenharmony_ci delete tcpSocket_; 55a3e0fd82Sopenharmony_ci } 56a3e0fd82Sopenharmony_ci} 57a3e0fd82Sopenharmony_ci 58a3e0fd82Sopenharmony_civoid TcpSocketClientManager::InitSocket() 59a3e0fd82Sopenharmony_ci{ 60a3e0fd82Sopenharmony_ci if (tcpSocket_ == nullptr) { 61a3e0fd82Sopenharmony_ci tcpSocket_ = new TcpScoketClient(); 62a3e0fd82Sopenharmony_ci } 63a3e0fd82Sopenharmony_ci 64a3e0fd82Sopenharmony_ci tcpSocket_->CreateTCPScoket(); 65a3e0fd82Sopenharmony_ci tcpSocket_->SetScoketManager(GetInstance()); 66a3e0fd82Sopenharmony_ci 67a3e0fd82Sopenharmony_ci ConnectSocket(); 68a3e0fd82Sopenharmony_ci 69a3e0fd82Sopenharmony_ci SetDispatchFuncCallBack(std::bind(StartTest, std::placeholders::_1)); 70a3e0fd82Sopenharmony_ci SetDispatchConfigFuncCallBack(std::bind(DipatchConfigMsg, std::placeholders::_1)); 71a3e0fd82Sopenharmony_ci SetDispatchCompleteFuncCallBack(std::bind(DispatchComplete)); 72a3e0fd82Sopenharmony_ci AutoTestManager::GetInstance()->SetSendMsgFuncCallBack(std::bind(SendTestMsg, std::placeholders::_1)); 73a3e0fd82Sopenharmony_ci} 74a3e0fd82Sopenharmony_ci 75a3e0fd82Sopenharmony_civoid TcpSocketClientManager::ConnectSocket() 76a3e0fd82Sopenharmony_ci{ 77a3e0fd82Sopenharmony_ci if (tcpSocket_ == nullptr) { 78a3e0fd82Sopenharmony_ci return; 79a3e0fd82Sopenharmony_ci } 80a3e0fd82Sopenharmony_ci 81a3e0fd82Sopenharmony_ci tcpSocket_->ConnectSocket(); 82a3e0fd82Sopenharmony_ci} 83a3e0fd82Sopenharmony_ci 84a3e0fd82Sopenharmony_civoid TcpSocketClientManager::OnGetEventValue(QJsonArray array, std::vector<int>& values) 85a3e0fd82Sopenharmony_ci{ 86a3e0fd82Sopenharmony_ci foreach (auto it, array) { 87a3e0fd82Sopenharmony_ci values.push_back(it.toInt()); 88a3e0fd82Sopenharmony_ci } 89a3e0fd82Sopenharmony_ci} 90a3e0fd82Sopenharmony_ci 91a3e0fd82Sopenharmony_civoid TcpSocketClientManager::OnGetPageNav(QJsonArray array, std::vector<std::string>& pageNav) 92a3e0fd82Sopenharmony_ci{ 93a3e0fd82Sopenharmony_ci foreach (auto it, array) { 94a3e0fd82Sopenharmony_ci pageNav.push_back(it.toString().toStdString()); 95a3e0fd82Sopenharmony_ci } 96a3e0fd82Sopenharmony_ci} 97a3e0fd82Sopenharmony_ci 98a3e0fd82Sopenharmony_civoid TcpSocketClientManager::OnGetTestSetps(QJsonArray array, std::vector<TestSteps>& steps) 99a3e0fd82Sopenharmony_ci{ 100a3e0fd82Sopenharmony_ci foreach (auto it, array) { 101a3e0fd82Sopenharmony_ci TestSteps testSteps; 102a3e0fd82Sopenharmony_ci QJsonObject arrobj = it.toObject(); 103a3e0fd82Sopenharmony_ci if (arrobj.contains(JSON_VALUE_VIEW_ID.c_str())) { 104a3e0fd82Sopenharmony_ci testSteps.viewID = arrobj.value(JSON_VALUE_VIEW_ID.c_str()).toString().toStdString(); 105a3e0fd82Sopenharmony_ci } 106a3e0fd82Sopenharmony_ci if (arrobj.contains(JSON_VALUE_EVENT_ID.c_str())) { 107a3e0fd82Sopenharmony_ci testSteps.eventID = static_cast<TestEventID>(arrobj.value(JSON_VALUE_EVENT_ID.c_str()).toInt()); 108a3e0fd82Sopenharmony_ci } 109a3e0fd82Sopenharmony_ci if (arrobj.contains(JSON_VALUE_EVENT_VALUE.c_str())) { 110a3e0fd82Sopenharmony_ci QJsonValue arrays_value = arrobj.take(JSON_VALUE_EVENT_VALUE.c_str()); 111a3e0fd82Sopenharmony_ci if (arrays_value.isArray()) { 112a3e0fd82Sopenharmony_ci QJsonArray localArray = arrays_value.toArray(); 113a3e0fd82Sopenharmony_ci OnGetEventValue(localArray, testSteps.eventValue); 114a3e0fd82Sopenharmony_ci } 115a3e0fd82Sopenharmony_ci } 116a3e0fd82Sopenharmony_ci if (arrobj.contains(JSON_VALUE_SAVE_CHECK_POINT.c_str())) { 117a3e0fd82Sopenharmony_ci testSteps.saveCheckPoint = static_cast<bool>( 118a3e0fd82Sopenharmony_ci arrobj.value(JSON_VALUE_SAVE_CHECK_POINT.c_str()).toBool()); 119a3e0fd82Sopenharmony_ci } 120a3e0fd82Sopenharmony_ci steps.push_back(testSteps); 121a3e0fd82Sopenharmony_ci } 122a3e0fd82Sopenharmony_ci} 123a3e0fd82Sopenharmony_ci 124a3e0fd82Sopenharmony_civoid TcpSocketClientManager::RecvMsg(QByteArray recv) 125a3e0fd82Sopenharmony_ci{ 126a3e0fd82Sopenharmony_ci std::shared_ptr<QByteArray> recvmsg = std::make_shared<QByteArray>(recv); 127a3e0fd82Sopenharmony_ci QMutexLocker mutexLocker(&mutex_); 128a3e0fd82Sopenharmony_ci recv_.push_back(recvmsg); 129a3e0fd82Sopenharmony_ci} 130a3e0fd82Sopenharmony_ci 131a3e0fd82Sopenharmony_civoid TcpSocketClientManager::OnGetMsgInfo(const std::shared_ptr<QByteArray> recv) 132a3e0fd82Sopenharmony_ci{ 133a3e0fd82Sopenharmony_ci QJsonParseError parseError; 134a3e0fd82Sopenharmony_ci QJsonDocument document = QJsonDocument::fromJson(recv->toStdString().data(), &parseError); 135a3e0fd82Sopenharmony_ci if (parseError.error != QJsonParseError::NoError) { 136a3e0fd82Sopenharmony_ci return; 137a3e0fd82Sopenharmony_ci } 138a3e0fd82Sopenharmony_ci 139a3e0fd82Sopenharmony_ci QJsonObject object; 140a3e0fd82Sopenharmony_ci if (document.isObject()) { 141a3e0fd82Sopenharmony_ci object = document.object(); 142a3e0fd82Sopenharmony_ci } 143a3e0fd82Sopenharmony_ci 144a3e0fd82Sopenharmony_ci size_t mainID = 0; 145a3e0fd82Sopenharmony_ci if (object.contains(JSON_VALUE_MAIN_ID.c_str())) { 146a3e0fd82Sopenharmony_ci mainID = static_cast<size_t>(object.value(JSON_VALUE_MAIN_ID.c_str()).toInt()); 147a3e0fd82Sopenharmony_ci } 148a3e0fd82Sopenharmony_ci 149a3e0fd82Sopenharmony_ci printf("OnGetMsgInfo------mainID = [%zu]\n", mainID); 150a3e0fd82Sopenharmony_ci fflush(stdout); 151a3e0fd82Sopenharmony_ci switch (mainID) { 152a3e0fd82Sopenharmony_ci case S_C_MAIN_ID_SEND_CONFIG_INFO: 153a3e0fd82Sopenharmony_ci OnGetConfigInfo(object); 154a3e0fd82Sopenharmony_ci break; 155a3e0fd82Sopenharmony_ci case S_C_MAIN_ID_SEND_TEST_INFO: 156a3e0fd82Sopenharmony_ci OnGetTestInfo(object); 157a3e0fd82Sopenharmony_ci break; 158a3e0fd82Sopenharmony_ci case S_C_MAIN_ID_All_TESTS_COMPLETE: 159a3e0fd82Sopenharmony_ci dispatchCompleteFunc_(); 160a3e0fd82Sopenharmony_ci break; 161a3e0fd82Sopenharmony_ci default: 162a3e0fd82Sopenharmony_ci break; 163a3e0fd82Sopenharmony_ci } 164a3e0fd82Sopenharmony_ci} 165a3e0fd82Sopenharmony_ci 166a3e0fd82Sopenharmony_civoid TcpSocketClientManager::OnGetConfigInfo(const QJsonObject object) 167a3e0fd82Sopenharmony_ci{ 168a3e0fd82Sopenharmony_ci if (object.empty()) { 169a3e0fd82Sopenharmony_ci return; 170a3e0fd82Sopenharmony_ci } 171a3e0fd82Sopenharmony_ci 172a3e0fd82Sopenharmony_ci std::shared_ptr<TestConfigInfo> configInfo = std::make_shared<TestConfigInfo>(); 173a3e0fd82Sopenharmony_ci if (object.contains(JOSN_VALUE_TEST_MODE.c_str())) { 174a3e0fd82Sopenharmony_ci configInfo->testMode = static_cast<TestMode>(object.value(JOSN_VALUE_TEST_MODE.c_str()).toInt()); 175a3e0fd82Sopenharmony_ci } 176a3e0fd82Sopenharmony_ci 177a3e0fd82Sopenharmony_ci if (object.contains(JSON_VALUE_BASE_DIR.c_str())) { 178a3e0fd82Sopenharmony_ci configInfo->baseDir = object.value(JSON_VALUE_BASE_DIR.c_str()).toString().toStdString(); 179a3e0fd82Sopenharmony_ci } 180a3e0fd82Sopenharmony_ci 181a3e0fd82Sopenharmony_ci if (object.contains(JSON_VALUE_RUN_DIR.c_str())) { 182a3e0fd82Sopenharmony_ci configInfo->runDir = object.value(JSON_VALUE_RUN_DIR.c_str()).toString().toStdString(); 183a3e0fd82Sopenharmony_ci } 184a3e0fd82Sopenharmony_ci 185a3e0fd82Sopenharmony_ci if (object.contains(JSON_VALUE_LOG_DIR.c_str())) { 186a3e0fd82Sopenharmony_ci configInfo->logDir = object.value(JSON_VALUE_LOG_DIR.c_str()).toString().toStdString(); 187a3e0fd82Sopenharmony_ci } 188a3e0fd82Sopenharmony_ci 189a3e0fd82Sopenharmony_ci dispatchConfigFunc_(configInfo); 190a3e0fd82Sopenharmony_ci} 191a3e0fd82Sopenharmony_ci 192a3e0fd82Sopenharmony_civoid TcpSocketClientManager::OnGetTestInfo(QJsonObject object) 193a3e0fd82Sopenharmony_ci{ 194a3e0fd82Sopenharmony_ci if (object.empty()) { 195a3e0fd82Sopenharmony_ci return; 196a3e0fd82Sopenharmony_ci } 197a3e0fd82Sopenharmony_ci 198a3e0fd82Sopenharmony_ci std::vector<std::shared_ptr<TestMsgInfo>> testMsgInfo; 199a3e0fd82Sopenharmony_ci if (object.contains(JSON_VALUE_TEST_INFO.c_str())) { 200a3e0fd82Sopenharmony_ci QJsonValue arrays_value = object.take(JSON_VALUE_TEST_INFO.c_str()); 201a3e0fd82Sopenharmony_ci if (!arrays_value.isArray()) { 202a3e0fd82Sopenharmony_ci return; 203a3e0fd82Sopenharmony_ci } 204a3e0fd82Sopenharmony_ci 205a3e0fd82Sopenharmony_ci QJsonArray assintArray = arrays_value.toArray(); 206a3e0fd82Sopenharmony_ci foreach(auto it, assintArray) { 207a3e0fd82Sopenharmony_ci std::shared_ptr<TestMsgInfo> msgInfo = std::make_shared<TestMsgInfo>(); 208a3e0fd82Sopenharmony_ci QJsonObject arrobj = it.toObject(); 209a3e0fd82Sopenharmony_ci OnGetTestInfo(arrobj, msgInfo); 210a3e0fd82Sopenharmony_ci testMsgInfo.push_back(msgInfo); 211a3e0fd82Sopenharmony_ci } 212a3e0fd82Sopenharmony_ci } 213a3e0fd82Sopenharmony_ci OnPrintTestInfo(testMsgInfo); 214a3e0fd82Sopenharmony_ci 215a3e0fd82Sopenharmony_ci dispatchFunc_(testMsgInfo); 216a3e0fd82Sopenharmony_ci} 217a3e0fd82Sopenharmony_ci 218a3e0fd82Sopenharmony_civoid TcpSocketClientManager::OnGetTestInfo(QJsonObject arrobj, std::shared_ptr<TestMsgInfo>& msgInfo) 219a3e0fd82Sopenharmony_ci{ 220a3e0fd82Sopenharmony_ci if (arrobj.contains(JSON_VALUE_CLASS_NAME.c_str())) { 221a3e0fd82Sopenharmony_ci msgInfo->className = arrobj.value(JSON_VALUE_CLASS_NAME.c_str()).toString().toStdString(); 222a3e0fd82Sopenharmony_ci } 223a3e0fd82Sopenharmony_ci 224a3e0fd82Sopenharmony_ci if (arrobj.contains(JSON_VALUE_PAGE_NAV.c_str())) { 225a3e0fd82Sopenharmony_ci QJsonValue value = arrobj.take(JSON_VALUE_PAGE_NAV.c_str()); 226a3e0fd82Sopenharmony_ci if (value.isArray()) { 227a3e0fd82Sopenharmony_ci QJsonArray array = value.toArray(); 228a3e0fd82Sopenharmony_ci OnGetPageNav(array, msgInfo->pageNav); 229a3e0fd82Sopenharmony_ci } 230a3e0fd82Sopenharmony_ci } 231a3e0fd82Sopenharmony_ci 232a3e0fd82Sopenharmony_ci if (arrobj.contains(JSON_VALUE_TEST_STEPS.c_str())) { 233a3e0fd82Sopenharmony_ci QJsonValue value = arrobj.take(JSON_VALUE_TEST_STEPS.c_str()); 234a3e0fd82Sopenharmony_ci if (value.isArray()) { 235a3e0fd82Sopenharmony_ci QJsonArray array = value.toArray(); 236a3e0fd82Sopenharmony_ci OnGetTestSetps(array, msgInfo->steps); 237a3e0fd82Sopenharmony_ci } 238a3e0fd82Sopenharmony_ci } 239a3e0fd82Sopenharmony_ci} 240a3e0fd82Sopenharmony_ci 241a3e0fd82Sopenharmony_civoid TcpSocketClientManager::OnPrintTestInfo(const std::vector<std::shared_ptr<TestMsgInfo>> testMsgInfo) const 242a3e0fd82Sopenharmony_ci{ 243a3e0fd82Sopenharmony_ci for (auto it : testMsgInfo) { 244a3e0fd82Sopenharmony_ci printf("TcpSocketClientManager::OnRunRecvMsg()-className=[%s],---\n", it->className.c_str()); 245a3e0fd82Sopenharmony_ci fflush(stdout); 246a3e0fd82Sopenharmony_ci for (auto it2 : it->pageNav) { 247a3e0fd82Sopenharmony_ci printf("pageNav--%s----------", it2.c_str()); 248a3e0fd82Sopenharmony_ci } 249a3e0fd82Sopenharmony_ci printf("\n"); 250a3e0fd82Sopenharmony_ci for (auto it3: it->steps) { 251a3e0fd82Sopenharmony_ci printf("steps---viewID=[%s], eventID=[%d]", it3.viewID.c_str(), it3.eventID); 252a3e0fd82Sopenharmony_ci for (auto it4 : it3.eventValue) { 253a3e0fd82Sopenharmony_ci printf("steps---eventValue=[%d]", it4); 254a3e0fd82Sopenharmony_ci } 255a3e0fd82Sopenharmony_ci printf("steps---saveCheckPoint=[%d]--------\n", it3.saveCheckPoint); 256a3e0fd82Sopenharmony_ci } 257a3e0fd82Sopenharmony_ci } 258a3e0fd82Sopenharmony_ci} 259a3e0fd82Sopenharmony_ci 260a3e0fd82Sopenharmony_civoid TcpSocketClientManager::DispatchMsg() 261a3e0fd82Sopenharmony_ci{ 262a3e0fd82Sopenharmony_ci OnRunRecvMsg(); 263a3e0fd82Sopenharmony_ci} 264a3e0fd82Sopenharmony_ci 265a3e0fd82Sopenharmony_civoid TcpSocketClientManager::SetDispatchFuncCallBack(DispatchFunc dispatchFunc) 266a3e0fd82Sopenharmony_ci{ 267a3e0fd82Sopenharmony_ci dispatchFunc_ = dispatchFunc; 268a3e0fd82Sopenharmony_ci} 269a3e0fd82Sopenharmony_ci 270a3e0fd82Sopenharmony_civoid TcpSocketClientManager::SetDispatchConfigFuncCallBack(DispatchConfigFunc dispatchConfigFunc) 271a3e0fd82Sopenharmony_ci{ 272a3e0fd82Sopenharmony_ci dispatchConfigFunc_ = dispatchConfigFunc; 273a3e0fd82Sopenharmony_ci} 274a3e0fd82Sopenharmony_ci 275a3e0fd82Sopenharmony_civoid TcpSocketClientManager::SetDispatchCompleteFuncCallBack(DispatchCompleteFunc dispatchCompleteFunc) 276a3e0fd82Sopenharmony_ci{ 277a3e0fd82Sopenharmony_ci dispatchCompleteFunc_ = dispatchCompleteFunc; 278a3e0fd82Sopenharmony_ci} 279a3e0fd82Sopenharmony_ci 280a3e0fd82Sopenharmony_civoid TcpSocketClientManager::OnRunRecvMsg() 281a3e0fd82Sopenharmony_ci{ 282a3e0fd82Sopenharmony_ci if (recv_.empty()) { 283a3e0fd82Sopenharmony_ci return; 284a3e0fd82Sopenharmony_ci } 285a3e0fd82Sopenharmony_ci 286a3e0fd82Sopenharmony_ci QMutexLocker mutexLocker(&mutex_); 287a3e0fd82Sopenharmony_ci std::shared_ptr<QByteArray> recv = recv_.front(); 288a3e0fd82Sopenharmony_ci recv_.pop_front(); 289a3e0fd82Sopenharmony_ci 290a3e0fd82Sopenharmony_ci OnGetMsgInfo(recv); 291a3e0fd82Sopenharmony_ci} 292a3e0fd82Sopenharmony_ci} // namespace OHOS 293