1#include "gles_conformance_tests.h" 2#include "GTFMain.h" 3 4#include <stdio.h> 5#include <stdlib.h> 6#include <vector> 7#include <sstream> 8#include <stdarg.h> 9 10static ConformanceConfig kCurrentConfig = { 64, 64, EGL_DEFAULT_DISPLAY }; 11 12void SetCurrentConfig(const ConformanceConfig& config) 13{ 14 kCurrentConfig = config; 15} 16 17const ConformanceConfig& GetCurrentConfig() 18{ 19 return kCurrentConfig; 20} 21 22static std::vector<char> FormatArg(const char* fmt, ...) 23{ 24 va_list vararg; 25 va_start(vararg, fmt); 26 int len = vsnprintf(NULL, 0, fmt, vararg); 27 va_end(vararg); 28 29 std::vector<char> buf(len + 1); 30 31 va_start(vararg, fmt); 32 vsnprintf(buf.data(), buf.size(), fmt, vararg); 33 va_end(vararg); 34 35 return buf; 36} 37 38static std::string GetExecutableDirectory() 39{ 40 std::vector<char> executableFileBuf(MAX_PATH); 41 DWORD executablePathLen = GetModuleFileNameA(NULL, executableFileBuf.data(), executableFileBuf.size()); 42 if (executablePathLen == 0) 43 { 44 return false; 45 } 46 47 std::string executableLocation = executableFileBuf.data(); 48 size_t lastPathSepLoc = executableLocation.find_last_of("\\/"); 49 if (lastPathSepLoc != std::string::npos) 50 { 51 executableLocation = executableLocation.substr(0, lastPathSepLoc); 52 } 53 else 54 { 55 executableLocation = ""; 56 } 57 58 return executableLocation; 59} 60 61void RunConformanceTest(const std::string &testPath, const ConformanceConfig& config) 62{ 63 std::vector<char*> args; 64 65 // Empty first argument for the program name 66 args.push_back(""); 67 68 std::vector<char> widthArg = FormatArg("-width=%u", config.width); 69 args.push_back(widthArg.data()); 70 71 std::vector<char> heightArg = FormatArg("-height=%u", config.height); 72 args.push_back(heightArg.data()); 73 74 std::vector<char> displayArg = FormatArg("-d=%u", config.displayType); 75 args.push_back(displayArg.data()); 76 77 std::vector<char> runArg = FormatArg("-run=%s/conformance_tests/%s", GetExecutableDirectory().c_str(), testPath.c_str()); 78 args.push_back(runArg.data()); 79 80 // Redirect cout 81 std::streambuf* oldCoutStreamBuf = std::cout.rdbuf(); 82 std::ostringstream strCout; 83 std::cout.rdbuf(strCout.rdbuf()); 84 85 if (GTFMain(args.size(), args.data()) != 0) 86 { 87 FAIL() << "GTFMain failed."; 88 } 89 90 // Restore old cout 91 std::cout.rdbuf(oldCoutStreamBuf); 92 std::string log = strCout.str(); 93 94 // Look for failures 95 size_t offset = 0; 96 std::string offsetSearchString = "failure = "; 97 while ((offset = log.find("failure = ", offset)) != std::string::npos) 98 { 99 offset += offsetSearchString.length(); 100 101 size_t failureCount = atoll(log.c_str() + offset); 102 EXPECT_EQ(0, failureCount) << log; 103 } 104} 105