xref: /aosp_15_r20/external/deqp/executor/xeTestLogParser.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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