swiftiply 0.6.1.1 → 1.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.
Files changed (75) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTORS +2 -0
  3. data/README.md +62 -0
  4. data/bin/{mongrel_rails → evented_mongrel_rails} +6 -14
  5. data/bin/swiftiplied_mongrel_rails +246 -0
  6. data/bin/swiftiply +136 -116
  7. data/bin/swiftiply_mongrel_rails +2 -2
  8. data/bin/swiftiplyctl +283 -0
  9. data/cleanup.sh +5 -0
  10. data/ext/deque/extconf.rb +162 -0
  11. data/ext/deque/swiftcore/rubymain.cpp +435 -0
  12. data/ext/fastfilereader/extconf.rb +2 -2
  13. data/ext/fastfilereader/mapper.cpp +2 -0
  14. data/ext/map/extconf.rb +161 -0
  15. data/ext/map/rubymain.cpp +500 -0
  16. data/ext/splaytree/extconf.rb +161 -0
  17. data/ext/splaytree/swiftcore/rubymain.cpp +580 -0
  18. data/ext/splaytree/swiftcore/splay_map.h +635 -0
  19. data/ext/splaytree/swiftcore/splay_set.h +575 -0
  20. data/ext/splaytree/swiftcore/splay_tree.h +1127 -0
  21. data/external/httpclient.rb +231 -0
  22. data/external/package.rb +13 -13
  23. data/setup.rb +18 -2
  24. data/src/swiftcore/Swiftiply.rb +417 -773
  25. data/src/swiftcore/Swiftiply/backend_protocol.rb +213 -0
  26. data/src/swiftcore/Swiftiply/cache_base.rb +49 -0
  27. data/src/swiftcore/Swiftiply/cache_base_mixin.rb +52 -0
  28. data/src/swiftcore/Swiftiply/cluster_managers/rest_based_cluster_manager.rb +9 -0
  29. data/src/swiftcore/Swiftiply/cluster_protocol.rb +70 -0
  30. data/src/swiftcore/Swiftiply/config.rb +370 -0
  31. data/src/swiftcore/Swiftiply/config/rest_updater.rb +26 -0
  32. data/src/swiftcore/Swiftiply/constants.rb +101 -0
  33. data/src/swiftcore/Swiftiply/content_cache_entry.rb +44 -0
  34. data/src/swiftcore/Swiftiply/content_response.rb +45 -0
  35. data/src/swiftcore/Swiftiply/control_protocol.rb +49 -0
  36. data/src/swiftcore/Swiftiply/dynamic_request_cache.rb +41 -0
  37. data/src/swiftcore/Swiftiply/etag_cache.rb +64 -0
  38. data/src/swiftcore/Swiftiply/file_cache.rb +46 -0
  39. data/src/swiftcore/Swiftiply/hash_cache_base.rb +22 -0
  40. data/src/swiftcore/Swiftiply/http_recognizer.rb +267 -0
  41. data/src/swiftcore/Swiftiply/loggers/Analogger.rb +21 -0
  42. data/src/swiftcore/Swiftiply/loggers/stderror.rb +13 -0
  43. data/src/swiftcore/Swiftiply/mocklog.rb +10 -0
  44. data/src/swiftcore/Swiftiply/proxy.rb +15 -0
  45. data/src/swiftcore/Swiftiply/proxy_backends/keepalive.rb +286 -0
  46. data/src/swiftcore/Swiftiply/proxy_backends/traditional.rb +286 -0
  47. data/src/swiftcore/Swiftiply/proxy_backends/traditional/redis_directory.rb +87 -0
  48. data/src/swiftcore/Swiftiply/proxy_backends/traditional/static_directory.rb +69 -0
  49. data/src/swiftcore/Swiftiply/proxy_bag.rb +716 -0
  50. data/src/swiftcore/Swiftiply/rest_based_cluster_manager.rb +15 -0
  51. data/src/swiftcore/Swiftiply/splay_cache_base.rb +21 -0
  52. data/src/swiftcore/Swiftiply/support_pagecache.rb +6 -3
  53. data/src/swiftcore/Swiftiply/swiftiply_2_http_proxy.rb +7 -0
  54. data/src/swiftcore/Swiftiply/swiftiply_client.rb +20 -5
  55. data/src/swiftcore/Swiftiply/version.rb +5 -0
  56. data/src/swiftcore/evented_mongrel.rb +26 -8
  57. data/src/swiftcore/hash.rb +43 -0
  58. data/src/swiftcore/method_builder.rb +28 -0
  59. data/src/swiftcore/streamer.rb +46 -0
  60. data/src/swiftcore/swiftiplied_mongrel.rb +91 -23
  61. data/src/swiftcore/types.rb +20 -3
  62. data/swiftiply.gemspec +14 -8
  63. data/test/TC_Deque.rb +152 -0
  64. data/test/TC_ProxyBag.rb +147 -166
  65. data/test/TC_Swiftiply.rb +576 -169
  66. data/test/TC_Swiftiply/mongrel/evented_hello.rb +1 -1
  67. data/test/TC_Swiftiply/mongrel/swiftiplied_hello.rb +1 -1
  68. data/test/TC_Swiftiply/test_serve_static_file_xsendfile/sendfile_client.rb +27 -0
  69. data/test/TC_Swiftiply/test_ssl/bin/validate_ssl_capability.rb +21 -0
  70. data/test/TC_Swiftiply/test_ssl/test.cert +16 -0
  71. data/test/TC_Swiftiply/test_ssl/test.key +15 -0
  72. data/{bin → test/bin}/echo_client +0 -0
  73. metadata +136 -94
  74. data/README +0 -126
  75. data/ext/swiftiply_parse/parse.rl +0 -90
data/test/TC_Swiftiply.rb CHANGED
@@ -1,14 +1,15 @@
1
- require 'test/unit'
1
+ require 'minitest/autorun'
2
2
  require 'external/test_support'
3
3
  SwiftcoreTestSupport.set_src_dir
4
4
  require 'rbconfig'
5
5
  require 'net/http'
6
+ require 'net/https'
6
7
  require 'swiftcore/Swiftiply'
7
8
  require 'yaml'
8
9
 
9
- class TC_Swiftiply < Test::Unit::TestCase
10
+ class TC_Swiftiply < Minitest::Test
10
11
  @@testdir = SwiftcoreTestSupport.test_dir(__FILE__)
11
- Ruby = File.join(::Config::CONFIG['bindir'],::Config::CONFIG['ruby_install_name']) << ::Config::CONFIG['EXEEXT']
12
+ Ruby = File.join(::RbConfig::CONFIG['bindir'],::RbConfig::CONFIG['ruby_install_name']) << ::RbConfig::CONFIG['EXEEXT']
12
13
 
13
14
  DeleteQueue = []
14
15
  KillQueue = []
@@ -17,6 +18,12 @@ class TC_Swiftiply < Test::Unit::TestCase
17
18
  cluster_address: 127.0.0.1
18
19
  cluster_port: 29998
19
20
  daemonize: false
