unicorn 0.4.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -49,7 +49,7 @@ class HttpParserTest < Test::Unit::TestCase
49
49
  should_be_good = "GET / HTTP/1.1\r\naaaaaaaaaaaaa:++++++++++\r\n\r\n"
50
50
  assert parser.execute(req, should_be_good)
51
51
 
52
- # ref: http://thread.gmane.org/gmane.comp.lang.ruby.Unicorn.devel/37/focus=45
52
+ # ref: http://thread.gmane.org/gmane.comp.lang.ruby.mongrel.devel/37/focus=45
53
53
  # (note we got 'pen' mixed up with 'pound' in that thread,
54
54
  # but the gist of it is still relevant: these nasty headers are irrelevant
55
55
  #
@@ -33,10 +33,63 @@ class RequestTest < Test::Unit::TestCase
33
33
  @lint = Rack::Lint.new(@app)
34
34
  end
35
35
 
36
+ def test_options
37
+ client = MockRequest.new("OPTIONS * HTTP/1.1\r\n" \
38
+ "Host: foo\r\n\r\n")
39
+ res = env = nil
40
+ assert_nothing_raised { env = @request.read(client) }
41
+ assert_equal '*', env['REQUEST_PATH']
42
+ assert_equal '*', env['PATH_INFO']
43
+ assert_equal '*', env['REQUEST_URI']
44
+
45
+ # assert_nothing_raised { res = @lint.call(env) } # fails Rack lint
46
+ end
47
+
48
+ def test_full_url_path
49
+ client = MockRequest.new("GET http://e:3/x?y=z HTTP/1.1\r\n" \
50
+ "Host: foo\r\n\r\n")
51
+ res = env = nil
52
+ assert_nothing_raised { env = @request.read(client) }
53
+ assert_equal '/x', env['REQUEST_PATH']
54
+ assert_equal '/x', env['PATH_INFO']
55
+ assert_nothing_raised { res = @lint.call(env) }
56
+ end
57
+
58
+ def test_x_forwarded_proto_https
59
+ res = env = nil
60
+ client = MockRequest.new("GET / HTTP/1.1\r\n" \
61
+ "X-Forwarded-Proto: https\r\n" \
62
+ "Host: foo\r\n\r\n")
63
+ assert_nothing_raised { env = @request.read(client) }
64
+ assert_equal "https", env['rack.url_scheme']
65
+ assert_nothing_raised { res = @lint.call(env) }
66
+ end
67
+
68
+ def test_x_forwarded_proto_http
69
+ res = env = nil
70
+ client = MockRequest.new("GET / HTTP/1.1\r\n" \
71
+ "X-Forwarded-Proto: http\r\n" \
72
+ "Host: foo\r\n\r\n")
73
+ assert_nothing_raised { env = @request.read(client) }
74
+ assert_equal "http", env['rack.url_scheme']
75
+ assert_nothing_raised { res = @lint.call(env) }
76
+ end
77
+
78
+ def test_x_forwarded_proto_invalid
79
+ res = env = nil
80
+ client = MockRequest.new("GET / HTTP/1.1\r\n" \
81
+ "X-Forwarded-Proto: ftp\r\n" \
82
+ "Host: foo\r\n\r\n")
83
+ assert_nothing_raised { env = @request.read(client) }
84
+ assert_equal "http", env['rack.url_scheme']
85
+ assert_nothing_raised { res = @lint.call(env) }
86
+ end
87
+
36
88
  def test_rack_lint_get
37
89
  client = MockRequest.new("GET / HTTP/1.1\r\nHost: foo\r\n\r\n")
38
90
  res = env = nil
39
91
  assert_nothing_raised { env = @request.read(client) }
92
+ assert_equal "http", env['rack.url_scheme']
40
93
  assert_equal '666.666.666.666', env['REMOTE_ADDR']
41
94
  assert_nothing_raised { res = @lint.call(env) }
42
95
  end
