seleniumrc 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. data/CHANGES +4 -0
  2. data/README +38 -0
  3. data/Rakefile +1 -1
  4. data/lib/seleniumrc.rb +2 -4
  5. data/lib/seleniumrc/dsl/selenium_dsl.rb +8 -143
  6. data/lib/seleniumrc/extensions/testrunnermediator.rb +2 -2
  7. data/lib/seleniumrc/mongrel_selenium_server_runner.rb +9 -7
  8. data/lib/seleniumrc/selenium_configuration.rb +233 -40
  9. data/lib/seleniumrc/selenium_driver.rb +193 -0
  10. data/lib/seleniumrc/selenium_element.rb +31 -37
  11. data/lib/seleniumrc/selenium_page.rb +16 -16
  12. data/lib/seleniumrc/selenium_server_runner.rb +1 -1
  13. data/lib/seleniumrc/selenium_test_case.rb +2 -4
  14. data/lib/seleniumrc/wait_for.rb +3 -10
  15. data/lib/seleniumrc/webrick_selenium_server_runner.rb +11 -11
  16. data/spec/seleniumrc/mongrel_selenium_server_runner_spec.rb +31 -38
  17. data/spec/seleniumrc/selenese_interpreter_spec.rb +12 -12
  18. data/spec/seleniumrc/selenium_configuration_spec.rb +350 -12
  19. data/spec/seleniumrc/selenium_driver_spec.rb +104 -0
  20. data/spec/seleniumrc/selenium_element_spec.rb +78 -76
  21. data/spec/seleniumrc/selenium_page_spec.rb +39 -29
  22. data/spec/seleniumrc/selenium_test_case_spec.rb +631 -673
  23. data/spec/seleniumrc/selenium_test_case_spec_helper.rb +0 -7
  24. data/spec/seleniumrc/webrick_selenium_server_runner_spec.rb +14 -13
  25. data/spec/spec_helper.rb +7 -1
  26. metadata +4 -7
  27. data/lib/seleniumrc/app_server_checker.rb +0 -43
  28. data/lib/seleniumrc/extensions/selenium_driver.rb +0 -33
  29. data/lib/seleniumrc/selenium_context.rb +0 -226
  30. data/spec/seleniumrc/app_server_checker_spec.rb +0 -56
  31. data/spec/seleniumrc/selenium_context_spec.rb +0 -362
data/CHANGES CHANGED
@@ -1,2 +1,6 @@
1
+ 0.0.2
2
+ * Supports multiple sessions by instantiating multiple SeleniumDrivers
3
+ * Added Seleniumrc::SeleniumDriver which holds most of the polling methods
4
+
1
5
  0.0.1
2
6
  * Initial Release. More documentation to come.
data/README CHANGED
@@ -0,0 +1,38 @@
1
+ == Introduction
2
+
3
+ Welcome to Selenium RC!
4
+
5
+ This plugin is designed to let you use Selenium RC to write Selenium tests in Ruby, using a simple series of
6
+ Rake tasks.
7
+
8
+ == Installation
9
+
10
+ The current version of this plugin can be found at: http://rubyforge.org/var/svn/pivotalrb/seleniumrc/trunk
11
+
12
+ You may install the plugin with the following command:
13
+
14
+ script/plugin install svn://rubyforge.org/var/svn/pivotalrb/seleniumrc/trunk
15
+
16
+ == Usage
17
+ The seleniumrc plugin assumes you have a test/selenium directory with a selenium_suite.rb file in
18
+ it. A sample selenium_suite.rb and selenium_helper.rb can be copied into your test/selenium directory.
19
+
20
+ You'll get the following tasks:
21
+ - selenium:test - starts a Selenium RC server, runs selenium tests, and shuts the server down
22
+ when they're done
23
+
24
+ and lower level tasks as well:
25
+ - selenium:server starts up a Selenium RC server
26
+ - selenium:test_with_server_started runs Selenium tests off of an existing server
27
+
28
+ == Future Enhancements
29
+
30
+ There are a few things we'd like to improve, but we wanted to get this out now. Check the tracker in the pivotal.rb RubyForge project for details.
31
+
32
+ == License
33
+
34
+ Selenium RC Fu is distributed under the MIT license. Copyright © 2007 Pivotal Labs, Inc.
35
+
36
+ == Contributing
37
+
38
+ Contributions to this plugin are welcome. Contributions should be accompanied by tests. See http://pivotalrb.rubyforge.org for more details.
data/Rakefile CHANGED
@@ -26,7 +26,7 @@ def run_suite
26
26
  end
