13f085823Sopenharmony_ci/* 23f085823Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 33f085823Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 43f085823Sopenharmony_ci * you may not use this file except in compliance with the License. 53f085823Sopenharmony_ci * You may obtain a copy of the License at 63f085823Sopenharmony_ci * 73f085823Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 83f085823Sopenharmony_ci * 93f085823Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 103f085823Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 113f085823Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 123f085823Sopenharmony_ci * See the License for the specific language governing permissions and 133f085823Sopenharmony_ci * limitations under the License. 143f085823Sopenharmony_ci */ 153f085823Sopenharmony_ci 163f085823Sopenharmony_ci#ifndef AW_CXX_HWEXT_PERF_H_ 173f085823Sopenharmony_ci#define AW_CXX_HWEXT_PERF_H_ 183f085823Sopenharmony_ci 193f085823Sopenharmony_ci#include <iosfwd> 203f085823Sopenharmony_ci 213f085823Sopenharmony_ci#include <string> 223f085823Sopenharmony_ci#include <list> 233f085823Sopenharmony_ci#include <map> 243f085823Sopenharmony_ci#include <ctime> 253f085823Sopenharmony_ci#include <gtest/gtest.h> 263f085823Sopenharmony_ci 273f085823Sopenharmony_cinamespace OHOS { 283f085823Sopenharmony_cinamespace TestAW { 293f085823Sopenharmony_ci 303f085823Sopenharmony_ci#define PERF_BASELINE_CONFIG_PATH "/data/test/baseline.xml" 313f085823Sopenharmony_ci 323f085823Sopenharmony_ci// Common Function 333f085823Sopenharmony_cistruct BaseLineItem { 343f085823Sopenharmony_ci std::string testcasename; 353f085823Sopenharmony_ci double baseline; 363f085823Sopenharmony_ci double lastvalue; 373f085823Sopenharmony_ci double floatrange; 383f085823Sopenharmony_ci BaseLineItem() 393f085823Sopenharmony_ci { 403f085823Sopenharmony_ci testcasename = ""; 413f085823Sopenharmony_ci baseline = 0; 423f085823Sopenharmony_ci lastvalue = 0; 433f085823Sopenharmony_ci floatrange = 0; 443f085823Sopenharmony_ci } 453f085823Sopenharmony_ci}; 463f085823Sopenharmony_ci 473f085823Sopenharmony_cistruct BaselineConfig { 483f085823Sopenharmony_ci std::string date; 493f085823Sopenharmony_ci std::string url; 503f085823Sopenharmony_ci std::list<std::map<std::string, std::string>> items; 513f085823Sopenharmony_ci}; 523f085823Sopenharmony_ci 533f085823Sopenharmony_ci// BaseLineManager 543f085823Sopenharmony_ciclass BaseLineManager { 553f085823Sopenharmony_cipublic: 563f085823Sopenharmony_ci BaseLineManager(); 573f085823Sopenharmony_ci explicit BaseLineManager(const std::string path); 583f085823Sopenharmony_ci ~BaseLineManager(); 593f085823Sopenharmony_ci 603f085823Sopenharmony_ci bool LoadConfig(const std::string path); 613f085823Sopenharmony_ci bool IsNoBaseline(); 623f085823Sopenharmony_ci bool GetExtraValueDouble(const std::string testcaseName, const std::string extra, double &value); 633f085823Sopenharmony_ci 643f085823Sopenharmony_ciprivate: 653f085823Sopenharmony_ci bool ReadXmlFile(std::string path); 663f085823Sopenharmony_ci double StrtoDouble(const std::string &str); 673f085823Sopenharmony_ci 683f085823Sopenharmony_ciprivate: 693f085823Sopenharmony_ci BaselineConfig m_bastCfg; 703f085823Sopenharmony_ci bool m_bNoBaseline; 713f085823Sopenharmony_ci}; 723f085823Sopenharmony_ci 733f085823Sopenharmony_ci// should be defined in GTEST testcase function. 743f085823Sopenharmony_ciclass GtestPerfTestCase { 753f085823Sopenharmony_ciprivate: 763f085823Sopenharmony_ci GtestPerfTestCase() = delete; 773f085823Sopenharmony_cipublic: 783f085823Sopenharmony_ci GtestPerfTestCase(BaseLineManager* pManager, testing::Test *tester, 793f085823Sopenharmony_ci int caseVersion, 803f085823Sopenharmony_ci std::string testClassName = "", 813f085823Sopenharmony_ci std::string testInterfaceName = ""); 823f085823Sopenharmony_ci 833f085823Sopenharmony_ci ~GtestPerfTestCase() {} 843f085823Sopenharmony_ci 853f085823Sopenharmony_ci // expect result is larger than or equal baseline*(1.0-float_range). 863f085823Sopenharmony_ci bool ExpectLarger(double testValue); 873f085823Sopenharmony_ci 883f085823Sopenharmony_ci // expect result is smaller than or equal baseline*(1.0-float_range). 893f085823Sopenharmony_ci bool ExpectSmaller(double testValue); 903f085823Sopenharmony_ci 913f085823Sopenharmony_ci // specific baseline name (test case name). 923f085823Sopenharmony_ci bool SetBaseLine(std::string testcaseName); 933f085823Sopenharmony_ci 943f085823Sopenharmony_ci // ================== extra APIs for advanced usage ================== 953f085823Sopenharmony_ci // get test case name. 963f085823Sopenharmony_ci std::string GetCaseName() 973f085823Sopenharmony_ci { 983f085823Sopenharmony_ci return m_strCaseName; 993f085823Sopenharmony_ci }; 1003f085823Sopenharmony_ci 1013f085823Sopenharmony_ci // get baseline value. 1023f085823Sopenharmony_ci bool HasBaseLine() 1033f085823Sopenharmony_ci { 1043f085823Sopenharmony_ci return m_bHasBaseLine; 1053f085823Sopenharmony_ci }; 1063f085823Sopenharmony_ci double GetBaseLine() 1073f085823Sopenharmony_ci { 1083f085823Sopenharmony_ci return m_dbBaseLine; 1093f085823Sopenharmony_ci }; 1103f085823Sopenharmony_ci 1113f085823Sopenharmony_ci // get last test result from remote database 1123f085823Sopenharmony_ci bool HasLastValue() 1133f085823Sopenharmony_ci { 1143f085823Sopenharmony_ci return m_bHasLastValue; 1153f085823Sopenharmony_ci }; 1163f085823Sopenharmony_ci double GetLastValue() 1173f085823Sopenharmony_ci { 1183f085823Sopenharmony_ci return m_dbLastValue; 1193f085823Sopenharmony_ci }; 1203f085823Sopenharmony_ci 1213f085823Sopenharmony_ci // get floating range: 0.0 ~ 1.0 1223f085823Sopenharmony_ci bool HasFloatRange() 1233f085823Sopenharmony_ci { 1243f085823Sopenharmony_ci return m_bHasFloatRange; 1253f085823Sopenharmony_ci }; 1263f085823Sopenharmony_ci double GetFloatRange() 1273f085823Sopenharmony_ci { 1283f085823Sopenharmony_ci return m_dbFloatRange; 1293f085823Sopenharmony_ci }; 1303f085823Sopenharmony_ci 1313f085823Sopenharmony_ci // get test result, valid after ExpectXXX() is called. 1323f085823Sopenharmony_ci bool GetTestResult(double *out = nullptr) 1333f085823Sopenharmony_ci { 1343f085823Sopenharmony_ci if (out != nullptr) { 1353f085823Sopenharmony_ci *out = m_dbTestResult; 1363f085823Sopenharmony_ci } 1373f085823Sopenharmony_ci return m_bTestResult; 1383f085823Sopenharmony_ci }; 1393f085823Sopenharmony_ci 1403f085823Sopenharmony_ci // output result to stdout & xml. 1413f085823Sopenharmony_ci bool SaveResult(double testValue); 1423f085823Sopenharmony_ci 1433f085823Sopenharmony_ciprivate: 1443f085823Sopenharmony_ci bool Initialize(); 1453f085823Sopenharmony_ci void ResetValues(); 1463f085823Sopenharmony_ci bool UpdateBaseLineName(std::string testcaseName); 1473f085823Sopenharmony_ci bool ExpectValue(double testValue, bool isLargerBetter); 1483f085823Sopenharmony_ci 1493f085823Sopenharmony_ciprivate: 1503f085823Sopenharmony_ci BaseLineManager *m_pManager; 1513f085823Sopenharmony_ci testing::Test *m_pTester; 1523f085823Sopenharmony_ci std::string m_strCaseName; 1533f085823Sopenharmony_ci std::string m_strTestClassName; 1543f085823Sopenharmony_ci std::string m_strTestInterfaceName; 1553f085823Sopenharmony_ci int m_dCaseVersion; 1563f085823Sopenharmony_ci 1573f085823Sopenharmony_ci bool m_bHasBaseLine; 1583f085823Sopenharmony_ci double m_dbBaseLine; 1593f085823Sopenharmony_ci bool m_bHasLastValue; 1603f085823Sopenharmony_ci double m_dbLastValue; 1613f085823Sopenharmony_ci bool m_bHasFloatRange; 1623f085823Sopenharmony_ci double m_dbFloatRange; // 0.0~1.0 1633f085823Sopenharmony_ci 1643f085823Sopenharmony_ci bool m_bTestResult; 1653f085823Sopenharmony_ci double m_dbTestResult; 1663f085823Sopenharmony_ci}; 1673f085823Sopenharmony_ci} // namespace TestAW 1683f085823Sopenharmony_ci} // namespace OHOS 1693f085823Sopenharmony_ci 1703f085823Sopenharmony_ci#endif // AW_CXX_HWEXT_PERF_H_ 171