21
+ epoll: true
22
+ descriptors: 20000
23
+ defaults:
24
+ logger:
25
+ type: stderror
26
+ log_level: 0
20
27
  map:
21
28
  - incoming:
22
29
  - 127.0.0.1
@@ -29,6 +36,17 @@ ECONF
29
36
  def get_url(hostname,port,url)
30
37
  Net::HTTP.start(hostname,port) {|http| http.get(url)}
31
38
  end
39
+
40
+ def get_url_https(hostname, port, url)
41
+ http = Net::HTTP.new(hostname, port)
42
+ http.use_ssl = true
43
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
44
+ http.start {http.request_get(url)}
45
+ end
46
+
47
+ def get_url_1_0(hostname, port, url)
48
+ Net::HTTP.start(hostname,port) {|http| http.instance_variable_set('@curr_http_version','1.0'); http.get(url)}
49
+ end
32
50
 
33
51
  def post_url(hostname,port,url,data = nil)
34
52
  Net::HTTP.start(hostname,port) {|http| http.post(url,data)}
@@ -38,6 +56,24 @@ ECONF
38
56
  Net::HTTP.start(hostname,port) {|http| http.delete(url)}
39
57
  end
40
58
 
59
+ require "#{@@testdir}/../external/httpclient"
60
+ def httpclient(host, port, request, query_string)
61
+ r = nil
62
+ EventMachine.run do
63
+ http = EventMachine::Protocols::HttpClient.request(
64
+ :host => host,
65
+ :port => port,
66
+ :request => request,
67
+ :query_string => query_string
68
+ )
69
+ http.callback do |response|
70
+ r = response
71
+ EM.stop_event_loop
72
+ end
73
+ end
74
+ r
75
+ end
76
+
41
77
  def setup
42
78
  Dir.chdir(@@testdir)
43
79
  SwiftcoreTestSupport.announce(:swiftiply_functional,"Functional Swiftiply Testing")
@@ -45,7 +81,7 @@ ECONF
45
81
 
46
82
  def teardown
47
83
  while f = DeleteQueue.pop do
48
- File.delete f if f
84
+ File.delete f if f and FileTest.exist?(f)
49
85
  end
50
86
 
51
87
  while p = KillQueue.pop do
@@ -53,10 +89,107 @@ ECONF
53
89
  Process.wait p if p
54
90
  end
55
91
  end
92
+
93
+ # Configure a Swiftiply, change the config, HUP it, and see if the changes
94
+ # are picked up.
95
+
96
+ def test_HUP
97
+ puts "\nTesting HUP handling"
98
+ dc = File.join(Dir.pwd,'TC_Swiftiply')
99
+ dr = File.join(dc,'test_serve_static_file')
100
+
101
+ conf_file = File.join(dc,'test_HUP.conf')
102
+ File.open(conf_file,'w+') do |fh|
103
+ conf = YAML.load(ConfBase.to_yaml)
104
+ conf['map'].first.delete('docroot')
105
+ fh.write conf.to_yaml
106
+ end
107
+
108
+ DeleteQueue << conf_file
109
+
110
+ smallfile_name = "xyzzy"
111
+ smallfile_path = File.join(dr,smallfile_name)
112
+ File.open(smallfile_path,'w') {|fh| fh.puts "alfalfa leafcutter bee"}
113
+ DeleteQueue << smallfile_path
114
+
115
+ swiftiply_pid = nil
116
+ KillQueue << swiftiply_pid = SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
117
+ :cmd => ["#{Ruby} -I../../src ../../bin/swiftiply -c test_HUP.conf"])
118
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
119
+ :cmd => ["#{Ruby} -I../../src ../bin/echo_client 127.0.0.1:29999"])
120
+ sleep 1
121
+
122
+ # Normal request for a sanity check.
123
+ response = get_url('127.0.0.1',29998,'/xyzzy')
124
+ assert(response.body =~ /GET \/xyzzy HTTP\/1.1\r\n.*\r\nHost: 127.0.0.1:29998\r\n\r\n/m, "Got #{response.body.inspect}, expected to match " + '/GET \/xyzzy HTTP\/1.1\r\n.*\r\nHost: 127.0.0.1:29998\r\n\r\n/m')
125
+
126
+ # Now rewrite the conf file to be a little different.
127
+ File.open(conf_file,'w+') {|fh| fh.write ConfBase.to_yaml }
128
+
129
+ # Reload the config
130
+ Process.kill 'SIGHUP',swiftiply_pid
131
+
132
+ sleep(1)
133
+ # This request should pull the file from the docroot, since it the
134
+ # docroot was not deleted from the config that was just read.
135
+ response = get_url('127.0.0.1',29998,'/xyzzy')
136
+ assert_equal("alfalfa leafcutter bee\n",response.body)
137
+
138
+ # Reload the config again, just to make sure we can do it twice;
139
+ # there was a bug reported about Swiftiply dying after the second HUP,
140
+ # so we want to make sure we are covered, here.
141
+
142
+ Process.kill 'SIGHUP',swiftiply_pid
143
+ response = get_url('127.0.0.1',29998,'/xyzzy')
144
+ assert_equal("alfalfa leafcutter bee\n",response.body,"Swiftiply failure on second HUP.")
145
+
146
+ # And because we're the suspicious types, let's do it a third tim, just to cover the bases.
147
+ Process.kill 'SIGHUP',swiftiply_pid
148
+ response = get_url('127.0.0.1',29998,'/xyzzy')
149
+ assert_equal("alfalfa leafcutter bee\n",response.body,"Swiftiply failure on second HUP.")
150
+ end
151
+
152
+ # Do some basic sanity tests of evented mongrel, and also run a simple
153
+ # perf test against evented mongrel and threaded mongrel.
56
154
 
155
+ def test_evented_mongrel
156
+ puts "\nTesting Evented Mongrel"
157
+
158
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => File.join('TC_Swiftiply','mongrel'),
159
+ :cmd => ["#{Ruby} -I../../../src threaded_hello.rb"])
160
+ sleep 1
161
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => File.join('TC_Swiftiply','mongrel'),
162
+ :cmd => ["#{Ruby} -I../../../src evented_hello.rb"])
163
+
164
+ sleep 1
165
+
166
+ response = get_url('127.0.0.1',29998,'/hello')
167
+ assert_equal("hello!\n",response.body)
168
+
169
+ response = get_url('127.0.0.1',29998,'/dir')
170
+ assert_equal("<html><head><title>Directory Listing",response.body[0..35])
171
+
172
+ ab = `which ab`.chomp
173
+ unless ab == ''
174
+ puts "\nThreaded Mongrel..."
175
+ rt = `#{ab} -n 10000 -c 25 http://127.0.0.1:29997/hello`
176
+ rt =~ /^(Requests per second.*)$/
177
+ rts = $1
178
+ puts "\nEvented Mongrel..."
179
+ re = `#{ab} -n 10000 -c 25 http://127.0.0.1:29998/hello`
180
+ re =~ /^(Requests per second.*)$/
181
+ res = $1
182
+ puts "\nThreaded Mongrel, no proxies, concurrency of 25\n#{rts}"
183
+ puts "Evented Mongrel, no proxies, concurrency of 25\n#{res}"
184
+ sleep 1
185
+ end
186
+ end
187
+
188
+ #####
57
189
  # Test serving a small file (no chunked encoding) and a large file (chunked
