regurgitator 0.0.0

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.
@@ -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