xref: /aosp_15_r20/external/deqp/executor/tools/xeBatchResultToJUnit.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 Batch result to JUnit report conversion tool.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "xeTestLogParser.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "xeTestResultParser.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "xeXMLWriter.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "deFilePath.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "deString.h"
29*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
30*35238bceSAndroid Build Coastguard Worker 
31*35238bceSAndroid Build Coastguard Worker #include <vector>
32*35238bceSAndroid Build Coastguard Worker #include <string>
33*35238bceSAndroid Build Coastguard Worker #include <map>
34*35238bceSAndroid Build Coastguard Worker #include <cstdio>
35*35238bceSAndroid Build Coastguard Worker #include <fstream>
36*35238bceSAndroid Build Coastguard Worker 
37*35238bceSAndroid Build Coastguard Worker using std::map;
38*35238bceSAndroid Build Coastguard Worker using std::string;
39*35238bceSAndroid Build Coastguard Worker using std::vector;
40*35238bceSAndroid Build Coastguard Worker 
41*35238bceSAndroid Build Coastguard Worker struct CommandLine
42*35238bceSAndroid Build Coastguard Worker {
CommandLineCommandLine43*35238bceSAndroid Build Coastguard Worker     CommandLine(void)
44*35238bceSAndroid Build Coastguard Worker     {
45*35238bceSAndroid Build Coastguard Worker     }
46*35238bceSAndroid Build Coastguard Worker 
47*35238bceSAndroid Build Coastguard Worker     std::string batchResultFile;
48*35238bceSAndroid Build Coastguard Worker     std::string outputFile;
49*35238bceSAndroid Build Coastguard Worker };
50*35238bceSAndroid Build Coastguard Worker 
printHelp(const char * binName)51*35238bceSAndroid Build Coastguard Worker static void printHelp(const char *binName)
52*35238bceSAndroid Build Coastguard Worker {
53*35238bceSAndroid Build Coastguard Worker     printf("%s: [testlog] [output file]\n", binName);
54*35238bceSAndroid Build Coastguard Worker }
55*35238bceSAndroid Build Coastguard Worker 
parseCommandLine(CommandLine & cmdLine,int argc,const char * const * argv)56*35238bceSAndroid Build Coastguard Worker static void parseCommandLine(CommandLine &cmdLine, int argc, const char *const *argv)
57*35238bceSAndroid Build Coastguard Worker {
58*35238bceSAndroid Build Coastguard Worker     if (argc != 3)
59*35238bceSAndroid Build Coastguard Worker         throw xe::Error("Expected input and output paths");
60*35238bceSAndroid Build Coastguard Worker 
61*35238bceSAndroid Build Coastguard Worker     cmdLine.batchResultFile = argv[argc - 2];
62*35238bceSAndroid Build Coastguard Worker     cmdLine.outputFile      = argv[argc - 1];
63*35238bceSAndroid Build Coastguard Worker }
64*35238bceSAndroid Build Coastguard Worker 
parseBatchResult(xe::TestLogParser & parser,const char * filename)65*35238bceSAndroid Build Coastguard Worker static void parseBatchResult(xe::TestLogParser &parser, const char *filename)
66*35238bceSAndroid Build Coastguard Worker {
67*35238bceSAndroid Build Coastguard Worker     std::ifstream in(filename, std::ios_base::binary);
68*35238bceSAndroid Build Coastguard Worker     uint8_t buf[2048];
69*35238bceSAndroid Build Coastguard Worker 
70*35238bceSAndroid Build Coastguard Worker     for (;;)
71*35238bceSAndroid Build Coastguard Worker     {
72*35238bceSAndroid Build Coastguard Worker         in.read((char *)&buf[0], sizeof(buf));
73*35238bceSAndroid Build Coastguard Worker         int numRead = (int)in.gcount();
74*35238bceSAndroid Build Coastguard Worker 
75*35238bceSAndroid Build Coastguard Worker         if (numRead > 0)
76*35238bceSAndroid Build Coastguard Worker             parser.parse(&buf[0], numRead);
77*35238bceSAndroid Build Coastguard Worker 
78*35238bceSAndroid Build Coastguard Worker         if (numRead < (int)sizeof(buf))
79*35238bceSAndroid Build Coastguard Worker             break;
80*35238bceSAndroid Build Coastguard Worker     }
81*35238bceSAndroid Build Coastguard Worker }
82*35238bceSAndroid Build Coastguard Worker 
83*35238bceSAndroid Build Coastguard Worker class ResultToJUnitHandler : public xe::TestLogHandler
84*35238bceSAndroid Build Coastguard Worker {
85*35238bceSAndroid Build Coastguard Worker public:
ResultToJUnitHandler(xe::xml::Writer & writer)86*35238bceSAndroid Build Coastguard Worker     ResultToJUnitHandler(xe::xml::Writer &writer) : m_writer(writer)
87*35238bceSAndroid Build Coastguard Worker     {
88*35238bceSAndroid Build Coastguard Worker     }
89*35238bceSAndroid Build Coastguard Worker 
setSessionInfo(const xe::SessionInfo &)90*35238bceSAndroid Build Coastguard Worker     void setSessionInfo(const xe::SessionInfo &)
91*35238bceSAndroid Build Coastguard Worker     {
92*35238bceSAndroid Build Coastguard Worker     }
93*35238bceSAndroid Build Coastguard Worker 
startTestCaseResult(const char * casePath)94*35238bceSAndroid Build Coastguard Worker     xe::TestCaseResultPtr startTestCaseResult(const char *casePath)
95*35238bceSAndroid Build Coastguard Worker     {
96*35238bceSAndroid Build Coastguard Worker         return xe::TestCaseResultPtr(new xe::TestCaseResultData(casePath));
97*35238bceSAndroid Build Coastguard Worker     }
98*35238bceSAndroid Build Coastguard Worker 
testCaseResultUpdated(const xe::TestCaseResultPtr &)99*35238bceSAndroid Build Coastguard Worker     void testCaseResultUpdated(const xe::TestCaseResultPtr &)
100*35238bceSAndroid Build Coastguard Worker     {
101*35238bceSAndroid Build Coastguard Worker     }
102*35238bceSAndroid Build Coastguard Worker 
testCaseResultComplete(const xe::TestCaseResultPtr & resultData)103*35238bceSAndroid Build Coastguard Worker     void testCaseResultComplete(const xe::TestCaseResultPtr &resultData)
104*35238bceSAndroid Build Coastguard Worker     {
105*35238bceSAndroid Build Coastguard Worker         using xe::xml::Writer;
106*35238bceSAndroid Build Coastguard Worker 
107*35238bceSAndroid Build Coastguard Worker         xe::TestCaseResult result;
108*35238bceSAndroid Build Coastguard Worker 
109*35238bceSAndroid Build Coastguard Worker         xe::parseTestCaseResultFromData(&m_resultParser, &result, *resultData.get());
110*35238bceSAndroid Build Coastguard Worker 
111*35238bceSAndroid Build Coastguard Worker         // Split group and case names.
112*35238bceSAndroid Build Coastguard Worker         size_t sepPos         = result.casePath.find_last_of('.');
113*35238bceSAndroid Build Coastguard Worker         std::string caseName  = result.casePath.substr(sepPos + 1);
114*35238bceSAndroid Build Coastguard Worker         std::string groupName = result.casePath.substr(0, sepPos);
115*35238bceSAndroid Build Coastguard Worker 
116*35238bceSAndroid Build Coastguard Worker         // Write result.
117*35238bceSAndroid Build Coastguard Worker         m_writer << Writer::BeginElement("testcase") << Writer::Attribute("name", caseName)
118*35238bceSAndroid Build Coastguard Worker                  << Writer::Attribute("classname", groupName);
119*35238bceSAndroid Build Coastguard Worker 
120*35238bceSAndroid Build Coastguard Worker         if (result.statusCode != xe::TESTSTATUSCODE_PASS)
121*35238bceSAndroid Build Coastguard Worker             m_writer << Writer::BeginElement("failure")
122*35238bceSAndroid Build Coastguard Worker                      << Writer::Attribute("type", xe::getTestStatusCodeName(result.statusCode)) << result.statusDetails
123*35238bceSAndroid Build Coastguard Worker                      << Writer::EndElement;
124*35238bceSAndroid Build Coastguard Worker 
125*35238bceSAndroid Build Coastguard Worker         m_writer << Writer::EndElement;
126*35238bceSAndroid Build Coastguard Worker     }
127*35238bceSAndroid Build Coastguard Worker 
128*35238bceSAndroid Build Coastguard Worker private:
129*35238bceSAndroid Build Coastguard Worker     xe::xml::Writer &m_writer;
130*35238bceSAndroid Build Coastguard Worker     xe::TestResultParser m_resultParser;
131*35238bceSAndroid Build Coastguard Worker };
132*35238bceSAndroid Build Coastguard Worker 
batchResultToJUnitReport(const char * batchResultFilename,const char * dstFileName)133*35238bceSAndroid Build Coastguard Worker static void batchResultToJUnitReport(const char *batchResultFilename, const char *dstFileName)
134*35238bceSAndroid Build Coastguard Worker {
135*35238bceSAndroid Build Coastguard Worker     std::ofstream out(dstFileName, std::ios_base::binary);
136*35238bceSAndroid Build Coastguard Worker     xe::xml::Writer writer(out);
137*35238bceSAndroid Build Coastguard Worker     ResultToJUnitHandler handler(writer);
138*35238bceSAndroid Build Coastguard Worker     xe::TestLogParser parser(&handler);
139*35238bceSAndroid Build Coastguard Worker 
140*35238bceSAndroid Build Coastguard Worker     XE_CHECK(out.good());
141*35238bceSAndroid Build Coastguard Worker 
142*35238bceSAndroid Build Coastguard Worker     out << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
143*35238bceSAndroid Build Coastguard Worker 
144*35238bceSAndroid Build Coastguard Worker     writer << xe::xml::Writer::BeginElement("testsuites") << xe::xml::Writer::BeginElement("testsuite");
145*35238bceSAndroid Build Coastguard Worker 
146*35238bceSAndroid Build Coastguard Worker     // Parse and write individual cases
147*35238bceSAndroid Build Coastguard Worker     parseBatchResult(parser, batchResultFilename);
148*35238bceSAndroid Build Coastguard Worker 
149*35238bceSAndroid Build Coastguard Worker     writer << xe::xml::Writer::EndElement << xe::xml::Writer::EndElement;
150*35238bceSAndroid Build Coastguard Worker }
151*35238bceSAndroid Build Coastguard Worker 
main(int argc,const char * const * argv)152*35238bceSAndroid Build Coastguard Worker int main(int argc, const char *const *argv)
153*35238bceSAndroid Build Coastguard Worker {
154*35238bceSAndroid Build Coastguard Worker     CommandLine cmdLine;
155*35238bceSAndroid Build Coastguard Worker     try
156*35238bceSAndroid Build Coastguard Worker     {
157*35238bceSAndroid Build Coastguard Worker         parseCommandLine(cmdLine, argc, argv);
158*35238bceSAndroid Build Coastguard Worker     }
159*35238bceSAndroid Build Coastguard Worker     catch (const std::exception &)
160*35238bceSAndroid Build Coastguard Worker     {
161*35238bceSAndroid Build Coastguard Worker         printHelp(argv[0]);
162*35238bceSAndroid Build Coastguard Worker         return -1;
163*35238bceSAndroid Build Coastguard Worker     }
164*35238bceSAndroid Build Coastguard Worker 
165*35238bceSAndroid Build Coastguard Worker     try
166*35238bceSAndroid Build Coastguard Worker     {
167*35238bceSAndroid Build Coastguard Worker         batchResultToJUnitReport(cmdLine.batchResultFile.c_str(), cmdLine.outputFile.c_str());
168*35238bceSAndroid Build Coastguard Worker     }
169*35238bceSAndroid Build Coastguard Worker     catch (const std::exception &e)
170*35238bceSAndroid Build Coastguard Worker     {
171*35238bceSAndroid Build Coastguard Worker         printf("%s\n", e.what());
172*35238bceSAndroid Build Coastguard Worker         return -1;
173*35238bceSAndroid Build Coastguard Worker     }
174*35238bceSAndroid Build Coastguard Worker 
175*35238bceSAndroid Build Coastguard Worker     return 0;
176*35238bceSAndroid Build Coastguard Worker }
177