1 #ifndef _XETESTRESULTPARSER_HPP
2 #define _XETESTRESULTPARSER_HPP
3 /*-------------------------------------------------------------------------
4  * drawElements Quality Program Test Executor
5  * ------------------------------------------
6  *
7  * Copyright 2014 The Android Open Source Project
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  *//*!
22  * \file
23  * \brief Test case result parser.
24  *//*--------------------------------------------------------------------*/
25 
26 #include "xeDefs.hpp"
27 #include "xeXMLParser.hpp"
28 #include "xeTestCaseResult.hpp"
29 
30 #include <vector>
31 
32 namespace xe
33 {
34 
35 enum TestLogVersion
36 {
37 	TESTLOGVERSION_0_2_0 = 0,
38 	TESTLOGVERSION_0_3_0,
39 	TESTLOGVERSION_0_3_1,
40 	TESTLOGVERSION_0_3_2,
41 	TESTLOGVERSION_0_3_3,
42 
43 	TESTLOGVERSION_LAST
44 };
45 
46 class TestResultParseError : public ParseError
47 {
48 public:
TestResultParseError(const std::string & message)49 	TestResultParseError (const std::string& message) : ParseError(message) {}
50 };
51 
52 class TestResultParser
53 {
54 public:
55 	enum ParseResult
56 	{
57 		PARSERESULT_NOT_CHANGED,
58 		PARSERESULT_CHANGED,
59 		PARSERESULT_COMPLETE,
60 		PARSERESULT_ERROR,
61 
62 		PARSERESULT_LAST
63 	};
64 
65 							TestResultParser			(void);
66 							~TestResultParser			(void);
67 
68 	void					init						(TestCaseResult* dstResult);
69 	ParseResult				parse						(const deUint8* bytes, int numBytes);
70 
71 private:
72 							TestResultParser			(const TestResultParser& other);
73 	TestResultParser&		operator=					(const TestResultParser& other);
74 
75 	void					clear						(void);
76 
77 	void					handleElementStart			(void);
78 	void					handleElementEnd			(void);
79 	void					handleData					(void);
80 
81 	const char*				getAttribute				(const char* name);
82 
83 	ri::Item*				getCurrentItem				(void);
84 	ri::List*				getCurrentItemList			(void);
85 	void					pushItem					(ri::Item* item);
86 	void					popItem						(void);
87 	void					updateCurrentItemList		(void);
88 
89 	enum State
90 	{
91 		STATE_NOT_INITIALIZED = 0,
92 		STATE_INITIALIZED,
93 		STATE_IN_TEST_CASE_RESULT,
94 		STATE_TEST_CASE_RESULT_ENDED,
95 
96 		STATE_LAST
97 	};
98 
99 	xml::Parser				m_xmlParser;
100 	TestCaseResult*			m_result;
101 
102 	State					m_state;
103 	TestLogVersion			m_logVersion;		//!< Only valid in STATE_IN_TEST_CASE_RESULT.
104 
105 	std::vector<ri::Item*>	m_itemStack;
106 	ri::List*				m_curItemList;
107 
108 	int						m_base64DecodeOffset;
109 
110 	std::string				m_curNumValue;
111 };
112 
113 // Helpers exposed to other parsers.
114 TestStatusCode	getTestStatusCode			(const char* statusCode);
115 
116 // Parsing helpers.
117 
118 class TestCaseResultData;
119 
120 void			parseTestCaseResultFromData	(TestResultParser* parser, TestCaseResult* result, const TestCaseResultData& data);
121 
122 } // xe
123 
124 #endif // _XETESTRESULTPARSER_HPP
125