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