blob: 5b2b7f5d87a414aeab47e02e254befefa9a13a22 [file] [log] [blame] [edit]
// <copyright file="Platform.cs" company="WebDriver Committers">
// Licensed to the Software Freedom Conservancy (SFC) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The SFC licenses this file
// to you under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// </copyright>
using System;
namespace OpenQA.Selenium
{
/// <summary>
/// Represents the known and supported Platforms that WebDriver runs on.
/// </summary>
/// <remarks>The <see cref="Platform"/> class maps closely to the Operating System,
/// but differs slightly, because this class is used to extract information such as
/// program locations and line endings. </remarks>
public enum PlatformType
{
/// <summary>
/// Any platform. This value is never returned by a driver, but can be used to find
/// drivers with certain capabilities.
/// </summary>
Any,
/// <summary>
/// Any version of Microsoft Windows. This value is never returned by a driver,
/// but can be used to find drivers with certain capabilities.
/// </summary>
Windows,
/// <summary>
/// Any Windows NT-based version of Microsoft Windows. This value is never returned
/// by a driver, but can be used to find drivers with certain capabilities. This value
/// is equivalent to PlatformType.Windows.
/// </summary>
WinNT = Windows,
/// <summary>
/// Versions of Microsoft Windows that are compatible with Windows XP.
/// </summary>
XP,
/// <summary>
/// Versions of Microsoft Windows that are compatible with Windows Vista.
/// </summary>
Vista,
/// <summary>
/// Any version of the Macintosh OS
/// </summary>
Mac,
/// <summary>
/// Any version of the Unix operating system.
/// </summary>
Unix,
/// <summary>
/// Any version of the Linux operating system.
/// </summary>
Linux,
/// <summary>
/// A version of the Android mobile operating system.
/// </summary>
Android
}
/// <summary>
/// Represents the platform on which tests are to be run.
/// </summary>
public class Platform
{
private static Platform current;
private PlatformType platformTypeValue;
private int major;
private int minor;
/// <summary>
/// Initializes a new instance of the <see cref="Platform"/> class for a specific platform type.
/// </summary>
/// <param name="typeValue">The platform type.</param>
public Platform(PlatformType typeValue)
{
this.platformTypeValue = typeValue;
}
private Platform()
{
this.major = Environment.OSVersion.Version.Major;
this.minor = Environment.OSVersion.Version.Minor;
switch (Environment.OSVersion.Platform)
{
case PlatformID.Win32NT:
if (this.major == 5)
{
this.platformTypeValue = PlatformType.XP;
}
else if (this.major == 6)
{
this.platformTypeValue = PlatformType.Vista;
}
else
{
this.platformTypeValue = PlatformType.Windows;
}
break;
// Thanks to a bug in Mono Mac and Linux will be treated the same https://bugzilla.novell.com/show_bug.cgi?id=515570 but adding this in case
case PlatformID.MacOSX:
this.platformTypeValue = PlatformType.Mac;
break;
case PlatformID.Unix:
this.platformTypeValue = PlatformType.Unix;
break;
}
}
/// <summary>
/// Gets the current platform.
/// </summary>
public static Platform CurrentPlatform
{
get
{
if (current == null)
{
current = new Platform();
}
return current;
}
}
/// <summary>
/// Gets the major version of the platform operating system.
/// </summary>
public int MajorVersion
{
get { return this.major; }
}
/// <summary>
/// Gets the major version of the platform operating system.
/// </summary>
public int MinorVersion
{
get { return this.minor; }
}
/// <summary>
/// Gets the type of the platform.
/// </summary>
public PlatformType PlatformType
{
get { return this.platformTypeValue; }
}
/// <summary>
/// Gets the value of the platform type for transmission using the JSON Wire Protocol.
/// </summary>
public string ProtocolPlatformType
{
get { return this.platformTypeValue.ToString("G").ToUpperInvariant(); }
}
/// <summary>
/// Compares the platform to the specified type.
/// </summary>
/// <param name="compareTo">A <see cref="PlatformType"/> value to compare to.</param>
/// <returns><see langword="true"/> if the platforms match; otherwise <see langword="false"/>.</returns>
public bool IsPlatformType(PlatformType compareTo)
{
bool platformIsType = false;
switch (compareTo)
{
case PlatformType.Any:
platformIsType = true;
break;
case PlatformType.Windows:
platformIsType = this.platformTypeValue == PlatformType.Windows || this.platformTypeValue == PlatformType.XP || this.platformTypeValue == PlatformType.Vista;
break;
case PlatformType.Vista:
platformIsType = this.platformTypeValue == PlatformType.Windows || this.platformTypeValue == PlatformType.Vista;
break;
case PlatformType.XP:
platformIsType = this.platformTypeValue == PlatformType.Windows || this.platformTypeValue == PlatformType.XP;
break;
case PlatformType.Linux:
platformIsType = this.platformTypeValue == PlatformType.Linux || this.platformTypeValue == PlatformType.Unix;
break;
default:
platformIsType = this.platformTypeValue == compareTo;
break;
}
return platformIsType;
}
/// <summary>
/// Returns the string value for this platform type.
/// </summary>
/// <returns>The string value for this platform type.</returns>
public override string ToString()
{
return this.platformTypeValue.ToString();
}
/// <summary>
/// Creates a <see cref="Platform"/> object from a string name of the platform.
/// </summary>
/// <param name="platformName">The name of the platform to create.</param>
/// <returns>The Platform object represented by the string name.</returns>
internal static Platform FromString(string platformName)
{
PlatformType platformTypeFromString = PlatformType.Any;
try
{
platformTypeFromString = (PlatformType)Enum.Parse(typeof(PlatformType), platformName, true);
}
catch (ArgumentException)
{
// If the requested platform string is not a valid platform type,
// ignore it and use PlatformType.Any.
}
return new Platform(platformTypeFromString);
}
}
}