@@ -35,18 +35,53 @@ class WebServerTest < Test::Unit::TestCase
35
35
  end
36
36
  end
37
37
 
38
+ def test_preload_app_config
39
+ teardown
40
+ tmp = Tempfile.new('test_preload_app_config')
41
+ ObjectSpace.undefine_finalizer(tmp)
42
+ app = lambda { ||
43
+ tmp.sysseek(0)
44
+ tmp.truncate(0)
45
+ tmp.syswrite($$)
46
+ lambda { |env| [ 200, { 'Content-Type' => 'text/plain' }, [ "#$$\n" ] ] }
47
+ }
48
+ redirect_test_io do
49
+ @server = HttpServer.new(app, :listeners => [ "127.0.0.1:#@port"] )
50
+ @server.start
51
+ end
52
+ results = hit(["http://localhost:#@port/"])
53
+ worker_pid = results[0].to_i
54
+ tmp.sysseek(0)
55
+ loader_pid = tmp.sysread(4096).to_i
56
+ assert_equal worker_pid, loader_pid
57
+ teardown
58
+
59
+ redirect_test_io do
60
+ @server = HttpServer.new(app, :listeners => [ "127.0.0.1:#@port"],
61
+ :preload_app => true)
62
+ @server.start
63
+ end
64
+ results = hit(["http://localhost:#@port/"])
65
+ worker_pid = results[0].to_i
66
+ tmp.sysseek(0)
67
+ loader_pid = tmp.sysread(4096).to_i
68
+ assert_equal $$, loader_pid
69
+ assert worker_pid != loader_pid
70
+ ensure
71
+ tmp.close!
72
+ end
73
+
38
74
  def test_broken_app
39
75
  teardown
40
- port = unused_port
41
76
  app = lambda { |env| raise RuntimeError, "hello" }
42
77
  # [200, {}, []] }
43
78
  redirect_test_io do
44
- @server = HttpServer.new(app, :listeners => [ "127.0.0.1:#{port}"] )
79
+ @server = HttpServer.new(app, :listeners => [ "127.0.0.1:#@port"] )
45
80
  @server.start
46
81
  end
47
82
  sock = nil
48
83
  assert_nothing_raised do
49
- sock = TCPSocket.new('127.0.0.1', port)
84
+ sock = TCPSocket.new('127.0.0.1', @port)
50
85
  sock.syswrite("GET / HTTP/1.0\r\n\r\n")
51
86
  end
52
87
 