58
190
  # encoding).
59
-
191
+ #####
192
+
60
193
  def test_serve_static_file
61
194
  puts "\nTesting Static File Delivery"
62
195
  dc = File.join(Dir.pwd,'TC_Swiftiply')
@@ -64,7 +197,7 @@ ECONF
64
197
 
65
198
  smallfile_name = "smallfile#{Time.now.to_i}"
66
199
  smallfile_path = File.join(dr,smallfile_name)
67
- File.open(smallfile_path,'w') {|fh| fh.puts "alfalfa leafcutter bee"}
200
+ File.open(smallfile_path,'w') {|fh| fh.puts "0123456789"*102}
68
201
  DeleteQueue << smallfile_path
69
202
 
70
203
  bigfile_name = "bigfile#{Time.now.to_i}"
@@ -73,23 +206,34 @@ ECONF
73
206
  DeleteQueue << bigfile_path
74
207
 
75
208
  conf_file = File.join(dc,'test_serve_static_file.conf')
76
- File.open(conf_file,'w+') {|fh| fh.write ConfBase.to_yaml}
209
+ conf = YAML.load(ConfBase.to_yaml)
210
+
211
+ File.open(conf_file,'w+') {|fh| fh.write conf.to_yaml}
77
212
  DeleteQueue << conf_file
78
213
 
79
- assert_nothing_raised("setup failed") do
80
- KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
81
- :cmd => ["#{Ruby} -I../../src ../../bin/swiftiply -c test_serve_static_file.conf"])
82
- KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
83
- :cmd => ["#{Ruby} -I../../src ../../bin/echo_client 127.0.0.1:29999"])
84
- # Make sure everything has time to start, connect, etc... before
85
- # the tests are executed.
86
- sleep 1
87
- end
214
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
215
+ :cmd => ["#{Ruby} -I../../src ../../bin/swiftiply -c test_serve_static_file.conf"])
216
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
217
+ :cmd => ["#{Ruby} -I../../src ../bin/echo_client 127.0.0.1:29999"])
218
+ # Make sure everything has time to start, connect, etc... before
219
+ # the tests are executed.
220
+ sleep 1
88
221
 
89
222
  response = get_url('127.0.0.1',29998,smallfile_name)
90
- assert_equal("alfalfa leafcutter bee\n",response.body)
223
+ small_etag = response['ETag']
224
+ assert_equal("0123456789"*102+"\n",response.body)
225
+
226
+ # Make sure the file is retrieved if a proxy style request is used.
227
+ response = httpclient('127.0.0.1',29998,"http://127.0.0.1/#{smallfile_name}",'')
228
+ assert_equal("0123456789"*102+"\n",response[:content])
91
229
 
92
230
  response = get_url('127.0.0.1',29998,bigfile_name)
231
+ big_etag = response['ETag']
232
+ assert_equal("I am a duck. I am a duck. ",response.body[0..25])
233
+ assert_equal("I am a duck. \n",response.body[-14..-1])
234
+ assert_equal(79000,response.body.length)
235
+
236
+ response = get_url_1_0('127.0.0.1',29998,bigfile_name)
93
237
  assert_equal("I am a duck. I am a duck. ",response.body[0..25])
94
238
  assert_equal("I am a duck. \n",response.body[-14..-1])
95
239
  assert_equal(79000,response.body.length)
@@ -97,17 +241,312 @@ ECONF
97
241
  # Hit it a bunch of times.
98
242
 
99
243
  ab = `which ab`.chomp
244
+ #unless ab == ''
245
+ # r = `#{ab} -n 100000 -c 2 http://127.0.0.1:29998/#{smallfile_name}`
246
+ # r =~ /^(Requests per second.*)$/
247
+ # puts "10k 1020 byte files, concurrency of 25; no KeepAlive\n#{$1}\n"
248
+ #end
249
+
250
+ unless ab == ''
251
+ r = `#{ab} -n 100000 -c 25 -k http://127.0.0.1:29998/#{smallfile_name}`
252
+ r =~ /^(Requests per second.*)$/
253
+ puts r
254
+ puts "10k 1020 byte files, concurrency of 25; with KeepAlive\n#{$1}\n"
255
+ end
100
256
  unless ab == ''
101
- r = `#{ab} -n 10000 -c 25 http://127.0.0.1:29998/#{smallfile_name}`
257
+ r = `#{ab} -n 100000 -v 9 -c 25 -k -H 'If-None-Match: #{small_etag}' http://127.0.0.1:29998/#{smallfile_name}`
102
258
  r =~ /^(Requests per second.*)$/
103
- puts "10k files, concurrency of 25\n#{$1}"
259
+ puts "10k 1020 byte files with etag, concurrency of 25; with KeepAlive\n#{$1}\n"
260
+ end
261
+ unless ab == ''
262
+ r = `#{ab} -n 10000 -i -c 25 http://127.0.0.1:29998/#{smallfile_name}`
263
+ r =~ /^(Requests per second.*)$/
264
+ puts "10k HEAD requests, concurrency of 25\n#{$1}\n"
265
+ end
266
+ unless ab == ''
267
+ r = `#{ab} -n 20000 -c 25 -k http://127.0.0.1:29998/#{bigfile_name}`
268
+ r =~ /^(Requests per second.*)$/
269
+ puts "10k 78000 byte files, concurrency of 25; with KeepAlive\n#{$1}\n"
270
+ end
271
+ unless ab == ''
272
+ r = `#{ab} -n 20000 -c 25 -k -H 'If-None-Match: #{big_etag}' http://127.0.0.1:29998/#{bigfile_name}`
273
+ r =~ /^(Requests per second.*)$/
274
+ puts "10k 78000 byte files with etag, concurrency of 25; with KeepAlive\n#{$1}\n"
104
275
  end
105
276
 
106
277
  # And it is still correct?
107
278
  response = get_url('127.0.0.1',29998,smallfile_name)
