160 lines
4.4 KiB
PHP
160 lines
4.4 KiB
PHP
<?php
|
|
|
|
namespace Laravel\Dusk;
|
|
|
|
use Illuminate\Support\Str;
|
|
use InvalidArgumentException;
|
|
|
|
class OperatingSystem
|
|
{
|
|
/**
|
|
* List of available operating system platforms.
|
|
*
|
|
* @var array<string, array{slug: string, commands: array<int, string>}>
|
|
*/
|
|
protected static $platforms = [
|
|
'linux' => [
|
|
'slug' => 'linux64',
|
|
'commands' => [
|
|
'/usr/bin/google-chrome --version',
|
|
'/usr/bin/chromium-browser --version',
|
|
'/usr/bin/chromium --version',
|
|
'/usr/bin/google-chrome-stable --version',
|
|
],
|
|
],
|
|
'mac' => [
|
|
'slug' => 'mac-x64',
|
|
'commands' => [
|
|
'/Applications/Google\ Chrome\ for\ Testing.app/Contents/MacOS/Google\ Chrome\ for\ Testing --version',
|
|
'/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --version',
|
|
],
|
|
],
|
|
'mac-intel' => [
|
|
'slug' => 'mac-x64',
|
|
'commands' => [
|
|
'/Applications/Google\ Chrome\ for\ Testing.app/Contents/MacOS/Google\ Chrome\ for\ Testing --version',
|
|
'/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --version',
|
|
],
|
|
],
|
|
'mac-arm' => [
|
|
'slug' => 'mac-arm64',
|
|
'commands' => [
|
|
'/Applications/Google\ Chrome\ for\ Testing.app/Contents/MacOS/Google\ Chrome\ for\ Testing --version',
|
|
'/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --version',
|
|
],
|
|
],
|
|
'win' => [
|
|
'slug' => 'win32',
|
|
'commands' => [
|
|
'reg query "HKEY_CURRENT_USER\Software\Google\Chrome\BLBeacon" /v version',
|
|
],
|
|
],
|
|
];
|
|
|
|
/**
|
|
* Resolve the Chrome version commands for the given operating system.
|
|
*
|
|
* @param string $operatingSystem
|
|
* @return array<int, string>
|
|
*/
|
|
public static function chromeVersionCommands($operatingSystem)
|
|
{
|
|
$commands = static::$platforms[$operatingSystem]['commands'] ?? null;
|
|
|
|
if (is_null($commands)) {
|
|
throw new InvalidArgumentException("Unable to find commands for Operating System [{$operatingSystem}]");
|
|
}
|
|
|
|
return $commands;
|
|
}
|
|
|
|
/**
|
|
* Resolve the ChromeDriver slug for the given operating system.
|
|
*
|
|
* @param string $operatingSystem
|
|
* @param string|null $version
|
|
* @return string
|
|
*/
|
|
public static function chromeDriverSlug($operatingSystem, $version = null)
|
|
{
|
|
$slug = static::$platforms[$operatingSystem]['slug'] ?? null;
|
|
|
|
if (is_null($slug)) {
|
|
throw new InvalidArgumentException("Unable to find ChromeDriver slug for Operating System [{$operatingSystem}]");
|
|
}
|
|
|
|
if (! is_null($version) && version_compare($version, '115.0', '<')) {
|
|
if ($slug === 'mac-arm64') {
|
|
return version_compare($version, '106.0.5249', '<') ? 'mac64_m1' : 'mac_arm64';
|
|
} elseif ($slug === 'mac-x64') {
|
|
return 'mac64';
|
|
}
|
|
}
|
|
|
|
return $slug;
|
|
}
|
|
|
|
/**
|
|
* Get all supported operating systems.
|
|
*
|
|
* @return array<int, string>
|
|
*/
|
|
public static function all()
|
|
{
|
|
return array_keys(static::$platforms);
|
|
}
|
|
|
|
/**
|
|
* Get the current operating system identifier.
|
|
*
|
|
* @return string
|
|
*/
|
|
public static function id()
|
|
{
|
|
if (static::onWindows()) {
|
|
return 'win';
|
|
} elseif (static::onMac()) {
|
|
return static::macArchitectureId();
|
|
}
|
|
|
|
return 'linux';
|
|
}
|
|
|
|
/**
|
|
* Determine if the operating system is Windows or Windows Subsystem for Linux.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public static function onWindows()
|
|
{
|
|
return PHP_OS === 'WINNT' || Str::contains(php_uname(), 'Microsoft');
|
|
}
|
|
|
|
/**
|
|
* Determine if the operating system is macOS.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public static function onMac()
|
|
{
|
|
return PHP_OS === 'Darwin';
|
|
}
|
|
|
|
/**
|
|
* Get the current macOS platform architecture.
|
|
*
|
|
* @return string
|
|
*/
|
|
public static function macArchitectureId()
|
|
{
|
|
switch (php_uname('m')) {
|
|
case 'arm64':
|
|
return 'mac-arm';
|
|
case 'x86_64':
|
|
return 'mac-intel';
|
|
default:
|
|
return 'mac';
|
|
}
|
|
}
|
|
}
|