@@ -0,0 +1,108 @@
1
+ # Copyright (c) 2009 Eric Wong
2
+ # You can redistribute it and/or modify it under the same terms as Ruby.
3
+ #
4
+ # Ensure we stay sane in the face of signals being sent to us
5
+
6
+ require 'test/test_helper'
7
+
8
+ include Unicorn
9
+
10
+ class Dd
11
+ def initialize(bs, count)
12
+ @count = count
13
+ @buf = ' ' * bs
14
+ end
15
+
16
+ def each(&block)
17
+ @count.times { yield @buf }
18
+ end
19
+ end
20
+
21
+ class SignalsTest < Test::Unit::TestCase
22
+
23
+ def setup
24
+ @bs = 1 * 1024 * 1024
25
+ @count = 100
26
+ @port = unused_port
27
+ tmp = @tmp = Tempfile.new('unicorn.sock')
28
+ File.unlink(@tmp.path)
29
+ n = 0
30
+ tmp.chmod(0)
31
+ @server_opts = {
32
+ :listeners => [ "127.0.0.1:#@port", @tmp.path ],
33
+ :after_fork => lambda { |server,worker|
34
+ trap(:HUP) { tmp.chmod(n += 1) }
35
+ },
36
+ }
37
+ @server = nil
38
+ end
39
+
40
+ def test_response_write
41
+ app = lambda { |env|
42
+ [ 200, { 'Content-Type' => 'text/plain', 'X-Pid' => Process.pid.to_s },
43
+ Dd.new(@bs, @count) ]
44
+ }
45
+ redirect_test_io { @server = HttpServer.new(app, @server_opts).start }
46
+ sock = nil
47
+ assert_nothing_raised do
48
+ sock = TCPSocket.new('127.0.0.1', @port)
49
+ sock.syswrite("GET / HTTP/1.0\r\n\r\n")
50
+ end
51
+ buf = ''
52
+ header_len = pid = nil
53
+ assert_nothing_raised do
54
+ buf = sock.sysread(16384, buf)
55
+ pid = buf[/\r\nX-Pid: (\d+)\r\n/, 1].to_i
56
+ header_len = buf[/\A(.+?\r\n\r\n)/m, 1].size
57
+ end
58
+ read = buf.size
59
+ mode_before = @tmp.stat.mode
60
+ assert_raises(EOFError,Errno::ECONNRESET,Errno::EPIPE,Errno::EINVAL,
61
+ Errno::EBADF) do
62
+ loop do
63
+ 3.times { Process.kill(:HUP, pid) }
64
+ sock.sysread(16384, buf)
65
+ read += buf.size
66
+ 3.times { Process.kill(:HUP, pid) }
67
+ end
68
+ end
69
+
70
+ redirect_test_io { @server.stop(true) }
71
+ # can't check for == since pending signals get merged
72
+ assert mode_before < @tmp.stat.mode
73
+ assert_equal(read - header_len, @bs * @count)
74
+ assert_nothing_raised { sock.close }
75
+ end
76
+
77
+ def test_request_read
78
+ app = lambda { |env|
79
+ [ 200, {'Content-Type'=>'text/plain', 'X-Pid'=>Process.pid.to_s}, [] ]
80
+ }
81
+ redirect_test_io { @server = HttpServer.new(app, @server_opts).start }
82
+ pid = nil
83
+
84
+ assert_nothing_raised do
85
+ sock = TCPSocket.new('127.0.0.1', @port)
86
+ sock.syswrite("GET / HTTP/1.0\r\n\r\n")
87
+ pid = sock.sysread(4096)[/\r\nX-Pid: (\d+)\r\n/, 1].to_i
88
+ sock.close
89
+ end
90
+
91
+ sock = TCPSocket.new('127.0.0.1', @port)
92
+ sock.syswrite("PUT / HTTP/1.0\r\n")
93
+ sock.syswrite("Content-Length: #{@bs * @count}\r\n\r\n")
94
+ 1000.times { Process.kill(:HUP, pid) }
95
+ mode_before = @tmp.stat.mode
96
+ killer = fork { loop { Process.kill(:HUP, pid); sleep(0.0001) } }
97
+ buf = ' ' * @bs
98
+ @count.times { sock.syswrite(buf) }
99
+ Process.kill(:TERM, killer)
100
+ Process.waitpid2(killer)
101
+ redirect_test_io { @server.stop(true) }
102
+ # can't check for == since pending signals get merged
103
+ assert mode_before < @tmp.stat.mode
104
+ assert_equal pid, sock.sysread(4096)[/\r\nX-Pid: (\d+)\r\n/, 1].to_i
105
+ sock.close
106
+ end
107
+
108
+ end
@@ -16,7 +16,7 @@ class TestSocketHelper < Test::Unit::TestCase
16
16
  port = unused_port @test_addr
17
17
  @tcp_listener_name = "#@test_addr:#{port}"
18
18
  @tcp_listener = bind_listen(@tcp_listener_name)
19
- assert Socket === @tcp_listener
19
+ assert TCPServer === @tcp_listener
20
20
  assert_equal @tcp_listener_name, sock_name(@tcp_listener)
21
21
  end
22
22
 
@@ -31,10 +31,10 @@ class TestSocketHelper < Test::Unit::TestCase
31
31
  ].each do |opts|
32
32
  assert_nothing_raised do
33
33
  tcp_listener = bind_listen(tcp_listener_name, opts)