279
+ assert_equal("0123456789"*102+"\n",response.body)
280
+ end
281
+
282
+ def test_serve_static_file_caches
283
+ puts "\nTesting caches"
284
+ dc = File.join(Dir.pwd,'TC_Swiftiply')
285
+ dr = File.join(dc,'test_serve_static_file')
286
+
287
+ smallfile_name = "smallfile#{Time.now.to_i}"
288
+ smallfile_path = File.join(dr,smallfile_name)
289
+ File.open(smallfile_path,'w') {|fh| fh.puts "alfalfa leafcutter bee"}
290
+ DeleteQueue << smallfile_path
291
+
292
+ bigfile_name = "bigfile#{Time.now.to_i}"
293
+ bigfile_path = File.join(dr,bigfile_name)
294
+ File.open(bigfile_path,'w+') {|fh| fh.write("#{'I am a duck. ' * 6}\n" * 1000)}
295
+ DeleteQueue << bigfile_path
296
+
297
+ conf_file = File.join(dc,'test_serve_static_file.conf')
298
+ conf = YAML.load(ConfBase.to_yaml)
299
+ conf['logger'] ||= {}
300
+ conf['logger']['log_level'] = 3
301
+ conf['map'][0]['file_cache'] = {}
302
+ conf['map'][0]['file_cache']['window'] = 5
303
+ conf['map'][0]['logger'] = {}
304
+ conf['map'][0]['logger']['log_level'] = 3
305
+ conf['map'][0]['logger']['type'] = 'stderror'
306
+
307
+ File.open(conf_file,'w+') {|fh| fh.write conf.to_yaml}
308
+ DeleteQueue << conf_file
309
+
310
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
311
+ :cmd => ["#{Ruby} -I../../src ../../bin/swiftiply -c test_serve_static_file.conf"])
312
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
313
+ :cmd => ["#{Ruby} -I../../src ../bin/echo_client 127.0.0.1:29999"])
314
+ # Make sure everything has time to start, connect, etc... before
315
+ # the tests are executed.
316
+ sleep 1
317
+
318
+ response = get_url('127.0.0.1',29998,smallfile_name)
319
+ small_etag = response['ETag']
108
320
  assert_equal("alfalfa leafcutter bee\n",response.body)
321
+ File.delete smallfile_path
322
+
323
+ response = get_url('127.0.0.1',29998,bigfile_name)
324
+ big_etag = response['ETag']
325
+ assert_equal("I am a duck. I am a duck. ",response.body[0..25])
326
+ assert_equal("I am a duck. \n",response.body[-14..-1])
327
+ assert_equal(79000,response.body.length)
328
+
329
+ sleep 4
330
+
331
+ File.open(smallfile_path,'w') {|fh| fh.puts "alfalfa leafcutter bee too"}
332
+
333
+ response = get_url('127.0.0.1',29998,smallfile_name)
334
+ small_etag = response['ETag']
335
+ assert_equal("alfalfa leafcutter bee too\n",response.body)
336
+ end
337
+
338
+ #####
339
+ # Test the x-sendfile header support.
340
+ # Big and small files that do exist.
341
+ #####
342
+
343
+ def test_serve_static_file_xsendfile
344
+ puts "\nTesting Static File Delivery via X-Sendfile"
345
+ dc = File.join(Dir.pwd,'TC_Swiftiply')
346
+ dr = File.join(dc,'test_serve_static_file_xsendfile')
347
+
348
+ smallfile1_name = "smallfile1#{Time.now.to_i}"
349
+ smallfile1_path = File.join(dr,'pub',smallfile1_name)
350
+ File.open(smallfile1_path,'w') {|fh| fh.puts "alfalfa leafcutter bee"}
351
+ DeleteQueue << smallfile1_path
352
+
353
+ smallfile2_name = "smallfile2#{Time.now.to_i}"
354
+ smallfile2_path = File.join(dr,'priv',smallfile2_name)
355
+ File.open(smallfile2_path,'w') {|fh| fh.puts "alfalfa leafcutter bee"}
356
+ DeleteQueue << smallfile2_path
357
+
358
+ bigfile1_name = "bigfile1#{Time.now.to_i}"
359
+ bigfile1_path = File.join(dr,'pub',bigfile1_name)
360
+ File.open(bigfile1_path,'w+') {|fh| fh.write("#{'I am a duck. ' * 6}\n" * 1000)}
361
+ DeleteQueue << bigfile1_path
362
+
363
+ bigfile2_name = "bigfile2#{Time.now.to_i}"
364
+ bigfile2_path = File.join(dr,'priv',bigfile2_name)
365
+ File.open(bigfile2_path,'w+') {|fh| fh.write("#{'I am a duck. ' * 6}\n" * 1000)}
366
+ DeleteQueue << bigfile2_path
367
+
368
+ conf = YAML.load(ConfBase.to_yaml)
369
+ conf['map'].first['docroot'] = "#{@@testdir}/TC_Swiftiply/test_serve_static_file_xsendfile/pub"
370
+ conf['map'].first['sendfileroot'] = "#{@@testdir}/TC_Swiftiply/test_serve_static_file_xsendfile/priv"
371
+
372
+ conf_file = File.join(dc,'test_serve_static_file_xsendfile.conf')
373
+ File.open(conf_file,'w+') {|fh| fh.write conf.to_yaml}
374
+ DeleteQueue << conf_file
375
+
376
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
377
+ :cmd => ["#{Ruby} -I../../src ../../bin/swiftiply -c test_serve_static_file_xsendfile.conf"])
378
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
379
+ :cmd => ["#{Ruby} -I../../src #{@@testdir}/TC_Swiftiply/test_serve_static_file_xsendfile/sendfile_client.rb 127.0.0.1:29999"])
380
+ # Make sure everything has time to start, connect, etc... before
381
+ # the tests are executed.
382
+ sleep 1
383
+
384
+ response = get_url('127.0.0.1',29998,smallfile1_name)
385
+ small_etag = response['ETag']
386
+ assert_equal("alfalfa leafcutter bee\n",response.body)
387
+
388
+ response = get_url('127.0.0.1',29998,smallfile2_name)
389
+ small_etag = response['ETag']
390
+ assert_equal("alfalfa leafcutter bee\n",response.body)
391
+
392
+ response = get_url('127.0.0.1',29998,bigfile1_name)
393
+ big_etag = response['ETag']
394
+ assert_equal("I am a duck. I am a duck. ",response.body[0..25])
395
+ assert_equal("I am a duck. \n",response.body[-14..-1])
396
+ assert_equal(79000,response.body.length)
397
+
398
+ response = get_url_1_0('127.0.0.1',29998,bigfile1_name)
399
+ assert_equal("I am a duck. I am a duck. ",response.body[0..25])
400
+ assert_equal("I am a duck. \n",response.body[-14..-1])
401
+ assert_equal(79000,response.body.length)
402
+
403
+ response = get_url('127.0.0.1',29998,bigfile2_name)
404
+ big_etag = response['ETag']
405
+ assert_equal("I am a duck. I am a duck. ",response.body[0..25])
406
+ assert_equal("I am a duck. \n",response.body[-14..-1])
407
+ assert_equal(79000,response.body.length)
408
+
409
+ response = get_url_1_0('127.0.0.1',29998,bigfile2_name)
410
+ assert_equal("I am a duck. I am a duck. ",response.body[0..25])
411
+ assert_equal("I am a duck. \n",response.body[-14..-1])
412
+ assert_equal(79000,response.body.length)
413
+
414
+ response = get_url('127.0.0.1',29998,'this_isnt_there')
415
+ assert_equal("this_isnt_there",response.to_hash['x-sendfile'].first)
416
+ assert(response.body =~ /Doing X-Sendfile to this_isnt_there/)
109
417
  end
