test/integration_tests/apache2_tests.rb in passenger-5.0.0.beta3 vs test/integration_tests/apache2_tests.rb in passenger-5.0.0.rc1

- old
+ new

@@ -14,572 +14,572 @@ # TODO: test the 'PassengerUserSwitching' and 'PassengerDefaultUser' option. # TODO: test custom page caching directory describe "Apache 2 module" do - before :all do - check_hosts_configuration - @passenger_temp_dir = "/tmp/passenger-test.#{$$}" - Dir.mkdir(@passenger_temp_dir) - FileUtils.chmod_R(0777, @passenger_temp_dir) - ENV['TMPDIR'] = @passenger_temp_dir - end + before :all do + check_hosts_configuration + @passenger_temp_dir = "/tmp/passenger-test.#{$$}" + Dir.mkdir(@passenger_temp_dir) + FileUtils.chmod_R(0777, @passenger_temp_dir) + ENV['TMPDIR'] = @passenger_temp_dir + end - after :all do - @apache2.stop if @apache2 - FileUtils.chmod_R(0777, @passenger_temp_dir) - FileUtils.rm_rf(@passenger_temp_dir) - end + after :all do + @apache2.stop if @apache2 + FileUtils.chmod_R(0777, @passenger_temp_dir) + FileUtils.rm_rf(@passenger_temp_dir) + end - before :each do - File.open("test.log", "a") do |f| - # Make sure that all Apache log output is prepended by the test description - # so that we know which messages are associated with which tests. - f.puts "\n#### #{Time.now}: #{example.full_description}" - @test_log_pos = f.pos - end - end + before :each do + File.open("test.log", "a") do |f| + # Make sure that all Apache log output is prepended by the test description + # so that we know which messages are associated with which tests. + f.puts "\n#### #{Time.now}: #{example.full_description}" + @test_log_pos = f.pos + end + end - after :each do - log "End of test" - if example.exception - puts "\t---------------- Begin logs -------------------" - File.open("test.log", "r") do |f| - f.seek(@test_log_pos) - puts f.read.split("\n").map{ |line| "\t#{line}" }.join("\n") - end - puts "\t---------------- End logs -------------------" - puts "\tThe following test failed. The web server logs are printed above." - end - end + after :each do + log "End of test" + if example.exception + puts "\t---------------- Begin logs -------------------" + File.open("test.log", "r") do |f| + f.seek(@test_log_pos) + puts f.read.split("\n").map{ |line| "\t#{line}" }.join("\n") + end + puts "\t---------------- End logs -------------------" + puts "\tThe following test failed. The web server logs are printed above." + end + end - def create_apache2_controller - @apache2 = Apache2Controller.new - @apache2.set(:passenger_temp_dir => @passenger_temp_dir) - if Process.uid == 0 - @apache2.set( - :www_user => CONFIG['normal_user_1'], - :www_group => Etc.getgrgid(Etc.getpwnam(CONFIG['normal_user_1']).gid).name - ) - end - end + def create_apache2_controller + @apache2 = Apache2Controller.new + @apache2.set(:passenger_temp_dir => @passenger_temp_dir) + if Process.uid == 0 + @apache2.set( + :www_user => CONFIG['normal_user_1'], + :www_group => Etc.getgrgid(Etc.getpwnam(CONFIG['normal_user_1']).gid).name + ) + end + end - def log(message) - File.open("test.log", "a") do |f| - f.puts "[#{Time.now}] Spec: #{message}" - end - end + def log(message) + File.open("test.log", "a") do |f| + f.puts "[#{Time.now}] Spec: #{message}" + end + end - describe "a Ruby app running on the root URI" do - before :all do - create_apache2_controller - @server = "http://1.passenger.test:#{@apache2.port}" - @stub = RackStub.new('rack') - @apache2 << "PassengerMaxPoolSize 1" - @apache2.set_vhost("1.passenger.test", "#{@stub.full_app_root}/public") - @apache2.start - end + describe "a Ruby app running on the root URI" do + before :all do + create_apache2_controller + @server = "http://1.passenger.test:#{@apache2.port}" + @stub = RackStub.new('rack') + @apache2 << "PassengerMaxPoolSize 1" + @apache2.set_vhost("1.passenger.test", "#{@stub.full_app_root}/public") + @apache2.start + end - after :all do - @stub.destroy - @apache2.stop if @apache2 - end + after :all do + @stub.destroy + @apache2.stop if @apache2 + end - before :each do - @stub.reset - end + before :each do + @stub.reset + end - it_should_behave_like "an example web app" - end + it_should_behave_like "an example web app" + end - describe "a Ruby app running in a sub-URI" do - before :all do - create_apache2_controller - @server = "http://1.passenger.test:#{@apache2.port}/subapp" - @stub = RackStub.new('rack') - @apache2 << "PassengerMaxPoolSize 1" - @apache2.set_vhost("1.passenger.test", File.expand_path("stub")) do |vhost| - vhost << %Q{ - Alias /subapp #{@stub.full_app_root}/public - <Location /subapp> - PassengerBaseURI /subapp - PassengerAppRoot #{@stub.full_app_root} - </Location> - } - end - @apache2.start - end + describe "a Ruby app running in a sub-URI" do + before :all do + create_apache2_controller + @server = "http://1.passenger.test:#{@apache2.port}/subapp" + @stub = RackStub.new('rack') + @apache2 << "PassengerMaxPoolSize 1" + @apache2.set_vhost("1.passenger.test", File.expand_path("stub")) do |vhost| + vhost << %Q{ + Alias /subapp #{@stub.full_app_root}/public + <Location /subapp> + PassengerBaseURI /subapp + PassengerAppRoot #{@stub.full_app_root} + </Location> + } + end + @apache2.start + end - after :all do - @stub.destroy - @apache2.stop if @apache2 - end + after :all do + @stub.destroy + @apache2.stop if @apache2 + end - before :each do - @stub.reset - end + before :each do + @stub.reset + end - it_should_behave_like "an example web app" + it_should_behave_like "an example web app" - it "does not interfere with the root website" do - @server = "http://1.passenger.test:#{@apache2.port}" - get('/').should == "This is the stub directory." - end - end + it "does not interfere with the root website" do + @server = "http://1.passenger.test:#{@apache2.port}" + get('/').should == "This is the stub directory." + end + end - describe "a Python app running on the root URI" do - before :all do - create_apache2_controller - @server = "http://1.passenger.test:#{@apache2.port}" - @stub = PythonStub.new('wsgi') - @apache2 << "PassengerMaxPoolSize 1" - @apache2.set_vhost("1.passenger.test", "#{@stub.full_app_root}/public") - @apache2.start - end + describe "a Python app running on the root URI" do + before :all do + create_apache2_controller + @server = "http://1.passenger.test:#{@apache2.port}" + @stub = PythonStub.new('wsgi') + @apache2 << "PassengerMaxPoolSize 1" + @apache2.set_vhost("1.passenger.test", "#{@stub.full_app_root}/public") + @apache2.start + end - after :all do - @stub.destroy - @apache2.stop if @apache2 - end + after :all do + @stub.destroy + @apache2.stop if @apache2 + end - before :each do - @stub.reset - end + before :each do + @stub.reset + end - it_should_behave_like "an example web app" - end + it_should_behave_like "an example web app" + end - describe "a Python app running in a sub-URI" do - before :all do - create_apache2_controller - @server = "http://1.passenger.test:#{@apache2.port}/subapp" - @stub = PythonStub.new('wsgi') - @apache2 << "PassengerMaxPoolSize 1" - @apache2.set_vhost("1.passenger.test", File.expand_path("stub")) do |vhost| - vhost << %Q{ - Alias /subapp #{@stub.full_app_root}/public - <Location /subapp> - PassengerBaseURI /subapp - PassengerAppRoot #{@stub.full_app_root} - </Location> - } - end - @apache2.start - end + describe "a Python app running in a sub-URI" do + before :all do + create_apache2_controller + @server = "http://1.passenger.test:#{@apache2.port}/subapp" + @stub = PythonStub.new('wsgi') + @apache2 << "PassengerMaxPoolSize 1" + @apache2.set_vhost("1.passenger.test", File.expand_path("stub")) do |vhost| + vhost << %Q{ + Alias /subapp #{@stub.full_app_root}/public + <Location /subapp> + PassengerBaseURI /subapp + PassengerAppRoot #{@stub.full_app_root} + </Location> + } + end + @apache2.start + end - after :all do - @stub.destroy - @apache2.stop if @apache2 - end + after :all do + @stub.destroy + @apache2.stop if @apache2 + end - before :each do - @stub.reset - end + before :each do + @stub.reset + end - it_should_behave_like "an example web app" + it_should_behave_like "an example web app" - it "does not interfere with the root website" do - @server = "http://1.passenger.test:#{@apache2.port}" - get('/').should == "This is the stub directory." - end - end + it "does not interfere with the root website" do + @server = "http://1.passenger.test:#{@apache2.port}" + get('/').should == "This is the stub directory." + end + end - describe "a Node.js app running on the root URI" do - before :all do - create_apache2_controller - @server = "http://1.passenger.test:#{@apache2.port}" - @stub = NodejsStub.new('node') - @apache2 << "PassengerMaxPoolSize 1" - @apache2.set_vhost("1.passenger.test", "#{@stub.full_app_root}/public") - @apache2.start - end + describe "a Node.js app running on the root URI" do + before :all do + create_apache2_controller + @server = "http://1.passenger.test:#{@apache2.port}" + @stub = NodejsStub.new('node') + @apache2 << "PassengerMaxPoolSize 1" + @apache2.set_vhost("1.passenger.test", "#{@stub.full_app_root}/public") + @apache2.start + end - after :all do - @stub.destroy - @apache2.stop if @apache2 - end + after :all do + @stub.destroy + @apache2.stop if @apache2 + end - before :each do - @stub.reset - end + before :each do + @stub.reset + end - it_should_behave_like "an example web app" - end + it_should_behave_like "an example web app" + end - describe "a Node.js app running in a sub-URI" do - before :all do - create_apache2_controller - @server = "http://1.passenger.test:#{@apache2.port}/subapp" - @stub = NodejsStub.new('node') - @apache2 << "PassengerMaxPoolSize 1" - @apache2.set_vhost("1.passenger.test", File.expand_path("stub")) do |vhost| - vhost << %Q{ - Alias /subapp #{@stub.full_app_root}/public - <Location /subapp> - PassengerBaseURI /subapp - PassengerAppRoot #{@stub.full_app_root} - </Location> - } - end - @apache2.start - end + describe "a Node.js app running in a sub-URI" do + before :all do + create_apache2_controller + @server = "http://1.passenger.test:#{@apache2.port}/subapp" + @stub = NodejsStub.new('node') + @apache2 << "PassengerMaxPoolSize 1" + @apache2.set_vhost("1.passenger.test", File.expand_path("stub")) do |vhost| + vhost << %Q{ + Alias /subapp #{@stub.full_app_root}/public + <Location /subapp> + PassengerBaseURI /subapp + PassengerAppRoot #{@stub.full_app_root} + </Location> + } + end + @apache2.start + end - after :all do - @stub.destroy - @apache2.stop if @apache2 - end + after :all do + @stub.destroy + @apache2.stop if @apache2 + end - before :each do - @stub.reset - end + before :each do + @stub.reset + end - it_should_behave_like "an example web app" + it_should_behave_like "an example web app" - it "does not interfere with the root website" do - @server = "http://1.passenger.test:#{@apache2.port}" - get('/').should == "This is the stub directory." - end - end + it "does not interfere with the root website" do + @server = "http://1.passenger.test:#{@apache2.port}" + get('/').should == "This is the stub directory." + end + end - describe "compatibility with other modules" do - before :all do - create_apache2_controller - @apache2 << "PassengerMaxPoolSize 1" - @apache2 << "PassengerStatThrottleRate 0" + describe "compatibility with other modules" do + before :all do + create_apache2_controller + @apache2 << "PassengerMaxPoolSize 1" + @apache2 << "PassengerStatThrottleRate 0" - @stub = RackStub.new('rack') - @server = "http://1.passenger.test:#{@apache2.port}" - @apache2.set_vhost("1.passenger.test", "#{@stub.full_app_root}/public") do |vhost| - vhost << "RewriteEngine on" - vhost << "RewriteRule ^/rewritten_frontpage$ / [PT,QSA,L]" - vhost << "RewriteRule ^/rewritten_env$ /env [PT,QSA,L]" - end - @apache2.start - end + @stub = RackStub.new('rack') + @server = "http://1.passenger.test:#{@apache2.port}" + @apache2.set_vhost("1.passenger.test", "#{@stub.full_app_root}/public") do |vhost| + vhost << "RewriteEngine on" + vhost << "RewriteRule ^/rewritten_frontpage$ / [PT,QSA,L]" + vhost << "RewriteRule ^/rewritten_env$ /env [PT,QSA,L]" + end + @apache2.start + end - after :all do - @stub.destroy - @apache2.stop if @apache2 - end + after :all do + @stub.destroy + @apache2.stop if @apache2 + end - before :each do - @stub.reset - end + before :each do + @stub.reset + end - it "supports environment variable passing through mod_env" do - File.write("#{@stub.app_root}/public/.htaccess", 'SetEnv FOO "Foo Bar!"') - File.touch("#{@stub.app_root}/tmp/restart.txt", 2) # Activate ENV changes. - get('/system_env').should =~ /^FOO = Foo Bar\!$/ - end + it "supports environment variable passing through mod_env" do + File.write("#{@stub.app_root}/public/.htaccess", 'SetEnv FOO "Foo Bar!"') + File.touch("#{@stub.app_root}/tmp/restart.txt", 2) # Activate ENV changes. + get('/system_env').should =~ /^FOO = Foo Bar\!$/ + end - it "supports mod_rewrite in the virtual host block" do - get('/rewritten_frontpage').should == "front page" - cgi_envs = get('/rewritten_env?foo=bar+baz') - cgi_envs.should include("REQUEST_URI = /env?foo=bar+baz\n") - cgi_envs.should include("PATH_INFO = /env\n") - end + it "supports mod_rewrite in the virtual host block" do + get('/rewritten_frontpage').should == "front page" + cgi_envs = get('/rewritten_env?foo=bar+baz') + cgi_envs.should include("REQUEST_URI = /env?foo=bar+baz\n") + cgi_envs.should include("PATH_INFO = /env\n") + end - it "supports mod_rewrite in .htaccess" do - File.write("#{@stub.app_root}/public/.htaccess", %Q{ - RewriteEngine on - RewriteRule ^htaccess_frontpage$ / [PT,QSA,L] - RewriteRule ^htaccess_env$ env [PT,QSA,L] - }) - get('/htaccess_frontpage').should == "front page" - cgi_envs = get('/htaccess_env?foo=bar+baz') - cgi_envs.should include("REQUEST_URI = /env?foo=bar+baz\n") - cgi_envs.should include("PATH_INFO = /env\n") - end - end + it "supports mod_rewrite in .htaccess" do + File.write("#{@stub.app_root}/public/.htaccess", %Q{ + RewriteEngine on + RewriteRule ^htaccess_frontpage$ / [PT,QSA,L] + RewriteRule ^htaccess_env$ env [PT,QSA,L] + }) + get('/htaccess_frontpage').should == "front page" + cgi_envs = get('/htaccess_env?foo=bar+baz') + cgi_envs.should include("REQUEST_URI = /env?foo=bar+baz\n") + cgi_envs.should include("PATH_INFO = /env\n") + end + end - describe "configuration options" do - before :all do - create_apache2_controller - @apache2 << "PassengerMaxPoolSize 3" - @apache2 << "PassengerStatThrottleRate 0" + describe "configuration options" do + before :all do + create_apache2_controller + @apache2 << "PassengerMaxPoolSize 3" + @apache2 << "PassengerStatThrottleRate 0" - @stub = RackStub.new('rack') - @stub_url_root = "http://5.passenger.test:#{@apache2.port}" - @apache2.set_vhost('5.passenger.test', "#{@stub.full_app_root}/public") do |vhost| - vhost << "PassengerBufferUpload off" - vhost << "PassengerFriendlyErrorPages on" - vhost << "AllowEncodedSlashes on" - end + @stub = RackStub.new('rack') + @stub_url_root = "http://5.passenger.test:#{@apache2.port}" + @apache2.set_vhost('5.passenger.test', "#{@stub.full_app_root}/public") do |vhost| + vhost << "PassengerBufferUpload off" + vhost << "PassengerFriendlyErrorPages on" + vhost << "AllowEncodedSlashes on" + end - @stub2 = RackStub.new('rack') - @stub2_url_root = "http://6.passenger.test:#{@apache2.port}" - @apache2.set_vhost('6.passenger.test', "#{@stub2.full_app_root}/public") do |vhost| - vhost << "PassengerAppEnv development" - vhost << "PassengerSpawnMethod conservative" - vhost << "PassengerRestartDir #{@stub2.full_app_root}/public" - vhost << "AllowEncodedSlashes off" - end + @stub2 = RackStub.new('rack') + @stub2_url_root = "http://6.passenger.test:#{@apache2.port}" + @apache2.set_vhost('6.passenger.test', "#{@stub2.full_app_root}/public") do |vhost| + vhost << "PassengerAppEnv development" + vhost << "PassengerSpawnMethod conservative" + vhost << "PassengerRestartDir #{@stub2.full_app_root}/public" + vhost << "AllowEncodedSlashes off" + end - @apache2.start - end + @apache2.start + end - after :all do - @stub.destroy - @stub2.destroy - @apache2.stop if @apache2 - end + after :all do + @stub.destroy + @stub2.destroy + @apache2.stop if @apache2 + end - before :each do - @stub.reset - @stub2.reset - end + before :each do + @stub.reset + @stub2.reset + end - specify "PassengerAppEnv is per-virtual host" do - @server = @stub_url_root - get('/system_env').should =~ /PASSENGER_APP_ENV = production/ + specify "PassengerAppEnv is per-virtual host" do + @server = @stub_url_root + get('/system_env').should =~ /PASSENGER_APP_ENV = production/ - @server = @stub2_url_root - get('/system_env').should =~ /PASSENGER_APP_ENV = development/ - end + @server = @stub2_url_root + get('/system_env').should =~ /PASSENGER_APP_ENV = development/ + end - it "looks for restart.txt in the directory specified by PassengerRestartDir" do - @server = @stub2_url_root - startup_file = "#{@stub2.app_root}/config.ru" - restart_file = "#{@stub2.app_root}/public/restart.txt" + it "looks for restart.txt in the directory specified by PassengerRestartDir" do + @server = @stub2_url_root + startup_file = "#{@stub2.app_root}/config.ru" + restart_file = "#{@stub2.app_root}/public/restart.txt" - File.write(startup_file, %Q{ - require File.expand_path(File.dirname(__FILE__) + "/library") + File.write(startup_file, %Q{ + require File.expand_path(File.dirname(__FILE__) + "/library") - app = lambda do |env| - case env['PATH_INFO'] - when '/' - text_response("hello world") - else - [404, { "Content-Type" => "text/plain" }, ["Unknown URI"]] - end - end + app = lambda do |env| + case env['PATH_INFO'] + when '/' + text_response("hello world") + else + [404, { "Content-Type" => "text/plain" }, ["Unknown URI"]] + end + end - run app - }) + run app + }) - now = Time.now - File.touch(restart_file, now - 5) - get('/').should == "hello world" + now = Time.now + File.touch(restart_file, now - 5) + get('/').should == "hello world" - File.write(startup_file, %Q{ - require File.expand_path(File.dirname(__FILE__) + "/library") + File.write(startup_file, %Q{ + require File.expand_path(File.dirname(__FILE__) + "/library") - app = lambda do |env| - case env['PATH_INFO'] - when '/' - text_response("oh hai") - else - [404, { "Content-Type" => "text/plain" }, ["Unknown URI"]] - end - end + app = lambda do |env| + case env['PATH_INFO'] + when '/' + text_response("oh hai") + else + [404, { "Content-Type" => "text/plain" }, ["Unknown URI"]] + end + end - run app - }) + run app + }) - File.touch(restart_file, now - 10) - get('/').should == "oh hai" - end + File.touch(restart_file, now - 10) + get('/').should == "oh hai" + end - describe "PassengerAppRoot" do - before :each do - @server = @stub_url_root - File.write("#{@stub.full_app_root}/public/cached.html", "Static cached.html") - File.write("#{@stub.full_app_root}/public/dir.html", "Static dir.html") - Dir.mkdir("#{@stub.full_app_root}/public/dir") - end + describe "PassengerAppRoot" do + before :each do + @server = @stub_url_root + File.write("#{@stub.full_app_root}/public/cached.html", "Static cached.html") + File.write("#{@stub.full_app_root}/public/dir.html", "Static dir.html") + Dir.mkdir("#{@stub.full_app_root}/public/dir") + end - it "supports page caching on non-index URIs" do - get('/cached').should == "Static cached.html" - end + it "supports page caching on non-index URIs" do + get('/cached').should == "Static cached.html" + end - it "supports page caching on directory index URIs" do - get('/dir').should == "Static dir.html" - end + it "supports page caching on directory index URIs" do + get('/dir').should == "Static dir.html" + end - it "works" do - result = get('/parameters?first=one&second=Green+Bananas') - result.should =~ %r{First: one\n} - result.should =~ %r{Second: Green Bananas\n} - end - end + it "works" do + result = get('/parameters?first=one&second=Green+Bananas') + result.should =~ %r{First: one\n} + result.should =~ %r{Second: Green Bananas\n} + end + end - it "resolves symlinks in the document root if PassengerResolveSymlinksInDocumentRoot is set" do - orig_app_root = @stub.app_root - @stub.move(File.expand_path('tmp.mycook.symlinktest')) - FileUtils.mkdir_p(orig_app_root) - File.symlink("#{@stub.app_root}/public", "#{orig_app_root}/public") - begin - File.write("#{@stub.app_root}/public/.htaccess", "PassengerResolveSymlinksInDocumentRoot on") - @server = @stub_url_root - get('/').should == "front page" - ensure - FileUtils.rm_rf(orig_app_root) - @stub.move(orig_app_root) - end - end + it "resolves symlinks in the document root if PassengerResolveSymlinksInDocumentRoot is set" do + orig_app_root = @stub.app_root + @stub.move(File.expand_path('tmp.mycook.symlinktest')) + FileUtils.mkdir_p(orig_app_root) + File.symlink("#{@stub.app_root}/public", "#{orig_app_root}/public") + begin + File.write("#{@stub.app_root}/public/.htaccess", "PassengerResolveSymlinksInDocumentRoot on") + @server = @stub_url_root + get('/').should == "front page" + ensure + FileUtils.rm_rf(orig_app_root) + @stub.move(orig_app_root) + end + end - it "supports encoded slashes in the URL if AllowEncodedSlashes is turned on" do - @server = @stub_url_root - get('/env/foo%2fbar').should =~ %r{PATH_INFO = /env/foo/bar\n} + it "supports encoded slashes in the URL if AllowEncodedSlashes is turned on" do + @server = @stub_url_root + get('/env/foo%2fbar').should =~ %r{PATH_INFO = /env/foo/bar\n} - @server = @stub2_url_root - get('/env/foo%2fbar').should =~ %r{404 Not Found} - end + @server = @stub2_url_root + get('/env/foo%2fbar').should =~ %r{404 Not Found} + end - describe "when handling POST requests with 'chunked' transfer encoding, if PassengerBufferUpload is off" do - it "sets Transfer-Encoding to 'chunked' and removes Content-Length" do - @uri = URI.parse(@stub_url_root) - socket = TCPSocket.new(@uri.host, @uri.port) - begin - socket.write("POST #{@stub_url_root}/env HTTP/1.1\r\n") - socket.write("Host: #{@uri.host}:#{@uri.port}\r\n") - socket.write("Transfer-Encoding: chunked\r\n") - socket.write("Content-Type: text/plain\r\n") - socket.write("Connection: close\r\n") - socket.write("\r\n") + describe "when handling POST requests with 'chunked' transfer encoding, if PassengerBufferUpload is off" do + it "sets Transfer-Encoding to 'chunked' and removes Content-Length" do + @uri = URI.parse(@stub_url_root) + socket = TCPSocket.new(@uri.host, @uri.port) + begin + socket.write("POST #{@stub_url_root}/env HTTP/1.1\r\n") + socket.write("Host: #{@uri.host}:#{@uri.port}\r\n") + socket.write("Transfer-Encoding: chunked\r\n") + socket.write("Content-Type: text/plain\r\n") + socket.write("Connection: close\r\n") + socket.write("\r\n") - chunk = "foo=bar!" - socket.write("%X\r\n%s\r\n" % [chunk.size, chunk]) - socket.write("0\r\n\r\n") - socket.flush + chunk = "foo=bar!" + socket.write("%X\r\n%s\r\n" % [chunk.size, chunk]) + socket.write("0\r\n\r\n") + socket.flush - response = socket.read - response.should_not include("CONTENT_LENGTH = ") - response.should include("HTTP_TRANSFER_ENCODING = chunked\n") - ensure - socket.close - end - end - end + response = socket.read + response.should_not include("CONTENT_LENGTH = ") + response.should include("HTTP_TRANSFER_ENCODING = chunked\n") + ensure + socket.close + end + end + end - #################################### - end + #################################### + end - describe "error handling" do - before :all do - create_apache2_controller - FileUtils.rm_rf('tmp.webdir') - FileUtils.mkdir_p('tmp.webdir') - @webdir = File.expand_path('tmp.webdir') - @apache2.set_vhost('1.passenger.test', @webdir) do |vhost| - vhost << "PassengerBaseURI /app-that-crashes-during-startup/public" - end + describe "error handling" do + before :all do + create_apache2_controller + FileUtils.rm_rf('tmp.webdir') + FileUtils.mkdir_p('tmp.webdir') + @webdir = File.expand_path('tmp.webdir') + @apache2.set_vhost('1.passenger.test', @webdir) do |vhost| + vhost << "PassengerBaseURI /app-that-crashes-during-startup/public" + end - @stub = RackStub.new('rack') - @stub_url_root = "http://2.passenger.test:#{@apache2.port}" - @apache2.set_vhost('2.passenger.test', "#{@stub.full_app_root}/public") + @stub = RackStub.new('rack') + @stub_url_root = "http://2.passenger.test:#{@apache2.port}" + @apache2.set_vhost('2.passenger.test', "#{@stub.full_app_root}/public") - @apache2 << "PassengerFriendlyErrorPages on" - @apache2.start - end + @apache2 << "PassengerFriendlyErrorPages on" + @apache2.start + end - after :all do - FileUtils.rm_rf('tmp.webdir') - @stub.destroy - @apache2.stop if @apache2 - end + after :all do + FileUtils.rm_rf('tmp.webdir') + @stub.destroy + @apache2.stop if @apache2 + end - before :each do - @server = "http://1.passenger.test:#{@apache2.port}" - @error_page_signature = /<meta name="generator" content="Phusion Passenger">/ - @stub.reset - end + before :each do + @server = "http://1.passenger.test:#{@apache2.port}" + @error_page_signature = /<meta name="generator" content="Phusion Passenger">/ + @stub.reset + end - it "displays an error page if the application crashes during startup" do - RackStub.use('rack', "#{@webdir}/app-that-crashes-during-startup") do |stub| - File.prepend(stub.startup_file, "raise 'app crash'") - result = get("/app-that-crashes-during-startup/public") - result.should =~ @error_page_signature - result.should =~ /app crash/ - end - end + it "displays an error page if the application crashes during startup" do + RackStub.use('rack', "#{@webdir}/app-that-crashes-during-startup") do |stub| + File.prepend(stub.startup_file, "raise 'app crash'") + result = get("/app-that-crashes-during-startup/public") + result.should =~ @error_page_signature + result.should =~ /app crash/ + end + end - it "doesn't display a Ruby spawn error page if PassengerFriendlyErrorPages is off" do - RackStub.use('rack', "#{@webdir}/app-that-crashes-during-startup") do |stub| - File.write("#{stub.app_root}/public/.htaccess", "PassengerFriendlyErrorPages off") - File.prepend(stub.startup_file, "raise 'app crash'") - result = get("/app-that-crashes-during-startup/public") - result.should_not =~ @error_page_signature - result.should_not =~ /app crash/ - end - end - end + it "doesn't display a Ruby spawn error page if PassengerFriendlyErrorPages is off" do + RackStub.use('rack', "#{@webdir}/app-that-crashes-during-startup") do |stub| + File.write("#{stub.app_root}/public/.htaccess", "PassengerFriendlyErrorPages off") + File.prepend(stub.startup_file, "raise 'app crash'") + result = get("/app-that-crashes-during-startup/public") + result.should_not =~ @error_page_signature + result.should_not =~ /app crash/ + end + end + end - describe "HelperAgent" do - AdminTools = PhusionPassenger::AdminTools + describe "HelperAgent" do + AdminTools = PhusionPassenger::AdminTools - before :all do - create_apache2_controller - @stub = RackStub.new('rack') - @stub_url_root = "http://1.passenger.test:#{@apache2.port}" - @apache2 << "PassengerStatThrottleRate 0" - @apache2.set_vhost('1.passenger.test', "#{@stub.full_app_root}/public") - @apache2.start - @server = "http://1.passenger.test:#{@apache2.port}" - end + before :all do + create_apache2_controller + @stub = RackStub.new('rack') + @stub_url_root = "http://1.passenger.test:#{@apache2.port}" + @apache2 << "PassengerStatThrottleRate 0" + @apache2.set_vhost('1.passenger.test', "#{@stub.full_app_root}/public") + @apache2.start + @server = "http://1.passenger.test:#{@apache2.port}" + end - after :all do - @stub.destroy - @apache2.stop if @apache2 - end + after :all do + @stub.destroy + @apache2.stop if @apache2 + end - before :each do - @stub.reset - end + before :each do + @stub.reset + end - it "is restarted if it crashes" do - # Make sure that all Apache worker processes have connected to - # the helper agent. - 10.times do - get('/').should == "front page" - sleep 0.1 - end + it "is restarted if it crashes" do + # Make sure that all Apache worker processes have connected to + # the helper agent. + 10.times do + get('/').should == "front page" + sleep 0.1 + end - # Now kill the helper agent. - instance = AdminTools::InstanceRegistry.new.list.first - Process.kill('SIGKILL', instance.server_pid) - sleep 0.02 # Give the signal a small amount of time to take effect. + # Now kill the helper agent. + instance = AdminTools::InstanceRegistry.new.list.first + Process.kill('SIGKILL', instance.server_pid) + sleep 0.02 # Give the signal a small amount of time to take effect. - # Each worker process should detect that the old - # helper agent has died, and should reconnect. - 10.times do - get('/').should == "front page" - sleep 0.1 - end - end + # Each worker process should detect that the old + # helper agent has died, and should reconnect. + 10.times do + get('/').should == "front page" + sleep 0.1 + end + end - it "exposes the application pool for passenger-status" do - File.touch("#{@stub.app_root}/tmp/restart.txt", 1) # Get rid of all previous app processes. - get('/').should == "front page" - instance = AdminTools::InstanceRegistry.new.list.first + it "exposes the application pool for passenger-status" do + File.touch("#{@stub.app_root}/tmp/restart.txt", 1) # Get rid of all previous app processes. + get('/').should == "front page" + instance = AdminTools::InstanceRegistry.new.list.first - # Wait until the server has processed the session close event. - sleep 0.1 + # Wait until the server has processed the session close event. + sleep 0.1 - request = Net::HTTP::Get.new("/pool.xml") - request.basic_auth("ro_admin", instance.read_only_admin_password) - response = instance.http_request("agents.s/server_admin", request) - if response.code.to_i / 100 == 2 - doc = REXML::Document.new(response.body) - else - raise response.body - end + request = Net::HTTP::Get.new("/pool.xml") + request.basic_auth("ro_admin", instance.read_only_admin_password) + response = instance.http_request("agents.s/server_admin", request) + if response.code.to_i / 100 == 2 + doc = REXML::Document.new(response.body) + else + raise response.body + end - groups = doc.get_elements("info/supergroups/supergroup/group") - groups.should have(1).item - groups.each do |group| - group.elements["name"].text.should == "#{@stub.full_app_root} (production)#default" - processes = group.get_elements("processes/process") - processes.should have(1).item - processes[0].elements["processed"].text.should == "1" - end - end - end + groups = doc.get_elements("info/supergroups/supergroup/group") + groups.should have(1).item + groups.each do |group| + group.elements["name"].text.should == "#{@stub.full_app_root} (production)#default" + processes = group.get_elements("processes/process") + processes.should have(1).item + processes[0].elements["processed"].text.should == "1" + end + end + end - ##### Helper methods ##### + ##### Helper methods ##### - def start_web_server_if_necessary - if !@apache2.running? - @apache2.start - end - end + def start_web_server_if_necessary + if !@apache2.running? + @apache2.start + end + end end