34
- assert Socket === tcp_listener
34
+ assert TCPServer === tcp_listener
35
35
  tcp_listener.close
36
36
  unix_listener = bind_listen(unix_listener_name, opts)
37
- assert Socket === unix_listener
37
+ assert UNIXServer === unix_listener
38
38
  unix_listener.close
39
39
  end
40
40
  end
@@ -42,12 +42,18 @@ class TestSocketHelper < Test::Unit::TestCase
42
42
  end
43
43
 
44
44
  def test_bind_listen_unix
45
+ old_umask = File.umask(0777)
45
46
  tmp = Tempfile.new 'unix.sock'
46
47
  @unix_listener_path = tmp.path
47
48
  File.unlink(@unix_listener_path)
48
49
  @unix_listener = bind_listen(@unix_listener_path)
49
- assert Socket === @unix_listener
50
+ assert UNIXServer === @unix_listener
50
51
  assert_equal @unix_listener_path, sock_name(@unix_listener)
52
+ assert File.readable?(@unix_listener_path), "not readable"
53
+ assert File.writable?(@unix_listener_path), "not writable"
54
+ assert_equal 0777, File.umask
55
+ ensure
56
+ File.umask(old_umask)
51
57
  end
52
58
 
53
59
  def test_bind_listen_unix_idempotent
@@ -55,6 +61,7 @@ class TestSocketHelper < Test::Unit::TestCase
55
61
  a = bind_listen(@unix_listener)
56
62
  assert_equal a.fileno, @unix_listener.fileno
57
63
  unix_server = server_cast(@unix_listener)
64
+ assert UNIXServer === unix_server
58
65
  a = bind_listen(unix_server)
59
66
  assert_equal a.fileno, unix_server.fileno
60
67
  assert_equal a.fileno, @unix_listener.fileno
@@ -65,6 +72,7 @@ class TestSocketHelper < Test::Unit::TestCase
65
72
  a = bind_listen(@tcp_listener)
66
73
  assert_equal a.fileno, @tcp_listener.fileno
67
74
  tcp_server = server_cast(@tcp_listener)
75
+ assert TCPServer === tcp_server
68
76
  a = bind_listen(tcp_server)
69
77
  assert_equal a.fileno, tcp_server.fileno
70
78
  assert_equal a.fileno, @tcp_listener.fileno
@@ -73,7 +81,7 @@ class TestSocketHelper < Test::Unit::TestCase
73
81
  def test_bind_listen_unix_rebind
74
82
  test_bind_listen_unix
75
83
  new_listener = bind_listen(@unix_listener_path)
76
- assert Socket === new_listener
84
+ assert UNIXServer === new_listener
77
85
  assert new_listener.fileno != @unix_listener.fileno
78
86
  assert_equal sock_name(new_listener), sock_name(@unix_listener)
79
87
  assert_equal @unix_listener_path, sock_name(new_listener)
@@ -94,13 +102,17 @@ class TestSocketHelper < Test::Unit::TestCase
94
102
  test_bind_listen_unix
95
103
  test_bind_listen_tcp
96
104
  end
97
- @unix_server = server_cast(@unix_listener)
105
+ unix_listener_socket = Socket.for_fd(@unix_listener.fileno)
106
+ assert Socket === unix_listener_socket
107
+ @unix_server = server_cast(unix_listener_socket)
98
108
  assert_equal @unix_listener.fileno, @unix_server.fileno
99
109
  assert UNIXServer === @unix_server
100
110
  assert File.socket?(@unix_server.path)
101
111
  assert_equal @unix_listener_path, sock_name(@unix_server)
102
112
 
103
- @tcp_server = server_cast(@tcp_listener)
113
+ tcp_listener_socket = Socket.for_fd(@tcp_listener.fileno)
114
+ assert Socket === tcp_listener_socket
115
+ @tcp_server = server_cast(tcp_listener_socket)
104
116
  assert_equal @tcp_listener.fileno, @tcp_server.fileno