418
+
419
+ #####
420
+ # Test x-sendfile handling for a file that doesn't exist.
421
+ #####
422
+
423
+ def test_serve_static_file_xsendfile2
424
+ dc = File.join(Dir.pwd,'TC_Swiftiply')
425
+ dr = File.join(dc,'test_serve_static_file_xsendfile')
426
+
427
+ smallfile2_name = "smallfile2#{Time.now.to_i}"
428
+ smallfile2_path = File.join(dr,'priv',smallfile2_name)
429
+ File.open(smallfile2_path,'w') {|fh| fh.puts "alfalfa leafcutter bee"}
430
+ DeleteQueue << smallfile2_path
431
+
432
+ conf = YAML.load(ConfBase.to_yaml)
433
+ conf['map'].first['docroot'] = "#{@@testdir}/TC_Swiftiply/test_serve_static_file_xsendfile/pub"
434
+ conf['map'].first['sendfileroot'] = "#{@@testdir}/TC_Swiftiply/test_serve_static_file_xsendfile/priv"
435
+ conf['map'].first['enable_sendfile_404'] = 'true'
436
+
437
+ conf_file = File.join(dc,'test_serve_static_file_xsendfile.conf')
438
+ File.open(conf_file,'w+') {|fh| fh.write conf.to_yaml}
439
+ DeleteQueue << conf_file
440
+
441
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
442
+ :cmd => ["#{Ruby} -I../../src ../../bin/swiftiply -c test_serve_static_file_xsendfile.conf"])
443
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
444
+ :cmd => ["#{Ruby} -I../../src #{@@testdir}/TC_Swiftiply/test_serve_static_file_xsendfile/sendfile_client.rb 127.0.0.1:29999"])
445
+ # Make sure everything has time to start, connect, etc... before
446
+ # the tests are executed.
447
+ sleep 1
448
+
449
+ response = get_url('127.0.0.1',29998,smallfile2_name)
450
+ small_etag = response['ETag']
451
+ assert_equal("alfalfa leafcutter bee\n",response.body)
452
+
453
+ response = get_url('127.0.0.1',29998,'this_isnt_there')
454
+ assert(Net::HTTPNotFound === response)
455
+ assert(response.body =~ /this_isnt_there could not be found/)
456
+ end
457
+
458
+ #####
459
+ # Setup an SSL connection and test a couple requests that use SSL.
460
+ #####
461
+
462
+ def test_ssl
463
+ puts "\nTesting SSL"
464
+ dc = File.join(Dir.pwd,'TC_Swiftiply')
465
+ dr = File.join(dc,'test_ssl')
466
+
467
+ # Before proceding with testing, the code here should determine if the
468
+ # EventMachine installed on the system has SSL support built. If it
469
+ # does not, don't run the tests. Instead, report on this fact and
470
+ # point them at some information about how to reinstall EM so that it
471
+ # does support ssl.
472
+
473
+ print "Testing whether SSL is available..."
474
+ Thread.new do
475
+ sleep 1
476
+ print '..'
477
+ STDOUT.flush
478
+ sleep 1
479
+ print '..'
480
+ STDOUT.flush
481
+ sleep 1
482
+ print '..'
483
+ STDOUT.flush
484
+ sleep 1
485
+ print '..'
486
+ STDOUT.flush
487
+ http = Net::HTTP.new('127.0.0.1',3333)
488
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
489
+ http.use_ssl
490
+ http.start {http.request_get('/')}
491
+ puts '..'
492
+ end
493
+
494
+ ssl_available = system("#{Ruby} TC_Swiftiply/test_ssl/bin/validate_ssl_capability.rb")
495
+
496
+ if ssl_available
497
+ puts " SSL is available. Continuing."
498
+ else
499
+ puts "\n\n\n!!! Notice !!!"
500
+ puts "\nSSL does not appear to be available in your version of EventMachine."
501
+ puts "This is probably because it could not find the openssl libraries while compiling."
502
+ puts "If you do not have these libraries, install them, then rebuild/reinstall"
503
+ puts "EventMachine. If you do have them, you should report this as a bug to the"
504
+ puts "EventMachine project, with details about your system, library locations, etc...,"
505
+ puts "so that they can fix the build process."
506
+ puts "\nSkipping SSL tests."
507
+ return
508
+ end
509
+
510
+ smallfile_name = "smallfile#{Time.now.to_i}"
511
+ smallfile_path = File.join(dr,'pub',smallfile_name)
512
+ File.open(smallfile_path,'w') {|fh| fh.puts "alfalfa leafcutter bee"}
513
+ DeleteQueue << smallfile_path
514
+
515
+ conf = YAML.load(ConfBase.to_yaml)
516
+ conf['map'].first['docroot'] = "#{@@testdir}/TC_Swiftiply/test_ssl/pub"
517
+ conf['ssl'] = []
518
+ conf['ssl'] << {'at' => '127.0.0.1:29998', 'certfile' => "#{@@testdir}/TC_Swiftiply/test_ssl/test.cert", 'keyfile' => "#{@@testdir}/TC_Swiftiply/test_ssl/test.key"}
519
+ conf['map'].first['sendfileroot'] = "#{@@testdir}/TC_Swiftiply/test_serve_static_file_xsendfile/priv"
520
+ conf['map'].first['enable_sendfile_404'] = 'true'
521
+
522
+ conf_file = File.join(dc,'test_ssl.conf')
523
+ File.open(conf_file,'w+') {|fh| fh.write conf.to_yaml}
524
+ DeleteQueue << conf_file
525
+
526
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
527
+ :cmd => ["#{Ruby} -I../../src ../../bin/swiftiply -c test_ssl.conf"])
528
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
529
+ :cmd => ["#{Ruby} -I../../src #{@@testdir}/TC_Swiftiply/test_serve_static_file_xsendfile/sendfile_client.rb 127.0.0.1:29999"])
530
+ # Make sure everything has time to start, connect, etc... before
531
+ # the tests are executed.
532
+ sleep 1
110
533
 
534
+ response = get_url_https('127.0.0.1',29998,smallfile_name)
535
+ small_etag = response['ETag']
536
+ assert_equal("alfalfa leafcutter bee\n",response.body)
537
+
538
+ response = get_url_https('127.0.0.1',29998,'this_isnt_there')
539
+ assert(Net::HTTPNotFound === response)
540
+ assert(response.body =~ /this_isnt_there could not be found/)
541
+
542
+ #ab = `which ab`.chomp
543
+ #unless ab == ''
544
+ # r = `#{ab} -n 20000 -c 25 https://127.0.0.1:29998/#{smallfile_name}`
545
+ # r =~ /^(Requests per second.*)$/
546
+ # puts "10k 22 byte files through SSL, concurrency of 25\n#{$1}\n"
547
+ #end
548
+ end
549
+
111
550
  def test_serve_static_file_from_cachedir
112
551
  puts "\nTesting Static File Delivery From Cachedir"
113
552
  dc = File.join(Dir.pwd,'TC_Swiftiply')
@@ -143,15 +582,13 @@ ECONF
143
582
  end
