regurgitator 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,71 @@
1
+ #!/bin/sh
2
+ . ./test-lib.sh
3
+ t_plan 7 "DomainHost tests"
4
+
5
+ t_begin "setup" && {
6
+ setup domain_host.ru
7
+ }
8
+
9
+ t_begin "retrieve empty file" && {
10
+ test 0 -eq $(curl -sSvf 2> $curl_err \
11
+ -H Host:d.example.com \
12
+ http://$listen/blah | wc -c)
13
+ grep 'E[tT]ag: ' $curl_err && die "ETag not expected"
14
+ grep 'Last-Modified: ' $curl_err && die "Last-Modified not expected"
15
+ }
16
+
17
+ t_begin "retrieve missing file" && {
18
+ sqlite3 $db <<EOF
19
+ UPDATE file SET length = $random_blob_size;
20
+ EOF
21
+ ok=$(curl -sSvf \
22
+ -H Host:d.example.com \
23
+ 2> $curl_err http://$listen/blah || echo ok)
24
+ test ok = "$ok"
25
+ grep '\<404\>' $curl_err
26
+ }
27
+
28
+ t_begin "retrieve existing file" && {
29
+ dir=$TMPDIR/dev1/0/000/000
30
+ mkdir -p $dir
31
+ ln random_blob $dir/0000000001.fid
32
+ cksum="$(curl -sSvf 2> $curl_err \
33
+ -H Host:d.example.com http://$listen/blah | cksum)"
34
+ test "$cksum" = "$random_blob_cksum"
35
+ dbgcat curl_err
36
+ grep 'E[tT]ag: "1"' $curl_err
37
+ }
38
+
39
+ t_begin "reproxy existing file" && {
40
+ curl -sSvf -H 'X-Reproxy-Path: /reproxy' 2> $curl_err \
41
+ -H Host:d.example.com \
42
+ http://$listen/blah >/dev/null
43
+ dbgcat curl_err
44
+ uri=http://$rack_file_listen/dev1/0/000/000/0000000001.fid
45
+ grep '^< X-Accel-Redirect: /reproxy' $curl_err
46
+ grep '^< X-Reproxy-Content-Type: application/octet-stream' $curl_err
47
+ grep "^< Location: $uri" $curl_err
48
+ grep '^< X-Reproxy-Last-Modified: ' $curl_err
49
+ grep '^< Content-Length: 0' $curl_err
50
+ grep '^< Etag: "1"' $curl_err
51
+ }
52
+
53
+ t_begin "using CNAME host name" && {
54
+ sqlite3 $db <<EOF
55
+ UPDATE domain SET namespace = 'i-have-a-cname.example.org'
56
+ WHERE namespace = 'd';
57
+ EOF
58
+ cksum="$(curl -sSvf 2> $curl_err \
59
+ -H Host:i-have-a-cname.example.org \
60
+ http://$listen/blah | cksum)"
61
+ test "$cksum" = "$random_blob_cksum"
62
+ dbgcat curl_err
63
+ grep 'E[tT]ag: "1"' $curl_err
64
+ }
65
+
66
+ t_begin "kill servers" && {
67
+ kill -INT $rack_file_pid
68
+ kill -INT $rack_server_pid
69
+ }
70
+
71
+ t_done
@@ -0,0 +1,52 @@
1
+ #!/bin/sh
2
+ . ./test-lib.sh
3
+ t_plan 6 "OneDomain tests"
4
+
5
+ t_begin "setup" && {
6
+ setup one_domain.ru
7
+ }
8
+
9
+ t_begin "retrieve empty file" && {
10
+ test 0 -eq $(curl -sSvf 2> $curl_err http://$listen/blah | wc -c)
11
+ grep 'E[tT]ag: ' $curl_err && die "ETag not expected"
12
+ grep 'Last-Modified: ' $curl_err && die "Last-Modified not expected"
13
+ }
14
+
15
+ t_begin "retrieve missing file" && {
16
+ sqlite3 $db <<EOF
17
+ UPDATE file SET length = $random_blob_size;
18
+ EOF
19
+ ok=$(curl -sSvf 2> $curl_err http://$listen/blah || echo ok)
20
+ test ok = "$ok"
21
+ grep '\<404\>' $curl_err
22
+ }
23
+
24
+ t_begin "retrieve existing file" && {
25
+ dir=$TMPDIR/dev1/0/000/000
26
+ mkdir -p $dir
27
+ ln random_blob $dir/0000000001.fid
28
+ cksum="$(curl -sSvf 2> $curl_err http://$listen/blah | cksum)"
29
+ test "$cksum" = "$random_blob_cksum"
30
+ dbgcat curl_err
31
+ grep 'E[tT]ag: "1"' $curl_err
32
+ }
33
+
34
+ t_begin "reproxy existing file" && {
35
+ curl -sSvf -H 'X-Reproxy-Path: /reproxy' 2> $curl_err \
36
+ http://$listen/blah >/dev/null
37
+ dbgcat curl_err
38
+ uri=http://$rack_file_listen/dev1/0/000/000/0000000001.fid
39
+ grep '^< X-Accel-Redirect: /reproxy' $curl_err
40
+ grep '^< X-Reproxy-Content-Type: application/octet-stream' $curl_err
41
+ grep "^< Location: $uri" $curl_err
42
+ grep '^< X-Reproxy-Last-Modified: ' $curl_err
43
+ grep '^< Content-Length: 0' $curl_err
44
+ grep '^< Etag: "1"' $curl_err
45
+ }
46
+
47
+ t_begin "kill servers" && {
48
+ kill -INT $rack_file_pid
49
+ kill -INT $rack_server_pid
50
+ }
51
+
52
+ t_done
data/t/test-lib.sh ADDED
@@ -0,0 +1,119 @@
1
+ #!/bin/sh
2
+ . ./my-tap-lib.sh
3
+ set -e
4
+ set -u
5
+
6
+ # sometimes we rely on http_proxy to avoid wasting bandwidth with Isolate
7
+ # and multiple Ruby versions
8
+ NO_PROXY=${UNICORN_TEST_ADDR-127.0.0.1}
9
+ export NO_PROXY
10
+
11
+ RUBY="${RUBY-ruby}"
12
+ RUBY_VERSION=${RUBY_VERSION-$($RUBY -e 'puts RUBY_VERSION')}
13
+ t_pfx=$PWD/trash/$T-$RUBY_VERSION
14
+ LOCKDIR=${TMPDIR-/tmp}
15
+ export LOCKDIR
16
+ TMPDIR=$t_pfx
17
+ rm -rf $TMPDIR
18
+ mkdir -p $TMPDIR
19
+ export TMPDIR
20
+
21
+ PATH=$PWD/bin:$PATH
22
+ export PATH
23
+
24
+ test -x $PWD/bin/unused_listen || die "must be run in 't' directory"
25
+
26
+ # given a list of variable names, create temporary files and assign
27
+ # the pathnames to those variables
28
+ rtmpfiles () {
29
+ for id in "$@"
30
+ do
31
+ name=$id
32
+ _tmp=$t_pfx/$id
33
+ eval "$id=$_tmp"
34
+
35
+ case $name in
36
+ *fifo)
37
+ rm -f $_tmp
38
+ mkfifo $_tmp
39
+ T_RM_LIST="$T_RM_LIST $_tmp"
40
+ ;;
41
+ *socket)
42
+ rm -f $_tmp
43
+ T_RM_LIST="$T_RM_LIST $_tmp"
44
+ ;;
45
+ *)
46
+ rm -f $_tmp
47
+ > $_tmp
48
+ T_OK_RM_LIST="$T_OK_RM_LIST $_tmp"
49
+ ;;
50
+ esac
51
+ done
52
+ }
53
+
54
+ dbgcat () {
55
+ id=$1
56
+ eval '_file=$'$id
57
+ echo "==> $id <=="
58
+ sed -e "s/^/$id:/" < $_file
59
+ }
60
+
61
+ check_stderr () {
62
+ set +u
63
+ _r_err=${1-${r_err}}
64
+ set -u
65
+ if grep -i Error $_r_err
66
+ then
67
+ die "Errors found in $_r_err"
68
+ elif grep SIGKILL $_r_err
69
+ then
70
+ die "SIGKILL found in $_r_err"
71
+ fi
72
+ }
73
+
74
+ setup () {
75
+ rtmpfiles r_err r_out r_pid db f_err f_out f_pid curl_err
76
+
77
+ random_blob_size=$(wc -c < random_blob | awk '{print $1}')
78
+ random_blob_cksum="$(cksum < random_blob)"
79
+ eval $(unused_listen)
80
+ rack_file_listen=$listen
81
+ port=$(expr $listen : '[^:]\+:\([0-9]\+\)')
82
+ rack_file_port=$port
83
+
84
+ ( rackup -s webrick -P$f_pid -p$port file.ru 2>> $f_err >> $f_out & ) &
85
+
86
+ (
87
+ cat fixtures.sql
88
+ echo "UPDATE host SET http_get_port = $rack_file_port;"
89
+ ) | sqlite3 $db
90
+
91
+ eval $(unused_listen)
92
+ port=$(expr $listen : '[^:]\+:\([0-9]\+\)')
93
+ TEST_SEQUEL=sqlite://$db
94
+ (
95
+ RACK_ENV=deployment
96
+ export TEST_SEQUEL RACK_ENV
97
+ rackup -E none \
98
+ -s webrick -P$r_pid -p $port "$@" 2>> $r_err >> $r_out &
99
+ ) &
100
+
101
+ wait_for_start $r_err
102
+ wait_for_start $f_err
103
+ wait
104
+ rack_server_pid=$(cat $r_pid)
105
+ test -n "$rack_server_pid" && kill -0 $rack_server_pid
106
+ rack_file_pid=$(cat $f_pid)
107
+ test -n "$rack_file_pid" && kill -0 $rack_file_pid
108
+ }
109
+
110
+ wait_for_start () {
111
+ log_err=$1
112
+ (
113
+ renice 19 $$
114
+ while ! grep 'HTTPServer#start:' $log_err
115
+ do
116
+ :
117
+ done
118
+ ) >/dev/null 2>&1 &
119
+ }
@@ -0,0 +1,78 @@
1
+ require "test/unit"
2
+ require "regurgitator"
3
+ require "tempfile"
4
+ require "fileutils"
5
+
6
+ class TestLocal < Test::Unit::TestCase
7
+ include Regurgitator::Local
8
+
9
+ def teardown
10
+ STORE_PATHS.clear
11
+ FileUtils.rm_rf @tmpdir
12
+ Regurgitator::Local.refresh_addrs!
13
+ end
14
+
15
+ def setup
16
+ @local_addrs = Regurgitator::Local.instance_variable_get(:@local_addrs)
17
+ @local_addrs["127.0.0.1"] = true if @local_addrs.empty?
18
+ @addr = @local_addrs.keys.first
19
+ tmp = Tempfile.new('test_local')
20
+ @tmpdir = tmp.path
21
+ tmp.close!
22
+ Dir.mkdir(@tmpdir)
23
+ end
24
+
25
+ def test_device_path_stat
26
+ port = 1234
27
+ uri = URI("http://#@addr:#{port}/dev10/0/004/689/0004689631.fid")
28
+ assert_nil device_path_stat(uri)
29
+
30
+ assert_raises(ArgumentError) {
31
+ Regurgitator::Local.register port, @tmpdir
32
+ }
33
+ Dir.mkdir "#@tmpdir/dev10"
34
+ devs = Regurgitator::Local.register port, @tmpdir
35
+ assert_equal [ "dev10" ], devs.to_a
36
+
37
+ Regurgitator::Local.register port, @tmpdir
38
+ expect = "#@tmpdir/dev10/0/004/689/0004689631.fid"
39
+ FileUtils.mkdir_p(File.dirname(expect))
40
+
41
+ File.open(expect, "wb") { |fp| fp.write '.' }
42
+ assert_equal expect, device_path_stat(uri)[0]
43
+ end
44
+
45
+ def test_device_path_stat_ambiguous
46
+ Dir.mkdir(@a = "#@tmpdir/a")
47
+ Dir.mkdir(@b = "#@tmpdir/b")
48
+ port = 1234
49
+ uri = URI("http://#@addr:#{port}/dev10/0/004/689/0004689631.fid")
50
+ assert_nil device_path_stat(uri)
51
+
52
+ apath = "#@a/dev10/0/004/689/0004689631.fid"
53
+ bpath = "#@b/dev10/0/004/689/0004689631.fid"
54
+ FileUtils.mkdir_p([apath, bpath].map! { |x| File.dirname(x) })
55
+ Regurgitator::Local.register port, @a
56
+ Regurgitator::Local.register port, @b
57
+
58
+ [ apath, bpath ].each do |path|
59
+ File.open(path, "wb") { |fp| fp.write '.' }
60
+ end
61
+ assert_nil device_path_stat(uri)
62
+ end
63
+
64
+ def test_trylocal
65
+ port = 1233
66
+ env = { "REQUEST_METHOD" => "GET" }
67
+ a = URI("http://#@addr:#{port}/dev10/0/004/689/0004689631.fid")
68
+ b = URI("http://#@addr:#{port + 6}/dev11/0/004/689/0004689631.fid")
69
+ assert_nil trylocal(env, [ [ a, b ] ])
70
+
71
+ path_a = "#@tmpdir#{a.path}"
72
+ FileUtils.mkdir_p(File.dirname(path_a))
73
+ Regurgitator::Local.register port, @tmpdir
74
+ File.open(path_a, "wb") { |fp| fp.write '.' }
75
+ res = trylocal(env, [ [ a, b ] ])
76
+ assert_kind_of Regurgitator::LocalFile, res
77
+ end
78
+ end
@@ -0,0 +1,37 @@
1
+ require 'test/unit'
2
+ require 'regurgitator'
3
+
4
+ class TestServerSettings < Test::Unit::TestCase
5
+ include Regurgitator::ServerSettings
6
+
7
+ attr_accessor :db
8
+
9
+ def setup
10
+ @db = Sequel.connect 'sqlite:///'
11
+ @db.create_table(:server_settings) do
12
+ String :field, :size => 50, :null => false, :primary_key => true
13
+ String :value, :size => 255
14
+ end
15
+ end
16
+
17
+ def test_zones
18
+ ds = @db[:server_settings]
19
+ [ %w(network_zones west,east,central),
20
+ %w(zone_west 10.1.0.0/16),
21
+ %w(zone_central 10.2.0.0/16),
22
+ %w(zone_east 10.3.0.0/16)
23
+ ].each { |(field,value)| ds.insert(:field => field, :value => value) }
24
+ assert_equal 'west', zone_for('10.1.0.8')
25
+ assert_equal 'central', zone_for('10.2.1.8')
26
+ assert_equal 'east', zone_for('10.3.1.8')
27
+ assert_nil zone_for('127.0.0.1')
28
+ end
29
+
30
+ def test_no_zones_defined
31
+ ds = @db[:server_settings]
32
+ assert_nil zone_for('10.1.0.8')
33
+ assert_nil zone_for('10.2.1.8')
34
+ assert_nil zone_for('10.3.1.8')
35
+ assert_nil zone_for('127.0.0.1')
36
+ end
37
+ end
metadata ADDED
@@ -0,0 +1,191 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: regurgitator
3
+ version: !ruby/object:Gem::Version
4
+ hash: 31
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 0
10
+ version: 0.0.0
11
+ platform: ruby
12
+ authors:
13
+ - Regurgitators
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-05-10 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rack
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ hash: 11
29
+ segments:
30
+ - 1
31
+ - 2
32
+ version: "1.2"
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: sequel
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ hash: 41
44
+ segments:
45
+ - 3
46
+ - 23
47
+ version: "3.23"
48
+ type: :runtime
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
51
+ name: http_spew
52
+ prerelease: false
53
+ requirement: &id003 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ~>
57
+ - !ruby/object:Gem::Version
58
+ hash: 9
59
+ segments:
60
+ - 0
61
+ - 1
62
+ version: "0.1"
63
+ type: :runtime
64
+ version_requirements: *id003
65
+ - !ruby/object:Gem::Dependency
66
+ name: wrongdoc
67
+ prerelease: false
68
+ requirement: &id004 !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ~>
72
+ - !ruby/object:Gem::Version
73
+ hash: 5
74
+ segments:
75
+ - 1
76
+ - 5
77
+ version: "1.5"
78
+ type: :development
79
+ version_requirements: *id004
80
+ description: |-
81
+ \Regurgitator is an GPL-licensed library and Rack middleware for
82
+ serving files stored in MogileFS. It can be embedded inside
83
+ any existing Rack application or be used as a standalone Rack app.
84
+ email: barfs@librelist.org
85
+ executables: []
86
+
87
+ extensions: []
88
+
89
+ extra_rdoc_files:
90
+ - ChangeLog
91
+ - lib/regurgitator.rb
92
+ - lib/regurgitator/device.rb
93
+ - lib/regurgitator/domain.rb
94
+ - lib/regurgitator/domain_host.rb
95
+ - lib/regurgitator/domain_path.rb
96
+ - lib/regurgitator/endpoint.rb
97
+ - lib/regurgitator/file_info.rb
98
+ - lib/regurgitator/file_request.rb
99
+ - lib/regurgitator/local.rb
100
+ - lib/regurgitator/local_file.rb
101
+ - lib/regurgitator/one_domain.rb
102
+ - lib/regurgitator/server_settings.rb
103
+ - NEWS
104
+ - README
105
+ - LICENSE
106
+ files:
107
+ - .document
108
+ - .gitignore
109
+ - .manifest
110
+ - .wrongdoc.yml
111
+ - COPYING
112
+ - ChangeLog
113
+ - GIT-VERSION-FILE
114
+ - GIT-VERSION-GEN
115
+ - GNUmakefile
116
+ - LATEST
117
+ - LICENSE
118
+ - NEWS
119
+ - README
120
+ - examples/domain_host.ru
121
+ - examples/domain_path.ru
122
+ - examples/one_domain.ru
123
+ - lib/regurgitator.rb
124
+ - lib/regurgitator/device.rb
125
+ - lib/regurgitator/domain.rb
126
+ - lib/regurgitator/domain_host.rb
127
+ - lib/regurgitator/domain_path.rb
128
+ - lib/regurgitator/endpoint.rb
129
+ - lib/regurgitator/file_info.rb
130
+ - lib/regurgitator/file_request.rb
131
+ - lib/regurgitator/local.rb
132
+ - lib/regurgitator/local_file.rb
133
+ - lib/regurgitator/one_domain.rb
134
+ - lib/regurgitator/server_settings.rb
135
+ - pkg.mk
136
+ - regurgitator.gemspec
137
+ - setup.rb
138
+ - t/.gitignore
139
+ - t/GNUmakefile
140
+ - t/bin/unused_listen
141
+ - t/domain_host.ru
142
+ - t/domain_path.ru
143
+ - t/file.ru
144
+ - t/fixtures.sql
145
+ - t/my-tap-lib.sh
146
+ - t/one_domain.ru
147
+ - t/t0001-domain_path.sh
148
+ - t/t0002-domain_host.sh
149
+ - t/t0003-one_domain.sh
150
+ - t/test-lib.sh
151
+ - test/test_local.rb
152
+ - test/test_server_settings.rb
153
+ homepage: http://bogomips.org/regurgitator/
154
+ licenses: []
155
+
156
+ post_install_message:
157
+ rdoc_options:
158
+ - -t
159
+ - \Regurgitator - read-only Rack endpoints for MogileFS
160
+ - -W
161
+ - http://bogomips.org/regurgitator.git/tree/%s
162
+ require_paths:
163
+ - lib
164
+ required_ruby_version: !ruby/object:Gem::Requirement
165
+ none: false
166
+ requirements:
167
+ - - ">="
168
+ - !ruby/object:Gem::Version
169
+ hash: 3
170
+ segments:
171
+ - 0
172
+ version: "0"
173
+ required_rubygems_version: !ruby/object:Gem::Requirement
174
+ none: false
175
+ requirements:
176
+ - - ">="
177
+ - !ruby/object:Gem::Version
178
+ hash: 3
179
+ segments:
180
+ - 0
181
+ version: "0"
182
+ requirements: []
183
+
184
+ rubyforge_project: rainbows
185
+ rubygems_version: 1.8.1
186
+ signing_key:
187
+ specification_version: 3
188
+ summary: read-only Rack endpoints for MogileFS
189
+ test_files:
190
+ - test/test_local.rb
191
+ - test/test_server_settings.rb