1// Copyright (c) 2013 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
5#include "base/test/expectations/expectation.h"
6
7#include "base/logging.h"
8
9#if defined(OS_WIN)
10#include "base/win/windows_version.h"
11#elif defined(OS_MACOSX) && !defined(OS_IOS)
12#include "base/mac/mac_util.h"
13#elif defined(OS_LINUX)
14#include "base/sys_info.h"
15#endif
16
17namespace test_expectations {
18
19bool ResultFromString(const base::StringPiece& result, Result* out_result) {
20  if (result == "Failure")
21    *out_result = RESULT_FAILURE;
22  else if (result == "Timeout")
23    *out_result = RESULT_TIMEOUT;
24  else if (result == "Crash")
25    *out_result = RESULT_CRASH;
26  else if (result == "Skip")
27    *out_result = RESULT_SKIP;
28  else if (result == "Pass")
29    *out_result = RESULT_PASS;
30  else
31    return false;
32
33  return true;
34}
35
36static bool IsValidPlatform(const Platform* platform) {
37  const std::string& name = platform->name;
38  const std::string& variant = platform->variant;
39
40  if (name == "Win") {
41    if (variant != "" &&
42        variant != "XP" &&
43        variant != "Vista" &&
44        variant != "7" &&
45        variant != "8") {
46      return false;
47    }
48  } else if (name == "Mac") {
49    if (variant != "" &&
50        variant != "10.6" &&
51        variant != "10.7" &&
52        variant != "10.8" &&
53        variant != "10.9" &&
54        variant != "10.10") {
55      return false;
56    }
57  } else if (name == "Linux") {
58    if (variant != "" &&
59        variant != "32" &&
60        variant != "64") {
61      return false;
62    }
63  } else if (name == "ChromeOS") {
64    // TODO(rsesek): Figure out what ChromeOS needs.
65  } else if (name == "iOS") {
66    // TODO(rsesek): Figure out what iOS needs. Probably Device and Simulator.
67  } else if (name == "Android") {
68    // TODO(rsesek): Figure out what Android needs.
69  } else {
70    return false;
71  }
72
73  return true;
74}
75
76bool PlatformFromString(const base::StringPiece& modifier,
77                        Platform* out_platform) {
78  size_t sep = modifier.find('-');
79  if (sep == std::string::npos) {
80    out_platform->name = modifier.as_string();
81    out_platform->variant.clear();
82  } else {
83    out_platform->name = modifier.substr(0, sep).as_string();
84    out_platform->variant = modifier.substr(sep + 1).as_string();
85  }
86
87  return IsValidPlatform(out_platform);
88}
89
90Platform GetCurrentPlatform() {
91  Platform platform;
92#if defined(OS_WIN)
93  platform.name = "Win";
94  base::win::Version version = base::win::GetVersion();
95  if (version == base::win::VERSION_XP)
96    platform.variant = "XP";
97  else if (version == base::win::VERSION_VISTA)
98    platform.variant = "Vista";
99  else if (version == base::win::VERSION_WIN7)
100    platform.variant = "7";
101  else if (version == base::win::VERSION_WIN8)
102    platform.variant = "8";
103#elif defined(OS_IOS)
104  platform.name = "iOS";
105#elif defined(OS_MACOSX)
106  platform.name = "Mac";
107  if (base::mac::IsOSSnowLeopard())
108    platform.variant = "10.6";
109  else if (base::mac::IsOSLion())
110    platform.variant = "10.7";
111  else if (base::mac::IsOSMountainLion())
112    platform.variant = "10.8";
113  else if (base::mac::IsOSMavericks())
114    platform.variant = "10.9";
115  else if (base::mac::IsOSYosemite())
116    platform.variant = "10.10";
117#elif defined(OS_CHROMEOS)
118  platform.name = "ChromeOS";
119#elif defined(OS_ANDROID)
120  platform.name = "Android";
121#elif defined(OS_LINUX)
122  platform.name = "Linux";
123  std::string arch = base::SysInfo::OperatingSystemArchitecture();
124  if (arch == "x86")
125    platform.variant = "32";
126  else if (arch == "x86_64")
127    platform.variant = "64";
128#else
129  NOTREACHED();
130#endif
131  return platform;
132}
133
134bool ConfigurationFromString(const base::StringPiece& modifier,
135                             Configuration* out_configuration) {
136  if (modifier == "Debug")
137    *out_configuration = CONFIGURATION_DEBUG;
138  else if (modifier == "Release")
139    *out_configuration = CONFIGURATION_RELEASE;
140  else
141    return false;
142
143  return true;
144}
145
146Configuration GetCurrentConfiguration() {
147#if NDEBUG
148  return CONFIGURATION_RELEASE;
149#else
150  return CONFIGURATION_DEBUG;
151#endif
152}
153
154Expectation::Expectation()
155    : configuration(CONFIGURATION_UNSPECIFIED),
156      result(RESULT_PASS) {
157}
158
159Expectation::~Expectation() {}
160
161}  // namespace test_expectations
162