blob: 0e2504832bdbc83fe6b725d43a4c47651464f21f [file] [log] [blame]
/*-------------------------------------------------------------------------
* drawElements Quality Program Test Executor
* ------------------------------------------
*
* Copyright 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*//*!
* \file
* \brief Batch result to JUnit report conversion tool.
*//*--------------------------------------------------------------------*/
#include "xeTestLogParser.hpp"
#include "xeTestResultParser.hpp"
#include "xeXMLWriter.hpp"
#include "deFilePath.hpp"
#include "deString.h"
#include "deStringUtil.hpp"
#include <vector>
#include <string>
#include <map>
#include <cstdio>
#include <fstream>
using std::map;
using std::string;
using std::vector;
struct CommandLine
{
CommandLine(void)
{
}
std::string batchResultFile;
std::string outputFile;
};
static void printHelp(const char *binName)
{
printf("%s: [testlog] [output file]\n", binName);
}
static void parseCommandLine(CommandLine &cmdLine, int argc, const char *const *argv)
{
if (argc != 3)
throw xe::Error("Expected input and output paths");
cmdLine.batchResultFile = argv[argc - 2];
cmdLine.outputFile = argv[argc - 1];
}
static void parseBatchResult(xe::TestLogParser &parser, const char *filename)
{
std::ifstream in(filename, std::ios_base::binary);
uint8_t buf[2048];
for (;;)
{
in.read((char *)&buf[0], sizeof(buf));
int numRead = (int)in.gcount();
if (numRead > 0)
parser.parse(&buf[0], numRead);
if (numRead < (int)sizeof(buf))
break;
}
}
class ResultToJUnitHandler : public xe::TestLogHandler
{
public:
ResultToJUnitHandler(xe::xml::Writer &writer) : m_writer(writer)
{
}
void setSessionInfo(const xe::SessionInfo &)
{
}
xe::TestCaseResultPtr startTestCaseResult(const char *casePath)
{
return xe::TestCaseResultPtr(new xe::TestCaseResultData(casePath));
}
void testCaseResultUpdated(const xe::TestCaseResultPtr &)
{
}
void testCaseResultComplete(const xe::TestCaseResultPtr &resultData)
{
using xe::xml::Writer;
xe::TestCaseResult result;
xe::parseTestCaseResultFromData(&m_resultParser, &result, *resultData.get());
// Split group and case names.
size_t sepPos = result.casePath.find_last_of('.');
std::string caseName = result.casePath.substr(sepPos + 1);
std::string groupName = result.casePath.substr(0, sepPos);
// Write result.
m_writer << Writer::BeginElement("testcase") << Writer::Attribute("name", caseName)
<< Writer::Attribute("classname", groupName);
if (result.statusCode != xe::TESTSTATUSCODE_PASS)
m_writer << Writer::BeginElement("failure")
<< Writer::Attribute("type", xe::getTestStatusCodeName(result.statusCode)) << result.statusDetails
<< Writer::EndElement;
m_writer << Writer::EndElement;
}
private:
xe::xml::Writer &m_writer;
xe::TestResultParser m_resultParser;
};
static void batchResultToJUnitReport(const char *batchResultFilename, const char *dstFileName)
{
std::ofstream out(dstFileName, std::ios_base::binary);
xe::xml::Writer writer(out);
ResultToJUnitHandler handler(writer);
xe::TestLogParser parser(&handler);
XE_CHECK(out.good());
out << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
writer << xe::xml::Writer::BeginElement("testsuites") << xe::xml::Writer::BeginElement("testsuite");
// Parse and write individual cases
parseBatchResult(parser, batchResultFilename);
writer << xe::xml::Writer::EndElement << xe::xml::Writer::EndElement;
}
int main(int argc, const char *const *argv)
{
CommandLine cmdLine;
try
{
parseCommandLine(cmdLine, argc, argv);
}
catch (const std::exception &)
{
printHelp(argv[0]);
return -1;
}
try
{
batchResultToJUnitReport(cmdLine.batchResultFile.c_str(), cmdLine.outputFile.c_str());
}
catch (const std::exception &e)
{
printf("%s\n", e.what());
return -1;
}
return 0;
}