144
583
  DeleteQueue << conf_file
145
584
 
146
- assert_nothing_raised("setup failed") do
147
- KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
148
- :cmd => ["#{Ruby} -I../../src ../../bin/swiftiply -c test_serve_static_file_from_cachedir.conf"])
149
- KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
150
- :cmd => ["#{Ruby} -I../../src ../../bin/echo_client 127.0.0.1:29999"])
151
- # Make sure everything has time to start, connect, etc... before
152
- # the tests are executed.
153
- sleep 1
154
- end
585
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
586
+ :cmd => ["#{Ruby} -I../../src ../../bin/swiftiply -c test_serve_static_file_from_cachedir.conf"])
587
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
588
+ :cmd => ["#{Ruby} -I../../src ../bin/echo_client 127.0.0.1:29999"])
589
+ # Make sure everything has time to start, connect, etc... before
590
+ # the tests are executed.
591
+ sleep 1
155
592
 
156
593
  response = get_url('127.0.0.1',29998,smallfile_name)
157
594
  assert_equal("alfalfa leafcutter bee\n",response.body)
@@ -180,33 +617,37 @@ ECONF
180
617
  File.open(conf_file,'w+') {|fh| fh.write ConfBase.to_yaml}
181
618
  DeleteQueue << conf_file
182
619
 
183
- assert_nothing_raised("setup failed") do
184
- KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
185
- :cmd => ["#{Ruby} -I../../src ../../bin/swiftiply -c test_serve_normal_proxy.conf"])
186
- KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
187
- :cmd => ["#{Ruby} -I../../src ../../bin/echo_client 127.0.0.1:29999"])
188
- sleep 1
189
- end
620
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
621
+ :cmd => ["#{Ruby} -I../../src ../../bin/swiftiply -c test_serve_normal_proxy.conf"])
622
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
623
+ :cmd => ["#{Ruby} -I../../src ../bin/echo_client 127.0.0.1:29999"])
624
+ sleep 1
625
+
190
626
 
191
627
  # Normal request
192
628
  response = get_url('127.0.0.1',29998,'/xyzzy')
193
- assert_equal("GET /xyzzy HTTP/1.1\r\nAccept: */*\r\nHost: 127.0.0.1:29998\r\n\r\n",response.body)
629
+ assert(response.body =~ /GET \/xyzzy HTTP\/1.1\r\n.*\r\nHost: 127.0.0.1:29998\r\n\r\n/m, "Got #{response.body.inspect}, expected to match " + '/GET \/xyzzy HTTP\/1.1\r\n.*\r\nHost: 127.0.0.1:29998\r\n\r\n/m')
194
630
 
195
631
  # With query string params.
196
632
  response = get_url('127.0.0.1',29998,'/foo/bar/bam?Q=1234')
197
- assert_equal("GET /foo/bar/bam?Q=1234 HTTP/1.1\r\nAccept: */*\r\nHost: 127.0.0.1:29998\r\n\r\n",response.body)
633
+ assert(response.body =~ /GET \/foo\/bar\/bam\?Q=1234 HTTP\/1.1\r\n.*\r\nHost: 127.0.0.1:29998\r\n\r\n/m, "Got #{response.body.inspect}, expected to match " + 'GET /foo/bar/bam?Q=1234 HTTP/1.1\r\n.*\r\nHost: 127.0.0.1:29998\r\n\r\n/m')
198
634
 
199
635
  # POST request
200
636
  response = post_url('127.0.0.1',29998,'/xyzzy')
201
- assert_equal("POST /xyzzy HTTP/1.1\r\nAccept: */*\r\nHost: 127.0.0.1:29998\r\n\r\n",response.body)
637
+ assert(response.body =~ /POST \/xyzzy HTTP\/1.1\r\n.*x-www-form-urlencoded\r\n\r\n/m, "Got #{response.body.inspect}, expected to match " + '/POST /xyzzy HTTP/1.1\r\n.*x-www-form-urlencoded\r\n\r\n/m')
202
638
 
203
639
  # And another verb; different verbs should be irrelevant
204
640
  response = delete_url('127.0.0.1',29998,'/xyzzy')
205
- assert_equal("DELETE /xyzzy HTTP/1.1\r\nAccept: */*\r\n",response.body[0..36])
641
+ assert(response.body =~ /DELETE \/xyzzy HTTP\/1.1\r\n.*\r\nHost: 127.0.0.1:29998\r\n\r\n/m, "Got #{response.body.inspect}, expected to match " + 'DELETE /xyzzy HTTP/1.1\r\n.*\r\nHost: 127.0.0.1:29998\r\n\r\n/m')
206
642
 
207
643
  # A non-matching hostname, to trigger default handling
208
644
  response = get_url('localhost',29998,'/xyzzy')
209
- assert_equal("GET /xyzzy HTTP/1.1\r\nAccept: */*\r\nHost: localhost:29998\r\n\r\n",response.body)
645
+ assert(response.body =~ /GET \/xyzzy HTTP\/1.1\r\n.*\r\nHost: localhost:29998\r\n\r\n/m, "Got #{response.body.inspect}, expected to match " + 'GET /xyzzy HTTP/1.1\r\n.*\r\nHost: localhost:29998\r\n\r\n/m')
646
+
647
+ # A very large url
648
+ u = '/abcdefghijklmnopqrstuvwxyz'*100
649
+ response = get_url('127.0.0.1',29998,u)
650
+ assert(response.body =~ /GET #{u} HTTP\/1.1.*\r\nHost: 127.0.0.1:29998\r\n\r\n/m, "Got #{response.body.inspect}, expected to match " + 'GET #{u} HTTP/1.1.*\r\nHost: 127.0.0.1:29998\r\n\r\n/m')
210
651
  end
211
652
 
212
653
  # Test redeployable requests.
@@ -225,13 +666,11 @@ ECONF
225
666
  DeleteQueue << conf_file
226
667
 
227
668
  secpid = nil
228
- assert_nothing_raised("setup failed") do
229
- KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
230
- :cmd => ["#{Ruby} -I../../src ../../bin/swiftiply -c test_redeployable.conf"])
231
- secpid = SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
232
- :cmd => ["#{Ruby} -I../../src slow_echo_client 127.0.0.1:29999"])
233
- sleep 1
234
- end
669
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
670
+ :cmd => ["#{Ruby} -I../../src ../../bin/swiftiply -c test_redeployable.conf"])
671
+ secpid = SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
672
+ :cmd => ["#{Ruby} -I../../src slow_echo_client 127.0.0.1:29999"])
673
+ sleep 1
235
674
 
236
675
  response = nil
237
676
  urlthread = Thread.start {response = get_url('127.0.0.1',29998,'/slo_gin_fizz')}
@@ -240,14 +679,11 @@ ECONF
240
679
 
241
680
  Process.kill "SIGKILL",secpid
242
681
  secpid = nil
