1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program Test Executor
3*35238bceSAndroid Build Coastguard Worker * ------------------------------------------
4*35238bceSAndroid Build Coastguard Worker *
5*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker *
7*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker *
11*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker *
13*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker *
19*35238bceSAndroid Build Coastguard Worker *//*!
20*35238bceSAndroid Build Coastguard Worker * \file
21*35238bceSAndroid Build Coastguard Worker * \brief Test log parser.
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "xeTestLogParser.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "deString.h"
26*35238bceSAndroid Build Coastguard Worker
27*35238bceSAndroid Build Coastguard Worker using std::map;
28*35238bceSAndroid Build Coastguard Worker using std::string;
29*35238bceSAndroid Build Coastguard Worker using std::vector;
30*35238bceSAndroid Build Coastguard Worker
31*35238bceSAndroid Build Coastguard Worker namespace xe
32*35238bceSAndroid Build Coastguard Worker {
33*35238bceSAndroid Build Coastguard Worker
TestLogParser(TestLogHandler * handler)34*35238bceSAndroid Build Coastguard Worker TestLogParser::TestLogParser(TestLogHandler *handler) : m_handler(handler), m_inSession(false)
35*35238bceSAndroid Build Coastguard Worker {
36*35238bceSAndroid Build Coastguard Worker }
37*35238bceSAndroid Build Coastguard Worker
~TestLogParser(void)38*35238bceSAndroid Build Coastguard Worker TestLogParser::~TestLogParser(void)
39*35238bceSAndroid Build Coastguard Worker {
40*35238bceSAndroid Build Coastguard Worker }
41*35238bceSAndroid Build Coastguard Worker
reset(void)42*35238bceSAndroid Build Coastguard Worker void TestLogParser::reset(void)
43*35238bceSAndroid Build Coastguard Worker {
44*35238bceSAndroid Build Coastguard Worker m_containerParser.clear();
45*35238bceSAndroid Build Coastguard Worker m_currentCaseData.clear();
46*35238bceSAndroid Build Coastguard Worker m_sessionInfo = SessionInfo();
47*35238bceSAndroid Build Coastguard Worker m_inSession = false;
48*35238bceSAndroid Build Coastguard Worker }
49*35238bceSAndroid Build Coastguard Worker
parse(const uint8_t * bytes,size_t numBytes)50*35238bceSAndroid Build Coastguard Worker void TestLogParser::parse(const uint8_t *bytes, size_t numBytes)
51*35238bceSAndroid Build Coastguard Worker {
52*35238bceSAndroid Build Coastguard Worker m_containerParser.feed(bytes, numBytes);
53*35238bceSAndroid Build Coastguard Worker
54*35238bceSAndroid Build Coastguard Worker for (;;)
55*35238bceSAndroid Build Coastguard Worker {
56*35238bceSAndroid Build Coastguard Worker ContainerElement element = m_containerParser.getElement();
57*35238bceSAndroid Build Coastguard Worker
58*35238bceSAndroid Build Coastguard Worker if (element == CONTAINERELEMENT_INCOMPLETE)
59*35238bceSAndroid Build Coastguard Worker break;
60*35238bceSAndroid Build Coastguard Worker
61*35238bceSAndroid Build Coastguard Worker switch (element)
62*35238bceSAndroid Build Coastguard Worker {
63*35238bceSAndroid Build Coastguard Worker case CONTAINERELEMENT_BEGIN_SESSION:
64*35238bceSAndroid Build Coastguard Worker {
65*35238bceSAndroid Build Coastguard Worker if (m_inSession)
66*35238bceSAndroid Build Coastguard Worker throw Error("Unexpected #beginSession");
67*35238bceSAndroid Build Coastguard Worker
68*35238bceSAndroid Build Coastguard Worker m_handler->setSessionInfo(m_sessionInfo);
69*35238bceSAndroid Build Coastguard Worker m_inSession = true;
70*35238bceSAndroid Build Coastguard Worker break;
71*35238bceSAndroid Build Coastguard Worker }
72*35238bceSAndroid Build Coastguard Worker
73*35238bceSAndroid Build Coastguard Worker case CONTAINERELEMENT_END_SESSION:
74*35238bceSAndroid Build Coastguard Worker {
75*35238bceSAndroid Build Coastguard Worker if (!m_inSession)
76*35238bceSAndroid Build Coastguard Worker throw Error("Unexpected #endSession");
77*35238bceSAndroid Build Coastguard Worker
78*35238bceSAndroid Build Coastguard Worker m_inSession = false;
79*35238bceSAndroid Build Coastguard Worker break;
80*35238bceSAndroid Build Coastguard Worker }
81*35238bceSAndroid Build Coastguard Worker
82*35238bceSAndroid Build Coastguard Worker case CONTAINERELEMENT_SESSION_INFO:
83*35238bceSAndroid Build Coastguard Worker {
84*35238bceSAndroid Build Coastguard Worker if (m_inSession)
85*35238bceSAndroid Build Coastguard Worker throw Error("Unexpected #sessionInfo");
86*35238bceSAndroid Build Coastguard Worker
87*35238bceSAndroid Build Coastguard Worker const char *attribute = m_containerParser.getSessionInfoAttribute();
88*35238bceSAndroid Build Coastguard Worker const char *value = m_containerParser.getSessionInfoValue();
89*35238bceSAndroid Build Coastguard Worker
90*35238bceSAndroid Build Coastguard Worker if (deStringEqual(attribute, "releaseName"))
91*35238bceSAndroid Build Coastguard Worker m_sessionInfo.releaseName = value;
92*35238bceSAndroid Build Coastguard Worker else if (deStringEqual(attribute, "releaseId"))
93*35238bceSAndroid Build Coastguard Worker m_sessionInfo.releaseId = value;
94*35238bceSAndroid Build Coastguard Worker else if (deStringEqual(attribute, "targetName"))
95*35238bceSAndroid Build Coastguard Worker m_sessionInfo.targetName = value;
96*35238bceSAndroid Build Coastguard Worker else if (deStringEqual(attribute, "candyTargetName"))
97*35238bceSAndroid Build Coastguard Worker m_sessionInfo.candyTargetName = value;
98*35238bceSAndroid Build Coastguard Worker else if (deStringEqual(attribute, "configName"))
99*35238bceSAndroid Build Coastguard Worker m_sessionInfo.configName = value;
100*35238bceSAndroid Build Coastguard Worker else if (deStringEqual(attribute, "resultName"))
101*35238bceSAndroid Build Coastguard Worker m_sessionInfo.resultName = value;
102*35238bceSAndroid Build Coastguard Worker else if (deStringEqual(attribute, "timestamp"))
103*35238bceSAndroid Build Coastguard Worker m_sessionInfo.timestamp = value;
104*35238bceSAndroid Build Coastguard Worker else if (deStringEqual(attribute, "commandLineParameters"))
105*35238bceSAndroid Build Coastguard Worker m_sessionInfo.qpaCommandLineParameters = value;
106*35238bceSAndroid Build Coastguard Worker
107*35238bceSAndroid Build Coastguard Worker // \todo [2012-06-09 pyry] What to do with unknown/duplicate attributes? Currently just ignored.
108*35238bceSAndroid Build Coastguard Worker break;
109*35238bceSAndroid Build Coastguard Worker }
110*35238bceSAndroid Build Coastguard Worker
111*35238bceSAndroid Build Coastguard Worker case CONTAINERELEMENT_BEGIN_TEST_CASE_RESULT:
112*35238bceSAndroid Build Coastguard Worker {
113*35238bceSAndroid Build Coastguard Worker if (!m_inSession)
114*35238bceSAndroid Build Coastguard Worker throw Error("Unexpected #beginTestCaseResult");
115*35238bceSAndroid Build Coastguard Worker
116*35238bceSAndroid Build Coastguard Worker const char *casePath = m_containerParser.getTestCasePath();
117*35238bceSAndroid Build Coastguard Worker m_currentCaseData = m_handler->startTestCaseResult(casePath);
118*35238bceSAndroid Build Coastguard Worker
119*35238bceSAndroid Build Coastguard Worker // Clear and set to running state.
120*35238bceSAndroid Build Coastguard Worker m_currentCaseData->setDataSize(0);
121*35238bceSAndroid Build Coastguard Worker m_currentCaseData->setTestResult(TESTSTATUSCODE_RUNNING, "Running");
122*35238bceSAndroid Build Coastguard Worker
123*35238bceSAndroid Build Coastguard Worker m_handler->testCaseResultUpdated(m_currentCaseData);
124*35238bceSAndroid Build Coastguard Worker break;
125*35238bceSAndroid Build Coastguard Worker }
126*35238bceSAndroid Build Coastguard Worker
127*35238bceSAndroid Build Coastguard Worker case CONTAINERELEMENT_END_TEST_CASE_RESULT:
128*35238bceSAndroid Build Coastguard Worker if (m_currentCaseData)
129*35238bceSAndroid Build Coastguard Worker {
130*35238bceSAndroid Build Coastguard Worker // \todo [2012-06-16 pyry] Parse status code already here?
131*35238bceSAndroid Build Coastguard Worker m_currentCaseData->setTestResult(TESTSTATUSCODE_LAST, "");
132*35238bceSAndroid Build Coastguard Worker m_handler->testCaseResultComplete(m_currentCaseData);
133*35238bceSAndroid Build Coastguard Worker }
134*35238bceSAndroid Build Coastguard Worker m_currentCaseData.clear();
135*35238bceSAndroid Build Coastguard Worker break;
136*35238bceSAndroid Build Coastguard Worker
137*35238bceSAndroid Build Coastguard Worker case CONTAINERELEMENT_TERMINATE_TEST_CASE_RESULT:
138*35238bceSAndroid Build Coastguard Worker if (m_currentCaseData)
139*35238bceSAndroid Build Coastguard Worker {
140*35238bceSAndroid Build Coastguard Worker TestStatusCode statusCode = TESTSTATUSCODE_CRASH;
141*35238bceSAndroid Build Coastguard Worker const char *reason = m_containerParser.getTerminateReason();
142*35238bceSAndroid Build Coastguard Worker try
143*35238bceSAndroid Build Coastguard Worker {
144*35238bceSAndroid Build Coastguard Worker statusCode = getTestStatusCode(reason);
145*35238bceSAndroid Build Coastguard Worker }
146*35238bceSAndroid Build Coastguard Worker catch (const xe::ParseError &)
147*35238bceSAndroid Build Coastguard Worker {
148*35238bceSAndroid Build Coastguard Worker // Could not map status code.
149*35238bceSAndroid Build Coastguard Worker }
150*35238bceSAndroid Build Coastguard Worker m_currentCaseData->setTestResult(statusCode, reason);
151*35238bceSAndroid Build Coastguard Worker m_handler->testCaseResultComplete(m_currentCaseData);
152*35238bceSAndroid Build Coastguard Worker }
153*35238bceSAndroid Build Coastguard Worker m_currentCaseData.clear();
154*35238bceSAndroid Build Coastguard Worker break;
155*35238bceSAndroid Build Coastguard Worker
156*35238bceSAndroid Build Coastguard Worker case CONTAINERELEMENT_END_OF_STRING:
157*35238bceSAndroid Build Coastguard Worker if (m_currentCaseData)
158*35238bceSAndroid Build Coastguard Worker {
159*35238bceSAndroid Build Coastguard Worker // Terminate current case.
160*35238bceSAndroid Build Coastguard Worker m_currentCaseData->setTestResult(TESTSTATUSCODE_TERMINATED, "Unexpected end of string");
161*35238bceSAndroid Build Coastguard Worker m_handler->testCaseResultComplete(m_currentCaseData);
162*35238bceSAndroid Build Coastguard Worker }
163*35238bceSAndroid Build Coastguard Worker m_currentCaseData.clear();
164*35238bceSAndroid Build Coastguard Worker break;
165*35238bceSAndroid Build Coastguard Worker
166*35238bceSAndroid Build Coastguard Worker case CONTAINERELEMENT_TEST_LOG_DATA:
167*35238bceSAndroid Build Coastguard Worker if (m_currentCaseData)
168*35238bceSAndroid Build Coastguard Worker {
169*35238bceSAndroid Build Coastguard Worker int offset = m_currentCaseData->getDataSize();
170*35238bceSAndroid Build Coastguard Worker int numDataBytes = m_containerParser.getDataSize();
171*35238bceSAndroid Build Coastguard Worker
172*35238bceSAndroid Build Coastguard Worker m_currentCaseData->setDataSize(offset + numDataBytes);
173*35238bceSAndroid Build Coastguard Worker m_containerParser.getData(m_currentCaseData->getData() + offset, numDataBytes, 0);
174*35238bceSAndroid Build Coastguard Worker
175*35238bceSAndroid Build Coastguard Worker m_handler->testCaseResultUpdated(m_currentCaseData);
176*35238bceSAndroid Build Coastguard Worker }
177*35238bceSAndroid Build Coastguard Worker break;
178*35238bceSAndroid Build Coastguard Worker
179*35238bceSAndroid Build Coastguard Worker default:
180*35238bceSAndroid Build Coastguard Worker throw ContainerParseError("Unknown container element");
181*35238bceSAndroid Build Coastguard Worker }
182*35238bceSAndroid Build Coastguard Worker
183*35238bceSAndroid Build Coastguard Worker m_containerParser.advance();
184*35238bceSAndroid Build Coastguard Worker }
185*35238bceSAndroid Build Coastguard Worker }
186*35238bceSAndroid Build Coastguard Worker
187*35238bceSAndroid Build Coastguard Worker } // namespace xe
188