• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef AW_CXX_HWEXT_PERF_H_
17 #define AW_CXX_HWEXT_PERF_H_
18 
19 #include <iosfwd>
20 
21 #include <string>
22 #include <list>
23 #include <map>
24 #include <ctime>
25 #include <gtest/gtest.h>
26 
27 namespace OHOS {
28 namespace TestAW {
29 
30 #define PERF_BASELINE_CONFIG_PATH    "/data/test/baseline.xml"
31 
32 // Common Function
33 struct BaseLineItem {
34     std::string testcasename;
35     double baseline;
36     double lastvalue;
37     double floatrange;
BaseLineItemBaseLineItem38     BaseLineItem()
39     {
40         testcasename = "";
41         baseline = 0;
42         lastvalue = 0;
43         floatrange = 0;
44     }
45 };
46 
47 struct BaselineConfig {
48     std::string date;
49     std::string url;
50     std::list<std::map<std::string, std::string>> items;
51 };
52 
53 // BaseLineManager
54 class BaseLineManager {
55 public:
56     BaseLineManager();
57     explicit BaseLineManager(const std::string path);
58     ~BaseLineManager();
59 
60     bool LoadConfig(const std::string path);
61     bool IsNoBaseline();
62     bool GetExtraValueDouble(const std::string testcaseName, const std::string extra, double &value);
63 
64 private:
65     bool ReadXmlFile(std::string path);
66     double StrtoDouble(const std::string &str);
67 
68 private:
69     BaselineConfig m_bastCfg;
70     bool m_bNoBaseline;
71 };
72 
73 // should be defined in GTEST testcase function.
74 class GtestPerfTestCase {
75 private:
76     GtestPerfTestCase() = delete;
77 public:
78     GtestPerfTestCase(BaseLineManager* pManager, testing::Test *tester,
79         int caseVersion,
80         std::string testClassName = "",
81         std::string testInterfaceName = "");
82 
~GtestPerfTestCase()83     ~GtestPerfTestCase() {}
84 
85     // expect result is larger than or equal baseline*(1.0-float_range).
86     bool ExpectLarger(double testValue);
87 
88     // expect result is smaller than or equal baseline*(1.0-float_range).
89     bool ExpectSmaller(double testValue);
90 
91     // specific baseline name (test case name).
92     bool SetBaseLine(std::string testcaseName);
93 
94     // ==================  extra APIs for advanced usage   ==================
95     // get test case name.
GetCaseName()96     std::string GetCaseName()
97     {
98         return m_strCaseName;
99     };
100 
101     // get baseline value.
HasBaseLine()102     bool HasBaseLine()
103     {
104         return m_bHasBaseLine;
105     };
GetBaseLine()106     double GetBaseLine()
107     {
108         return m_dbBaseLine;
109     };
110 
111     // get last test result from remote database
HasLastValue()112     bool HasLastValue()
113     {
114         return m_bHasLastValue;
115     };
GetLastValue()116     double GetLastValue()
117     {
118         return m_dbLastValue;
119     };
120 
121     // get floating range: 0.0 ~ 1.0
HasFloatRange()122     bool HasFloatRange()
123     {
124         return m_bHasFloatRange;
125     };
GetFloatRange()126     double GetFloatRange()
127     {
128         return m_dbFloatRange;
129     };
130 
131     // get test result, valid after ExpectXXX() is called.
132     bool GetTestResult(double *out = nullptr)
133     {
134         if (out != nullptr) {
135             *out = m_dbTestResult;
136         }
137         return m_bTestResult;
138     };
139 
140     // output result to stdout & xml.
141     bool SaveResult(double testValue);
142 
143 private:
144     bool Initialize();
145     void ResetValues();
146     bool UpdateBaseLineName(std::string testcaseName);
147     bool ExpectValue(double testValue, bool isLargerBetter);
148 
149 private:
150     BaseLineManager *m_pManager;
151     testing::Test   *m_pTester;
152     std::string      m_strCaseName;
153     std::string      m_strTestClassName;
154     std::string      m_strTestInterfaceName;
155     int     m_dCaseVersion;
156 
157     bool    m_bHasBaseLine;
158     double  m_dbBaseLine;
159     bool    m_bHasLastValue;
160     double  m_dbLastValue;
161     bool    m_bHasFloatRange;
162     double  m_dbFloatRange; // 0.0~1.0
163 
164     bool    m_bTestResult;
165     double  m_dbTestResult;
166 };
167 } // namespace TestAW
168 } // namespace OHOS
169 
170 #endif // AW_CXX_HWEXT_PERF_H_
171