xref: /aosp_15_r20/external/deqp/framework/common/tcuTestCase.hpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker #ifndef _TCUTESTCASE_HPP
2*35238bceSAndroid Build Coastguard Worker #define _TCUTESTCASE_HPP
3*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program Tester Core
5*35238bceSAndroid Build Coastguard Worker  * ----------------------------------------
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
8*35238bceSAndroid Build Coastguard Worker  *
9*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
10*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
11*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
14*35238bceSAndroid Build Coastguard Worker  *
15*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
16*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
17*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
19*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
20*35238bceSAndroid Build Coastguard Worker  *
21*35238bceSAndroid Build Coastguard Worker  *//*!
22*35238bceSAndroid Build Coastguard Worker  * \file
23*35238bceSAndroid Build Coastguard Worker  * \brief Base class for a test case.
24*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
25*35238bceSAndroid Build Coastguard Worker 
26*35238bceSAndroid Build Coastguard Worker #include "tcuDefs.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "tcuTestContext.hpp"
28*35238bceSAndroid Build Coastguard Worker 
29*35238bceSAndroid Build Coastguard Worker #include <string>
30*35238bceSAndroid Build Coastguard Worker #include <vector>
31*35238bceSAndroid Build Coastguard Worker 
32*35238bceSAndroid Build Coastguard Worker namespace tcu
33*35238bceSAndroid Build Coastguard Worker {
34*35238bceSAndroid Build Coastguard Worker 
35*35238bceSAndroid Build Coastguard Worker enum TestNodeType
36*35238bceSAndroid Build Coastguard Worker {
37*35238bceSAndroid Build Coastguard Worker     NODETYPE_ROOT = 0,      //!< Root for all test packages.
38*35238bceSAndroid Build Coastguard Worker     NODETYPE_PACKAGE,       //!< Test case package -- same as group, but is omitted from XML dump.
39*35238bceSAndroid Build Coastguard Worker     NODETYPE_GROUP,         //!< Test case container -- cannot be executed.
40*35238bceSAndroid Build Coastguard Worker     NODETYPE_SELF_VALIDATE, //!< Self-validating test case -- can be executed
41*35238bceSAndroid Build Coastguard Worker     NODETYPE_PERFORMANCE,   //!< Performace test case -- can be executed
42*35238bceSAndroid Build Coastguard Worker     NODETYPE_CAPABILITY,    //!< Capability score case -- can be executed
43*35238bceSAndroid Build Coastguard Worker     NODETYPE_ACCURACY       //!< Accuracy test case -- can be executed
44*35238bceSAndroid Build Coastguard Worker };
45*35238bceSAndroid Build Coastguard Worker 
46*35238bceSAndroid Build Coastguard Worker enum TestNodeClass
47*35238bceSAndroid Build Coastguard Worker {
48*35238bceSAndroid Build Coastguard Worker     NODECLASS_GROUP = 0,  //!< Root or non-leaf in the test hierarchy tree
49*35238bceSAndroid Build Coastguard Worker     NODECLASS_EXECUTABLE, //!< Non-root leaf in the test hierarchy tree
50*35238bceSAndroid Build Coastguard Worker 
51*35238bceSAndroid Build Coastguard Worker     NODECLASS_LAST
52*35238bceSAndroid Build Coastguard Worker };
53*35238bceSAndroid Build Coastguard Worker 
54*35238bceSAndroid Build Coastguard Worker enum TestRunnerType
55*35238bceSAndroid Build Coastguard Worker {
56*35238bceSAndroid Build Coastguard Worker     RUNNERTYPE_ANY   = 0u,
57*35238bceSAndroid Build Coastguard Worker     RUNNERTYPE_NONE  = (1u << 0),
58*35238bceSAndroid Build Coastguard Worker     RUNNERTYPE_AMBER = (1u << 1)
59*35238bceSAndroid Build Coastguard Worker };
60*35238bceSAndroid Build Coastguard Worker 
getTestNodeTypeClass(TestNodeType type)61*35238bceSAndroid Build Coastguard Worker inline TestNodeClass getTestNodeTypeClass(TestNodeType type)
62*35238bceSAndroid Build Coastguard Worker {
63*35238bceSAndroid Build Coastguard Worker     switch (type)
64*35238bceSAndroid Build Coastguard Worker     {
65*35238bceSAndroid Build Coastguard Worker     case NODETYPE_ROOT:
66*35238bceSAndroid Build Coastguard Worker         return NODECLASS_GROUP;
67*35238bceSAndroid Build Coastguard Worker     case NODETYPE_PACKAGE:
68*35238bceSAndroid Build Coastguard Worker         return NODECLASS_GROUP;
69*35238bceSAndroid Build Coastguard Worker     case NODETYPE_GROUP:
70*35238bceSAndroid Build Coastguard Worker         return NODECLASS_GROUP;
71*35238bceSAndroid Build Coastguard Worker     case NODETYPE_SELF_VALIDATE:
72*35238bceSAndroid Build Coastguard Worker         return NODECLASS_EXECUTABLE;
73*35238bceSAndroid Build Coastguard Worker     case NODETYPE_PERFORMANCE:
74*35238bceSAndroid Build Coastguard Worker         return NODECLASS_EXECUTABLE;
75*35238bceSAndroid Build Coastguard Worker     case NODETYPE_CAPABILITY:
76*35238bceSAndroid Build Coastguard Worker         return NODECLASS_EXECUTABLE;
77*35238bceSAndroid Build Coastguard Worker     case NODETYPE_ACCURACY:
78*35238bceSAndroid Build Coastguard Worker         return NODECLASS_EXECUTABLE;
79*35238bceSAndroid Build Coastguard Worker     default:
80*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
81*35238bceSAndroid Build Coastguard Worker         return NODECLASS_LAST;
82*35238bceSAndroid Build Coastguard Worker     }
83*35238bceSAndroid Build Coastguard Worker }
84*35238bceSAndroid Build Coastguard Worker 
isTestNodeTypeExecutable(TestNodeType type)85*35238bceSAndroid Build Coastguard Worker inline bool isTestNodeTypeExecutable(TestNodeType type)
86*35238bceSAndroid Build Coastguard Worker {
87*35238bceSAndroid Build Coastguard Worker     return getTestNodeTypeClass(type) == NODECLASS_EXECUTABLE;
88*35238bceSAndroid Build Coastguard Worker }
89*35238bceSAndroid Build Coastguard Worker 
isValidTestCaseNameChar(char c)90*35238bceSAndroid Build Coastguard Worker inline bool isValidTestCaseNameChar(char c)
91*35238bceSAndroid Build Coastguard Worker {
92*35238bceSAndroid Build Coastguard Worker     return de::inRange(c, 'a', 'z') || de::inRange(c, 'A', 'Z') || de::inRange(c, '0', '9') || c == '_' || c == '-';
93*35238bceSAndroid Build Coastguard Worker }
94*35238bceSAndroid Build Coastguard Worker 
95*35238bceSAndroid Build Coastguard Worker class TestCaseGroup;
96*35238bceSAndroid Build Coastguard Worker class CaseListFilter;
97*35238bceSAndroid Build Coastguard Worker 
98*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
99*35238bceSAndroid Build Coastguard Worker  * \brief Test case hierarchy node
100*35238bceSAndroid Build Coastguard Worker  *
101*35238bceSAndroid Build Coastguard Worker  * Test node forms the backbone of the test case hierarchy. All objects
102*35238bceSAndroid Build Coastguard Worker  * in the hierarchy are derived from this class.
103*35238bceSAndroid Build Coastguard Worker  *
104*35238bceSAndroid Build Coastguard Worker  * Each test node has a type and all except the root node have name and
105*35238bceSAndroid Build Coastguard Worker  * description. Root and test group nodes have a list of children.
106*35238bceSAndroid Build Coastguard Worker  *
107*35238bceSAndroid Build Coastguard Worker  * During test execution TestExecutor iterates the hierarchy. Upon entering
108*35238bceSAndroid Build Coastguard Worker  * the node (both groups and test cases) init() is called. When exiting the
109*35238bceSAndroid Build Coastguard Worker  * node deinit() is called respectively.
110*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
111*35238bceSAndroid Build Coastguard Worker class TestNode
112*35238bceSAndroid Build Coastguard Worker {
113*35238bceSAndroid Build Coastguard Worker public:
114*35238bceSAndroid Build Coastguard Worker     enum IterateResult
115*35238bceSAndroid Build Coastguard Worker     {
116*35238bceSAndroid Build Coastguard Worker         STOP     = 0,
117*35238bceSAndroid Build Coastguard Worker         CONTINUE = 1
118*35238bceSAndroid Build Coastguard Worker     };
119*35238bceSAndroid Build Coastguard Worker 
120*35238bceSAndroid Build Coastguard Worker     // Methods.
121*35238bceSAndroid Build Coastguard Worker     TestNode(TestContext &testCtx, TestNodeType nodeType, const char *name);
122*35238bceSAndroid Build Coastguard Worker     TestNode(TestContext &testCtx, TestNodeType nodeType, const char *name, const std::vector<TestNode *> &children);
123*35238bceSAndroid Build Coastguard Worker     virtual ~TestNode(void);
124*35238bceSAndroid Build Coastguard Worker 
getNodeType(void) const125*35238bceSAndroid Build Coastguard Worker     TestNodeType getNodeType(void) const
126*35238bceSAndroid Build Coastguard Worker     {
127*35238bceSAndroid Build Coastguard Worker         return m_nodeType;
128*35238bceSAndroid Build Coastguard Worker     }
getTestContext(void) const129*35238bceSAndroid Build Coastguard Worker     TestContext &getTestContext(void) const
130*35238bceSAndroid Build Coastguard Worker     {
131*35238bceSAndroid Build Coastguard Worker         return m_testCtx;
132*35238bceSAndroid Build Coastguard Worker     }
getName(void) const133*35238bceSAndroid Build Coastguard Worker     const char *getName(void) const
134*35238bceSAndroid Build Coastguard Worker     {
135*35238bceSAndroid Build Coastguard Worker         return m_name.c_str();
136*35238bceSAndroid Build Coastguard Worker     }
137*35238bceSAndroid Build Coastguard Worker     void getChildren(std::vector<TestNode *> &children) const;
138*35238bceSAndroid Build Coastguard Worker     void addRootChild(const std::string &groupName, const CaseListFilter *caseListFilter,
139*35238bceSAndroid Build Coastguard Worker                       TestCaseGroup *(*createTestGroup)(tcu::TestContext &testCtx, const std::string &name));
140*35238bceSAndroid Build Coastguard Worker     void addChild(TestNode *node);
empty() const141*35238bceSAndroid Build Coastguard Worker     bool empty() const
142*35238bceSAndroid Build Coastguard Worker     {
143*35238bceSAndroid Build Coastguard Worker         return m_children.empty();
144*35238bceSAndroid Build Coastguard Worker     }
145*35238bceSAndroid Build Coastguard Worker 
146*35238bceSAndroid Build Coastguard Worker     virtual void init(void);
147*35238bceSAndroid Build Coastguard Worker     virtual void deinit(void);
148*35238bceSAndroid Build Coastguard Worker     virtual IterateResult iterate(void) = 0;
getRunnerType(void) const149*35238bceSAndroid Build Coastguard Worker     virtual TestRunnerType getRunnerType(void) const
150*35238bceSAndroid Build Coastguard Worker     {
151*35238bceSAndroid Build Coastguard Worker         return RUNNERTYPE_NONE;
152*35238bceSAndroid Build Coastguard Worker     }
validateRequirements()153*35238bceSAndroid Build Coastguard Worker     virtual bool validateRequirements()
154*35238bceSAndroid Build Coastguard Worker     {
155*35238bceSAndroid Build Coastguard Worker         return true;
156*35238bceSAndroid Build Coastguard Worker     }
157*35238bceSAndroid Build Coastguard Worker 
158*35238bceSAndroid Build Coastguard Worker protected:
159*35238bceSAndroid Build Coastguard Worker     TestContext &m_testCtx;
160*35238bceSAndroid Build Coastguard Worker     std::string m_name;
161*35238bceSAndroid Build Coastguard Worker 
162*35238bceSAndroid Build Coastguard Worker private:
163*35238bceSAndroid Build Coastguard Worker     const TestNodeType m_nodeType;
164*35238bceSAndroid Build Coastguard Worker     std::vector<TestNode *> m_children;
165*35238bceSAndroid Build Coastguard Worker };
166*35238bceSAndroid Build Coastguard Worker 
167*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
168*35238bceSAndroid Build Coastguard Worker  * \brief Test case group node
169*35238bceSAndroid Build Coastguard Worker  *
170*35238bceSAndroid Build Coastguard Worker  * Test case group implementations must inherit this class. To save resources
171*35238bceSAndroid Build Coastguard Worker  * during test execution the group must delay creation of any child groups
172*35238bceSAndroid Build Coastguard Worker  * until init() is called.
173*35238bceSAndroid Build Coastguard Worker  *
174*35238bceSAndroid Build Coastguard Worker  * Default deinit() for test group will destroy all child nodes.
175*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
176*35238bceSAndroid Build Coastguard Worker class TestCaseGroup : public TestNode
177*35238bceSAndroid Build Coastguard Worker {
178*35238bceSAndroid Build Coastguard Worker public:
179*35238bceSAndroid Build Coastguard Worker     TestCaseGroup(TestContext &testCtx, const char *name);
180*35238bceSAndroid Build Coastguard Worker     TestCaseGroup(TestContext &testCtx, const char *name, const std::vector<TestNode *> &children);
181*35238bceSAndroid Build Coastguard Worker 
182*35238bceSAndroid Build Coastguard Worker     // Deprecated constructors
183*35238bceSAndroid Build Coastguard Worker     TestCaseGroup(TestContext &testCtx, const char *name, const char *description);
184*35238bceSAndroid Build Coastguard Worker     TestCaseGroup(TestContext &testCtx, const char *name, const char *description,
185*35238bceSAndroid Build Coastguard Worker                   const std::vector<TestNode *> &children);
186*35238bceSAndroid Build Coastguard Worker 
187*35238bceSAndroid Build Coastguard Worker     virtual ~TestCaseGroup(void);
188*35238bceSAndroid Build Coastguard Worker 
189*35238bceSAndroid Build Coastguard Worker     virtual IterateResult iterate(void);
190*35238bceSAndroid Build Coastguard Worker };
191*35238bceSAndroid Build Coastguard Worker 
192*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
193*35238bceSAndroid Build Coastguard Worker  * \brief Test case class
194*35238bceSAndroid Build Coastguard Worker  *
195*35238bceSAndroid Build Coastguard Worker  * Test case implementations must inherit this class.
196*35238bceSAndroid Build Coastguard Worker  *
197*35238bceSAndroid Build Coastguard Worker  * Test case objects are usually constructed when TestExecutor enters parent
198*35238bceSAndroid Build Coastguard Worker  * group. Allocating any non-parameter resources, especially target API objects
199*35238bceSAndroid Build Coastguard Worker  * must be delayed to init().
200*35238bceSAndroid Build Coastguard Worker  *
201*35238bceSAndroid Build Coastguard Worker  * Upon entering the test case TestExecutor calls init(). If initialization
202*35238bceSAndroid Build Coastguard Worker  * is successful (no exception is thrown) the executor will then call iterate()
203*35238bceSAndroid Build Coastguard Worker  * until test case returns STOP. After that deinit() will be called.
204*35238bceSAndroid Build Coastguard Worker  *
205*35238bceSAndroid Build Coastguard Worker  * Before exiting the execution phase (i.e. at returning STOP from iterate())
206*35238bceSAndroid Build Coastguard Worker  * the test case must set valid status code to test context (m_testCtx).
207*35238bceSAndroid Build Coastguard Worker  *
208*35238bceSAndroid Build Coastguard Worker  * Test case can also signal error condition by throwing an exception. In
209*35238bceSAndroid Build Coastguard Worker  * that case the framework will set result code and details based on the
210*35238bceSAndroid Build Coastguard Worker  * exception.
211*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
212*35238bceSAndroid Build Coastguard Worker class TestCase : public TestNode
213*35238bceSAndroid Build Coastguard Worker {
214*35238bceSAndroid Build Coastguard Worker public:
215*35238bceSAndroid Build Coastguard Worker     TestCase(TestContext &testCtx, const char *name);
216*35238bceSAndroid Build Coastguard Worker     TestCase(TestContext &testCtx, TestNodeType nodeType, const char *name);
217*35238bceSAndroid Build Coastguard Worker 
218*35238bceSAndroid Build Coastguard Worker     // Deprecated constructors
219*35238bceSAndroid Build Coastguard Worker     TestCase(TestContext &testCtx, const char *name, const char *description);
220*35238bceSAndroid Build Coastguard Worker     TestCase(TestContext &testCtx, TestNodeType nodeType, const char *name, const char *description);
221*35238bceSAndroid Build Coastguard Worker 
222*35238bceSAndroid Build Coastguard Worker     virtual ~TestCase(void);
223*35238bceSAndroid Build Coastguard Worker };
224*35238bceSAndroid Build Coastguard Worker 
225*35238bceSAndroid Build Coastguard Worker class TestStatus
226*35238bceSAndroid Build Coastguard Worker {
227*35238bceSAndroid Build Coastguard Worker public:
TestStatus(qpTestResult code,const std::string & description)228*35238bceSAndroid Build Coastguard Worker     TestStatus(qpTestResult code, const std::string &description) : m_code(code), m_description(description)
229*35238bceSAndroid Build Coastguard Worker     {
230*35238bceSAndroid Build Coastguard Worker     }
231*35238bceSAndroid Build Coastguard Worker 
isComplete(void) const232*35238bceSAndroid Build Coastguard Worker     bool isComplete(void) const
233*35238bceSAndroid Build Coastguard Worker     {
234*35238bceSAndroid Build Coastguard Worker         return m_code != QP_TEST_RESULT_LAST;
235*35238bceSAndroid Build Coastguard Worker     }
isFail(void) const236*35238bceSAndroid Build Coastguard Worker     bool isFail(void) const
237*35238bceSAndroid Build Coastguard Worker     {
238*35238bceSAndroid Build Coastguard Worker         return m_code == QP_TEST_RESULT_FAIL;
239*35238bceSAndroid Build Coastguard Worker     }
getCode(void) const240*35238bceSAndroid Build Coastguard Worker     qpTestResult getCode(void) const
241*35238bceSAndroid Build Coastguard Worker     {
242*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(isComplete());
243*35238bceSAndroid Build Coastguard Worker         return m_code;
244*35238bceSAndroid Build Coastguard Worker     }
getDescription(void) const245*35238bceSAndroid Build Coastguard Worker     const std::string &getDescription(void) const
246*35238bceSAndroid Build Coastguard Worker     {
247*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(isComplete());
248*35238bceSAndroid Build Coastguard Worker         return m_description;
249*35238bceSAndroid Build Coastguard Worker     }
250*35238bceSAndroid Build Coastguard Worker 
pass(const std::string & description)251*35238bceSAndroid Build Coastguard Worker     static TestStatus pass(const std::string &description)
252*35238bceSAndroid Build Coastguard Worker     {
253*35238bceSAndroid Build Coastguard Worker         return TestStatus(QP_TEST_RESULT_PASS, description);
254*35238bceSAndroid Build Coastguard Worker     }
fail(const std::string & description)255*35238bceSAndroid Build Coastguard Worker     static TestStatus fail(const std::string &description)
256*35238bceSAndroid Build Coastguard Worker     {
257*35238bceSAndroid Build Coastguard Worker         return TestStatus(QP_TEST_RESULT_FAIL, description);
258*35238bceSAndroid Build Coastguard Worker     }
incomplete(void)259*35238bceSAndroid Build Coastguard Worker     static TestStatus incomplete(void)
260*35238bceSAndroid Build Coastguard Worker     {
261*35238bceSAndroid Build Coastguard Worker         return TestStatus(QP_TEST_RESULT_LAST, "");
262*35238bceSAndroid Build Coastguard Worker     }
263*35238bceSAndroid Build Coastguard Worker 
264*35238bceSAndroid Build Coastguard Worker private:
265*35238bceSAndroid Build Coastguard Worker     qpTestResult m_code;
266*35238bceSAndroid Build Coastguard Worker     std::string m_description;
267*35238bceSAndroid Build Coastguard Worker } DE_WARN_UNUSED_TYPE;
268*35238bceSAndroid Build Coastguard Worker 
269*35238bceSAndroid Build Coastguard Worker } // namespace tcu
270*35238bceSAndroid Build Coastguard Worker 
271*35238bceSAndroid Build Coastguard Worker #endif // _TCUTESTCASE_HPP
272