105
117
  assert TCPServer === @tcp_server
106
118
  assert_equal @tcp_listener_name, sock_name(@tcp_server)
data/unicorn.gemspec CHANGED
@@ -2,17 +2,17 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{unicorn}
5
- s.version = "0.4.2"
5
+ s.version = "0.5.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Eric Wong"]
9
- s.date = %q{2009-04-02}
9
+ s.date = %q{2009-04-13}
10
10
  s.description = %q{A small fast HTTP library and server for Rack applications.}
11
11
  s.email = %q{normalperson@yhbt.net}
12
12
  s.executables = ["unicorn", "unicorn_rails"]
13
13
  s.extensions = ["ext/unicorn/http11/extconf.rb"]
14
14
  s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README", "TODO", "bin/unicorn", "bin/unicorn_rails", "ext/unicorn/http11/ext_help.h", "ext/unicorn/http11/extconf.rb", "ext/unicorn/http11/http11.c", "ext/unicorn/http11/http11_parser.c", "ext/unicorn/http11/http11_parser.h", "ext/unicorn/http11/http11_parser.rl", "ext/unicorn/http11/http11_parser_common.rl", "lib/unicorn.rb", "lib/unicorn/app/exec_cgi.rb", "lib/unicorn/app/old_rails.rb", "lib/unicorn/app/old_rails/static.rb", "lib/unicorn/cgi_wrapper.rb", "lib/unicorn/configurator.rb", "lib/unicorn/const.rb", "lib/unicorn/http_request.rb", "lib/unicorn/http_response.rb", "lib/unicorn/launcher.rb", "lib/unicorn/socket.rb", "lib/unicorn/util.rb"]
