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