Sha256: c5bbb856fea325fd1b506b473f7f48ecc89cd90afe965e56292458dde35f7c74

Contents?: true

Size: 1.2 KB

Versions: 1

Compression:

Stored size: 1.2 KB

Contents

module SauceTunnel
  class Tunnel
    class Error < StandardError; end

    attr_reader :sc_path, :sc_args

    def initialize(sc_path: "sc", sc_args: [], quiet: false, timeout: 120, shutdown_timeout: 20)
      @sc_path = sc_path
      @sc_args = sc_args
      @quiet = quiet
      @timeout = timeout
      @shutdown_timeout = shutdown_timeout

      @queue = SauceTunnel::SimpleQueue.new
      @up = false
    end

    def connect
      return if @wait_thread # don't start twice

      @stdin, @stdout, @stderr, @wait_thread = Open3.popen3(Shellwords.join([sc_path] + [sc_args].flatten))

      @read_thread = Thread.new do
        while line = @stdout.gets
          puts line unless quiet?
          @queue.push(true) if line =~ /sauce connect is up/i
        end
      end
    end

    def await
      @up ||= @queue.pop(@timeout)
      self
    rescue ThreadError
      raise ConnectionError, "timed out trying to establish connection to SauceLabs"
    end

    def terminate
      if @wait_thread
        Process.kill("TERM", @wait_thread.pid)
        @wait_thread.join(@shutdown_timeout)
      end
    rescue Errno::ESRCH
      # do nothing, tunnel already shut down
    end

    def quiet?
      @quiet
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
sauce_tunnel-0.1.0 lib/sauce_tunnel/tunnel.rb