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