diff --git a/.gitignore b/.gitignore index 0fcdb13..86d8b76 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ dist/* *.log +browserstack.err diff --git a/Gemfile b/Gemfile index 49cd10f..68f3992 100644 --- a/Gemfile +++ b/Gemfile @@ -1,4 +1,4 @@ source "http://rubygems.org" gem "minitest" gem "rake" - +gem "json" diff --git a/Gemfile.lock b/Gemfile.lock index a1b2118..c73ad7a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,6 +1,7 @@ GEM remote: http://rubygems.org/ specs: + json (1.8.3) minitest (5.8.4) rake (10.5.0) @@ -8,5 +9,9 @@ PLATFORMS ruby DEPENDENCIES + json minitest rake + +BUNDLED WITH + 1.11.2 diff --git a/Rakefile b/Rakefile index 241715f..eab441f 100644 --- a/Rakefile +++ b/Rakefile @@ -12,4 +12,5 @@ task :build do move_command = RbConfig::CONFIG['host_os'].match(/mswin|msys|mingw|cygwin|bccwin|wince|emc|win32/) ? "move" : "mv"; system "#{move_command} browserstack-local-*.gem dist" system "gem install ./dist/browserstack-local-*.gem" + system "rm -rf dist" end diff --git a/browserstack-local.gemspec b/browserstack-local.gemspec index 28681a4..f4a18b9 100644 --- a/browserstack-local.gemspec +++ b/browserstack-local.gemspec @@ -1,10 +1,10 @@ Gem::Specification.new do |s| s.name = 'browserstack-local' - s.version = '0.1.1' + s.version = '0.2.0' s.date = '2016-05-04' s.summary = "BrowserStack Local" s.description = "Ruby bindings for BrowserStack Local" - s.authors = [""] + s.authors = ["BrowserStack"] s.email = 'support@browserstack.com' s.files = ["lib/browserstack/local.rb", "lib/browserstack/localbinary.rb", "lib/browserstack/localexception.rb"] s.homepage = diff --git a/lib/browserstack/local.rb b/lib/browserstack/local.rb index 2e11af4..3e2f544 100644 --- a/lib/browserstack/local.rb +++ b/lib/browserstack/local.rb @@ -1,5 +1,6 @@ require 'browserstack/localbinary' require 'browserstack/localexception' +require 'json' module BrowserStack @@ -75,36 +76,29 @@ def start(options = {}) end if defined? spawn - @process = IO.popen(command_args) + @process = IO.popen(start_command_args) else - @process = IO.popen(command) + @process = IO.popen(start_command) end - @stdout = File.open(@logfile, "r") while true begin - line = @stdout.readline + line = @process.readline rescue EOFError => e sleep 1 next end - break if line.nil? - if line.match(/\*\*\* Error\:/) - @stdout.close - raise BrowserStack::LocalException.new(line) + + data = JSON.parse(line) rescue {"message" => "Unable to parse daemon mode JSON output"} + if data['state'].to_s != "connected" + @process.close + raise BrowserStack::LocalException.new(data["message"]) return - end - if line.strip == "Press Ctrl-C to exit" - @pid = @process.pid - @stdout.close + else + @pid = data["pid"] break end end - - while true - break if self.isRunning - sleep 1 - end end def isRunning @@ -113,20 +107,37 @@ def isRunning def stop return if @pid.nil? - Process.kill("TERM", @pid) rescue Process.kill(9, @pid) @process.close - @pid = nil if @is_windows - while self.isRunning - sleep 1 + if defined? spawn + @process = IO.popen(stop_command_args) + else + @process = IO.popen(stop_command) end + @process.close + @pid = nil end def command - "#{@exec} #{@binary_path} -logFile '#{@logfile}' #{@folder_flag} #{@key} #{@folder_path} #{@force_local_flag} #{@local_identifier_flag} #{@only_flag} #{@only_automate_flag} #{@proxy_host} #{@proxy_port} #{@proxy_user} #{@proxy_pass} #{@force_proxy_flag} #{@force_flag} #{@verbose_flag} #{@hosts} #{@user_arguments.join(" ")}".strip + start_command + end + + def start_command + "#{@binary_path} -d start -logFile '#{@logfile}' #{@folder_flag} #{@key} #{@folder_path} #{@force_local_flag} #{@local_identifier_flag} #{@only_flag} #{@only_automate_flag} #{@proxy_host} #{@proxy_port} #{@proxy_user} #{@proxy_pass} #{@force_proxy_flag} #{@force_flag} #{@verbose_flag} #{@hosts} #{@user_arguments.join(" ")} 2>&1".strip + end + + def start_command_args + args = ["#{@binary_path}", "-d", "start", "-logFile", "#{@logfile}", "#{@key}", "#{@folder_flag}", "#{@folder_path}", "#{@force_local_flag}", "#{@local_identifier_flag}", "#{@only_flag}", "#{@only_automate_flag}", "#{@proxy_host}", "#{@proxy_port}", "#{@proxy_user}", "#{@proxy_pass}", "#{@force_proxy_flag}","#{@force_flag}", "#{@verbose_flag}", "#{@hosts}", "#{@user_arguments.join(" ")}"] + args = args.select {|a| a.to_s != "" } + args.push(:err => [:child, :out]) + args + end + + def stop_command + "#{@binary_path} -d stop #{@local_identifier_flag}".strip end - def command_args - args = ["#{@binary_path}", "-logFile", "#{@logfile}", "#{@key}", "#{@folder_flag}", "#{@folder_path}", "#{@force_local_flag}", "#{@local_identifier_flag}", "#{@only_flag}", "#{@only_automate_flag}", "#{@proxy_host}", "#{@proxy_port}", "#{@proxy_user}", "#{@proxy_pass}", "#{@force_proxy_flag}","#{@force_flag}", "#{@verbose_flag}", "#{@hosts}", "#{@user_arguments.join(" ")}"] + def stop_command_args + args = ["#{@binary_path}", "-d", "stop", "#{@local_identifier_flag}"] args = args.select {|a| a.to_s != "" } args.push(:err => [:child, :out]) args