blob: 6c4f797f5d61785d77aec5ec64c524019770d1f6 [file] [log] [blame]
[email protected]db78bca52012-01-27 01:53:581// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]129f019e2013-05-28 23:38:025#include "gpu/config/gpu_test_expectations_parser.h"
[email protected]db78bca52012-01-27 01:53:586
avif15d60a2015-12-21 17:06:337#include <stddef.h>
8#include <stdint.h>
9
thestigc9e38a22014-09-13 01:02:1110#include "base/files/file_util.h"
[email protected]db78bca52012-01-27 01:53:5811#include "base/logging.h"
[email protected]f4390962013-06-11 07:29:2212#include "base/strings/string_number_conversions.h"
[email protected]27c05732013-02-15 21:55:4913#include "base/strings/string_split.h"
[email protected]f4390962013-06-11 07:29:2214#include "base/strings/string_util.h"
15#include "base/strings/stringprintf.h"
[email protected]129f019e2013-05-28 23:38:0216
17namespace gpu {
[email protected]db78bca52012-01-27 01:53:5818
19namespace {
20
21enum LineParserStage {
22 kLineParserBegin = 0,
23 kLineParserBugID,
24 kLineParserConfigs,
25 kLineParserColon,
26 kLineParserTestName,
27 kLineParserEqual,
28 kLineParserExpectations,
29};
30
31enum Token {
32 // os
33 kConfigWinXP = 0,
34 kConfigWinVista,
35 kConfigWin7,
[email protected]c9fc22f2012-11-16 23:39:5636 kConfigWin8,
wfh0355eead2015-07-22 04:15:0037 kConfigWin10,
[email protected]db78bca52012-01-27 01:53:5838 kConfigWin,
39 kConfigMacLeopard,
40 kConfigMacSnowLeopard,
41 kConfigMacLion,
[email protected]c9fc22f2012-11-16 23:39:5642 kConfigMacMountainLion,
[email protected]710089b92014-02-04 01:16:0943 kConfigMacMavericks,
iceman3197ce82015-04-15 11:02:3244 kConfigMacYosemite,
bajones019b3c802015-11-18 19:36:5845 kConfigMacElCapitan,
erikchenaf3ffdd22016-07-21 22:34:5646 kConfigMacSierra,
[email protected]db78bca52012-01-27 01:53:5847 kConfigMac,
48 kConfigLinux,
49 kConfigChromeOS,
[email protected]61d7e5e2012-07-27 04:08:5750 kConfigAndroid,
[email protected]db78bca52012-01-27 01:53:5851 // gpu vendor
52 kConfigNVidia,
53 kConfigAMD,
54 kConfigIntel,
[email protected]830631c2012-06-13 05:06:0855 kConfigVMWare,
[email protected]db78bca52012-01-27 01:53:5856 // build type
57 kConfigRelease,
58 kConfigDebug,
jmadill073a3232015-07-22 21:10:5259 // ANGLE renderer
60 kConfigD3D9,
61 kConfigD3D11,
62 kConfigGLDesktop,
63 kConfigGLES,
[email protected]db78bca52012-01-27 01:53:5864 // expectation
65 kExpectationPass,
66 kExpectationFail,
67 kExpectationFlaky,
68 kExpectationTimeout,
[email protected]55ab0192012-05-11 20:12:3769 kExpectationSkip,
[email protected]db78bca52012-01-27 01:53:5870 // separator
71 kSeparatorColon,
72 kSeparatorEqual,
73
74 kNumberOfExactMatchTokens,
75
76 // others
77 kConfigGPUDeviceID,
78 kTokenComment,
79 kTokenWord,
80};
81
82struct TokenInfo {
83 const char* name;
avif15d60a2015-12-21 17:06:3384 int32_t flag;
[email protected]db78bca52012-01-27 01:53:5885};
86
87const TokenInfo kTokenData[] = {
jmadill073a3232015-07-22 21:10:5288 {"xp", GPUTestConfig::kOsWinXP},
89 {"vista", GPUTestConfig::kOsWinVista},
90 {"win7", GPUTestConfig::kOsWin7},
91 {"win8", GPUTestConfig::kOsWin8},
92 {"win10", GPUTestConfig::kOsWin10},
93 {"win", GPUTestConfig::kOsWin},
94 {"leopard", GPUTestConfig::kOsMacLeopard},
95 {"snowleopard", GPUTestConfig::kOsMacSnowLeopard},
96 {"lion", GPUTestConfig::kOsMacLion},
97 {"mountainlion", GPUTestConfig::kOsMacMountainLion},
98 {"mavericks", GPUTestConfig::kOsMacMavericks},
99 {"yosemite", GPUTestConfig::kOsMacYosemite},
bajones019b3c802015-11-18 19:36:58100 {"elcapitan", GPUTestConfig::kOsMacElCapitan},
erikchenaf3ffdd22016-07-21 22:34:56101 {"sierra", GPUTestConfig::kOsMacSierra},
jmadill073a3232015-07-22 21:10:52102 {"mac", GPUTestConfig::kOsMac},
103 {"linux", GPUTestConfig::kOsLinux},
104 {"chromeos", GPUTestConfig::kOsChromeOS},
105 {"android", GPUTestConfig::kOsAndroid},
106 {"nvidia", 0x10DE},
107 {"amd", 0x1002},
108 {"intel", 0x8086},
109 {"vmware", 0x15ad},
110 {"release", GPUTestConfig::kBuildTypeRelease},
111 {"debug", GPUTestConfig::kBuildTypeDebug},
112 {"d3d9", GPUTestConfig::kAPID3D9},
113 {"d3d11", GPUTestConfig::kAPID3D11},
114 {"opengl", GPUTestConfig::kAPIGLDesktop},
115 {"gles", GPUTestConfig::kAPIGLES},
116 {"pass", GPUTestExpectationsParser::kGpuTestPass},
117 {"fail", GPUTestExpectationsParser::kGpuTestFail},
118 {"flaky", GPUTestExpectationsParser::kGpuTestFlaky},
119 {"timeout", GPUTestExpectationsParser::kGpuTestTimeout},
120 {"skip", GPUTestExpectationsParser::kGpuTestSkip},
121 {":", 0},
122 {"=", 0},
[email protected]db78bca52012-01-27 01:53:58123};
124
125enum ErrorType {
126 kErrorFileIO = 0,
127 kErrorIllegalEntry,
128 kErrorInvalidEntry,
129 kErrorEntryWithOsConflicts,
130 kErrorEntryWithGpuVendorConflicts,
131 kErrorEntryWithBuildTypeConflicts,
jmadill073a3232015-07-22 21:10:52132 kErrorEntryWithAPIConflicts,
[email protected]db78bca52012-01-27 01:53:58133 kErrorEntryWithGpuDeviceIdConflicts,
134 kErrorEntryWithExpectationConflicts,
135 kErrorEntriesOverlap,
136
137 kNumberOfErrors,
138};
139
140const char* kErrorMessage[] = {
jmadill073a3232015-07-22 21:10:52141 "file IO failed",
142 "entry with wrong format",
143 "entry invalid, likely wrong modifiers combination",
144 "entry with OS modifier conflicts",
145 "entry with GPU vendor modifier conflicts",
146 "entry with GPU build type conflicts",
147 "entry with GPU API conflicts",
148 "entry with GPU device id conflicts or malformat",
149 "entry with expectation modifier conflicts",
150 "two entries' configs overlap",
[email protected]db78bca52012-01-27 01:53:58151};
152
153Token ParseToken(const std::string& word) {
brettw95509312015-07-16 23:57:33154 if (base::StartsWith(word, "//", base::CompareCase::INSENSITIVE_ASCII))
[email protected]db78bca52012-01-27 01:53:58155 return kTokenComment;
brettw95509312015-07-16 23:57:33156 if (base::StartsWith(word, "0x", base::CompareCase::INSENSITIVE_ASCII))
[email protected]db78bca52012-01-27 01:53:58157 return kConfigGPUDeviceID;
158
avif15d60a2015-12-21 17:06:33159 for (int32_t i = 0; i < kNumberOfExactMatchTokens; ++i) {
brettwbc17d2c82015-06-09 22:39:08160 if (base::LowerCaseEqualsASCII(word, kTokenData[i].name))
[email protected]db78bca52012-01-27 01:53:58161 return static_cast<Token>(i);
162 }
163 return kTokenWord;
164}
165
[email protected]55ab0192012-05-11 20:12:37166// reference name can have the last character as *.
167bool NamesMatching(const std::string& ref, const std::string& test_name) {
168 size_t len = ref.length();
169 if (len == 0)
170 return false;
171 if (ref[len - 1] == '*') {
172 if (test_name.length() > len -1 &&
173 ref.compare(0, len - 1, test_name, 0, len - 1) == 0)
174 return true;
175 return false;
176 }
177 return (ref == test_name);
178}
179
[email protected]db78bca52012-01-27 01:53:58180} // namespace anonymous
181
182GPUTestExpectationsParser::GPUTestExpectationsParser() {
183 // Some sanity check.
184 DCHECK_EQ(static_cast<unsigned int>(kNumberOfExactMatchTokens),
185 sizeof(kTokenData) / sizeof(kTokenData[0]));
186 DCHECK_EQ(static_cast<unsigned int>(kNumberOfErrors),
187 sizeof(kErrorMessage) / sizeof(kErrorMessage[0]));
188}
189
190GPUTestExpectationsParser::~GPUTestExpectationsParser() {
191}
192
193bool GPUTestExpectationsParser::LoadTestExpectations(const std::string& data) {
194 entries_.clear();
195 error_messages_.clear();
196
brettw26dab8f02015-08-08 00:28:47197 std::vector<std::string> lines = base::SplitString(
198 data, "\n", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
[email protected]db78bca52012-01-27 01:53:58199 bool rt = true;
200 for (size_t i = 0; i < lines.size(); ++i) {
201 if (!ParseLine(lines[i], i + 1))
202 rt = false;
203 }
204 if (DetectConflictsBetweenEntries()) {
205 entries_.clear();
206 rt = false;
207 }
208
209 return rt;
210}
211
[email protected]d30a36f2013-02-07 04:16:26212bool GPUTestExpectationsParser::LoadTestExpectations(
213 const base::FilePath& path) {
[email protected]db78bca52012-01-27 01:53:58214 entries_.clear();
215 error_messages_.clear();
216
217 std::string data;
[email protected]82f84b92013-08-30 18:23:50218 if (!base::ReadFileToString(path, &data)) {
[email protected]db78bca52012-01-27 01:53:58219 error_messages_.push_back(kErrorMessage[kErrorFileIO]);
220 return false;
221 }
222 return LoadTestExpectations(data);
223}
224
avif15d60a2015-12-21 17:06:33225int32_t GPUTestExpectationsParser::GetTestExpectation(
[email protected]db78bca52012-01-27 01:53:58226 const std::string& test_name,
227 const GPUTestBotConfig& bot_config) const {
228 for (size_t i = 0; i < entries_.size(); ++i) {
[email protected]55ab0192012-05-11 20:12:37229 if (NamesMatching(entries_[i].test_name, test_name) &&
[email protected]db78bca52012-01-27 01:53:58230 bot_config.Matches(entries_[i].test_config))
231 return entries_[i].test_expectation;
232 }
233 return kGpuTestPass;
234}
235
236const std::vector<std::string>&
237GPUTestExpectationsParser::GetErrorMessages() const {
238 return error_messages_;
239}
240
[email protected]830631c2012-06-13 05:06:08241bool GPUTestExpectationsParser::ParseConfig(
242 const std::string& config_data, GPUTestConfig* config) {
243 DCHECK(config);
brettw26dab8f02015-08-08 00:28:47244 std::vector<std::string> tokens = base::SplitString(
245 config_data, base::kWhitespaceASCII, base::KEEP_WHITESPACE,
246 base::SPLIT_WANT_NONEMPTY);
[email protected]830631c2012-06-13 05:06:08247
248 for (size_t i = 0; i < tokens.size(); ++i) {
249 Token token = ParseToken(tokens[i]);
250 switch (token) {
251 case kConfigWinXP:
252 case kConfigWinVista:
253 case kConfigWin7:
[email protected]c9fc22f2012-11-16 23:39:56254 case kConfigWin8:
wfh0355eead2015-07-22 04:15:00255 case kConfigWin10:
[email protected]830631c2012-06-13 05:06:08256 case kConfigWin:
257 case kConfigMacLeopard:
258 case kConfigMacSnowLeopard:
259 case kConfigMacLion:
[email protected]c9fc22f2012-11-16 23:39:56260 case kConfigMacMountainLion:
[email protected]710089b92014-02-04 01:16:09261 case kConfigMacMavericks:
iceman3197ce82015-04-15 11:02:32262 case kConfigMacYosemite:
bajones019b3c802015-11-18 19:36:58263 case kConfigMacElCapitan:
erikchenaf3ffdd22016-07-21 22:34:56264 case kConfigMacSierra:
[email protected]830631c2012-06-13 05:06:08265 case kConfigMac:
266 case kConfigLinux:
267 case kConfigChromeOS:
[email protected]61d7e5e2012-07-27 04:08:57268 case kConfigAndroid:
[email protected]830631c2012-06-13 05:06:08269 case kConfigNVidia:
270 case kConfigAMD:
271 case kConfigIntel:
272 case kConfigVMWare:
273 case kConfigRelease:
274 case kConfigDebug:
jmadill073a3232015-07-22 21:10:52275 case kConfigD3D9:
276 case kConfigD3D11:
277 case kConfigGLDesktop:
278 case kConfigGLES:
[email protected]830631c2012-06-13 05:06:08279 case kConfigGPUDeviceID:
280 if (token == kConfigGPUDeviceID) {
281 if (!UpdateTestConfig(config, tokens[i], 0))
282 return false;
283 } else {
284 if (!UpdateTestConfig(config, token, 0))
285 return false;
286 }
287 break;
288 default:
289 return false;
290 }
291 }
292 return true;
293}
294
[email protected]db78bca52012-01-27 01:53:58295bool GPUTestExpectationsParser::ParseLine(
296 const std::string& line_data, size_t line_number) {
brettw26dab8f02015-08-08 00:28:47297 std::vector<std::string> tokens = base::SplitString(
298 line_data, base::kWhitespaceASCII, base::KEEP_WHITESPACE,
299 base::SPLIT_WANT_NONEMPTY);
avif15d60a2015-12-21 17:06:33300 int32_t stage = kLineParserBegin;
[email protected]db78bca52012-01-27 01:53:58301 GPUTestExpectationEntry entry;
302 entry.line_number = line_number;
303 GPUTestConfig& config = entry.test_config;
304 bool comments_encountered = false;
305 for (size_t i = 0; i < tokens.size() && !comments_encountered; ++i) {
306 Token token = ParseToken(tokens[i]);
307 switch (token) {
308 case kTokenComment:
309 comments_encountered = true;
310 break;
311 case kConfigWinXP:
312 case kConfigWinVista:
313 case kConfigWin7:
[email protected]c9fc22f2012-11-16 23:39:56314 case kConfigWin8:
wfh0355eead2015-07-22 04:15:00315 case kConfigWin10:
[email protected]db78bca52012-01-27 01:53:58316 case kConfigWin:
317 case kConfigMacLeopard:
318 case kConfigMacSnowLeopard:
319 case kConfigMacLion:
[email protected]c9fc22f2012-11-16 23:39:56320 case kConfigMacMountainLion:
[email protected]710089b92014-02-04 01:16:09321 case kConfigMacMavericks:
iceman3197ce82015-04-15 11:02:32322 case kConfigMacYosemite:
bajones019b3c802015-11-18 19:36:58323 case kConfigMacElCapitan:
erikchenaf3ffdd22016-07-21 22:34:56324 case kConfigMacSierra:
[email protected]db78bca52012-01-27 01:53:58325 case kConfigMac:
326 case kConfigLinux:
327 case kConfigChromeOS:
[email protected]61d7e5e2012-07-27 04:08:57328 case kConfigAndroid:
[email protected]db78bca52012-01-27 01:53:58329 case kConfigNVidia:
330 case kConfigAMD:
331 case kConfigIntel:
[email protected]830631c2012-06-13 05:06:08332 case kConfigVMWare:
[email protected]db78bca52012-01-27 01:53:58333 case kConfigRelease:
334 case kConfigDebug:
jmadill073a3232015-07-22 21:10:52335 case kConfigD3D9:
336 case kConfigD3D11:
337 case kConfigGLDesktop:
338 case kConfigGLES:
[email protected]db78bca52012-01-27 01:53:58339 case kConfigGPUDeviceID:
340 // MODIFIERS, could be in any order, need at least one.
341 if (stage != kLineParserConfigs && stage != kLineParserBugID) {
342 PushErrorMessage(kErrorMessage[kErrorIllegalEntry],
343 line_number);
344 return false;
345 }
346 if (token == kConfigGPUDeviceID) {
347 if (!UpdateTestConfig(&config, tokens[i], line_number))
348 return false;
349 } else {
350 if (!UpdateTestConfig(&config, token, line_number))
351 return false;
352 }
353 if (stage == kLineParserBugID)
354 stage++;
355 break;
356 case kSeparatorColon:
357 // :
358 if (stage != kLineParserConfigs) {
359 PushErrorMessage(kErrorMessage[kErrorIllegalEntry],
360 line_number);
361 return false;
362 }
363 stage++;
364 break;
365 case kSeparatorEqual:
366 // =
367 if (stage != kLineParserTestName) {
368 PushErrorMessage(kErrorMessage[kErrorIllegalEntry],
369 line_number);
370 return false;
371 }
372 stage++;
373 break;
374 case kTokenWord:
375 // BUG_ID or TEST_NAME
376 if (stage == kLineParserBegin) {
377 // Bug ID is not used for anything; ignore it.
378 } else if (stage == kLineParserColon) {
379 entry.test_name = tokens[i];
380 } else {
381 PushErrorMessage(kErrorMessage[kErrorIllegalEntry],
382 line_number);
383 return false;
384 }
385 stage++;
386 break;
387 case kExpectationPass:
388 case kExpectationFail:
389 case kExpectationFlaky:
390 case kExpectationTimeout:
[email protected]55ab0192012-05-11 20:12:37391 case kExpectationSkip:
[email protected]db78bca52012-01-27 01:53:58392 // TEST_EXPECTATIONS
393 if (stage != kLineParserEqual && stage != kLineParserExpectations) {
394 PushErrorMessage(kErrorMessage[kErrorIllegalEntry],
395 line_number);
396 return false;
397 }
398 if ((kTokenData[token].flag & entry.test_expectation) != 0) {
399 PushErrorMessage(kErrorMessage[kErrorEntryWithExpectationConflicts],
400 line_number);
401 return false;
402 }
403 entry.test_expectation =
404 (kTokenData[token].flag | entry.test_expectation);
405 if (stage == kLineParserEqual)
406 stage++;
407 break;
408 default:
409 DCHECK(false);
410 break;
411 }
412 }
413 if (stage == kLineParserBegin) {
414 // The whole line is empty or all comments
415 return true;
416 }
417 if (stage == kLineParserExpectations) {
418 if (!config.IsValid()) {
419 PushErrorMessage(kErrorMessage[kErrorInvalidEntry], line_number);
420 return false;
421 }
422 entries_.push_back(entry);
423 return true;
424 }
425 PushErrorMessage(kErrorMessage[kErrorIllegalEntry], line_number);
426 return false;
427}
428
avif15d60a2015-12-21 17:06:33429bool GPUTestExpectationsParser::UpdateTestConfig(GPUTestConfig* config,
430 int32_t token,
431 size_t line_number) {
[email protected]db78bca52012-01-27 01:53:58432 DCHECK(config);
433 switch (token) {
434 case kConfigWinXP:
435 case kConfigWinVista:
436 case kConfigWin7:
[email protected]c9fc22f2012-11-16 23:39:56437 case kConfigWin8:
wfh0355eead2015-07-22 04:15:00438 case kConfigWin10:
[email protected]db78bca52012-01-27 01:53:58439 case kConfigWin:
440 case kConfigMacLeopard:
441 case kConfigMacSnowLeopard:
442 case kConfigMacLion:
[email protected]c9fc22f2012-11-16 23:39:56443 case kConfigMacMountainLion:
[email protected]710089b92014-02-04 01:16:09444 case kConfigMacMavericks:
iceman3197ce82015-04-15 11:02:32445 case kConfigMacYosemite:
bajones019b3c802015-11-18 19:36:58446 case kConfigMacElCapitan:
erikchenaf3ffdd22016-07-21 22:34:56447 case kConfigMacSierra:
[email protected]db78bca52012-01-27 01:53:58448 case kConfigMac:
449 case kConfigLinux:
450 case kConfigChromeOS:
[email protected]61d7e5e2012-07-27 04:08:57451 case kConfigAndroid:
[email protected]db78bca52012-01-27 01:53:58452 if ((config->os() & kTokenData[token].flag) != 0) {
453 PushErrorMessage(kErrorMessage[kErrorEntryWithOsConflicts],
454 line_number);
455 return false;
456 }
457 config->set_os(config->os() | kTokenData[token].flag);
458 break;
459 case kConfigNVidia:
460 case kConfigAMD:
461 case kConfigIntel:
[email protected]830631c2012-06-13 05:06:08462 case kConfigVMWare:
[email protected]db78bca52012-01-27 01:53:58463 {
avif15d60a2015-12-21 17:06:33464 uint32_t gpu_vendor = static_cast<uint32_t>(kTokenData[token].flag);
[email protected]db78bca52012-01-27 01:53:58465 for (size_t i = 0; i < config->gpu_vendor().size(); ++i) {
466 if (config->gpu_vendor()[i] == gpu_vendor) {
467 PushErrorMessage(
468 kErrorMessage[kErrorEntryWithGpuVendorConflicts],
469 line_number);
470 return false;
471 }
472 }
473 config->AddGPUVendor(gpu_vendor);
474 }
475 break;
476 case kConfigRelease:
477 case kConfigDebug:
478 if ((config->build_type() & kTokenData[token].flag) != 0) {
479 PushErrorMessage(
480 kErrorMessage[kErrorEntryWithBuildTypeConflicts],
481 line_number);
482 return false;
483 }
484 config->set_build_type(
485 config->build_type() | kTokenData[token].flag);
486 break;
jmadill073a3232015-07-22 21:10:52487 case kConfigD3D9:
488 case kConfigD3D11:
489 case kConfigGLDesktop:
490 case kConfigGLES:
491 if ((config->api() & kTokenData[token].flag) != 0) {
492 PushErrorMessage(kErrorMessage[kErrorEntryWithAPIConflicts],
493 line_number);
494 return false;
495 }
496 config->set_api(config->api() | kTokenData[token].flag);
497 break;
[email protected]db78bca52012-01-27 01:53:58498 default:
499 DCHECK(false);
500 break;
501 }
502 return true;
503}
504
505bool GPUTestExpectationsParser::UpdateTestConfig(
506 GPUTestConfig* config,
507 const std::string& gpu_device_id,
508 size_t line_number) {
509 DCHECK(config);
avif15d60a2015-12-21 17:06:33510 uint32_t device_id = 0;
[email protected]db78bca52012-01-27 01:53:58511 if (config->gpu_device_id() != 0 ||
[email protected]3fb01692013-10-23 13:37:04512 !base::HexStringToUInt(gpu_device_id, &device_id) ||
[email protected]db78bca52012-01-27 01:53:58513 device_id == 0) {
514 PushErrorMessage(kErrorMessage[kErrorEntryWithGpuDeviceIdConflicts],
515 line_number);
516 return false;
517 }
518 config->set_gpu_device_id(device_id);
519 return true;
520}
521
522bool GPUTestExpectationsParser::DetectConflictsBetweenEntries() {
523 bool rt = false;
524 for (size_t i = 0; i < entries_.size(); ++i) {
525 for (size_t j = i + 1; j < entries_.size(); ++j) {
526 if (entries_[i].test_name == entries_[j].test_name &&
527 entries_[i].test_config.OverlapsWith(entries_[j].test_config)) {
528 PushErrorMessage(kErrorMessage[kErrorEntriesOverlap],
529 entries_[i].line_number,
530 entries_[j].line_number);
531 rt = true;
532 }
533 }
534 }
535 return rt;
536}
537
538void GPUTestExpectationsParser::PushErrorMessage(
539 const std::string& message, size_t line_number) {
540 error_messages_.push_back(
541 base::StringPrintf("Line %d : %s",
542 static_cast<int>(line_number), message.c_str()));
543}
544
545void GPUTestExpectationsParser::PushErrorMessage(
546 const std::string& message,
547 size_t entry1_line_number,
548 size_t entry2_line_number) {
549 error_messages_.push_back(
550 base::StringPrintf("Line %d and %d : %s",
551 static_cast<int>(entry1_line_number),
552 static_cast<int>(entry2_line_number),
553 message.c_str()));
554}
555
[email protected]db78bca52012-01-27 01:53:58556GPUTestExpectationsParser:: GPUTestExpectationEntry::GPUTestExpectationEntry()
557 : test_expectation(0),
558 line_number(0) {
559}
560
[email protected]129f019e2013-05-28 23:38:02561} // namespace gpu
562