unicorn-fotopedia 0.99.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.CHANGELOG.old +25 -0
- data/.document +19 -0
- data/.gitignore +21 -0
- data/.mailmap +26 -0
- data/CONTRIBUTORS +32 -0
- data/COPYING +339 -0
- data/DESIGN +105 -0
- data/Documentation/.gitignore +5 -0
- data/Documentation/GNUmakefile +30 -0
- data/Documentation/unicorn.1.txt +171 -0
- data/Documentation/unicorn_rails.1.txt +172 -0
- data/FAQ +52 -0
- data/GIT-VERSION-GEN +40 -0
- data/GNUmakefile +292 -0
- data/HACKING +116 -0
- data/ISSUES +36 -0
- data/KNOWN_ISSUES +50 -0
- data/LICENSE +55 -0
- data/PHILOSOPHY +145 -0
- data/README +149 -0
- data/Rakefile +191 -0
- data/SIGNALS +109 -0
- data/Sandbox +78 -0
- data/TODO +5 -0
- data/TUNING +70 -0
- data/bin/unicorn +126 -0
- data/bin/unicorn_rails +203 -0
- data/examples/big_app_gc.rb +33 -0
- data/examples/echo.ru +27 -0
- data/examples/git.ru +13 -0
- data/examples/init.sh +58 -0
- data/examples/logger_mp_safe.rb +25 -0
- data/examples/nginx.conf +139 -0
- data/examples/unicorn.conf.rb +78 -0
- data/ext/unicorn_http/CFLAGS +13 -0
- data/ext/unicorn_http/c_util.h +124 -0
- data/ext/unicorn_http/common_field_optimization.h +111 -0
- data/ext/unicorn_http/ext_help.h +77 -0
- data/ext/unicorn_http/extconf.rb +14 -0
- data/ext/unicorn_http/global_variables.h +89 -0
- data/ext/unicorn_http/unicorn_http.rl +714 -0
- data/ext/unicorn_http/unicorn_http_common.rl +75 -0
- data/lib/unicorn.rb +847 -0
- data/lib/unicorn/app/exec_cgi.rb +150 -0
- data/lib/unicorn/app/inetd.rb +109 -0
- data/lib/unicorn/app/old_rails.rb +33 -0
- data/lib/unicorn/app/old_rails/static.rb +58 -0
- data/lib/unicorn/cgi_wrapper.rb +145 -0
- data/lib/unicorn/configurator.rb +421 -0
- data/lib/unicorn/const.rb +34 -0
- data/lib/unicorn/http_request.rb +72 -0
- data/lib/unicorn/http_response.rb +75 -0
- data/lib/unicorn/launcher.rb +65 -0
- data/lib/unicorn/oob_gc.rb +58 -0
- data/lib/unicorn/socket_helper.rb +152 -0
- data/lib/unicorn/tee_input.rb +217 -0
- data/lib/unicorn/util.rb +90 -0
- data/local.mk.sample +62 -0
- data/setup.rb +1586 -0
- data/t/.gitignore +2 -0
- data/t/GNUmakefile +67 -0
- data/t/README +42 -0
- data/t/bin/content-md5-put +36 -0
- data/t/bin/sha1sum.rb +23 -0
- data/t/bin/unused_listen +40 -0
- data/t/bin/utee +12 -0
- data/t/env.ru +3 -0
- data/t/my-tap-lib.sh +200 -0
- data/t/t0000-http-basic.sh +50 -0
- data/t/t0001-reload-bad-config.sh +52 -0
- data/t/t0002-config-conflict.sh +49 -0
- data/t/test-lib.sh +100 -0
- data/test/aggregate.rb +15 -0
- data/test/benchmark/README +50 -0
- data/test/benchmark/dd.ru +18 -0
- data/test/exec/README +5 -0
- data/test/exec/test_exec.rb +1038 -0
- data/test/rails/app-1.2.3/.gitignore +2 -0
- data/test/rails/app-1.2.3/Rakefile +7 -0
- data/test/rails/app-1.2.3/app/controllers/application.rb +6 -0
- data/test/rails/app-1.2.3/app/controllers/foo_controller.rb +36 -0
- data/test/rails/app-1.2.3/app/helpers/application_helper.rb +4 -0
- data/test/rails/app-1.2.3/config/boot.rb +11 -0
- data/test/rails/app-1.2.3/config/database.yml +12 -0
- data/test/rails/app-1.2.3/config/environment.rb +13 -0
- data/test/rails/app-1.2.3/config/environments/development.rb +9 -0
- data/test/rails/app-1.2.3/config/environments/production.rb +5 -0
- data/test/rails/app-1.2.3/config/routes.rb +6 -0
- data/test/rails/app-1.2.3/db/.gitignore +0 -0
- data/test/rails/app-1.2.3/public/404.html +1 -0
- data/test/rails/app-1.2.3/public/500.html +1 -0
- data/test/rails/app-2.0.2/.gitignore +2 -0
- data/test/rails/app-2.0.2/Rakefile +7 -0
- data/test/rails/app-2.0.2/app/controllers/application.rb +4 -0
- data/test/rails/app-2.0.2/app/controllers/foo_controller.rb +36 -0
- data/test/rails/app-2.0.2/app/helpers/application_helper.rb +4 -0
- data/test/rails/app-2.0.2/config/boot.rb +11 -0
- data/test/rails/app-2.0.2/config/database.yml +12 -0
- data/test/rails/app-2.0.2/config/environment.rb +17 -0
- data/test/rails/app-2.0.2/config/environments/development.rb +8 -0
- data/test/rails/app-2.0.2/config/environments/production.rb +5 -0
- data/test/rails/app-2.0.2/config/routes.rb +6 -0
- data/test/rails/app-2.0.2/db/.gitignore +0 -0
- data/test/rails/app-2.0.2/public/404.html +1 -0
- data/test/rails/app-2.0.2/public/500.html +1 -0
- data/test/rails/app-2.1.2/.gitignore +2 -0
- data/test/rails/app-2.1.2/Rakefile +7 -0
- data/test/rails/app-2.1.2/app/controllers/application.rb +4 -0
- data/test/rails/app-2.1.2/app/controllers/foo_controller.rb +36 -0
- data/test/rails/app-2.1.2/app/helpers/application_helper.rb +4 -0
- data/test/rails/app-2.1.2/config/boot.rb +111 -0
- data/test/rails/app-2.1.2/config/database.yml +12 -0
- data/test/rails/app-2.1.2/config/environment.rb +17 -0
- data/test/rails/app-2.1.2/config/environments/development.rb +7 -0
- data/test/rails/app-2.1.2/config/environments/production.rb +5 -0
- data/test/rails/app-2.1.2/config/routes.rb +6 -0
- data/test/rails/app-2.1.2/db/.gitignore +0 -0
- data/test/rails/app-2.1.2/public/404.html +1 -0
- data/test/rails/app-2.1.2/public/500.html +1 -0
- data/test/rails/app-2.2.2/.gitignore +2 -0
- data/test/rails/app-2.2.2/Rakefile +7 -0
- data/test/rails/app-2.2.2/app/controllers/application.rb +4 -0
- data/test/rails/app-2.2.2/app/controllers/foo_controller.rb +36 -0
- data/test/rails/app-2.2.2/app/helpers/application_helper.rb +4 -0
- data/test/rails/app-2.2.2/config/boot.rb +111 -0
- data/test/rails/app-2.2.2/config/database.yml +12 -0
- data/test/rails/app-2.2.2/config/environment.rb +17 -0
- data/test/rails/app-2.2.2/config/environments/development.rb +7 -0
- data/test/rails/app-2.2.2/config/environments/production.rb +5 -0
- data/test/rails/app-2.2.2/config/routes.rb +6 -0
- data/test/rails/app-2.2.2/db/.gitignore +0 -0
- data/test/rails/app-2.2.2/public/404.html +1 -0
- data/test/rails/app-2.2.2/public/500.html +1 -0
- data/test/rails/app-2.3.5/.gitignore +2 -0
- data/test/rails/app-2.3.5/Rakefile +7 -0
- data/test/rails/app-2.3.5/app/controllers/application_controller.rb +5 -0
- data/test/rails/app-2.3.5/app/controllers/foo_controller.rb +36 -0
- data/test/rails/app-2.3.5/app/helpers/application_helper.rb +4 -0
- data/test/rails/app-2.3.5/config/boot.rb +109 -0
- data/test/rails/app-2.3.5/config/database.yml +12 -0
- data/test/rails/app-2.3.5/config/environment.rb +17 -0
- data/test/rails/app-2.3.5/config/environments/development.rb +7 -0
- data/test/rails/app-2.3.5/config/environments/production.rb +6 -0
- data/test/rails/app-2.3.5/config/routes.rb +6 -0
- data/test/rails/app-2.3.5/db/.gitignore +0 -0
- data/test/rails/app-2.3.5/public/404.html +1 -0
- data/test/rails/app-2.3.5/public/500.html +1 -0
- data/test/rails/app-2.3.5/public/x.txt +1 -0
- data/test/rails/test_rails.rb +280 -0
- data/test/test_helper.rb +301 -0
- data/test/unit/test_configurator.rb +150 -0
- data/test/unit/test_http_parser.rb +555 -0
- data/test/unit/test_http_parser_ng.rb +443 -0
- data/test/unit/test_request.rb +184 -0
- data/test/unit/test_response.rb +110 -0
- data/test/unit/test_server.rb +291 -0
- data/test/unit/test_signals.rb +206 -0
- data/test/unit/test_socket_helper.rb +147 -0
- data/test/unit/test_tee_input.rb +257 -0
- data/test/unit/test_upload.rb +298 -0
- data/test/unit/test_util.rb +96 -0
- data/unicorn.gemspec +52 -0
- metadata +283 -0
data/t/.gitignore
ADDED
data/t/GNUmakefile
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
# we can run tests in parallel with GNU make
|
2
|
+
all::
|
3
|
+
|
4
|
+
pid := $(shell echo $$PPID)
|
5
|
+
|
6
|
+
RUBY = ruby
|
7
|
+
-include ../local.mk
|
8
|
+
ifeq ($(RUBY_VERSION),)
|
9
|
+
RUBY_VERSION := $(shell $(RUBY) -e 'puts RUBY_VERSION')
|
10
|
+
endif
|
11
|
+
|
12
|
+
ifeq ($(RUBY_VERSION),)
|
13
|
+
$(error unable to detect RUBY_VERSION)
|
14
|
+
endif
|
15
|
+
|
16
|
+
T = $(wildcard t[0-9][0-9][0-9][0-9]-*.sh)
|
17
|
+
|
18
|
+
all:: $(T)
|
19
|
+
|
20
|
+
# can't rely on "set -o pipefail" since we don't require bash or ksh93 :<
|
21
|
+
t_pfx = trash/$@-$(RUBY_VERSION)
|
22
|
+
TEST_OPTS =
|
23
|
+
# TRACER = strace -f -o $(t_pfx).strace -s 100000
|
24
|
+
# TRACER = /usr/bin/time -o $(t_pfx).time
|
25
|
+
|
26
|
+
ifdef V
|
27
|
+
ifeq ($(V),2)
|
28
|
+
TEST_OPTS += --trace
|
29
|
+
else
|
30
|
+
TEST_OPTS += --verbose
|
31
|
+
endif
|
32
|
+
endif
|
33
|
+
|
34
|
+
random_blob:
|
35
|
+
dd if=/dev/urandom bs=1M count=30 of=$@.$(pid)
|
36
|
+
mv $@.$(pid) $@
|
37
|
+
|
38
|
+
$(T): random_blob
|
39
|
+
|
40
|
+
dependencies := socat curl
|
41
|
+
deps := $(addprefix .dep+,$(dependencies))
|
42
|
+
$(deps): dep_bin = $(lastword $(subst +, ,$@))
|
43
|
+
$(deps):
|
44
|
+
@which $(dep_bin) > $@.$(pid) 2>/dev/null || :
|
45
|
+
@test -s $@.$(pid) || \
|
46
|
+
{ echo >&2 "E '$(dep_bin)' not found in PATH=$(PATH)"; exit 1; }
|
47
|
+
@mv $@.$(pid) $@
|
48
|
+
dep: $(deps)
|
49
|
+
|
50
|
+
test_prefix := $(CURDIR)/../test/install-$(RUBY_VERSION)
|
51
|
+
$(test_prefix)/.stamp:
|
52
|
+
$(MAKE) -C .. test-install
|
53
|
+
|
54
|
+
$(T): export RUBY := $(RUBY)
|
55
|
+
$(T): export PATH := $(test_prefix)/bin:$(PATH)
|
56
|
+
$(T): export RUBYLIB := $(test_prefix)/lib:$(RUBYLIB)
|
57
|
+
$(T): dep $(test_prefix)/.stamp trash/.gitignore
|
58
|
+
$(TRACER) $(SHELL) $(SH_TEST_OPTS) $@ $(TEST_OPTS)
|
59
|
+
|
60
|
+
trash/.gitignore:
|
61
|
+
mkdir -p $(@D)
|
62
|
+
echo '*' > $@
|
63
|
+
|
64
|
+
clean:
|
65
|
+
$(RM) -r trash/*
|
66
|
+
|
67
|
+
.PHONY: $(T) clean
|
data/t/README
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
= Unicorn integration test suite
|
2
|
+
|
3
|
+
These are all integration tests that start the server on random, unused
|
4
|
+
TCP ports or Unix domain sockets. They're all designed to run
|
5
|
+
concurrently with other tests to minimize test time, but tests may be
|
6
|
+
run independently as well.
|
7
|
+
|
8
|
+
We write our tests in Bourne shell because that's what we're
|
9
|
+
comfortable writing integration tests with.
|
10
|
+
|
11
|
+
== Requirements
|
12
|
+
|
13
|
+
* {Ruby 1.8 or 1.9}[http://www.ruby-lang.org/] (duh!)
|
14
|
+
* {GNU make}[http://www.gnu.org/software/make/]
|
15
|
+
* {socat}[http://www.dest-unreach.org/socat/]
|
16
|
+
* {curl}[http://curl.haxx.se/]
|
17
|
+
* standard UNIX shell utilities (Bourne sh, awk, sed, grep, ...)
|
18
|
+
|
19
|
+
We do not use bashisms or any non-portable, non-POSIX constructs
|
20
|
+
in our shell code. We use the "pipefail" option if available and
|
21
|
+
mainly test with {ksh}[http://kornshell.com/], but occasionally
|
22
|
+
with {dash}[http://gondor.apana.org.au/~herbert/dash/] and
|
23
|
+
{bash}[http://www.gnu.org/software/bash/], too.
|
24
|
+
|
25
|
+
== Running Tests
|
26
|
+
|
27
|
+
To run the entire test suite with 8 tests running at once:
|
28
|
+
|
29
|
+
make -j8
|
30
|
+
|
31
|
+
To run one individual test:
|
32
|
+
|
33
|
+
make t0000-simple-http.sh
|
34
|
+
|
35
|
+
You may also increase verbosity by setting the "V" variable for
|
36
|
+
GNU make. To disable trapping of stdout/stderr:
|
37
|
+
|
38
|
+
make V=1
|
39
|
+
|
40
|
+
To enable the "set -x" option in shell scripts to trace execution
|
41
|
+
|
42
|
+
make V=2
|
@@ -0,0 +1,36 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- encoding: binary -*-
|
3
|
+
# simple chunked HTTP PUT request generator (and just that),
|
4
|
+
# it reads stdin and writes to stdout so socat can write to a
|
5
|
+
# UNIX or TCP socket (or to another filter or file) along with
|
6
|
+
# a Content-MD5 trailer.
|
7
|
+
require 'digest/md5'
|
8
|
+
$stdout.sync = $stderr.sync = true
|
9
|
+
$stdout.binmode
|
10
|
+
$stdin.binmode
|
11
|
+
|
12
|
+
bs = ENV['bs'] ? ENV['bs'].to_i : 4096
|
13
|
+
|
14
|
+
if ARGV.grep("--no-headers").empty?
|
15
|
+
$stdout.write(
|
16
|
+
"PUT / HTTP/1.1\r\n" \
|
17
|
+
"Host: example.com\r\n" \
|
18
|
+
"Transfer-Encoding: chunked\r\n" \
|
19
|
+
"Trailer: Content-MD5\r\n" \
|
20
|
+
"\r\n"
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
digest = Digest::MD5.new
|
25
|
+
if buf = $stdin.readpartial(bs)
|
26
|
+
begin
|
27
|
+
digest.update(buf)
|
28
|
+
$stdout.write("%x\r\n" % [ buf.size ])
|
29
|
+
$stdout.write(buf)
|
30
|
+
$stdout.write("\r\n")
|
31
|
+
end while $stdin.read(bs, buf)
|
32
|
+
end
|
33
|
+
|
34
|
+
digest = [ digest.digest ].pack('m').strip
|
35
|
+
$stdout.write("0\r\n")
|
36
|
+
$stdout.write("Content-MD5: #{digest}\r\n\r\n")
|
data/t/bin/sha1sum.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- encoding: binary -*-
|
3
|
+
|
4
|
+
# Reads from stdin and outputs the SHA1 hex digest of the input this is
|
5
|
+
# ONLY used as a last resort, our test code will try to use sha1sum(1),
|
6
|
+
# openssl(1), or gsha1sum(1) before falling back to using this. We try
|
7
|
+
# all options first because we have a strong and healthy distrust of our
|
8
|
+
# Ruby abilities in general, and *especially* when it comes to
|
9
|
+
# understanding (and trusting the implementation of) Ruby 1.9 encoding.
|
10
|
+
|
11
|
+
require 'digest/sha1'
|
12
|
+
$stdout.sync = $stderr.sync = true
|
13
|
+
$stdout.binmode
|
14
|
+
$stdin.binmode
|
15
|
+
bs = 16384
|
16
|
+
digest = Digest::SHA1.new
|
17
|
+
if buf = $stdin.read(bs)
|
18
|
+
begin
|
19
|
+
digest.update(buf)
|
20
|
+
end while $stdin.read(bs, buf)
|
21
|
+
end
|
22
|
+
|
23
|
+
$stdout.syswrite("#{digest.hexdigest}\n")
|
data/t/bin/unused_listen
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- encoding: binary -*-
|
3
|
+
# this is to remain compatible with the unused_port function in the
|
4
|
+
# Unicorn test/test_helper.rb file
|
5
|
+
require 'socket'
|
6
|
+
require 'tmpdir'
|
7
|
+
|
8
|
+
default_port = 8080
|
9
|
+
addr = ENV['UNICORN_TEST_ADDR'] || '127.0.0.1'
|
10
|
+
retries = 100
|
11
|
+
base = 5000
|
12
|
+
port = sock = lock_path = nil
|
13
|
+
|
14
|
+
begin
|
15
|
+
begin
|
16
|
+
port = base + rand(32768 - base)
|
17
|
+
while port == default_port
|
18
|
+
port = base + rand(32768 - base)
|
19
|
+
end
|
20
|
+
|
21
|
+
sock = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
|
22
|
+
sock.bind(Socket.pack_sockaddr_in(port, addr))
|
23
|
+
sock.listen(5)
|
24
|
+
rescue Errno::EADDRINUSE, Errno::EACCES
|
25
|
+
sock.close rescue nil
|
26
|
+
retry if (retries -= 1) >= 0
|
27
|
+
end
|
28
|
+
|
29
|
+
# since we'll end up closing the random port we just got, there's a race
|
30
|
+
# condition could allow the random port we just chose to reselect itself
|
31
|
+
# when running tests in parallel with gmake. Create a lock file while
|
32
|
+
# we have the port here to ensure that does not happen.
|
33
|
+
lock_path = "#{Dir::tmpdir}/unicorn_test.#{addr}:#{port}.lock"
|
34
|
+
lock = File.open(lock_path, File::WRONLY|File::CREAT|File::EXCL, 0600)
|
35
|
+
rescue Errno::EEXIST
|
36
|
+
sock.close rescue nil
|
37
|
+
retry
|
38
|
+
end
|
39
|
+
sock.close rescue nil
|
40
|
+
puts %Q(listen=#{addr}:#{port} T_RM_LIST="$T_RM_LIST #{lock_path}")
|
data/t/bin/utee
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- encoding: binary -*-
|
3
|
+
# tee(1) as distributed on most(all?) systems is buffered in luserspace
|
4
|
+
# this only does unbuffered writes (with line-buffered input) to make
|
5
|
+
# test output appear in real-time
|
6
|
+
$stdin.binmode
|
7
|
+
$stdout.binmode
|
8
|
+
fp = File.open(ARGV.shift, "wb")
|
9
|
+
$stdin.each_line do |line|
|
10
|
+
fp.syswrite line
|
11
|
+
$stdout.syswrite line
|
12
|
+
end
|
data/t/env.ru
ADDED
data/t/my-tap-lib.sh
ADDED
@@ -0,0 +1,200 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
# Copyright (c) 2009, 2010 Eric Wong <normalperson@yhbt.net>
|
3
|
+
#
|
4
|
+
# TAP-producing shell library for POSIX-compliant Bourne shells We do
|
5
|
+
# not _rely_ on Bourne Again features, though we will use "set -o
|
6
|
+
# pipefail" from ksh93 or bash 3 if available
|
7
|
+
#
|
8
|
+
# Only generic, non-project/non-language-specific stuff goes here. We
|
9
|
+
# only have POSIX dependencies for the core tests (without --verbose),
|
10
|
+
# though we'll enable useful non-POSIX things if they're available.
|
11
|
+
#
|
12
|
+
# This test library is intentionally unforgiving, it does not support
|
13
|
+
# skipping tests nor continuing after any failure. Any failures
|
14
|
+
# immediately halt execution as do any references to undefined
|
15
|
+
# variables.
|
16
|
+
#
|
17
|
+
# When --verbose is specified, we always prefix stdout/stderr
|
18
|
+
# output with "#" to avoid confusing TAP consumers. Otherwise
|
19
|
+
# the normal stdout/stderr streams are redirected to /dev/null
|
20
|
+
|
21
|
+
# dup normal stdout(fd=1) and stderr (fd=2) to fd=3 and fd=4 respectively
|
22
|
+
# normal TAP output goes to fd=3, nothing should go to fd=4
|
23
|
+
exec 3>&1 4>&2
|
24
|
+
|
25
|
+
# ensure a sane environment
|
26
|
+
TZ=UTC LC_ALL=C LANG=C
|
27
|
+
export LANG LC_ALL TZ
|
28
|
+
unset CDPATH
|
29
|
+
|
30
|
+
# pipefail is non-POSIX, but very useful in ksh93/bash
|
31
|
+
( set -o pipefail 2>/dev/null ) && set -o pipefail
|
32
|
+
|
33
|
+
SED=${SED-sed}
|
34
|
+
|
35
|
+
# Unlike other test frameworks, we are unforgiving and bail immediately
|
36
|
+
# on any failures. We do this because we're lazy about error handling
|
37
|
+
# and also because we believe anything broken should not be allowed to
|
38
|
+
# propagate throughout the rest of the test
|
39
|
+
set -e
|
40
|
+
set -u
|
41
|
+
|
42
|
+
# name of our test
|
43
|
+
T=${0##*/}
|
44
|
+
|
45
|
+
t_expect_nr=-1
|
46
|
+
t_nr=0
|
47
|
+
t_current=
|
48
|
+
t_complete=false
|
49
|
+
|
50
|
+
# list of files to remove unconditionally on exit
|
51
|
+
T_RM_LIST=
|
52
|
+
|
53
|
+
# list of files to remove only on successful exit
|
54
|
+
T_OK_RM_LIST=
|
55
|
+
|
56
|
+
# emit output to stdout, it'll be parsed by the TAP consumer
|
57
|
+
# so it must be TAP-compliant output
|
58
|
+
t_echo () {
|
59
|
+
echo >&3 "$@"
|
60
|
+
}
|
61
|
+
|
62
|
+
# emits non-parsed information to stdout, it will be prefixed with a '#'
|
63
|
+
# to not throw off TAP consumers
|
64
|
+
t_info () {
|
65
|
+
t_echo '#' "$@"
|
66
|
+
}
|
67
|
+
|
68
|
+
# exit with an error and print a diagnostic
|
69
|
+
die () {
|
70
|
+
echo >&2 "$@"
|
71
|
+
exit 1
|
72
|
+
}
|
73
|
+
|
74
|
+
# our at_exit handler, it'll fire for all exits except SIGKILL (unavoidable)
|
75
|
+
t_at_exit () {
|
76
|
+
code=$?
|
77
|
+
set +e
|
78
|
+
if test $code -eq 0
|
79
|
+
then
|
80
|
+
$t_complete || {
|
81
|
+
t_info "t_done not called"
|
82
|
+
code=1
|
83
|
+
}
|
84
|
+
elif test -n "$t_current"
|
85
|
+
then
|
86
|
+
t_echo "not ok $t_nr - $t_current"
|
87
|
+
fi
|
88
|
+
if test $t_expect_nr -ne -1
|
89
|
+
then
|
90
|
+
test $t_expect_nr -eq $t_nr || {
|
91
|
+
t_info "planned $t_expect_nr tests but ran $t_nr"
|
92
|
+
test $code -ne 0 || code=1
|
93
|
+
}
|
94
|
+
fi
|
95
|
+
$t_complete || {
|
96
|
+
t_info "unexpected test failure"
|
97
|
+
test $code -ne 0 || code=1
|
98
|
+
}
|
99
|
+
rm -f $T_RM_LIST
|
100
|
+
test $code -eq 0 && rm -f $T_OK_RM_LIST
|
101
|
+
set +x
|
102
|
+
exec >&3 2>&4
|
103
|
+
t_close_fds
|
104
|
+
exit $code
|
105
|
+
}
|
106
|
+
|
107
|
+
# close test-specific extra file descriptors
|
108
|
+
t_close_fds () {
|
109
|
+
exec 3>&- 4>&-
|
110
|
+
}
|
111
|
+
|
112
|
+
# call this at the start of your test to specify the number of tests
|
113
|
+
# you plan to run
|
114
|
+
t_plan () {
|
115
|
+
test "$1" -ge 1 || die "must plan at least one test"
|
116
|
+
test $t_expect_nr -eq -1 || die "tried to plan twice in one test"
|
117
|
+
t_expect_nr=$1
|
118
|
+
shift
|
119
|
+
t_echo 1..$t_expect_nr "#" "$@"
|
120
|
+
trap t_at_exit EXIT
|
121
|
+
}
|
122
|
+
|
123
|
+
_t_checkup () {
|
124
|
+
test $t_expect_nr -le 0 && die "no tests planned"
|
125
|
+
test -n "$t_current" && t_echo "ok $t_nr - $t_current"
|
126
|
+
true
|
127
|
+
}
|
128
|
+
|
129
|
+
# finalizes any previously test and starts a new one
|
130
|
+
t_begin () {
|
131
|
+
_t_checkup
|
132
|
+
t_nr=$(( $t_nr + 1 ))
|
133
|
+
t_current="$1"
|
134
|
+
|
135
|
+
# just in case somebody wanted to cheat us:
|
136
|
+
set -e
|
137
|
+
}
|
138
|
+
|
139
|
+
# finalizes the current test without starting a new one
|
140
|
+
t_end () {
|
141
|
+
_t_checkup
|
142
|
+
t_current=
|
143
|
+
}
|
144
|
+
|
145
|
+
# run this to signify the end of your test
|
146
|
+
t_done () {
|
147
|
+
_t_checkup
|
148
|
+
t_current=
|
149
|
+
t_complete=true
|
150
|
+
test $t_expect_nr -eq $t_nr || exit 1
|
151
|
+
exit 0
|
152
|
+
}
|
153
|
+
|
154
|
+
# create and assign named-pipes to variable _names_ passed to this function
|
155
|
+
t_fifos () {
|
156
|
+
for _id in "$@"
|
157
|
+
do
|
158
|
+
_name=$_id
|
159
|
+
_tmp=$(mktemp -t $T.$$.$_id.XXXXXXXX)
|
160
|
+
eval "$_id=$_tmp"
|
161
|
+
rm -f $_tmp
|
162
|
+
mkfifo $_tmp
|
163
|
+
T_RM_LIST="$T_RM_LIST $_tmp"
|
164
|
+
done
|
165
|
+
}
|
166
|
+
|
167
|
+
t_verbose=false t_trace=false
|
168
|
+
|
169
|
+
while test "$#" -ne 0
|
170
|
+
do
|
171
|
+
arg="$1"
|
172
|
+
shift
|
173
|
+
case $arg in
|
174
|
+
-v|--verbose) t_verbose=true ;;
|
175
|
+
--trace) t_trace=true t_verbose=true ;;
|
176
|
+
*) die "Unknown option: $arg" ;;
|
177
|
+
esac
|
178
|
+
done
|
179
|
+
|
180
|
+
# we always only setup stdout, nothing should end up in the "real" stderr
|
181
|
+
if $t_verbose
|
182
|
+
then
|
183
|
+
if test x"$(which mktemp 2>/dev/null)" = x
|
184
|
+
then
|
185
|
+
die "mktemp(1) not available for --verbose"
|
186
|
+
fi
|
187
|
+
t_fifos t_stdout t_stderr
|
188
|
+
|
189
|
+
(
|
190
|
+
# use a subshell so seds are not waitable
|
191
|
+
$SED -e 's/^/#: /' $t_stdout &
|
192
|
+
$SED -e 's/^/#! /' $t_stderr &
|
193
|
+
) &
|
194
|
+
exec > $t_stdout 2> $t_stderr
|
195
|
+
else
|
196
|
+
exec > /dev/null 2> /dev/null
|
197
|
+
fi
|
198
|
+
|
199
|
+
$t_trace && set -x
|
200
|
+
true
|
@@ -0,0 +1,50 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
. ./test-lib.sh
|
3
|
+
t_plan 8 "simple HTTP connection tests"
|
4
|
+
|
5
|
+
t_begin "setup and start" && {
|
6
|
+
unicorn_setup
|
7
|
+
unicorn -D -c $unicorn_config env.ru
|
8
|
+
unicorn_wait_start
|
9
|
+
}
|
10
|
+
|
11
|
+
t_begin "single request" && {
|
12
|
+
curl -sSfv http://$listen/
|
13
|
+
}
|
14
|
+
|
15
|
+
t_begin "check stderr has no errors" && {
|
16
|
+
check_stderr
|
17
|
+
}
|
18
|
+
|
19
|
+
t_begin "HTTP/0.9 request should not return headers" && {
|
20
|
+
(
|
21
|
+
printf 'GET /\r\n'
|
22
|
+
cat $fifo > $tmp &
|
23
|
+
wait
|
24
|
+
echo ok > $ok
|
25
|
+
) | socat - TCP:$listen > $fifo
|
26
|
+
}
|
27
|
+
|
28
|
+
t_begin "env.inspect should've put everything on one line" && {
|
29
|
+
test 1 -eq $(wc -l < $tmp)
|
30
|
+
}
|
31
|
+
|
32
|
+
t_begin "no headers in output" && {
|
33
|
+
if grep ^Connection: $tmp
|
34
|
+
then
|
35
|
+
die "Connection header found in $tmp"
|
36
|
+
elif grep ^HTTP/ $tmp
|
37
|
+
then
|
38
|
+
die "HTTP/ found in $tmp"
|
39
|
+
fi
|
40
|
+
}
|
41
|
+
|
42
|
+
t_begin "killing succeeds" && {
|
43
|
+
kill $unicorn_pid
|
44
|
+
}
|
45
|
+
|
46
|
+
t_begin "check stderr has no errors" && {
|
47
|
+
check_stderr
|
48
|
+
}
|
49
|
+
|
50
|
+
t_done
|