require ‘cucumber/rake/task’
BROWSERS = JSON.load(File.open(‘browsers.json’))
desc ‘Run all cross browser tests in parallel (with ENV parallel limit)’ task :crossbrowsify => [:environment] do
parallel_limit = ENV["nodes"] || 2 parallel_limit = parallel_limit.to_i sliced = BROWSERS.keys.each_slice(parallel_limit).to_a browser_groups = sliced.first.zip(*sliced[1..-1]) browser_groups.each_with_index do |browser_group, group_index| browser_group.compact.each do |browser_name| if ENV['CIRCLE_NODE_INDEX'].to_i == group_index puts "Cross browser testing against #{browser_name}." Rake::Task["crossbrowsify:#{browser_name}"].execute end end end
end
namespace :crossbrowsify do
desc "Downloading browserstack binary" task :setup do download_browserstack unless File.exists? 'BrowserStackLocal' end desc "Open a tunnel for browserstack to access" task :run_local => [:setup] do unless File.exists? 'browserstack_tunnel_map.json' raise 'Missing browserstack_tunnel_map.json file! [{ name: "hostname", port: port_number}, ...]' end hosts = JSON.load(File.open('browserstack_tunnel_map.json')).inject('') do |params, host| params += host['name'] + ',' + host['port'].to_s + ',0,' end identifier = ENV['CI'] ? "-localIdentifier #{ENV['CIRCLE_PROJECT_REPONAME']}-node-#{ENV['CIRCLE_NODE_INDEX']}" : '' puts 'Starting a local tunnel to Browserstack...' tunnel = Thread.new do puts `./BrowserStackLocal #{identifier} -force -skipCheck $BS_AUTHKEY #{hosts}` end puts 'Started!' tunnel.join end BROWSERS.each_pair do |browser_name, browser| mobile = browser["mobile"] || false Cucumber::Rake::Task.new("#{browser_name}_run".to_sym) do |task| unless mobile task.cucumber_opts = ["--tags @cross_browser --tags ~@mobile"] else task.cucumber_opts = ["--tags @cross_browser --tags ~@not_mobile"] end task.cucumber_opts << '-r features' end desc "Run cucumber against #{browser['human']}" task browser_name do ENV['BROWSER_TASK_NAME'] = browser_name Rake::Task["crossbrowsify:#{browser_name}_run"].execute end end
end
def download_browserstack
if `uname` =~ /darwin/i url = "https://www.browserstack.com/browserstack-local/BrowserStackLocal-darwin-x64.zip" else url = "https://www.browserstack.com/browserstack-local/BrowserStackLocal-linux-x64.zip " end `curl #{url} > browserstack.zip` `unzip browserstack.zip` File.delete('browserstack.zip')
end