12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/test/expectations/expectation.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/win/windows_version.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_MACOSX) && !defined(OS_IOS)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/mac/mac_util.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_LINUX)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/sys_info.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace test_expectations {
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ResultFromString(const base::StringPiece& result, Result* out_result) {
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (result == "Failure")
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *out_result = RESULT_FAILURE;
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else if (result == "Timeout")
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *out_result = RESULT_TIMEOUT;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else if (result == "Crash")
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *out_result = RESULT_CRASH;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else if (result == "Skip")
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *out_result = RESULT_SKIP;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else if (result == "Pass")
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *out_result = RESULT_PASS;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static bool IsValidPlatform(const Platform* platform) {
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string& name = platform->name;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string& variant = platform->variant;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (name == "Win") {
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (variant != "" &&
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        variant != "XP" &&
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        variant != "Vista" &&
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        variant != "7" &&
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        variant != "8") {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (name == "Mac") {
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (variant != "" &&
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        variant != "10.6" &&
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        variant != "10.7" &&
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        variant != "10.8" &&
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        variant != "10.9" &&
54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        variant != "10.10") {
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (name == "Linux") {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (variant != "" &&
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        variant != "32" &&
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        variant != "64") {
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (name == "ChromeOS") {
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(rsesek): Figure out what ChromeOS needs.
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (name == "iOS") {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(rsesek): Figure out what iOS needs. Probably Device and Simulator.
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (name == "Android") {
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(rsesek): Figure out what Android needs.
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PlatformFromString(const base::StringPiece& modifier,
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        Platform* out_platform) {
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t sep = modifier.find('-');
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (sep == std::string::npos) {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    out_platform->name = modifier.as_string();
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    out_platform->variant.clear();
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    out_platform->name = modifier.substr(0, sep).as_string();
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    out_platform->variant = modifier.substr(sep + 1).as_string();
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsValidPlatform(out_platform);
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Platform GetCurrentPlatform() {
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Platform platform;
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  platform.name = "Win";
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::win::Version version = base::win::GetVersion();
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (version == base::win::VERSION_XP)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    platform.variant = "XP";
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else if (version == base::win::VERSION_VISTA)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    platform.variant = "Vista";
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else if (version == base::win::VERSION_WIN7)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    platform.variant = "7";
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else if (version == base::win::VERSION_WIN8)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    platform.variant = "8";
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_IOS)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  platform.name = "iOS";
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_MACOSX)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  platform.name = "Mac";
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (base::mac::IsOSSnowLeopard())
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    platform.variant = "10.6";
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else if (base::mac::IsOSLion())
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    platform.variant = "10.7";
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else if (base::mac::IsOSMountainLion())
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    platform.variant = "10.8";
1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  else if (base::mac::IsOSMavericks())
1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    platform.variant = "10.9";
115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  else if (base::mac::IsOSYosemite())
116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    platform.variant = "10.10";
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_CHROMEOS)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  platform.name = "ChromeOS";
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_ANDROID)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  platform.name = "Android";
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_LINUX)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  platform.name = "Linux";
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string arch = base::SysInfo::OperatingSystemArchitecture();
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (arch == "x86")
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    platform.variant = "32";
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else if (arch == "x86_64")
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    platform.variant = "64";
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED();
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return platform;
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ConfigurationFromString(const base::StringPiece& modifier,
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             Configuration* out_configuration) {
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (modifier == "Debug")
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *out_configuration = CONFIGURATION_DEBUG;
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else if (modifier == "Release")
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *out_configuration = CONFIGURATION_RELEASE;
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Configuration GetCurrentConfiguration() {
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if NDEBUG
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return CONFIGURATION_RELEASE;
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return CONFIGURATION_DEBUG;
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Expectation::Expectation()
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : configuration(CONFIGURATION_UNSPECIFIED),
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result(RESULT_PASS) {
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Expectation::~Expectation() {}
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace test_expectations
162