saucelabs-adapter 0.7.6

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Kelly Felkins & Sam Pierson
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.markdown ADDED
@@ -0,0 +1,150 @@
1
+ Saucelabs-Adapter
2
+ =================
3
+
4
+ Saucelabs-adapter provides the glue to connect Rails Selenium tests to saucelabs.com.
5
+
6
+ Currently it supports tests written using Webrat, Polonium and JSUnit.
7
+
8
+ Getting Started - Webrat or Polonium test suites
9
+ ------------------------------------------------
10
+
11
+ 1. Prerequisites:
12
+
13
+ You must be able to run selenium tests locally using test/selenium/selenium_suite.rb
14
+
15
+ 2. Install the gem:
16
+
17
+ gem install saucelabs-adapter --source gems.pivotallabs.com
18
+
19
+ 3. Run the saucelabs_adapter generator in your project:
20
+
21
+ cd your_project
22
+
23
+ script/generate saucelabs_adapter
24
+
25
+ 4. Configure it. In config/selenium.yml, replace YOUR-SAUCELABS-USERNAME and
26
+ YOUR-SAUCELABS-ACCESS-KEY with your saucelabs.com account information.
27
+
28
+ 5. Run Tests
29
+
30
+ To run Selenium Test::Unit tests locally:
31
+
32
+ rake selenium:local
33
+
34
+ To run Selenium Test::Unit tests using saucelabs.com:
35
+
36
+ rake selenium:sauce
37
+
38
+ Getting Started - JsUnit test suite
39
+ -----------------------------------
40
+
41
+ 1. Prerequisites:
42
+
43
+ Install the latest JsUnit from http://github.com/pivotal/jsunit
44
+
45
+ JsUnit must be installed in RAILS_ROOT/public/jsunit as follows:
46
+
47
+ public/jsunit/jsunit_jar/jsunit.jar -- the compiled jar
48
+ public/jsunit/jsunit/build.xml etc... -- jsunit sources
49
+
50
+ 2. Install the saucelabs-adapter gem:
51
+
52
+ gem install saucelabs-adapter --source gems.pivotallabs.com
53
+
54
+ 3. Run the saucelabs_adapter generator in your project:
55
+
56
+ cd your_project
57
+
58
+ script/generate saucelabs_adapter --jsunit
59
+
60
+ 4. Configure it.
61
+
62
+ In config/selenium.yml, replace YOUR-SAUCELABS-USERNAME and
63
+ YOUR-SAUCELABS-ACCESS-KEY with your saucelabs.com account information.
64
+
65
+ Rename RAILS_ROOT/test/jsunit/jsunit_suite_example.rb to RAILS_ROOT/test/jsunit/jsunit_suite.rb
66
+ and modify it if necessary:
67
+ test_page needs to be set to the path under /public where your JsUnit test page (suite.html or similar) lives,
68
+ with '/jsunit' prepended. e.g. if your JsUnit suite runs from RAILS_ROOT/public/javascripts/test-pages/suite.html
69
+ then test_page needs to be set to '/jsunit/javascripts/test-pages/suite.html'.
70
+
71
+ 5. Run Tests
72
+
73
+ To run JsUnit tests locally:
74
+
75
+ rake jsunit:selenium_rc:local
76
+
77
+ To run JsUnit tests using saucelabs.com:
78
+
79
+ rake jsunit:selenium_rc:sauce
80
+
81
+ What You Should See
82
+ -------------------
83
+
84
+ When running tests, intermixed with your test output you should see the following lines:
85
+
86
+ [saucelabs-adapter] Setting up tunnel from Saucelabs (yourhostname-12345.com:80) to localhost:4000
87
+ [saucelabs-adapter] Tunnel ID 717909c571b8319dc5ae708b689fd7f5 for yourhostname-12345.com is up.
88
+ Started
89
+ ....................
90
+ [saucelabs-adapter] Shutting down tunnel to Saucelabs...
91
+ [saucelabs-adapter] done.
92
+
93
+ In Case of Problems
94
+ -------------------
95
+ Try setting environment variable SAUCELABS_ADAPTER_DEBUG to "true". This enables more verbose output.
96
+
97
+
98
+ Continuous Integration
99
+ ----------------------
100
+ Sauce Labs now lets you set the name of a test job.
101
+ By default the SaucelabsAdapter will set this to the name of the machine it is currently running on,
102
+ however you may override this by setting the environment variable SAUCELABS_JOB_NAME.
103
+
104
+ This can be useful if you run many tests from the same CI machine and would like to differentiate between
105
+ them without actually viewing the video.
106
+
107
+ What it Does
108
+ ------------
109
+
110
+ The saucelabs-adapter performs two functions when it detects you are running a test that will use saucelabs.com:
111
+
112
+ 1. It sets up a SauceTunnel before the test run starts and tears it down after the test ends. This happens once for the entire test run.
113
+
114
+ 2. It configures the selenium client to connect to the correct address at saucelabs.com. This happens at the start of each test.
115
+
116
+ CHANGES
117
+ =======
118
+ 0.7.6
119
+ -----
120
+ - Added saucelabs_max_duration configuration option.
121
+
122
+ 0.7.0
123
+ -----
124
+ - The gem has been reorganized to better conform with Gem best-practices.
125
+
126
+ - The rakefile generator has changed. If you are upgrading, you will need to rerun the generator and overwrite lib/tasks/saucelabs_adapter.rake,
127
+ or just change line 1 of that file to read:
128
+
129
+ require 'saucelabs_adapter/run_utils'
130
+
131
+ - The selenium.yml syntax has changed to break out all the saucelabs info into separate lines, and the tunnel method is now explicitly stated:
132
+
133
+ - Old:
134
+ selenium_browser_key: '{"username": "YOUR-SAUCELABS-USERNAME", "access-key": "YOUR-SAUCELABS-ACCESS-KEY", "os": "Linux", "browser": "firefox", "browser-version": "3."}'
135
+ #
136
+ localhost_app_server_port: "4000"
137
+ tunnel_startup_timeout: 240
138
+
139
+ - New:
140
+ saucelabs_username: "YOUR-SAUCELABS-USERNAME"
141
+ saucelabs_access_key: "YOUR-SAUCELABS-ACCESS-KEY"
142
+ saucelabs_browser_os: "Linux"
143
+ saucelabs_browser: "firefox"
144
+ saucelabs_browser_version: "3."
145
+ #
146
+ tunnel_method: :saucetunnel
147
+ tunnel_to_localhost_port: 4000
148
+ tunnel_startup_timeout: 240
149
+
150
+ - The dependency on Python has been removed.
data/Rakefile ADDED
@@ -0,0 +1,108 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ require 'rake'
5
+ require 'spec'
6
+ require 'spec/rake/spectask'
7
+
8
+ desc 'Default: run unit tests.'
9
+ task :default => :spec
10
+
11
+ desc 'Test the saucelabs-adapter plugin.'
12
+ Spec::Rake::SpecTask.new(:spec) do |t|
13
+ t.libs << 'lib'
14
+ t.verbose = true
15
+ end
16
+
17
+ begin
18
+ require 'jeweler'
19
+ Jeweler::Tasks.new do |gem|
20
+ gem.name = "saucelabs-adapter"
21
+ gem.summary = %Q{Adapter for running Selenium tests using SauceLabs.com}
22
+ gem.description = %Q{This gem augments Test::Unit and Polonium/Webrat to run Selenium tests in the cloud. }
23
+ gem.email = "pair+kelly+sam@pivotallabs.com"
24
+ gem.homepage = "http://github.com/pivotal/saucelabs-adapter"
25
+ gem.authors = ["Kelly Felkins, Chad Woolley & Sam Pierson"]
26
+ gem.files = [
27
+ "LICENSE",
28
+ "README.rdoc",
29
+ "Rakefile",
30
+ "VERSION",
31
+ "lib/saucelabs_adapter.rb",
32
+ "lib/saucelabs-adapter.rb",
33
+ "lib/saucelabs_adapter/run_utils.rb",
34
+ "lib/saucelabs_adapter/sauce_tunnel.rb",
35
+ "lib/saucelabs_adapter/selenium_config.rb",
36
+ "lib/saucelabs_adapter/test_unit_adapter.rb",
37
+ "lib/saucelabs_adapter/jsunit_selenium_support.rb",
38
+ "lib/saucerest-ruby/saucerest.rb",
39
+ "lib/saucerest-ruby/gateway.rb",
40
+ "lib/saucerest-python/tunnel.py",
41
+ "lib/saucerest-python/daemon.py",
42
+ "lib/saucerest-python/saucerest.py",
43
+ "lib/saucerest-python/sshtunnel.py",
44
+ "lib/tasks/jsunit.rake",
45
+ "generators/saucelabs_adapter/saucelabs_adapter_generator.rb",
46
+ "generators/saucelabs_adapter/templates/selenium.yml",
47
+ "generators/saucelabs_adapter/templates/saucelabs_adapter.rake",
48
+ "generators/saucelabs_adapter/templates/jsunit.rake",
49
+ "generators/saucelabs_adapter/templates/jsunit_suite_example.rb"
50
+ ]
51
+ gem.add_dependency 'rest-client', '>= 1.2.0'
52
+ gem.add_dependency 'net-ssh', '>= 2.0.12'
53
+ gem.add_dependency 'net-ssh-gateway', '>= 1.0.1'
54
+ gem.add_dependency 'selenium-client', '>= 1.2.17'
55
+ gem.add_dependency 'lsof', '>= 0.3.0'
56
+ # gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
57
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
58
+ end
59
+ Jeweler::GemcutterTasks.new
60
+ rescue LoadError
61
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
62
+ end
63
+
64
+ require 'rake/testtask'
65
+ Rake::TestTask.new(:test) do |test|
66
+ test.libs << 'lib' << 'test'
67
+ test.pattern = 'test/**/test_*.rb'
68
+ test.verbose = true
69
+ end
70
+
71
+ begin
72
+ require 'rcov/rcovtask'
73
+ Rcov::RcovTask.new do |test|
74
+ test.libs << 'test'
75
+ test.pattern = 'test/**/test_*.rb'
76
+ test.verbose = true
77
+ end
78
+ rescue LoadError
79
+ task :rcov do
80
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
81
+ end
82
+ end
83
+
84
+ task :test => :check_dependencies
85
+
86
+ #task :default => :test
87
+
88
+ require 'rake/rdoctask'
89
+ Rake::RDocTask.new do |rdoc|
90
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
91
+
92
+ rdoc.rdoc_dir = 'rdoc'
93
+ rdoc.title = "saucelabs-adapter #{version}"
94
+ rdoc.rdoc_files.include('README*')
95
+ rdoc.rdoc_files.include('lib/**/*.rb')
96
+ end
97
+
98
+ def run(command)
99
+ puts command
100
+ puts `#{command}`
101
+ end
102
+
103
+ desc "Push gem to gemcutter.org"
104
+ task :deploy => :build do
105
+ gem = `ls pkg/*|tail -1`.strip
106
+ puts "Deploying #{gem}:"
107
+ run "gem push #{gem}"
108
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.7.6
@@ -0,0 +1,49 @@
1
+
2
+ # This generator bootstraps a Rails project for use with RSpec
3
+ class SaucelabsAdapterGenerator < Rails::Generator::Base
4
+ DEFAULT_SHEBANG = File.join(Config::CONFIG['bindir'],
5
+ Config::CONFIG['ruby_install_name'])
6
+
7
+ def initialize(runtime_args, runtime_options = {})
8
+ puts <<-HELPFUL_INSTRUCTIONS
9
+
10
+ The saucelabs_adapter generator installs glue to connect your Selenium tests to saucelabs.com
11
+
12
+ After running this generator:
13
+
14
+ 1) Go edit config/selenium.yml and add your SauceLabs API credentials
15
+ 2) Add this to your selenium_helper.rb:
16
+
17
+ require 'saucelabs-adapter'
18
+
19
+ HELPFUL_INSTRUCTIONS
20
+ super
21
+ end
22
+
23
+ def manifest
24
+ record do |m|
25
+ m.directory 'lib/tasks'
26
+ m.file 'saucelabs_adapter.rake', 'lib/tasks/saucelabs_adapter.rake'
27
+ m.file 'selenium.yml', 'config/selenium.yml'
28
+ if options[:jsunit]
29
+ m.file 'jsunit.rake', 'lib/tasks/jsunit.rake'
30
+ m.directory 'test/jsunit'
31
+ m.file 'jsunit_suite_example.rb', 'test/jsunit/jsunit_suite_example.rb'
32
+ end
33
+ end
34
+ end
35
+
36
+ protected
37
+
38
+ def banner
39
+ "Usage: #{$0} saucelabs_adapter [options]"
40
+ end
41
+
42
+ def add_options!(opt)
43
+ opt.separator ''
44
+ opt.separator 'Options:'
45
+ opt.on('--jsunit', 'Also install Saucelabs support for JsUnit') do |value|
46
+ options[:jsunit] = true
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,62 @@
1
+ require 'run_utils'
2
+
3
+ namespace :jsunit do
4
+ namespace :selenium_rc do
5
+ desc "Runs JsUnit tests locally using configuration 'local' in config/selenium.yml (selenium server must already be started)"
6
+ task :local => [:local_jsunit_env, :suite]
7
+
8
+ desc "Run JsUnit tests at saucelabs.com (using configuration 'saucelabs' in config/selenium.yml)"
9
+ task :sauce => [:sauce_jsunit_env, :suite]
10
+
11
+ desc "Run JsUnit tests at saucelabs.com for all supported browsers"
12
+ task :sauce_all => [:sauce_jsunit_all_env, :suite]
13
+
14
+ desc "Run Selenium tests using configuration SELENIUM_ENV (from config/selenium.yml)"
15
+ task :custom => [:check_selenium_env_is_set, :suite]
16
+
17
+ task :local_jsunit_env do
18
+ ENV['SELENIUM_ENV'] = 'local_jsunit'
19
+ end
20
+
21
+ task :sauce_jsunit_env do
22
+ ENV['SELENIUM_ENV'] = 'saucelabs_jsunit'
23
+ end
24
+
25
+ task :sauce_jsunit_all_env do
26
+ ENV['SELENIUM_ENV'] = "saucelabs_jsunit_firefox,saucelabs_jsunit_ie,saucelabs_jsunit_chrome,saucelabs_jsunit_safari"
27
+ end
28
+
29
+ task :check_selenium_env_is_set do
30
+ raise "SELENIUM_ENV must be set" unless ENV['SELENIUM_ENV']
31
+ end
32
+
33
+ task :suite do
34
+ unless (File.exists?("test/jsunit/jsunit_suite.rb"))
35
+ raise "test/jsunit/jsunit_suite.rb not found, bailing.\nPlease create a script that will run your jsunit tests."
36
+ end
37
+ ENV['RUNNING_POLONIUM'] = 'false'
38
+
39
+ # TODO: This multi-suite support is a hack and slow, but it's the easiest way to support it without major refactoring to saucelabs_adapter
40
+ env = ENV['SELENIUM_ENV']
41
+ if env =~ /,/
42
+ begin
43
+ envs = env.split(',')
44
+ envs.each do |single_env|
45
+ ENV['SELENIUM_ENV'] = single_env
46
+ run_suite
47
+ end
48
+ ensure
49
+ # make sure we reset it to avoid confusion
50
+ ENV['SELENIUM_ENV'] = env
51
+ end
52
+ else
53
+ run_suite
54
+ end
55
+ end
56
+
57
+ def run_suite
58
+ success = RunUtils.run "ruby test/jsunit/jsunit_suite.rb"
59
+ raise "Jsunit suite run for #{ENV['SELENIUM_ENV']} environment failed." unless success
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,19 @@
1
+ require File.dirname(__FILE__) + "/../test_helper"
2
+ require "saucelabs_adapter"
3
+
4
+ class JsunitTest < ActiveSupport::TestCase
5
+ include ::JsunitSeleniumSupport
6
+
7
+ def setup
8
+ setup_jsunit_selenium # :timeout_in_seconds => 60, :app_server_logfile_path => "#{RAILS_ROOT}/log/jsunit_jetty_app_server.log"
9
+ end
10
+
11
+ def teardown
12
+ teardown_jsunit_selenium
13
+ end
14
+
15
+ def test_javascript
16
+ test_page = "/jsunit/javascripts/test-pages/" + (ENV['TEST'] ? "#{ENV['TEST']}.html" : "suite.html")
17
+ assert run_jsunit_test({:testPage => test_page}, :jsunit_suite_timeout_seconds => 600, :verbose => true)
18
+ end
19
+ end
@@ -0,0 +1,53 @@
1
+ require 'saucelabs_adapter/run_utils'
2
+
3
+ class Rake::Task
4
+ def self.exists?(name)
5
+ tasks.any? { |t| t.name == name }
6
+ end
7
+ end
8
+
9
+ namespace :selenium do
10
+
11
+ # Rake tasks are cumulative, and some old plugins are still defining selenium:server, so clear it.
12
+ Rake::Task[:'selenium:server'].clear_actions if Rake::Task.exists?('selenium:server')
13
+
14
+ desc "Run the selenium remote-control server"
15
+ task :server do
16
+ system('selenium-rc')
17
+ end
18
+
19
+ desc "Run the selenium remote-control server in the background"
20
+ task :server_bg do
21
+ system('nohup selenium-rc 2&>1 &')
22
+ end
23
+
24
+ desc "Runs Selenium tests locally (selenium server must already be started)"
25
+ task :local => [:local_env, :suite]
26
+
27
+ desc "Run Selenium tests at saucelabs.com (using configuration 'saucelabs' in config/selenium.yml)"
28
+ task :sauce => [:sauce_env, :suite]
29
+
30
+ desc "Run Selenium tests using configuration SELENIUM_ENV (from config/selenium.yml)"
31
+ task :custom => [:check_selenium_env_is_set, :suite]
32
+
33
+ task :local_env do
34
+ ENV['SELENIUM_ENV'] = 'local'
35
+ end
36
+
37
+ task :sauce_env do
38
+ ENV['SELENIUM_ENV'] = 'saucelabs'
39
+ end
40
+
41
+ task :check_selenium_env_is_set do
42
+ raise "SELENIUM_ENV must be set" unless ENV['SELENIUM_ENV']
43
+ end
44
+
45
+ task :suite do
46
+ if (File.exists?("test/selenium/selenium_suite.rb"))
47
+ RunUtils.run "ruby test/selenium/selenium_suite.rb"
48
+ else
49
+ puts "test/selenium/selenium_suite.rb not found, bailing.\nPlease create a script that will run your selenium tests."
50
+ exit 1
51
+ end
52
+ end
53
+ end