243
- assert_nothing_raised("setup failed") do
244
-
245
- secpid = SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
246
- :cmd => ["#{Ruby} -I../../src slow_echo_client 127.0.0.1:29999"])
247
- end
682
+ secpid = SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
683
+ :cmd => ["#{Ruby} -I../../src slow_echo_client 127.0.0.1:29999"])
248
684
 
249
685
  urlthread.join
250
- assert_equal("GET /slo_gin_fizz HTTP/1.1\r\nAccept: */*\r\nHost: 127.0.0.1:29998\r\n\r\n",response.body)
686
+ assert(response.body =~ /GET \/slo_gin_fizz HTTP\/1.1\r\n.*\r\nHost: 127.0.0.1:29998\r\n\r\n/m, "Got #{response.body.inspect}, expected to match " + 'GET /slo_gin_fizz HTTP/1.1\r\n.*\r\nHost: 127.0.0.1:29998\r\n\r\n/m')
251
687
 
252
688
  sleep 1
253
689
 
@@ -257,9 +693,7 @@ ECONF
257
693
 
258
694
  # First, make sure that an ininterrupted request of this size is handled.
259
695
 
260
- assert_nothing_raised do
261
- response = post_url('127.0.0.1',29998,'/slo_gin_fizz',bigdata)
262
- end
696
+ response = post_url('127.0.0.1',29998,'/slo_gin_fizz',bigdata)
263
697
 
264
698
  response.body =~ /(xxxxx*)/
265
699
  xs_len = $1.length
@@ -278,17 +712,15 @@ ECONF
278
712
 
279
713
  Process.kill "SIGKILL",secpid
280
714
  secpid = nil
281
- assert_nothing_raised("setup failed") do
282
- KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
283
- :cmd => ["#{Ruby} -I../../src slow_echo_client 127.0.0.1:29999"])
284
- end
715
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
716
+ :cmd => ["#{Ruby} -I../../src slow_echo_client 127.0.0.1:29999"])
285
717
 
286
- assert_raise(EOFError) do
287
- # Net::HTTP should have blown up trying to get a result. The
288
- # request was too big to be redeployed, so the connection should
289
- # have been dropped with nothing returned.
290
- urlthread.join
291
- end
718
+ # assert_raise(EOFError) do
719
+ # # Net::HTTP should have blown up trying to get a result. The
720
+ # # request was too big to be redeployed, so the connection should
721
+ # # have been dropped with nothing returned.
722
+ # urlthread.join
723
+ # end
292
724
  ensure
293
725
  Process.kill("SIGKILL",secpid) if secpid
294
726
  end
@@ -306,74 +738,86 @@ ECONF
306
738
  end
307
739
  DeleteQueue << conf_file
308
740
 
309
- assert_nothing_raised("setup failed") do
310
- KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
311
- :cmd => ["#{Ruby} -I../../src ../../bin/swiftiply -c test_serve_normal_proxy_with_authentication.conf"])
312
- KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
313
- :cmd => ["#{Ruby} -I../../src ../../bin/echo_client 127.0.0.1:29999 abcdef1234"])
314
- sleep 1
315
- end
741
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
742
+ :cmd => ["#{Ruby} -I../../src ../../bin/swiftiply -c test_serve_normal_proxy_with_authentication.conf"])
743
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
744
+ :cmd => ["#{Ruby} -I../../src ../bin/echo_client 127.0.0.1:29999 abcdef1234"])
745
+ sleep 1
316
746
 
317
747
  # Normal request
318
748
  response = get_url('127.0.0.1',29998,'/xyzzy')
319
- assert_equal("GET /xyzzy HTTP/1.1\r\nAccept: */*\r\nHost: 127.0.0.1:29998\r\n\r\n",response.body)
749
+ assert(response.body =~ /GET \/xyzzy HTTP\/1.1\r\n.*\r\nHost: 127.0.0.1:29998\r\n\r\n/m, "Got #{response.body.inspect}, expected to match " + '/GET \/xyzzy HTTP\/1.1\r\n.*\r\nHost: 127.0.0.1:29998\r\n\r\n/m')
320
750
  end
321
-
322
- def test_sensible_error1
323
- puts "\n---------------------------------"
324
- puts "| Raising an error; this is OK! |"
325
- puts "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"
326
- sleep 1
327
751
 
752
+ def test_http_404_error
753
+ puts "\nTesting Request for Unknown Host, No Default (404 Error situation)"
328
754
  dc = File.join(Dir.pwd,'TC_Swiftiply')
329
755
  dr = dc
330
756
 
331
- conf_file = File.join(dc,'test_sensible_error1.conf')
332
- File.open(conf_file,'w+') {|fh| fh.write ConfBase.to_yaml }
757
+ conf_file = File.join(dc,'test_404_error.conf')
758
+ File.open(conf_file,'w+') do |fh|
759
+ conf = YAML.load(ConfBase.to_yaml)
760
+ conf['map'].first['default'] = false
761
+ conf['map'].first['incoming'] = ["localhost"]
762
+ fh.write conf.to_yaml
763
+ end
764
+
333
765
  DeleteQueue << conf_file
334
766
 
335
- assert_nothing_raised("setup failed") do
336
- KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
337
- :cmd => ["#{Ruby} -I../../src ../../bin/swiftiply -c test_sensible_error1.conf"])
338
- sleep 1
339
- KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
340
- :cmd => ["#{Ruby} -I../../src ../../bin/swiftiply -c test_sensible_error1.conf"])
341
- sleep 1
342
- end
767
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
768
+ :cmd => ["#{Ruby} -I../../src ../../bin/swiftiply -c test_404_error.conf"])
769
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
770
+ :cmd => ["#{Ruby} -I../../src ../bin/echo_client 127.0.0.1:29999 abcdef1234"])
771
+ sleep 1
772
+
773
+ response = get_url('127.0.0.1',29998,'/xyzzy')
774
+ assert_equal("404",response.header.code)
343
775
  end
344
-
345
- def test_evented_mongrel
346
- puts "\nTesting Evented Mongrel"
776
+
777
+ def test_http_503_error
778
+ puts "\nTesting Request when server unavailable (503 error situation)"
779
+ dc = File.join(Dir.pwd,'TC_Swiftiply')
780
+ dr = dc
347
781
 
348
- assert_nothing_raised("setup failed") do
349
- KillQueue << SwiftcoreTestSupport::create_process(:dir => File.join('TC_Swiftiply','mongrel'),
350
- :cmd => ["#{Ruby} -I../../../src evented_hello.rb"])
351
- KillQueue << SwiftcoreTestSupport::create_process(:dir => File.join('TC_Swiftiply','mongrel'),
352
- :cmd => ["#{Ruby} -I../../../src threaded_hello.rb"])
782
+ conf_file = File.join(dc,'test_404_error.conf')
783
+ File.open(conf_file,'w+') do |fh|
784
+ conf = YAML.load(ConfBase.to_yaml)
785
+ fh.write conf.to_yaml
353
786
  end
354
787
 
788
+ DeleteQueue << conf_file
789
+
790
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
791
+ :cmd => ["#{Ruby} -I../../src ../../bin/swiftiply -c test_404_error.conf"])
355
792
  sleep 1
