1e5c31af7Sopenharmony_ci/*-------------------------------------------------------------------------
2e5c31af7Sopenharmony_ci * drawElements Quality Program Test Executor
3e5c31af7Sopenharmony_ci * ------------------------------------------
4e5c31af7Sopenharmony_ci *
5e5c31af7Sopenharmony_ci * Copyright 2014 The Android Open Source Project
6e5c31af7Sopenharmony_ci *
7e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
8e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License.
9e5c31af7Sopenharmony_ci * You may obtain a copy of the License at
10e5c31af7Sopenharmony_ci *
11e5c31af7Sopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
12e5c31af7Sopenharmony_ci *
13e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
14e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
15e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and
17e5c31af7Sopenharmony_ci * limitations under the License.
18e5c31af7Sopenharmony_ci *
19e5c31af7Sopenharmony_ci *//*!
20e5c31af7Sopenharmony_ci * \file
21e5c31af7Sopenharmony_ci * \brief Extract sample lists from logs.
22e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/
23e5c31af7Sopenharmony_ci
24e5c31af7Sopenharmony_ci#include "xeTestLogParser.hpp"
25e5c31af7Sopenharmony_ci#include "xeTestResultParser.hpp"
26e5c31af7Sopenharmony_ci#include "deFilePath.hpp"
27e5c31af7Sopenharmony_ci#include "deString.h"
28e5c31af7Sopenharmony_ci#include "deStringUtil.hpp"
29e5c31af7Sopenharmony_ci
30e5c31af7Sopenharmony_ci#include <vector>
31e5c31af7Sopenharmony_ci#include <string>
32e5c31af7Sopenharmony_ci#include <cstdio>
33e5c31af7Sopenharmony_ci#include <cstdlib>
34e5c31af7Sopenharmony_ci#include <fstream>
35e5c31af7Sopenharmony_ci#include <iostream>
36e5c31af7Sopenharmony_ci#include <stdexcept>
37e5c31af7Sopenharmony_ci
38e5c31af7Sopenharmony_ciusing std::vector;
39e5c31af7Sopenharmony_ciusing std::string;
40e5c31af7Sopenharmony_ciusing std::set;
41e5c31af7Sopenharmony_ciusing std::map;
42e5c31af7Sopenharmony_ci
43e5c31af7Sopenharmony_civoid writeSampleList (const char* casePath, int listNdx, const xe::ri::SampleList& sampleList)
44e5c31af7Sopenharmony_ci{
45e5c31af7Sopenharmony_ci	const string	filename	= string(casePath) + "." + de::toString(listNdx) + ".csv";
46e5c31af7Sopenharmony_ci	std::ofstream	out			(filename.c_str(), std::ios_base::binary);
47e5c31af7Sopenharmony_ci
48e5c31af7Sopenharmony_ci	if (!out.good())
49e5c31af7Sopenharmony_ci		throw std::runtime_error("Failed to open " + filename);
50e5c31af7Sopenharmony_ci
51e5c31af7Sopenharmony_ci	// Header
52e5c31af7Sopenharmony_ci	for (int ndx = 0; ndx < sampleList.sampleInfo.valueInfos.getNumItems(); ndx++)
53e5c31af7Sopenharmony_ci	{
54e5c31af7Sopenharmony_ci		if (ndx != 0)
55e5c31af7Sopenharmony_ci			out << ",";
56e5c31af7Sopenharmony_ci		out << static_cast<const xe::ri::ValueInfo&>(sampleList.sampleInfo.valueInfos.getItem(ndx)).name;
57e5c31af7Sopenharmony_ci	}
58e5c31af7Sopenharmony_ci	out << "\n";
59e5c31af7Sopenharmony_ci
60e5c31af7Sopenharmony_ci	// Samples
61e5c31af7Sopenharmony_ci	for (int sampleNdx = 0; sampleNdx < sampleList.samples.getNumItems(); sampleNdx++)
62e5c31af7Sopenharmony_ci	{
63e5c31af7Sopenharmony_ci		const xe::ri::Sample&	sample	= static_cast<const xe::ri::Sample&>(sampleList.samples.getItem(sampleNdx));
64e5c31af7Sopenharmony_ci
65e5c31af7Sopenharmony_ci		for (int valNdx = 0; valNdx < sample.values.getNumItems(); valNdx++)
66e5c31af7Sopenharmony_ci		{
67e5c31af7Sopenharmony_ci			const xe::ri::SampleValue&	value	= static_cast<const xe::ri::SampleValue&>(sample.values.getItem(valNdx));
68e5c31af7Sopenharmony_ci
69e5c31af7Sopenharmony_ci			if (valNdx != 0)
70e5c31af7Sopenharmony_ci				out << ",";
71e5c31af7Sopenharmony_ci
72e5c31af7Sopenharmony_ci			out << value.value;
73e5c31af7Sopenharmony_ci		}
74e5c31af7Sopenharmony_ci		out << "\n";
75e5c31af7Sopenharmony_ci	}
76e5c31af7Sopenharmony_ci}
77e5c31af7Sopenharmony_ci
78e5c31af7Sopenharmony_civoid extractSampleLists (const char* casePath, int* listNdx, const xe::ri::List& items)
79e5c31af7Sopenharmony_ci{
80e5c31af7Sopenharmony_ci	for (int itemNdx = 0; itemNdx < items.getNumItems(); itemNdx++)
81e5c31af7Sopenharmony_ci	{
82e5c31af7Sopenharmony_ci		const xe::ri::Item& child = items.getItem(itemNdx);
83e5c31af7Sopenharmony_ci
84e5c31af7Sopenharmony_ci		if (child.getType() == xe::ri::TYPE_SECTION)
85e5c31af7Sopenharmony_ci			extractSampleLists(casePath, listNdx, static_cast<const xe::ri::Section&>(child).items);
86e5c31af7Sopenharmony_ci		else if (child.getType() == xe::ri::TYPE_SAMPLELIST)
87e5c31af7Sopenharmony_ci		{
88e5c31af7Sopenharmony_ci			writeSampleList(casePath, *listNdx, static_cast<const xe::ri::SampleList&>(child));
89e5c31af7Sopenharmony_ci			*listNdx += 1;
90e5c31af7Sopenharmony_ci		}
91e5c31af7Sopenharmony_ci	}
92e5c31af7Sopenharmony_ci}
93e5c31af7Sopenharmony_ci
94e5c31af7Sopenharmony_civoid extractSampleLists (const xe::TestCaseResult& result)
95e5c31af7Sopenharmony_ci{
96e5c31af7Sopenharmony_ci	int listNdx = 0;
97e5c31af7Sopenharmony_ci	extractSampleLists(result.casePath.c_str(), &listNdx, result.resultItems);
98e5c31af7Sopenharmony_ci}
99e5c31af7Sopenharmony_ci
100e5c31af7Sopenharmony_ciclass SampleListParser : public xe::TestLogHandler
101e5c31af7Sopenharmony_ci{
102e5c31af7Sopenharmony_cipublic:
103e5c31af7Sopenharmony_ci	SampleListParser (void)
104e5c31af7Sopenharmony_ci	{
105e5c31af7Sopenharmony_ci	}
106e5c31af7Sopenharmony_ci
107e5c31af7Sopenharmony_ci	void setSessionInfo (const xe::SessionInfo&)
108e5c31af7Sopenharmony_ci	{
109e5c31af7Sopenharmony_ci		// Ignored.
110e5c31af7Sopenharmony_ci	}
111e5c31af7Sopenharmony_ci
112e5c31af7Sopenharmony_ci	xe::TestCaseResultPtr startTestCaseResult (const char* casePath)
113e5c31af7Sopenharmony_ci	{
114e5c31af7Sopenharmony_ci		return xe::TestCaseResultPtr(new xe::TestCaseResultData(casePath));
115e5c31af7Sopenharmony_ci	}
116e5c31af7Sopenharmony_ci
117e5c31af7Sopenharmony_ci	void testCaseResultUpdated (const xe::TestCaseResultPtr&)
118e5c31af7Sopenharmony_ci	{
119e5c31af7Sopenharmony_ci		// Ignored.
120e5c31af7Sopenharmony_ci	}
121e5c31af7Sopenharmony_ci
122e5c31af7Sopenharmony_ci	void testCaseResultComplete (const xe::TestCaseResultPtr& caseData)
123e5c31af7Sopenharmony_ci	{
124e5c31af7Sopenharmony_ci		xe::TestCaseResult result;
125e5c31af7Sopenharmony_ci		xe::parseTestCaseResultFromData(&m_testResultParser, &result, *caseData.get());
126e5c31af7Sopenharmony_ci		extractSampleLists(result);
127e5c31af7Sopenharmony_ci	}
128e5c31af7Sopenharmony_ci
129e5c31af7Sopenharmony_ciprivate:
130e5c31af7Sopenharmony_ci	xe::TestResultParser	m_testResultParser;
131e5c31af7Sopenharmony_ci};
132e5c31af7Sopenharmony_ci
133e5c31af7Sopenharmony_cistatic void processLogFile (const char* filename)
134e5c31af7Sopenharmony_ci{
135e5c31af7Sopenharmony_ci	std::ifstream		in				(filename, std::ifstream::binary|std::ifstream::in);
136e5c31af7Sopenharmony_ci	SampleListParser	resultHandler;
137e5c31af7Sopenharmony_ci	xe::TestLogParser	parser			(&resultHandler);
138e5c31af7Sopenharmony_ci	deUint8				buf				[1024];
139e5c31af7Sopenharmony_ci	int					numRead			= 0;
140e5c31af7Sopenharmony_ci
141e5c31af7Sopenharmony_ci	if (!in.good())
142e5c31af7Sopenharmony_ci		throw std::runtime_error(string("Failed to open '") + filename + "'");
143e5c31af7Sopenharmony_ci
144e5c31af7Sopenharmony_ci	for (;;)
145e5c31af7Sopenharmony_ci	{
146e5c31af7Sopenharmony_ci		in.read((char*)&buf[0], DE_LENGTH_OF_ARRAY(buf));
147e5c31af7Sopenharmony_ci		numRead = (int)in.gcount();
148e5c31af7Sopenharmony_ci
149e5c31af7Sopenharmony_ci		if (numRead <= 0)
150e5c31af7Sopenharmony_ci			break;
151e5c31af7Sopenharmony_ci
152e5c31af7Sopenharmony_ci		parser.parse(&buf[0], numRead);
153e5c31af7Sopenharmony_ci	}
154e5c31af7Sopenharmony_ci
155e5c31af7Sopenharmony_ci	in.close();
156e5c31af7Sopenharmony_ci}
157e5c31af7Sopenharmony_ci
158e5c31af7Sopenharmony_ciint main (int argc, const char* const* argv)
159e5c31af7Sopenharmony_ci{
160e5c31af7Sopenharmony_ci	if (argc != 2)
161e5c31af7Sopenharmony_ci	{
162e5c31af7Sopenharmony_ci		printf("%s: [filename]\n", de::FilePath(argv[0]).getBaseName().c_str());
163e5c31af7Sopenharmony_ci		return -1;
164e5c31af7Sopenharmony_ci	}
165e5c31af7Sopenharmony_ci
166e5c31af7Sopenharmony_ci	try
167e5c31af7Sopenharmony_ci	{
168e5c31af7Sopenharmony_ci		processLogFile(argv[1]);
169e5c31af7Sopenharmony_ci	}
170e5c31af7Sopenharmony_ci	catch (const std::exception& e)
171e5c31af7Sopenharmony_ci	{
172e5c31af7Sopenharmony_ci		printf("FATAL ERROR: %s\n", e.what());
173e5c31af7Sopenharmony_ci		return -1;
174e5c31af7Sopenharmony_ci	}
175e5c31af7Sopenharmony_ci
176e5c31af7Sopenharmony_ci	return 0;
177e5c31af7Sopenharmony_ci}
178