module Selenium
  module WebDriver
    class PortProber
      def self.above(port)
        port += 1 until free? port
        port
      end
      
      def self.random
        server = TCPServer.new(Platform.localhost, 0)
        port   = server.addr[1]
        server.close
        
        port
      end
      
      def self.free?(port)
        TCPServer.new(Platform.localhost, port).close
        true
      rescue SocketError, Errno::EADDRINUSE
        false
      end
    end # PortProber
  end # WebDriver
end # Selenium

module Selenium
  module WebDriver
    class PortProber
      def self.above(port)
        port += 1 until free? port
        port
      end

      def self.random
        server = TCPServer.new(Platform.localhost, 0)
        port   = server.addr[1]
        server.close

        port
      end

      def self.free?(port)
        interfaces = Socket.getaddrinfo("localhost", port).map { |e| e[2] }
        interfaces += ["0.0.0.0", Platform.ip]
        interfaces.each { |address| TCPServer.new(address, port).close }

        true
      rescue SocketError, Errno::EADDRINUSE
        false
      end

    end # PortProber
  end # WebDriver
end # Selenium

Make sure Ruby's PortProber.above checks all network interfaces.
JariBakken: Make sure Ruby's PortProber.above checks all network interfaces.

git-svn-id: aa1aa1384423cb28c2b1e29129bb3a91de1d9196@16769 07704840-8298-11de-bf8c-fd130f914ac9