15
- s.files = [".document", ".gitignore", "CHANGELOG", "CONTRIBUTORS", "DESIGN", "GNUmakefile", "LICENSE", "Manifest", "PHILOSOPHY", "README", "Rakefile", "SIGNALS", "TODO", "bin/unicorn", "bin/unicorn_rails", "ext/unicorn/http11/ext_help.h", "ext/unicorn/http11/extconf.rb", "ext/unicorn/http11/http11.c", "ext/unicorn/http11/http11_parser.c", "ext/unicorn/http11/http11_parser.h", "ext/unicorn/http11/http11_parser.rl", "ext/unicorn/http11/http11_parser_common.rl", "lib/unicorn.rb", "lib/unicorn/app/exec_cgi.rb", "lib/unicorn/app/old_rails.rb", "lib/unicorn/app/old_rails/static.rb", "lib/unicorn/cgi_wrapper.rb", "lib/unicorn/configurator.rb", "lib/unicorn/const.rb", "lib/unicorn/http_request.rb", "lib/unicorn/http_response.rb", "lib/unicorn/launcher.rb", "lib/unicorn/socket.rb", "lib/unicorn/util.rb", "local.mk.sample", "setup.rb", "test/aggregate.rb", "test/benchmark/README", "test/benchmark/big_request.rb", "test/benchmark/dd.ru", "test/benchmark/request.rb", "test/benchmark/response.rb", "test/exec/README", "test/exec/test_exec.rb", "test/rails/app-1.2.3/.gitignore", "test/rails/app-1.2.3/Rakefile", "test/rails/app-1.2.3/app/controllers/application.rb", "test/rails/app-1.2.3/app/controllers/foo_controller.rb", "test/rails/app-1.2.3/app/helpers/application_helper.rb", "test/rails/app-1.2.3/config/boot.rb", "test/rails/app-1.2.3/config/database.yml", "test/rails/app-1.2.3/config/environment.rb", "test/rails/app-1.2.3/config/environments/development.rb", "test/rails/app-1.2.3/config/environments/production.rb", "test/rails/app-1.2.3/config/routes.rb", "test/rails/app-1.2.3/db/.gitignore", "test/rails/app-1.2.3/log/.gitignore", "test/rails/app-1.2.3/public/404.html", "test/rails/app-1.2.3/public/500.html", "test/rails/app-2.0.2/.gitignore", "test/rails/app-2.0.2/Rakefile", "test/rails/app-2.0.2/app/controllers/application.rb", "test/rails/app-2.0.2/app/controllers/foo_controller.rb", "test/rails/app-2.0.2/app/helpers/application_helper.rb", "test/rails/app-2.0.2/config/boot.rb", "test/rails/app-2.0.2/config/database.yml", "test/rails/app-2.0.2/config/environment.rb", "test/rails/app-2.0.2/config/environments/development.rb", "test/rails/app-2.0.2/config/environments/production.rb", "test/rails/app-2.0.2/config/routes.rb", "test/rails/app-2.0.2/db/.gitignore", "test/rails/app-2.0.2/log/.gitignore", "test/rails/app-2.0.2/public/404.html", "test/rails/app-2.0.2/public/500.html", "test/rails/app-2.1.2/.gitignore", "test/rails/app-2.1.2/Rakefile", "test/rails/app-2.1.2/app/controllers/application.rb", "test/rails/app-2.1.2/app/controllers/foo_controller.rb", "test/rails/app-2.1.2/app/helpers/application_helper.rb", "test/rails/app-2.1.2/config/boot.rb", "test/rails/app-2.1.2/config/database.yml", "test/rails/app-2.1.2/config/environment.rb", "test/rails/app-2.1.2/config/environments/development.rb", "test/rails/app-2.1.2/config/environments/production.rb", "test/rails/app-2.1.2/config/routes.rb", "test/rails/app-2.1.2/db/.gitignore", "test/rails/app-2.1.2/log/.gitignore", "test/rails/app-2.1.2/public/404.html", "test/rails/app-2.1.2/public/500.html", "test/rails/app-2.2.2/.gitignore", "test/rails/app-2.2.2/Rakefile", "test/rails/app-2.2.2/app/controllers/application.rb", "test/rails/app-2.2.2/app/controllers/foo_controller.rb", "test/rails/app-2.2.2/app/helpers/application_helper.rb", "test/rails/app-2.2.2/config/boot.rb", "test/rails/app-2.2.2/config/database.yml", "test/rails/app-2.2.2/config/environment.rb", "test/rails/app-2.2.2/config/environments/development.rb", "test/rails/app-2.2.2/config/environments/production.rb", "test/rails/app-2.2.2/config/routes.rb", "test/rails/app-2.2.2/db/.gitignore", "test/rails/app-2.2.2/log/.gitignore", "test/rails/app-2.2.2/public/404.html", "test/rails/app-2.2.2/public/500.html", "test/rails/app-2.3.2.1/.gitignore", "test/rails/app-2.3.2.1/Rakefile", "test/rails/app-2.3.2.1/app/controllers/application_controller.rb", "test/rails/app-2.3.2.1/app/controllers/foo_controller.rb", "test/rails/app-2.3.2.1/app/helpers/application_helper.rb", "test/rails/app-2.3.2.1/config/boot.rb", "test/rails/app-2.3.2.1/config/database.yml", "test/rails/app-2.3.2.1/config/environment.rb", "test/rails/app-2.3.2.1/config/environments/development.rb", "test/rails/app-2.3.2.1/config/environments/production.rb", "test/rails/app-2.3.2.1/config/routes.rb", "test/rails/app-2.3.2.1/db/.gitignore", "test/rails/app-2.3.2.1/log/.gitignore", "test/rails/app-2.3.2.1/public/404.html", "test/rails/app-2.3.2.1/public/500.html", "test/rails/test_rails.rb", "test/test_helper.rb", "test/tools/trickletest.rb", "test/unit/test_configurator.rb", "test/unit/test_http_parser.rb", "test/unit/test_request.rb", "test/unit/test_response.rb", "test/unit/test_server.rb", "test/unit/test_socket_helper.rb", "test/unit/test_upload.rb", "unicorn.gemspec"]
15
+ s.files = [".document", ".gitignore", "CHANGELOG", "CONTRIBUTORS", "DESIGN", "GNUmakefile", "LICENSE", "Manifest", "PHILOSOPHY", "README", "Rakefile", "SIGNALS", "TODO", "bin/unicorn", "bin/unicorn_rails", "ext/unicorn/http11/ext_help.h", "ext/unicorn/http11/extconf.rb", "ext/unicorn/http11/http11.c", "ext/unicorn/http11/http11_parser.c", "ext/unicorn/http11/http11_parser.h", "ext/unicorn/http11/http11_parser.rl", "ext/unicorn/http11/http11_parser_common.rl", "lib/unicorn.rb", "lib/unicorn/app/exec_cgi.rb", "lib/unicorn/app/old_rails.rb", "lib/unicorn/app/old_rails/static.rb", "lib/unicorn/cgi_wrapper.rb", "lib/unicorn/configurator.rb", "lib/unicorn/const.rb", "lib/unicorn/http_request.rb", "lib/unicorn/http_response.rb", "lib/unicorn/launcher.rb", "lib/unicorn/socket.rb", "lib/unicorn/util.rb", "local.mk.sample", "setup.rb", "test/aggregate.rb", "test/benchmark/README", "test/benchmark/big_request.rb", "test/benchmark/dd.ru", "test/benchmark/request.rb", "test/benchmark/response.rb", "test/exec/README", "test/exec/test_exec.rb", "test/rails/app-1.2.3/.gitignore", "test/rails/app-1.2.3/Rakefile", "test/rails/app-1.2.3/app/controllers/application.rb", "test/rails/app-1.2.3/app/controllers/foo_controller.rb", "test/rails/app-1.2.3/app/helpers/application_helper.rb", "test/rails/app-1.2.3/config/boot.rb", "test/rails/app-1.2.3/config/database.yml", "test/rails/app-1.2.3/config/environment.rb", "test/rails/app-1.2.3/config/environments/development.rb", "test/rails/app-1.2.3/config/environments/production.rb", "test/rails/app-1.2.3/config/routes.rb", "test/rails/app-1.2.3/db/.gitignore", "test/rails/app-1.2.3/log/.gitignore", "test/rails/app-1.2.3/public/404.html", "test/rails/app-1.2.3/public/500.html", "test/rails/app-2.0.2/.gitignore", "test/rails/app-2.0.2/Rakefile", "test/rails/app-2.0.2/app/controllers/application.rb", "test/rails/app-2.0.2/app/controllers/foo_controller.rb", "test/rails/app-2.0.2/app/helpers/application_helper.rb", "test/rails/app-2.0.2/config/boot.rb", "test/rails/app-2.0.2/config/database.yml", "test/rails/app-2.0.2/config/environment.rb", "test/rails/app-2.0.2/config/environments/development.rb", "test/rails/app-2.0.2/config/environments/production.rb", "test/rails/app-2.0.2/config/routes.rb", "test/rails/app-2.0.2/db/.gitignore", "test/rails/app-2.0.2/log/.gitignore", "test/rails/app-2.0.2/public/404.html", "test/rails/app-2.0.2/public/500.html", "test/rails/app-2.1.2/.gitignore", "test/rails/app-2.1.2/Rakefile", "test/rails/app-2.1.2/app/controllers/application.rb", "test/rails/app-2.1.2/app/controllers/foo_controller.rb", "test/rails/app-2.1.2/app/helpers/application_helper.rb", "test/rails/app-2.1.2/config/boot.rb", "test/rails/app-2.1.2/config/database.yml", "test/rails/app-2.1.2/config/environment.rb", "test/rails/app-2.1.2/config/environments/development.rb", "test/rails/app-2.1.2/config/environments/production.rb", "test/rails/app-2.1.2/config/routes.rb", "test/rails/app-2.1.2/db/.gitignore", "test/rails/app-2.1.2/log/.gitignore", "test/rails/app-2.1.2/public/404.html", "test/rails/app-2.1.2/public/500.html", "test/rails/app-2.2.2/.gitignore", "test/rails/app-2.2.2/Rakefile", "test/rails/app-2.2.2/app/controllers/application.rb", "test/rails/app-2.2.2/app/controllers/foo_controller.rb", "test/rails/app-2.2.2/app/helpers/application_helper.rb", "test/rails/app-2.2.2/config/boot.rb", "test/rails/app-2.2.2/config/database.yml", "test/rails/app-2.2.2/config/environment.rb", "test/rails/app-2.2.2/config/environments/development.rb", "test/rails/app-2.2.2/config/environments/production.rb", "test/rails/app-2.2.2/config/routes.rb", "test/rails/app-2.2.2/db/.gitignore", "test/rails/app-2.2.2/log/.gitignore", "test/rails/app-2.2.2/public/404.html", "test/rails/app-2.2.2/public/500.html", "test/rails/app-2.3.2.1/.gitignore", "test/rails/app-2.3.2.1/Rakefile", "test/rails/app-2.3.2.1/app/controllers/application_controller.rb", "test/rails/app-2.3.2.1/app/controllers/foo_controller.rb", "test/rails/app-2.3.2.1/app/helpers/application_helper.rb", "test/rails/app-2.3.2.1/config/boot.rb", "test/rails/app-2.3.2.1/config/database.yml", "test/rails/app-2.3.2.1/config/environment.rb", "test/rails/app-2.3.2.1/config/environments/development.rb", "test/rails/app-2.3.2.1/config/environments/production.rb", "test/rails/app-2.3.2.1/config/routes.rb", "test/rails/app-2.3.2.1/db/.gitignore", "test/rails/app-2.3.2.1/log/.gitignore", "test/rails/app-2.3.2.1/public/404.html", "test/rails/app-2.3.2.1/public/500.html", "test/rails/test_rails.rb", "test/test_helper.rb", "test/tools/trickletest.rb", "test/unit/test_configurator.rb", "test/unit/test_http_parser.rb", "test/unit/test_request.rb", "test/unit/test_response.rb", "test/unit/test_server.rb", "test/unit/test_socket_helper.rb", "test/unit/test_upload.rb", "unicorn.gemspec", "test/unit/test_signals.rb"]
16
16
  s.has_rdoc = true
