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