module Selenium::WebDriver::Platform

def assert_executable(path)

def assert_executable(path)
  assert_file(path)
  return if File.executable? path
  raise Error::WebDriverError, "not executable: #{path.inspect}"
end

def assert_file(path)

def assert_file(path)
  return if File.file? path
  raise Error::WebDriverError, "not a file: #{path.inspect}"
end

def ci

def ci
  if ENV['TRAVIS']
    :travis
  elsif ENV['JENKINS']
    :jenkins
  elsif ENV['APPVEYOR']
    :appveyor
  elsif ENV['GITHUB_ACTIONS']
    :github
  end
end

def cygwin?

def cygwin?
  RUBY_PLATFORM.include?('cygwin')
end

def cygwin_path(path, only_cygwin: false, **opts)

def cygwin_path(path, only_cygwin: false, **opts)
  return path if only_cygwin && !cygwin?
  flags = []
  opts.each { |k, v| flags << "--#{k}" if v }
  `cygpath #{flags.join ' '} "#{path}"`.strip
end

def engine

def engine
  @engine ||= RUBY_ENGINE.to_sym
end

def exit_hook

def exit_hook
  pid = Process.pid
  at_exit { yield if Process.pid == pid }
end

def home

def home
  @home ||= Dir.home
end

def interfaces

def interfaces
  interfaces = Socket.getaddrinfo('localhost', 8080).map { |e| e[3] }
  interfaces += ['0.0.0.0', Platform.ip]
  interfaces.compact.uniq
end

def ip

def ip
  orig = Socket.do_not_reverse_lookup
  Socket.do_not_reverse_lookup = true
  begin
    UDPSocket.open do |s|
      s.connect '8.8.8.8', 53
      return s.addr.last
    end
  ensure
    Socket.do_not_reverse_lookup = orig
  end
rescue Errno::ENETUNREACH, Errno::EHOSTUNREACH
  # no external ip
end

def jruby?

def jruby?
  engine == :jruby
end

def linux?

def linux?
  os == :linux
end

def localhost

def localhost
  info = Socket.getaddrinfo 'localhost', 80, Socket::AF_INET, Socket::SOCK_STREAM
  return info[0][3] unless info.empty?
  raise Error::WebDriverError, "unable to translate 'localhost' for TCP + IPv4"
end

def mac?

def mac?
  os == :macosx
end

def make_writable(file)

def make_writable(file)
  File.chmod 0o766, file
end

def null_device

def null_device
  File::NULL
end

def os

def os
  host_os = RbConfig::CONFIG['host_os']
  @os ||= case host_os
          when /mswin|msys|mingw|cygwin|bccwin|wince|emc/
            :windows
          when /darwin|mac os/
            :macosx
          when /linux/
            :linux
          when /solaris|bsd/
            :unix
          else
            raise Error::WebDriverError, "unknown os: #{host_os.inspect}"
          end
end

def ruby_version

def ruby_version
  RUBY_VERSION
end

def truffleruby?

def truffleruby?
  engine == :truffleruby
end

def unix?

def unix?
  os == :unix
end

def unix_path(path)

def unix_path(path)
  path.tr(File::ALT_SEPARATOR, File::SEPARATOR)
end

def windows?

def windows?
  os == :windows
end

def windows_path(path)

def windows_path(path)
  path.tr(File::SEPARATOR, File::ALT_SEPARATOR)
end

def wrap_in_quotes_if_necessary(str)

def wrap_in_quotes_if_necessary(str)
  windows? && !cygwin? ? %("#{str}") : str
end

def wsl?

def wsl?
  return false unless linux?
  File.read('/proc/version').downcase.include?('microsoft')
rescue Errno::EACCES
  # the file cannot be accessed on Linux on DeX
  false
end