about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2010-02-24 15:04:15 -0800
committerEric Wong <normalperson@yhbt.net>2010-02-24 15:24:54 -0800
commita5064bc0bb549ca60e3e4d5f1a912bafa46c7f5f (patch)
treeb6e074a3e4104de4b4cf45b8579414692ee7c547
parentecdc78d04e874f64bfea1b787aa8f3d469df8e79 (diff)
downloadrainbows-a5064bc0bb549ca60e3e4d5f1a912bafa46c7f5f.tar.gz
The Unicorn.builder helper will help us avoid namespace
conflicts inside config.ru, allowing us to pass tests.

While we're at it, port some tests over from the latest
unicorn.git for dealing with bad configs.
-rw-r--r--bin/rainbows34
-rw-r--r--rainbows.gemspec2
-rwxr-xr-xt/t0013-reload-bad-config.sh54
-rwxr-xr-xt/t0014-config-conflict.sh50
4 files changed, 107 insertions, 33 deletions
diff --git a/bin/rainbows b/bin/rainbows
index 77059ef..ba7ee7f 100644
--- a/bin/rainbows
+++ b/bin/rainbows
@@ -122,37 +122,7 @@ end
 
 require 'pp' if $DEBUG
 
-app = lambda do ||
-  # require Rack as late as possible in case $LOAD_PATH is modified
-  # in config.ru or command-line
-  inner_app = case config
-  when /\.ru$/
-    raw = File.open(config, "rb") { |fp| fp.sysread(fp.stat.size) }
-    raw.sub!(/^__END__\n.*/, '')
-    eval("Rack::Builder.new {(#{raw}\n)}.to_app", nil, config)
-  else
-    require config
-    Object.const_get(File.basename(config, '.rb').capitalize)
-  end
-  pp({ :inner_app => inner_app }) if $DEBUG
-  case ENV["RACK_ENV"]
-  when "development"
-    Rack::Builder.new do
-      use Rack::CommonLogger, $stderr
-      use Rack::ShowExceptions
-      use Rack::Lint
-      run inner_app
-    end.to_app
-  when "deployment"
-    Rack::Builder.new do
-      use Rack::CommonLogger, $stderr
-      run inner_app
-    end.to_app
-  else
-    inner_app
-  end
-end
-
+app = Unicorn.builder(config)
 listeners << "#{host}:#{port}" if set_listener
 
 if $DEBUG
@@ -163,5 +133,5 @@ if $DEBUG
   })
 end
 
-Unicorn::Launcher.daemonize! if daemonize
+Unicorn::Launcher.daemonize!(options) if daemonize
 Rainbows.run(app, options)
diff --git a/rainbows.gemspec b/rainbows.gemspec
index fc6be20..0fda618 100644
--- a/rainbows.gemspec
+++ b/rainbows.gemspec
@@ -43,7 +43,7 @@ Gem::Specification.new do |s|
   # we need Unicorn for the HTTP parser and process management
   # The HTTP parser in Unicorn < 0.96.1 did not use the Ruby
   # API correctly and resulted in a memory leak
-  s.add_dependency(%q<unicorn>, ["~> 0.96.1", "< 0.97.0"])
+  s.add_dependency(%q<unicorn>, ["~> 0.97.0"])
 
   # Unicorn already depends on Rack
   # s.add_dependency(%q<rack>)
diff --git a/t/t0013-reload-bad-config.sh b/t/t0013-reload-bad-config.sh
new file mode 100755
index 0000000..abe1d5e
--- /dev/null
+++ b/t/t0013-reload-bad-config.sh
@@ -0,0 +1,54 @@
+#!/bin/sh
+. ./test-lib.sh
+t_plan 7 "reload config.ru error with preload_app true"
+
+t_begin "setup and start" && {
+        rainbows_setup
+        rtmpfiles ru
+
+        cat > $ru <<\EOF
+use Rack::ContentLength
+use Rack::ContentType, "text/plain"
+x = { "hello" => "world" }
+run lambda { |env| [ 200, {}, [ x.inspect << "\n" ] ] }
+EOF
+        echo 'preload_app true' >> $unicorn_config
+        rainbows -D -c $unicorn_config $ru
+        rainbows_wait_start
+}
+
+t_begin "hit with curl" && {
+        out=$(curl -sSf http://$listen/)
+        test x"$out" = x'{"hello"=>"world"}'
+}
+
+t_begin "introduce syntax error in rackup file" && {
+        echo '...' >> $ru
+}
+
+t_begin "reload signal succeeds" && {
+        kill -HUP $rainbows_pid
+        rainbows_wait_start
+        while ! egrep '(done|error) reloading' $r_err >/dev/null
+        do
+                sleep 1
+        done
+
+        grep 'error reloading' $r_err >/dev/null
+        > $r_err
+}
+
+t_begin "hit with curl" && {
+        out=$(curl -sSf http://$listen/)
+        test x"$out" = x'{"hello"=>"world"}'
+}
+
+t_begin "killing succeeds" && {
+        kill $rainbows_pid
+}
+
+t_begin "check stderr" && {
+        check_stderr
+}
+
+t_done
diff --git a/t/t0014-config-conflict.sh b/t/t0014-config-conflict.sh
new file mode 100755
index 0000000..b91355d
--- /dev/null
+++ b/t/t0014-config-conflict.sh
@@ -0,0 +1,50 @@
+#!/bin/sh
+. ./test-lib.sh
+t_plan 6 "config variables conflict with preload_app"
+
+t_begin "setup and start" && {
+        rainbows_setup
+        rtmpfiles ru rutmp
+
+        cat > $ru <<\EOF
+use Rack::ContentLength
+use Rack::ContentType, "text/plain"
+config = ru = { "hello" => "world" }
+run lambda { |env| [ 200, {}, [ ru.inspect << "\n" ] ] }
+EOF
+        echo 'preload_app true' >> $unicorn_config
+        rainbows -D -c $unicorn_config $ru
+        rainbows_wait_start
+}
+
+t_begin "hit with curl" && {
+        out=$(curl -sSf http://$listen/)
+        test x"$out" = x'{"hello"=>"world"}'
+}
+
+t_begin "modify rackup file" && {
+        sed -e 's/world/WORLD/' < $ru > $rutmp
+        mv $rutmp $ru
+}
+
+t_begin "reload signal succeeds" && {
+        kill -HUP $rainbows_pid
+        rainbows_wait_start
+        while ! egrep '(done|error) reloading' < $r_err >/dev/null
+        do
+                sleep 1
+        done
+
+        grep 'done reloading' $r_err >/dev/null
+}
+
+t_begin "hit with curl" && {
+        out=$(curl -sSf http://$listen/)
+        test x"$out" = x'{"hello"=>"WORLD"}'
+}
+
+t_begin "killing succeeds" && {
+        kill $rainbows_pid
+}
+
+t_done