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