27
27
 
28
28
  PKG_NAME = "seleniumrc"
29
- PKG_VERSION = "0.0.1"
29
+ PKG_VERSION = "0.0.2"
30
30
  PKG_FILES = FileList[
31
31
  '[A-Z]*',
32
32
  '*.rb',
@@ -10,15 +10,13 @@ require 'test/unit/testresult'
10
10
 
11
11
  require "selenium"
12
12
  require "seleniumrc/extensions/testrunnermediator"
13
- require "seleniumrc/extensions/selenium_driver"
14
- require "seleniumrc/app_server_checker"
13
+ require "seleniumrc/wait_for"
14
+ require "seleniumrc/selenium_driver"
15
15
  require "seleniumrc/selenium_server_runner"
16
16
  require "seleniumrc/mongrel_selenium_server_runner"
17
17
  require "seleniumrc/webrick_selenium_server_runner"
18
- require "seleniumrc/wait_for"
19
18
  require "seleniumrc/dsl/test_unit_dsl"
20
19
  require "seleniumrc/dsl/selenium_dsl"
21
- require "seleniumrc/selenium_context"
22
20
  require "seleniumrc/selenium_configuration"
23
21
  require "seleniumrc/selenium_page"
24
22
  require "seleniumrc/selenium_element"
@@ -5,21 +5,10 @@ module Seleniumrc
5
5
  @configuration ||= SeleniumConfiguration.instance
6
6
  end
7
7
  attr_writer :configuration
8
+ attr_accessor :selenium_driver
8
9
  include WaitFor
9
10
  include TestUnitDsl
10
11
 
11
- def type(locator,value)
12
- element(locator).is_present
13
- selenium.type(locator,value)
14
- end
15
-
16
- def click(locator)
17
- element(locator).is_present
18
- selenium.click(locator)
19
- end
20
-
21
- alias_method :wait_for_and_click, :click
22
-
23
12
  # Download a file from the Application Server
24
13
  def download(path)
25
14
  uri = URI.parse(configuration.browser_url + path)
@@ -27,142 +16,18 @@ module Seleniumrc
27
16
  Net::HTTP.get(uri)
28
17
  end
29
18
 
30
- def select(select_locator,option_locator)
31
- element(select_locator).is_present
32
- selenium.select(select_locator,option_locator)
33
- end
34
-
35
- # Reload the current page that the browser is on.
36
- def reload
37
- selenium.get_eval("selenium.browserbot.getCurrentWindow().location.reload()")
38
- end
39
-
40
- def method_missing(name, *args)
41
- return selenium.send(name, *args)
42
- end
43
-
44
-
45
- #--------- Commands
46
-
47
- # Open a location and wait for the page to load.
48
- def open_and_wait(url)
49
- page.open_and_wait url
50
- end
51
-
52
- # Click a link and wait for the page to load.
53
- def click_and_wait(locator, wait_for = default_timeout)
54
- selenium.click locator
55
- wait_for_page_to_load(wait_for)
56
- end
57
- alias_method :click_and_wait_for_page_to_load, :click_and_wait
58
-
59
- # Click the back button and wait for the page to load.
60
- def go_back_and_wait
61
- selenium.go_back
62
- wait_for_page_to_load
63
- end
64
-
65
19
  # Open the home page of the Application and wait for the page to load.
66
20
  def open_home_page
67
- selenium.open(configuration.browser_url)
68
- wait_for_page_to_load
69
- end
70
-
71
- # Get the inner html of the located element.
72
- def get_inner_html(locator)
73
- element(locator).inner_html
21
+ selenium_driver.open(configuration.browser_url)
74
22
  end
75
23
 
76
- # Does the element at locator contain the text?
77
- def element_contains_text(locator, text)
78
- selenium.is_element_present(locator) && get_inner_html(locator).include?(text)
79
- end
80
-
81
- # Does the element at locator not contain the text?
82
- def element_does_not_contain_text(locator, text)
83
- return true unless selenium.is_element_present(locator)
84
- return !get_inner_html(locator).include?(text)
85
- end
86
-
87
- # Does locator element have text fragments in a certain order?
88
- def is_text_in_order(locator, *text_fragments)
89
- container = Hpricot(get_text(locator))
90
-
91
- everything_found = true
92
- wasnt_found_message = "Certain fragments weren't found:\n"
93
-
94
- everything_in_order = true
95
- wasnt_in_order_message = "Certain fragments were out of order:\n"
96
-
97
- text_fragments.inject([-1, nil]) do |old_results, new_fragment|
98
- old_index = old_results[0]
99
- old_fragment = old_results[1]
100
- new_index = container.inner_html.index(new_fragment)
101
-
102
- unless new_index
103
- everything_found = false
104
- wasnt_found_message << "Fragment #{new_fragment} was not found\n"
105
- end
106
-
107
- if new_index < old_index
108
- everything_in_order = false
109
- wasnt_in_order_message << "Fragment #{new_fragment} out of order:\n"
110
- wasnt_in_order_message << "\texpected '#{old_fragment}'\n"
111
- wasnt_in_order_message << "\tto come before '#{new_fragment}'\n"
112
- end
113
-
114
- [new_index, new_fragment]
115
- end
116
-
117
- wasnt_found_message << "\n\nhtml follows:\n #{container.inner_html}\n"
118
- wasnt_in_order_message << "\n\nhtml follows:\n #{container.inner_html}\n"
119
-
120
- unless everything_found && everything_in_order
121
- yield(everything_found, wasnt_found_message, everything_in_order, wasnt_in_order_message)
122
- end
123
- end
124
- #----- Waiting for conditions
125
-
126
- def wait_for_page_to_load(timeout=default_timeout)
127
- selenium.wait_for_page_to_load timeout
128
- if get_title.include?("Exception caught")
129
- flunk "We got a new page, but it was an application exception page.\n\n" + get_html_source
130
- end
131
- end
132
-
133
- def wait_for_element_to_contain(locator, text, message=nil, timeout=default_wait_for_time)
134
- wait_for({:message => message, :timeout => timeout}) {element_contains_text(locator, text)}
135
- end
136
- alias_method :wait_for_element_to_contain_text, :wait_for_element_to_contain
137
-
138
- # Open the log window on the browser. This is useful to diagnose issues with Selenium Core.
139
- def show_log(log_level = "debug")
140
- get_eval "LOG.setLogLevelThreshold('#{log_level}')"
141
- end
142
-
143
- # Slow down each Selenese step after this method is called.
144
- def slow_mode
145
- get_eval "slowMode = true"
146
- get_eval 'window.document.getElementsByName("FASTMODE")[0].checked = true'
147
- end
148
-
149
- # Speeds up each Selenese step to normal speed after this method is called.
150
- def fast_mode
151
- get_eval "slowMode = false"
152
- get_eval 'window.document.getElementsByName("FASTMODE")[0].checked = false'
153
- end
154
-
155
- def page
156
- SeleniumPage.new(@selenium)
157
- end
158
-
159
- def element(locator)
160
- SeleniumElement.new(@selenium, locator)
24
+ def method_missing(name, *args)
25
+ return selenium_driver.send(name, *args)
161
26
  end
162
27
 
163
28
  protected
164
- attr_accessor :selenium
165
29
  delegate :open,
30
+ :type,
166
31
  :wait_for_condition,
167
32
  :get_select_options,
168
33
  :get_selected_id,
@@ -176,11 +41,11 @@ module Seleniumrc
176
41
  :get_selected_values,
177
42
  :get_body_text,
178
43
  :get_html_source,
179
- :to => :selenium
44
+ :to => :selenium_driver
180
45
 
181
- def should_stop_selenese_interpreter?
46
+ def should_stop_driver?
182
47
  return false unless configuration.test_browser_mode?
183
- configuration.stop_selenese_interpreter?(passed?)
48
+ configuration.stop_driver?(passed?)
184
49
  end
185
50
  end
186
51
  end
@@ -8,12 +8,12 @@ class Test::Unit::UI::TestRunnerMediator
8
8
  alias_method :initialize, :initialize_with_seleniumrc
9
9
 
10
10
  protected
11
- def start_app_server
11
+ def start_app_server(*args)
12
12
  @app_runner = Seleniumrc::SeleniumConfiguration.instance.create_server_runner
13
13
  @app_runner.start
14
14
  end
15
15
 
16
- def stop_app_server
16
+ def stop_app_server(*args)
17
17
  @app_runner.stop
18
18
  end
19
19
  end
@@ -1,23 +1,24 @@
1
1
  module Seleniumrc
2
2
  class MongrelSeleniumServerRunner < SeleniumServerRunner
3
3
  def start
4
- @configurator = @context.create_mongrel_configurator
5
- initialize_server(@configurator)
4
+ mongrel_configurator = configuration.create_mongrel_configurator
5
+ initialize_server(mongrel_configurator)
6
6
 
7
7
  @thread_class.start do
8
- start_server
8
+ start_server(mongrel_configurator)
9
9
  end
10
10
  @started = true
11
11
  end
12
12
 
13
13
  protected
14
- def start_server
15
- @configurator.run
16
- @configurator.log "Mongrel running at #{@context.internal_app_server_host}:#{@context.internal_app_server_port}"
17
- @configurator.join
14
+ def start_server(mongrel_configurator)
15
+ mongrel_configurator.run
16
+ mongrel_configurator.log "Mongrel running at #{configuration.internal_app_server_host}:#{configuration.internal_app_server_port}"
17
+ mongrel_configurator.join
18
18
  end
19
19
 
20
20
  def initialize_server(config)
21
+ configuration = self.configuration
21
22
  config.listener do |*args|
22
23
  mongrel = (args.first || self)
23
24
  mongrel.log "Starting Rails in environment #{defaults[:environment]} ..."
@@ -26,6 +27,7 @@ module Seleniumrc
26
27
 
27
28
  mongrel.log "Loading any Rails specific GemPlugins"
28
29
  mongrel.load_plugins
30
+ configuration.app_server_initialization.call(mongrel)
29
31
  end
30
32
  end
31
33
 
@@ -1,7 +1,7 @@
1
1
  module Seleniumrc
2
2
  # The configuration interface. This SeleniumConfiguration acts as a singleton to a SeleniumContext.
3
- # You can access the SeleniumContext object by calling
4
- # Seleniumrc::SeleniumContext.instance
3
+ # You can access the SeleniumConfiguration object by calling
4
+ # Seleniumrc::SeleniumConfiguration.instance
5
5
  class SeleniumConfiguration
6
6
  module BrowserMode
7
7
  Suite = "suite" unless const_defined? :Suite
@@ -10,8 +10,8 @@ module Seleniumrc
10
10
  FIREFOX = "firefox" unless const_defined? :FIREFOX
11
11
  IEXPLORE = "iexplore" unless const_defined? :IEXPLORE
12
12
 
13
- module ClassMethods
14
- # The instance of the Singleton SeleniumContext. On its initial call, the initial configuration is set.
13
+ class << self
14
+ # The instance of the Singleton SeleniumConfiguration. On its initial call, the initial configuration is set.
15
15
  # The initial configuration is based on Environment variables and defaults.
16
16
  # The environment variables are:
17
17
  # * RAILS_ENV - The Rails environment (defaults: test)
@@ -20,59 +20,252 @@ module Seleniumrc
20
20
  # * webrick_host - The host name that the application server will start under (default: localhost)
21
21
  # * webrick_port - The port that the application server will start under (default: 4000)
22
22
  # * app_server_engine - The type of server the application will be run with (webrick or mongrel)
23
- # * browsers - A comma-delimited list of browsers that will be tested (e.g. firebox,iexplore)
24
23
  # * internal_app_server_host - The host name for the Application server that the Browser will access (default: localhost)
25
24
  # * internal_app_server_host - The port for the Application server that the Browser will access (default: 4000)
26
25
  # * keep_browser_open_on_failure - If there is a failure in the test suite, keep the browser window open (default: true)
27
26
  # * verify_remote_app_server_is_running - Raise an exception if the Application Server is not running (default: true)
28
27
  def instance
29
- return @context if @context
30
- @context = SeleniumContext.new
31
- @context.env = ENV
32
-
33
- # TODO: BT - We need to only run one browser per run. Having an array makes the architecture wack.
34
- @context.browsers = [FIREFOX] # Crack is wack
35
- @context.failure_has_not_occurred!
36
- @context.selenium_server_host = "localhost" # address of selenium RC server (java)
37
- @context.selenium_server_port = 4444
38
- @context.app_server_engine = :webrick
39
- @context.internal_app_server_host = "0.0.0.0" # internal address of app server (webrick)
40
- @context.internal_app_server_port = 4000
41
- @context.external_app_server_host = "localhost" # external address of app server (webrick)
42
- @context.external_app_server_port = 4000
43
- @context.server_engine = :webrick
44
- @context.keep_browser_open_on_failure = true
45
- @context.browser_mode = BrowserMode::Suite
46
- @context.verify_remote_app_server_is_running = true
28
+ return @instance if @instance
29
+ @instance = new
30
+ @instance.env = ENV
31
+
32
+ @instance.browser = FIREFOX
33
+ @instance.selenium_server_host = "localhost" # address of selenium RC server (java)
34
+ @instance.selenium_server_port = 4444
35
+ @instance.app_server_engine = :webrick
36
+ @instance.internal_app_server_host = "0.0.0.0" # internal address of app server (webrick or mongrel)
37
+ @instance.internal_app_server_port = 4000
38
+ @instance.external_app_server_host = "localhost" # external address of app server (webrick or mongrel)
39
+ @instance.external_app_server_port = 4000
40
+ @instance.server_engine = :webrick
41
+ @instance.keep_browser_open_on_failure = true
42
+ @instance.browser_mode = BrowserMode::Suite
43
+ @instance.verify_remote_app_server_is_running = true
47
44
 
48
45
  establish_environment
49
- @context
46
+ @instance
50
47
  end
48
+ attr_writer :instance
51
49
 
52
50
  private
53
- def context
54
- @context || SeleniumContext.new
55
- end
56
-
57
51
  def establish_environment
58
- @context.rails_env = env['RAILS_ENV'] if env.include?('RAILS_ENV')
59
- @context.rails_root = Object.const_get(:RAILS_ROOT) if Object.const_defined?(:RAILS_ROOT)
60
- ['selenium_server_host', 'selenium_server_port', 'internal_app_server_port', 'internal_app_server_host',
61
- 'app_server_engine', 'external_app_server_host', 'external_app_server_port'].each do |env_key|
62
- @context.send(env_key + "=", env[env_key]) if env.include?(env_key)
63
- end
64
- ['keep_browser_open_on_failure', 'verify_remote_app_server_is_running'].each do |env_key|
65
- @context.send(env_key + "=", env[env_key].to_s != false.to_s) if env.include?(env_key)
52
+ @instance.rails_env = env['RAILS_ENV'] if env.include?('RAILS_ENV')
53
+ @instance.rails_root = Object.const_get(:RAILS_ROOT) if Object.const_defined?(:RAILS_ROOT)
54
+ [
55
+ 'selenium_server_host',
56
+ 'selenium_server_port',
57
+ 'internal_app_server_port',
58
+ 'internal_app_server_host',
59
+ 'app_server_engine',
60
+ 'external_app_server_host',
61
+ 'external_app_server_port'
62
+ ].each do |env_key|
63
+ if env.include?(env_key)
64
+ @instance.send("#{env_key}=", env[env_key])
65
+ end
66
66
  end
67
- ['browsers'].each do |env_key|
68
- @context.send(env_key + "=", env[env_key].split(",")) if env.include?(env_key)
67
+ [
68
+ 'keep_browser_open_on_failure',
69
+ 'verify_remote_app_server_is_running'
70
+ ].each do |env_key|
71
+ if env.include?(env_key)
72
+ @instance.send("#{env_key}=", env[env_key].to_s != false.to_s)
73
+ end
69
74
  end
75
+ @instance.browser = env['browser'] if env.include?('browser')
70
76
  end
71
77
 
72
78
  def env
73
- @context.env
79
+ @instance.env
80
+ end
81
+ end
82
+
83
+ attr_accessor :configuration,
84
+ :env,
85
+ :rails_env,
86
+ :rails_root,
87
+ :browser,
88
+ :driver,
89
+ :browser_mode,
90
+ :selenium_server_host,
91
+ :selenium_server_port,
92
+ :app_server_engine,
93
+ :internal_app_server_host,
94
+ :internal_app_server_port,
95
+ :external_app_server_host,
96
+ :external_app_server_port,
97
+ :server_engine,
98
+ :keep_browser_open_on_failure,
99
+ :verify_remote_app_server_is_running,
100
+ :app_server_initialization
101
+
102
+ def initialize
103
+ self.verify_remote_app_server_is_running = true
104
+ @after_driver_started_listeners = []
105
+ @app_server_initialization = proc {}
106
+ @failure_has_occurred = false
107
+ end
108
+
109
+ # A callback hook that gets run after the Selenese Interpreter is started.
110
+ def after_driver_started(&block)
111
+ @after_driver_started_listeners << block
112
+ end
113
+
114
+ # Notify all after_driver_started callbacks.
115
+ def notify_after_driver_started(driver)
116
+ for listener in @after_driver_started_listeners
117
+ listener.call(driver)
118
+ end
119
+ end
120
+
121
+ # The browser formatted for the Selenese driver.
122
+ def formatted_browser
123
+ return "*#{@browser}"
124
+ end
125
+
126
+ # Has a failure occurred in the tests?
127
+ def failure_has_occurred?
128
+ @failure_has_occurred = true
129
+ end
130
+
131
+ # The http host name and port to be entered into the browser address bar
132
+ def browser_url
133
+ "http://#{external_app_server_host}:#{external_app_server_port}"
134
+ end
135
+
136
+ # The root directory (public) of the Rails application
137
+ def server_root
138
+ File.expand_path("#{rails_root}/public/")
139
+ end
140
+
141
+ # Sets the Test Suite to open a new browser instance for each TestCase
142
+ def test_browser_mode
143
+ @browser_mode = SeleniumConfiguration::BrowserMode::Test
144
+ end
145
+
146
+ # Are we going to open a new browser instance for each TestCase?
147
+ def test_browser_mode?
148
+ @browser_mode == SeleniumConfiguration::BrowserMode::Test
149
+ end
150
+
151
+ # Sets the Test Suite to use one browser instance
152
+ def suite_browser_mode
153
+ @browser_mode = SeleniumConfiguration::BrowserMode::Suite
154
+ end
155
+
156
+ # Does the Test Suite to use one browser instance?
157
+ def suite_browser_mode?
158
+ @browser_mode == SeleniumConfiguration::BrowserMode::Suite
159
+ end
160
+
161
+ # The SeleniumDriver object, which sublcasses the SeleniumDriver provided by the Selenium RC (http://openqa.org/selenium-rc/) project.
162
+ def driver
163
+ return nil unless suite_browser_mode?
164
+ @driver ||= create_and_initialize_driver
165
+ end
166
+
167
+ def stop_driver_if_necessary(suite_passed) # nodoc
168
+ failure_has_occurred unless suite_passed
169
+ if @driver && stop_driver?(suite_passed)
170
+ @driver.stop
171
+ @driver = nil
172
+ end
173
+ end
174
+
175
+ def stop_driver?(passed) # nodoc
176
+ return true if passed
177
+ return !keep_browser_open_on_failure
178
+ end
179
+
180
+ def create_and_initialize_driver # nodoc
181
+ driver = create_driver
182
+ driver.start
183
+ notify_after_driver_started(driver)
184
+ driver
185
+ end
186
+
187
+ def create_driver # nodoc
188
+ return ::Seleniumrc::SeleniumDriver.new(
189
+ selenium_server_host,
190
+ selenium_server_port,
191
+ formatted_browser,
192
+ browser_url,
193
+ 15000
194
+ )
195
+ end
196
+
197
+ def create_server_runner # nodoc
198
+ case @app_server_engine.to_sym
199
+ when :mongrel
200
+ create_mongrel_runner
201
+ when :webrick
202
+ create_webrick_runner
203
+ else
204
+ raise "Invalid server type: #{selenium_configuration.app_server_type}"
74
205
  end
75
206
  end
76
- extend ClassMethods
207
+
208
+ def create_webrick_runner # nodoc
209
+ require 'webrick_server'
210
+ runner = WebrickSeleniumServerRunner.new
211
+ runner.configuration = self
212
+ runner.thread_class = Thread
213
+ runner.socket = Socket
214
+ runner.dispatch_servlet = DispatchServlet
215
+ runner.environment_path = File.expand_path("#{@rails_root}/config/environment")
216
+ runner
217
+ end
218
+
219
+ def create_webrick_server # nodoc
220
+ WEBrick::HTTPServer.new({
221
+ :Port => @internal_app_server_port,
222
+ :BindAddress => @internal_app_server_host,
223
+ :ServerType => WEBrick::SimpleServer,
224
+ :MimeTypes => WEBrick::HTTPUtils::DefaultMimeTypes,
225
+ :Logger => new_logger,
226
+ :AccessLog => []
227
+ })
228
+ end
229
+
230
+ def new_logger
231
+ Logger.new(StringIO.new)
232
+ end
233
+
234
+ def create_mongrel_runner # nodoc
235
+ runner = MongrelSeleniumServerRunner.new
236
+ runner.configuration = self
237
+ runner.thread_class = Thread
238
+ runner
239
+ end
240
+
241
+ def create_mongrel_configurator # nodoc
242
+ dir = File.dirname(__FILE__)
243
+ require 'mongrel/rails'
244
+ settings = {
245
+ :host => internal_app_server_host,
246
+ :port => internal_app_server_port,
247
+ :cwd => @rails_root,
248
+ :log_file => "#{@rails_root}/log/mongrel.log",
249
+ :pid_file => "#{@rails_root}/log/mongrel.pid",
250
+ :environment => @rails_env,
251
+ :docroot => "#{@rails_root}/public",
252
+ :mime_map => nil,
253
+ :daemon => false,
254
+ :debug => false,
255
+ :includes => ["mongrel"],
256
+ :config_script => nil
257
+ }
258
+
259
+ configurator = Mongrel::Rails::RailsConfigurator.new(settings) do
260
+ log "Starting Mongrel in #{defaults[:environment]} mode at #{defaults[:host]}:#{defaults[:port]}"
261
+ end
262
+ configurator
263
+ end
264
+
265
+ protected
266
+ # Sets the failure state to true
267
+ def failure_has_occurred
268
+ @failure_has_occurred = true
269
+ end
77
270
  end
78
271
  end