356
793
 
357
- response = get_url('127.0.0.1',29998,'/hello')
358
- assert_equal("hello!\n",response.body)
794
+ response = get_url('127.0.0.1',29998,'/xyzzy')
795
+ assert_equal("503",response.header.code)
796
+ end
797
+
798
+ def test_sensible_error1
799
+ puts "\n---------------------------------------------------------------"
800
+ puts "| Raising an error; this is OK! |"
801
+ puts "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"
802
+ sleep 1
803
+
804
+ dc = File.join(Dir.pwd,'TC_Swiftiply')
805
+ dr = dc
359
806
 
360
- response = get_url('127.0.0.1',29998,'/dir')
361
- assert_equal("<html><head><title>Directory Listing",response.body[0..35])
807
+ conf_file = File.join(dc,'test_sensible_error1.conf')
808
+ File.open(conf_file,'w+') {|fh| fh.write ConfBase.to_yaml }
809
+ DeleteQueue << conf_file
362
810
 
363
- ab = `which ab`.chomp
364
- unless ab == ''
365
- puts "\nThreaded Mongrel..."
366
- rt = `#{ab} -n 10000 -c 25 http://127.0.0.1:29997/hello`
367
- rt =~ /^(Requests per second.*)$/
368
- rts = $1
369
- puts "\nEvented Mongrel..."
370
- re = `#{ab} -n 10000 -c 25 http://127.0.0.1:29998/hello`
371
- re =~ /^(Requests per second.*)$/
372
- res = $1
373
- puts "\nThreaded Mongrel, no proxies, concurrency of 25\n#{rts}"
374
- puts "Evented Mongrel, no proxies, concurrency of 25\n#{res}"
375
- sleep 1
376
- end
811
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
812
+ :cmd => ["#{Ruby} -I../../src ../../bin/swiftiply -c test_sensible_error1.conf"])
813
+ sleep 1
814
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
815
+ :cmd => ["#{Ruby} -I../../src ../../bin/swiftiply -c test_sensible_error1.conf"])
816
+ sleep 1
817
+ puts "\n---------------------------------------------------------------"
818
+ puts "| The above exception was just a test. It should have started |"
819
+ puts "| with: \"The listener on 127.0.0.1:29998 could not be started.\" |"
820
+ puts "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"
377
821
  end
378
822
 
379
823
  def test_swiftiplied_mongrel
@@ -386,17 +830,19 @@ ECONF
386
830
  File.open(conf_file,'w+') {|fh| fh.write ConfBase.to_yaml}
387
831
  DeleteQueue << conf_file
388
832
 
389
- assert_nothing_raised("setup failed") do
390
- KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
391
- :cmd => ["#{Ruby} -I../../src ../../bin/swiftiply -c test_serve_mongrel.conf"])
392
- sleep 1
393
- KillQueue << SwiftcoreTestSupport::create_process(:dir => File.join('TC_Swiftiply','mongrel'),
394
- :cmd => ["#{Ruby} -I../../../src swiftiplied_hello.rb"])
395
- KillQueue << SwiftcoreTestSupport::create_process(:dir => File.join('TC_Swiftiply','mongrel'),
396
- :cmd => ["#{Ruby} -I../../../src swiftiplied_hello.rb"])
397
- sleep 1
398
- end
833
+ kq = []
834
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
835
+ :cmd => ["#{Ruby} -I../../src ../../bin/swiftiply -c test_serve_mongrel.conf"])
836
+ sleep 1
837
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => File.join('TC_Swiftiply','mongrel'),
838
+ :cmd => ["#{Ruby} -I../../../src swiftiplied_hello.rb"])
839
+ KillQueue << SwiftcoreTestSupport::create_process(:dir => File.join('TC_Swiftiply','mongrel'),
840
+ :cmd => ["#{Ruby} -I../../../src swiftiplied_hello.rb"])
841
+ sleep 1
399
842
 
843
+ response = httpclient('127.0.0.1',29998,"http://127.0.0.1",'')
844
+ assert(response[:headers].any? {|x| x =~ /404\s+not\s+found/i})
845
+
400
846
  response = get_url('127.0.0.1',29998,'/hello')
401
847
  assert_equal("hello!\n",response.body)
402
848
 
@@ -409,50 +855,11 @@ ECONF
409
855
  r =~ /^(Requests per second.*)$/
410
856
  puts "Swiftiply -> Swiftiplied Mongrel, concurrency of 25\n#{$1}"
411
857
  end
412
- end
413
-
414
- def test_HUP
415
- puts "\nTesting HUP handling"
416
- dc = File.join(Dir.pwd,'TC_Swiftiply')
417
- dr = File.join(dc,'test_serve_static_file')
418
-
419
- conf_file = File.join(dc,'test_HUP.conf')
420
- File.open(conf_file,'w+') do |fh|
421
- conf = YAML.load(ConfBase.to_yaml)
422
- conf['map'].first.delete('docroot')
423
- fh.write conf.to_yaml
424
- end
425
- DeleteQueue << conf_file
426
-
427
- smallfile_name = "xyzzy"
428
- smallfile_path = File.join(dr,smallfile_name)
429
- File.open(smallfile_path,'w') {|fh| fh.puts "alfalfa leafcutter bee"}
430
- DeleteQueue << smallfile_path
431
-
432
- swiftiply_pid = nil
433
- assert_nothing_raised("setup failed") do
434
- KillQueue << swiftiply_pid = SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
435
- :cmd => ["#{Ruby} -I../../src ../../bin/swiftiply -c test_HUP.conf"])
436
- KillQueue << SwiftcoreTestSupport::create_process(:dir => 'TC_Swiftiply',
437
- :cmd => ["#{Ruby} -I../../src ../../bin/echo_client 127.0.0.1:29999"])
438
- sleep 1
858
+ unless ab == ''
859
+ r = `#{ab} -n 100000 -k -c 25 http://127.0.0.1:29998/hello`
860
+ r =~ /^(Requests per second.*)$/
861
+ puts "Swiftiply -> Swiftiplied Mongrel, concurrency of 25 with Keep-Alive\n#{$1}"
439
862
  end
440
-
441
- # Normal request for a sanity check.
442
- response = get_url('127.0.0.1',29998,'/xyzzy')
443
- assert_equal("GET /xyzzy HTTP/1.1\r\nAccept: */*\r\nHost: 127.0.0.1:29998\r\n\r\n",response.body)
444
-
445
- # Now rewrite the conf file to be a little different.
446
- File.open(conf_file,'w+') {|fh| fh.write ConfBase.to_yaml }
447
-
448
- # Reload the config
449
- Process.kill 'SIGHUP',swiftiply_pid
450
-
451
- # This request should pull the file from the docroot, since it the
452
- # docroot was not deleted from the config that was just read.
453
- response = get_url('127.0.0.1',29998,'/xyzzy')
454
-
455
- assert_equal("alfalfa leafcutter bee\n",response.body)
456
863
  end
457
864
 
458
865
  end