15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/config/gpu_test_expectations_parser.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace gpu {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum LineParserStage {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kLineParserBegin = 0,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kLineParserBugID,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kLineParserConfigs,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kLineParserColon,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kLineParserTestName,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kLineParserEqual,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kLineParserExpectations,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum Token {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // os
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kConfigWinXP = 0,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kConfigWinVista,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kConfigWin7,
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  kConfigWin8,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kConfigWin,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kConfigMacLeopard,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kConfigMacSnowLeopard,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kConfigMacLion,
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  kConfigMacMountainLion,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kConfigMac,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kConfigLinux,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kConfigChromeOS,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kConfigAndroid,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // gpu vendor
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kConfigNVidia,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kConfigAMD,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kConfigIntel,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kConfigVMWare,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // build type
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kConfigRelease,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kConfigDebug,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // expectation
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kExpectationPass,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kExpectationFail,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kExpectationFlaky,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kExpectationTimeout,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kExpectationSkip,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // separator
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kSeparatorColon,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kSeparatorEqual,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kNumberOfExactMatchTokens,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // others
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kConfigGPUDeviceID,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kTokenComment,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kTokenWord,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct TokenInfo {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* name;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 flag;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const TokenInfo kTokenData[] = {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "xp", GPUTestConfig::kOsWinXP },
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "vista", GPUTestConfig::kOsWinVista },
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "win7", GPUTestConfig::kOsWin7 },
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  { "win8", GPUTestConfig::kOsWin8 },
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "win", GPUTestConfig::kOsWin },
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "leopard", GPUTestConfig::kOsMacLeopard },
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "snowleopard", GPUTestConfig::kOsMacSnowLeopard },
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "lion", GPUTestConfig::kOsMacLion },
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  { "mountainlion", GPUTestConfig::kOsMacMountainLion },
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "mac", GPUTestConfig::kOsMac },
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "linux", GPUTestConfig::kOsLinux },
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "chromeos", GPUTestConfig::kOsChromeOS },
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "android", GPUTestConfig::kOsAndroid },
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "nvidia", 0x10DE },
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "amd", 0x1002 },
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "intel", 0x8086 },
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "vmware", 0x15ad },
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "release", GPUTestConfig::kBuildTypeRelease },
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "debug", GPUTestConfig::kBuildTypeDebug },
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "pass", GPUTestExpectationsParser::kGpuTestPass },
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "fail", GPUTestExpectationsParser::kGpuTestFail },
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "flaky", GPUTestExpectationsParser::kGpuTestFlaky },
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "timeout", GPUTestExpectationsParser::kGpuTestTimeout },
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "skip", GPUTestExpectationsParser::kGpuTestSkip },
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { ":", 0 },
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "=", 0 },
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum ErrorType {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kErrorFileIO = 0,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kErrorIllegalEntry,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kErrorInvalidEntry,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kErrorEntryWithOsConflicts,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kErrorEntryWithGpuVendorConflicts,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kErrorEntryWithBuildTypeConflicts,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kErrorEntryWithGpuDeviceIdConflicts,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kErrorEntryWithExpectationConflicts,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kErrorEntriesOverlap,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kNumberOfErrors,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kErrorMessage[] = {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "file IO failed",
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "entry with wrong format",
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "entry invalid, likely wrong modifiers combination",
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "entry with OS modifier conflicts",
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "entry with GPU vendor modifier conflicts",
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "entry with GPU build type conflicts",
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "entry with GPU device id conflicts or malformat",
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "entry with expectation modifier conflicts",
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "two entries's configs overlap",
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Token ParseToken(const std::string& word) {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (StartsWithASCII(word, "//", false))
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return kTokenComment;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (StartsWithASCII(word, "0x", false))
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return kConfigGPUDeviceID;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int32 i = 0; i < kNumberOfExactMatchTokens; ++i) {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (LowerCaseEqualsASCII(word, kTokenData[i].name))
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return static_cast<Token>(i);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return kTokenWord;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reference name can have the last character as *.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NamesMatching(const std::string& ref, const std::string& test_name) {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t len = ref.length();
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (len == 0)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ref[len - 1] == '*') {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (test_name.length() > len -1 &&
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ref.compare(0, len - 1, test_name, 0, len - 1) == 0)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (ref == test_name);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace anonymous
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GPUTestExpectationsParser::GPUTestExpectationsParser() {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Some sanity check.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(static_cast<unsigned int>(kNumberOfExactMatchTokens),
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            sizeof(kTokenData) / sizeof(kTokenData[0]));
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(static_cast<unsigned int>(kNumberOfErrors),
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            sizeof(kErrorMessage) / sizeof(kErrorMessage[0]));
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GPUTestExpectationsParser::~GPUTestExpectationsParser() {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GPUTestExpectationsParser::LoadTestExpectations(const std::string& data) {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entries_.clear();
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error_messages_.clear();
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> lines;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::SplitString(data, '\n', &lines);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool rt = true;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < lines.size(); ++i) {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ParseLine(lines[i], i + 1))
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rt = false;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (DetectConflictsBetweenEntries()) {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entries_.clear();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rt = false;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rt;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GPUTestExpectationsParser::LoadTestExpectations(
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& path) {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entries_.clear();
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error_messages_.clear();
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string data;
19458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!base::ReadFileToString(path, &data)) {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    error_messages_.push_back(kErrorMessage[kErrorFileIO]);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return LoadTestExpectations(data);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32 GPUTestExpectationsParser::GetTestExpectation(
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& test_name,
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GPUTestBotConfig& bot_config) const {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < entries_.size(); ++i) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (NamesMatching(entries_[i].test_name, test_name) &&
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bot_config.Matches(entries_[i].test_config))
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return entries_[i].test_expectation;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return kGpuTestPass;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::vector<std::string>&
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GPUTestExpectationsParser::GetErrorMessages() const {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error_messages_;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GPUTestExpectationsParser::ParseConfig(
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& config_data, GPUTestConfig* config) {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(config);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> tokens;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::SplitStringAlongWhitespace(config_data, &tokens);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < tokens.size(); ++i) {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Token token = ParseToken(tokens[i]);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (token) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigWinXP:
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigWinVista:
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigWin7:
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case kConfigWin8:
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigWin:
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigMacLeopard:
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigMacSnowLeopard:
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigMacLion:
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case kConfigMacMountainLion:
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigMac:
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigLinux:
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigChromeOS:
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigAndroid:
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigNVidia:
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigAMD:
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigIntel:
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigVMWare:
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigRelease:
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigDebug:
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigGPUDeviceID:
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (token == kConfigGPUDeviceID) {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (!UpdateTestConfig(config, tokens[i], 0))
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return false;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (!UpdateTestConfig(config, token, 0))
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return false;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GPUTestExpectationsParser::ParseLine(
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& line_data, size_t line_number) {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> tokens;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::SplitStringAlongWhitespace(line_data, &tokens);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 stage = kLineParserBegin;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GPUTestExpectationEntry entry;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry.line_number = line_number;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GPUTestConfig& config = entry.test_config;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool comments_encountered = false;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < tokens.size() && !comments_encountered; ++i) {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Token token = ParseToken(tokens[i]);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (token) {
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kTokenComment:
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        comments_encountered = true;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigWinXP:
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigWinVista:
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigWin7:
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case kConfigWin8:
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigWin:
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigMacLeopard:
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigMacSnowLeopard:
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigMacLion:
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case kConfigMacMountainLion:
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigMac:
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigLinux:
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigChromeOS:
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigAndroid:
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigNVidia:
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigAMD:
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigIntel:
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigVMWare:
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigRelease:
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigDebug:
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kConfigGPUDeviceID:
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // MODIFIERS, could be in any order, need at least one.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (stage != kLineParserConfigs && stage != kLineParserBugID) {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          PushErrorMessage(kErrorMessage[kErrorIllegalEntry],
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           line_number);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return false;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (token == kConfigGPUDeviceID) {
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (!UpdateTestConfig(&config, tokens[i], line_number))
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return false;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (!UpdateTestConfig(&config, token, line_number))
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return false;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (stage == kLineParserBugID)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          stage++;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kSeparatorColon:
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // :
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (stage != kLineParserConfigs) {
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          PushErrorMessage(kErrorMessage[kErrorIllegalEntry],
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           line_number);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return false;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        stage++;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kSeparatorEqual:
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // =
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (stage != kLineParserTestName) {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          PushErrorMessage(kErrorMessage[kErrorIllegalEntry],
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           line_number);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return false;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        stage++;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kTokenWord:
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // BUG_ID or TEST_NAME
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (stage == kLineParserBegin) {
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // Bug ID is not used for anything; ignore it.
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (stage == kLineParserColon) {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          entry.test_name = tokens[i];
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          PushErrorMessage(kErrorMessage[kErrorIllegalEntry],
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           line_number);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return false;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        stage++;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kExpectationPass:
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kExpectationFail:
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kExpectationFlaky:
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kExpectationTimeout:
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case kExpectationSkip:
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // TEST_EXPECTATIONS
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (stage != kLineParserEqual && stage != kLineParserExpectations) {
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          PushErrorMessage(kErrorMessage[kErrorIllegalEntry],
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           line_number);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return false;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((kTokenData[token].flag & entry.test_expectation) != 0) {
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          PushErrorMessage(kErrorMessage[kErrorEntryWithExpectationConflicts],
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           line_number);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return false;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        entry.test_expectation =
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (kTokenData[token].flag | entry.test_expectation);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (stage == kLineParserEqual)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          stage++;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DCHECK(false);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (stage == kLineParserBegin) {
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The whole line is empty or all comments
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (stage == kLineParserExpectations) {
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!config.IsValid()) {
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PushErrorMessage(kErrorMessage[kErrorInvalidEntry], line_number);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entries_.push_back(entry);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PushErrorMessage(kErrorMessage[kErrorIllegalEntry], line_number);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GPUTestExpectationsParser::UpdateTestConfig(
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GPUTestConfig* config, int32 token, size_t line_number) {
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(config);
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (token) {
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kConfigWinXP:
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kConfigWinVista:
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kConfigWin7:
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kConfigWin8:
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kConfigWin:
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kConfigMacLeopard:
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kConfigMacSnowLeopard:
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kConfigMacLion:
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kConfigMacMountainLion:
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kConfigMac:
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kConfigLinux:
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kConfigChromeOS:
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kConfigAndroid:
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((config->os() & kTokenData[token].flag) != 0) {
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PushErrorMessage(kErrorMessage[kErrorEntryWithOsConflicts],
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         line_number);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      config->set_os(config->os() | kTokenData[token].flag);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kConfigNVidia:
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kConfigAMD:
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kConfigIntel:
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kConfigVMWare:
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uint32 gpu_vendor =
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            static_cast<uint32>(kTokenData[token].flag);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (size_t i = 0; i < config->gpu_vendor().size(); ++i) {
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (config->gpu_vendor()[i] == gpu_vendor) {
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            PushErrorMessage(
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                kErrorMessage[kErrorEntryWithGpuVendorConflicts],
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                line_number);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return false;
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        config->AddGPUVendor(gpu_vendor);
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kConfigRelease:
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kConfigDebug:
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((config->build_type() & kTokenData[token].flag) != 0) {
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PushErrorMessage(
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            kErrorMessage[kErrorEntryWithBuildTypeConflicts],
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            line_number);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      config->set_build_type(
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          config->build_type() | kTokenData[token].flag);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(false);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GPUTestExpectationsParser::UpdateTestConfig(
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GPUTestConfig* config,
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& gpu_device_id,
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t line_number) {
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(config);
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 device_id = 0;
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (config->gpu_device_id() != 0 ||
4521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !base::HexStringToUInt(gpu_device_id, &device_id) ||
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      device_id == 0) {
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PushErrorMessage(kErrorMessage[kErrorEntryWithGpuDeviceIdConflicts],
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     line_number);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  config->set_gpu_device_id(device_id);
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GPUTestExpectationsParser::DetectConflictsBetweenEntries() {
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool rt = false;
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < entries_.size(); ++i) {
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t j = i + 1; j < entries_.size(); ++j) {
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (entries_[i].test_name == entries_[j].test_name &&
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          entries_[i].test_config.OverlapsWith(entries_[j].test_config)) {
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PushErrorMessage(kErrorMessage[kErrorEntriesOverlap],
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         entries_[i].line_number,
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         entries_[j].line_number);
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rt = true;
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rt;
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GPUTestExpectationsParser::PushErrorMessage(
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& message, size_t line_number) {
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error_messages_.push_back(
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::StringPrintf("Line %d : %s",
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         static_cast<int>(line_number), message.c_str()));
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GPUTestExpectationsParser::PushErrorMessage(
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& message,
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t entry1_line_number,
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t entry2_line_number) {
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error_messages_.push_back(
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::StringPrintf("Line %d and %d : %s",
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         static_cast<int>(entry1_line_number),
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         static_cast<int>(entry2_line_number),
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         message.c_str()));
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GPUTestExpectationsParser:: GPUTestExpectationEntry::GPUTestExpectationEntry()
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : test_expectation(0),
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      line_number(0) {
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace gpu
50290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
503