# encoding: utf-8 require 'sinatra/base' require 'socket' class WatirSpec::Server < ::Sinatra::Base class << self attr_accessor :autorun def run_async case RUBY_PLATFORM when /java/ Thread.new { run! } sleep 0.1 until WatirSpec::Server.running? when /windows/ run_in_child_process sleep 0.5 until listening? else pid = fork { run! } sleep 0.5 until listening? end if pid # is this really necessary? at_exit { begin Process.kill 0, pid alive = true rescue Errno::ESRCH alive = false end Process.kill(9, pid) if alive } end end def run! handler = detect_rack_handler handler.run(self, :Host => bind, :Port => port) { @running = true } end def listening? $stderr.puts "trying #{bind}:#{port}..." TCPSocket.new(bind, port).close true rescue false end def find_free_port_above(int) port = int until free_port?(port) port += 1 end port end def autorun @autorun ||= true end def should_run? autorun && !running? end def running? defined?(@running) && @running end SOCKET_ERRORS = [Errno::EADDRINUSE] SOCKET_ERRORS << SocketError if defined?(SocketError) # ruby versions... def free_port?(port) s = TCPServer.new(@host, port) s.close true rescue *SOCKET_ERRORS false end private def run_in_child_process begin require 'childprocess' rescue LoadError => ex raise "please run `gem install childprocess` for WatirSpec on Windows + MRI\n\t(caught: #{ex.message})" end path = File.expand_path('../../spec_helper.rb', __FILE__) process = ChildProcess.build(WatirSpec.ruby, path) process.io.inherit! if $DEBUG process.start at_exit { process.stop } end end set :app_file, __FILE__ set :root, File.dirname(__FILE__) set :public_folder, File.join(root, 'fixtures') set :static, true set :run, false set :environment, :production set :bind, 'localhost'# if Config::CONFIG['host_os'] =~ /windows/ set :port, find_free_port_above(2000) get '/' do self.class.name end get '/big' do Class.new do def each(&blk) yield "Big Content" string = "hello "*205 300.times { yield string } yield "" end end.new end post '/post_to_me' do "You posted the following content:\n#{ env['rack.input'].read }" end get '/plain_text' do content_type 'text/plain' 'This is text/plain' end get '/ajax' do sleep 10 "A slooow ajax response" end get '/charset_mismatch' do content_type 'text/html; charset=UTF-8' %{

ΓΈ

} end get '/octet_stream' do content_type 'application/octet-stream' 'This is application/octet-stream' end get '/set_cookie' do content_type 'text/plain' headers 'Set-Cookie' => "monster=/" "C is for cookie, it's good enough for me" end get '/header_echo' do content_type 'text/plain' env.inspect end get '/authentication' do auth = Rack::Auth::Basic::Request.new(env) unless auth.provided? && auth.credentials == %w[foo bar] headers 'WWW-Authenticate' => %(Basic realm="localhost") halt 401, 'Authorization Required' end "ok" end get '/encodable_' do 'page with characters in URI that need encoding' end end