17
17
  s.homepage = %q{http://unicorn.bogomips.org}
18
18
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Unicorn", "--main", "README"]
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
20
20
  s.rubyforge_project = %q{unicorn}
21
21
  s.rubygems_version = %q{1.3.1}
22
22
  s.summary = %q{A small fast HTTP library and server for Rack applications.}
23
- s.test_files = ["test/unit/test_configurator.rb", "test/unit/test_response.rb", "test/unit/test_request.rb", "test/unit/test_upload.rb", "test/unit/test_http_parser.rb", "test/unit/test_socket_helper.rb", "test/unit/test_server.rb"]
23
+ s.test_files = ["test/unit/test_configurator.rb", "test/unit/test_response.rb", "test/unit/test_request.rb", "test/unit/test_signals.rb", "test/unit/test_upload.rb", "test/unit/test_http_parser.rb", "test/unit/test_socket_helper.rb", "test/unit/test_server.rb"]
24
24
 
25
25
  if s.respond_to? :specification_version then
26
26
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unicorn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Wong
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-04-02 00:00:00 -07:00
12
+ date: 2009-04-13 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -213,6 +213,7 @@ test_files:
213
213
  - test/unit/test_configurator.rb
214
214
  - test/unit/test_response.rb
215
215
  - test/unit/test_request.rb
216
+ - test/unit/test_signals.rb
216
217
  - test/unit/test_upload.rb
217
218
  - test/unit/test_http_parser.rb
218
219
  - test/unit/test_socket_helper.rb