gin 1.1.2 → 1.2.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.
- data/History.rdoc +22 -1
- data/Manifest.txt +7 -0
- data/TODO.rdoc +45 -0
- data/bin/gin +105 -35
- data/lib/gin.rb +7 -1
- data/lib/gin/app.rb +328 -59
- data/lib/gin/asset_manifest.rb +178 -0
- data/lib/gin/asset_pipeline.rb +235 -0
- data/lib/gin/cache.rb +36 -0
- data/lib/gin/config.rb +3 -1
- data/lib/gin/constants.rb +6 -1
- data/lib/gin/controller.rb +180 -17
- data/lib/gin/core_ext/float.rb +10 -0
- data/lib/gin/core_ext/time.rb +41 -0
- data/lib/gin/filterable.rb +5 -5
- data/lib/gin/mountable.rb +100 -0
- data/lib/gin/request.rb +4 -12
- data/lib/gin/response.rb +4 -2
- data/lib/gin/router.rb +110 -37
- data/lib/gin/strict_hash.rb +33 -0
- data/lib/gin/test.rb +8 -4
- data/lib/gin/worker.rb +49 -0
- data/test/mock_app.rb +7 -7
- data/test/test_app.rb +266 -17
- data/test/test_cache.rb +73 -5
- data/test/test_config.rb +4 -4
- data/test/test_controller.rb +158 -32
- data/test/test_filterable.rb +16 -1
- data/test/test_gin.rb +7 -6
- data/test/test_request.rb +6 -1
- data/test/test_response.rb +1 -1
- data/test/test_router.rb +156 -34
- data/test/test_test.rb +51 -45
- metadata +42 -14
- checksums.yaml +0 -7
data/test/mock_app.rb
CHANGED
@@ -5,22 +5,22 @@ class MockApp < Gin::App
|
|
5
5
|
layout "foo"
|
6
6
|
|
7
7
|
def index
|
8
|
-
view :bar, locals
|
8
|
+
view :bar, :locals => {:test_val => "LOCAL"}
|
9
9
|
end
|
10
10
|
|
11
11
|
def login
|
12
12
|
set_cookie "foo_session", "12345",
|
13
|
-
expires
|
13
|
+
:expires => Time.parse("Fri, 01 Jan 2100 00:00:00 -0000")
|
14
14
|
"OK"
|
15
15
|
end
|
16
16
|
|
17
17
|
def supercookie
|
18
18
|
set_cookie "supercookie", "SUPER!",
|
19
|
-
expires
|
20
|
-
domain
|
21
|
-
path
|
22
|
-
secure
|
23
|
-
httponly
|
19
|
+
:expires => Time.parse("Fri, 01 Jan 2100 00:00:00 -0000"),
|
20
|
+
:domain => "mockapp.com",
|
21
|
+
:path => "/",
|
22
|
+
:secure => true,
|
23
|
+
:httponly => true
|
24
24
|
"OK"
|
25
25
|
end
|
26
26
|
end
|
data/test/test_app.rb
CHANGED
@@ -4,6 +4,7 @@ require "stringio"
|
|
4
4
|
class FooController < Gin::Controller;
|
5
5
|
def index; "FOO"; end
|
6
6
|
def create; end
|
7
|
+
def show id; "FOO ID = #{id}"; end
|
7
8
|
def error; raise "Something bad happened"; end
|
8
9
|
end
|
9
10
|
|
@@ -21,6 +22,13 @@ class FooApp < Gin::App
|
|
21
22
|
get :index, "/"
|
22
23
|
post :create, "/"
|
23
24
|
get :error, "/error"
|
25
|
+
get :show, "/:id"
|
26
|
+
end
|
27
|
+
|
28
|
+
def call env
|
29
|
+
env['SERVER_NAME'] ||= 'foo.com'
|
30
|
+
env['SERVER_PORT'] ||= '80'
|
31
|
+
super
|
24
32
|
end
|
25
33
|
|
26
34
|
def reloaded?
|
@@ -71,6 +79,8 @@ end
|
|
71
79
|
|
72
80
|
|
73
81
|
class AppTest < Test::Unit::TestCase
|
82
|
+
include Gin::Constants
|
83
|
+
|
74
84
|
class NamespacedApp < Gin::App; end
|
75
85
|
|
76
86
|
FOO_ROUTER = FooApp.router
|
@@ -122,6 +132,54 @@ class AppTest < Test::Unit::TestCase
|
|
122
132
|
end
|
123
133
|
|
124
134
|
|
135
|
+
def test_hostname
|
136
|
+
FooApp.hostname 'example.com'
|
137
|
+
@app = FooApp.new
|
138
|
+
|
139
|
+
assert_equal 'example.com', FooApp.hostname
|
140
|
+
assert_equal 'example.com', @app.hostname
|
141
|
+
assert @app.send(:valid_host?,{})
|
142
|
+
end
|
143
|
+
|
144
|
+
|
145
|
+
def test_hostname_enforce
|
146
|
+
FooApp.hostname 'example.com', :enforce => true
|
147
|
+
@app = FooApp.new
|
148
|
+
|
149
|
+
assert_equal 'example.com', FooApp.hostname
|
150
|
+
assert_equal 'example.com', @app.hostname
|
151
|
+
assert !@app.send(:valid_host?,{'SERVER_NAME' => 'admin.example.com', 'SERVER_PORT' => '80'})
|
152
|
+
assert @app.send(:valid_host?,{'SERVER_NAME' => 'example.com', 'SERVER_PORT' => '443'})
|
153
|
+
assert @app.send(:valid_host?,{'SERVER_NAME' => 'example.com', 'SERVER_PORT' => '80'})
|
154
|
+
end
|
155
|
+
|
156
|
+
|
157
|
+
def test_hostname_enforce_port
|
158
|
+
FooApp.hostname 'example.com:80', :enforce => true
|
159
|
+
@app = FooApp.new
|
160
|
+
|
161
|
+
assert_equal 'example.com:80', FooApp.hostname
|
162
|
+
assert_equal 'example.com:80', @app.hostname
|
163
|
+
assert !@app.send(:valid_host?,{'SERVER_NAME' => 'admin.example.com', 'SERVER_PORT' => '80'})
|
164
|
+
assert !@app.send(:valid_host?,{'SERVER_NAME' => 'example.com', 'SERVER_PORT' => '443'})
|
165
|
+
assert @app.send(:valid_host?,{'SERVER_NAME' => 'example.com', 'SERVER_PORT' => '80'})
|
166
|
+
end
|
167
|
+
|
168
|
+
|
169
|
+
def test_hostname_enforce_regexp
|
170
|
+
FooApp.hostname 'admin.example.com',
|
171
|
+
:enforce => /^admin\.(example\.com|localhost)$/
|
172
|
+
|
173
|
+
@app = FooApp.new
|
174
|
+
|
175
|
+
assert_equal 'admin.example.com', FooApp.hostname
|
176
|
+
assert_equal 'admin.example.com', @app.hostname
|
177
|
+
assert !@app.send(:valid_host?,{'SERVER_NAME' => 'example.com'})
|
178
|
+
assert @app.send(:valid_host?,{'SERVER_NAME' => 'admin.example.com'})
|
179
|
+
assert @app.send(:valid_host?,{'SERVER_NAME' => 'admin.localhost'})
|
180
|
+
end
|
181
|
+
|
182
|
+
|
125
183
|
def test_namespace
|
126
184
|
assert_nil FooApp.namespace
|
127
185
|
assert_equal self.class, NamespacedApp.namespace
|
@@ -131,8 +189,8 @@ class AppTest < Test::Unit::TestCase
|
|
131
189
|
def test_protection
|
132
190
|
assert_equal false, FooApp.protection
|
133
191
|
|
134
|
-
FooApp.protection(test
|
135
|
-
assert_equal({test
|
192
|
+
FooApp.protection(:test => "thing")
|
193
|
+
assert_equal({:test =>"thing"}, FooApp.protection)
|
136
194
|
|
137
195
|
FooApp.protection false
|
138
196
|
assert_equal false, FooApp.protection
|
@@ -174,8 +232,8 @@ class AppTest < Test::Unit::TestCase
|
|
174
232
|
def test_sessions
|
175
233
|
assert_equal false, FooApp.sessions
|
176
234
|
|
177
|
-
FooApp.sessions(test
|
178
|
-
assert_equal({test
|
235
|
+
FooApp.sessions(:test => "thing")
|
236
|
+
assert_equal({:test =>"thing"}, FooApp.sessions)
|
179
237
|
|
180
238
|
FooApp.sessions false
|
181
239
|
assert_equal false, FooApp.sessions
|
@@ -313,7 +371,7 @@ class AppTest < Test::Unit::TestCase
|
|
313
371
|
|
314
372
|
def test_template_for
|
315
373
|
FooApp.default_template Tilt::ERBTemplate, "erb"
|
316
|
-
@app = FooApp.new root_dir
|
374
|
+
@app = FooApp.new :root_dir => "./test/app"
|
317
375
|
template = @app.template_for "./test/app/layouts/foo"
|
318
376
|
|
319
377
|
assert Tilt::ERBTemplate === template
|
@@ -322,14 +380,14 @@ class AppTest < Test::Unit::TestCase
|
|
322
380
|
|
323
381
|
|
324
382
|
def test_template_for_invalid
|
325
|
-
@app = FooApp.new root_dir
|
383
|
+
@app = FooApp.new :root_dir => "./test/app"
|
326
384
|
template = @app.template_for "./test/app/layouts/ugh"
|
327
385
|
assert_nil template
|
328
386
|
end
|
329
387
|
|
330
388
|
|
331
389
|
def test_template_files
|
332
|
-
@app = FooApp.new root_dir
|
390
|
+
@app = FooApp.new :root_dir => "./test/app"
|
333
391
|
|
334
392
|
files = @app.template_files "./test/app/layouts/foo"
|
335
393
|
assert_equal ["./test/app/layouts/foo.erb"], files
|
@@ -351,16 +409,97 @@ class AppTest < Test::Unit::TestCase
|
|
351
409
|
assert_equal [FooMiddleware, :foo, :bar], FooApp.middleware[0]
|
352
410
|
assert !FooMiddleware.called?
|
353
411
|
|
354
|
-
myapp = FooApp.new logger
|
412
|
+
myapp = FooApp.new :logger => @error_io
|
355
413
|
myapp.call({'rack.input' => "", 'PATH_INFO' => '/foo', 'REQUEST_METHOD' => 'GET'})
|
356
414
|
assert FooMiddleware.called?
|
357
415
|
|
358
416
|
FooMiddleware.reset!
|
359
|
-
myapp.dispatch(
|
417
|
+
myapp.dispatch('rack.input' => "", 'PATH_INFO' => '/foo',
|
418
|
+
'REQUEST_METHOD' => 'GET', GIN_TARGET => [FooController, :index])
|
360
419
|
assert !FooMiddleware.called?
|
361
420
|
end
|
362
421
|
|
363
422
|
|
423
|
+
def test_rewrite_env
|
424
|
+
time = Time.now
|
425
|
+
env = {'rack.input' => 'id=foo', 'PATH_INFO' => '/foobar', 'REQUEST_METHOD' => 'GET',
|
426
|
+
'REMOTE_ADDR' => '127.0.0.1', GIN_RELOADED => true, GIN_TIMESTAMP => time,
|
427
|
+
GIN_TARGET => [FooController, :index]}
|
428
|
+
|
429
|
+
expected_env = env.dup
|
430
|
+
expected_env.delete(GIN_TARGET)
|
431
|
+
expected_env['REQUEST_METHOD'] = 'POST'
|
432
|
+
expected_env['PATH_INFO'] = '/foo'
|
433
|
+
expected_env['QUERY_STRING'] = nil
|
434
|
+
|
435
|
+
assert_equal expected_env, @app.rewrite_env(env, FooController, :create)
|
436
|
+
|
437
|
+
assert_raises Gin::RouterError do
|
438
|
+
@app.rewrite_env(env, FooController, :bad_action)
|
439
|
+
end
|
440
|
+
|
441
|
+
assert_raises Gin::Router::PathArgumentError do
|
442
|
+
@app.rewrite_env(env, FooController, :show)
|
443
|
+
end
|
444
|
+
|
445
|
+
expected_env['REQUEST_METHOD'] = 'GET'
|
446
|
+
expected_env['PATH_INFO'] = '/foo/123'
|
447
|
+
expected_env['QUERY_STRING'] = 'blah=456'
|
448
|
+
|
449
|
+
assert_equal expected_env,
|
450
|
+
@app.rewrite_env(env, FooController, :show, {:id => 123, :blah => 456}, 'REQUEST_METHOD' => 'POST')
|
451
|
+
end
|
452
|
+
|
453
|
+
|
454
|
+
def test_rewrite_env_custom_path
|
455
|
+
time = Time.now
|
456
|
+
env = {'rack.input' => 'id=foo', 'PATH_INFO' => '/foobar', 'REQUEST_METHOD' => 'GET',
|
457
|
+
'REMOTE_ADDR' => '127.0.0.1', GIN_RELOADED => true, GIN_TIMESTAMP => time,
|
458
|
+
GIN_TARGET => [FooController, :index]}
|
459
|
+
|
460
|
+
expected_env = env.dup
|
461
|
+
expected_env.delete(GIN_TARGET)
|
462
|
+
expected_env['REQUEST_METHOD'] = 'POST'
|
463
|
+
expected_env['PATH_INFO'] = '/foo'
|
464
|
+
expected_env['QUERY_STRING'] = nil
|
465
|
+
|
466
|
+
assert_equal expected_env, @app.rewrite_env(env, '/foo', {}, 'REQUEST_METHOD' => 'POST')
|
467
|
+
assert_raises Gin::Router::PathArgumentError do
|
468
|
+
@app.rewrite_env(env, '/foo/:id', {}, 'REQUEST_METHOD' => 'POST')
|
469
|
+
end
|
470
|
+
|
471
|
+
expected_env['PATH_INFO'] = '/foo/123'
|
472
|
+
expected_env['QUERY_STRING'] = 'blah=456'
|
473
|
+
|
474
|
+
assert_equal expected_env,
|
475
|
+
@app.rewrite_env(env, '/foo/:id', {:id => 123, :blah => 456}, 'REQUEST_METHOD' => 'POST')
|
476
|
+
end
|
477
|
+
|
478
|
+
|
479
|
+
def test_rewrite
|
480
|
+
env = {'rack.input' => 'id=foo', 'PATH_INFO' => '/foobar', 'REQUEST_METHOD' => 'GET',
|
481
|
+
'REMOTE_ADDR' => '127.0.0.1'}
|
482
|
+
|
483
|
+
resp = @app.rewrite!(env, FooController, :show, :id => 123)
|
484
|
+
@app.logger.rewind
|
485
|
+
|
486
|
+
assert_equal ["FOO ID = 123"], resp[2]
|
487
|
+
assert_equal "[REWRITE] GET /foobar -> GET /foo/123\n", @app.logger.readline
|
488
|
+
end
|
489
|
+
|
490
|
+
|
491
|
+
def test_rewrite_path
|
492
|
+
env = {'rack.input' => 'id=foo', 'PATH_INFO' => '/foobar', 'REQUEST_METHOD' => 'GET',
|
493
|
+
'REMOTE_ADDR' => '127.0.0.1'}
|
494
|
+
|
495
|
+
resp = @app.rewrite!(env, '/other/path/:id', {:id => 123}, 'REQUEST_METHOD' => 'PUT')
|
496
|
+
@app.logger.rewind
|
497
|
+
|
498
|
+
assert_equal 404, resp[0]
|
499
|
+
assert_equal "[REWRITE] GET /foobar -> PUT /other/path/123\n", @app.logger.readline
|
500
|
+
end
|
501
|
+
|
502
|
+
|
364
503
|
def test_call_reload
|
365
504
|
FooApp.autoreload true
|
366
505
|
myapp = FooApp.new @error_io
|
@@ -393,6 +532,116 @@ class AppTest < Test::Unit::TestCase
|
|
393
532
|
end
|
394
533
|
|
395
534
|
|
535
|
+
def test_call_host
|
536
|
+
env = {'rack.input' => "", 'PATH_INFO' => '/foo', 'REQUEST_METHOD' => 'GET',
|
537
|
+
'SERVER_NAME' => 'foo.com', 'SERVER_PORT' => '80'}
|
538
|
+
FooApp.hostname 'example.com'
|
539
|
+
@app = FooApp.new
|
540
|
+
resp = @app.call env
|
541
|
+
|
542
|
+
assert_equal 200, resp[0]
|
543
|
+
assert_equal 'example.com:80', resp[1]['Host']
|
544
|
+
end
|
545
|
+
|
546
|
+
|
547
|
+
def test_call_validate_host
|
548
|
+
env = {'rack.input' => "", 'PATH_INFO' => '/foo', 'REQUEST_METHOD' => 'GET',
|
549
|
+
'SERVER_NAME' => 'foo.com', 'SERVER_PORT' => '80'}
|
550
|
+
FooApp.hostname 'example.com', :enforce => true
|
551
|
+
@app = FooApp.new
|
552
|
+
resp = @app.call env
|
553
|
+
|
554
|
+
assert_equal 400, resp[0]
|
555
|
+
assert_equal 'example.com:80', resp[1]['Host']
|
556
|
+
assert resp[2][0].include?("No route for host 'foo.com:80'")
|
557
|
+
|
558
|
+
env['SERVER_NAME'] = 'example.com'
|
559
|
+
resp = @app.call env
|
560
|
+
|
561
|
+
assert_equal 200, resp[0]
|
562
|
+
assert_equal 'example.com:80', resp[1]['Host']
|
563
|
+
end
|
564
|
+
|
565
|
+
|
566
|
+
def test_call_validate_host_regexp
|
567
|
+
env = {'rack.input' => "", 'PATH_INFO' => '/foo', 'REQUEST_METHOD' => 'GET',
|
568
|
+
'SERVER_NAME' => 'foo.com', 'SERVER_PORT' => '80'}
|
569
|
+
FooApp.hostname 'admin.example.com', :enforce => /^admin\.(example\.com|localhost)$/
|
570
|
+
@app = FooApp.new
|
571
|
+
resp = @app.call env
|
572
|
+
|
573
|
+
assert_equal 400, resp[0]
|
574
|
+
assert_equal 'admin.example.com:80', resp[1]['Host']
|
575
|
+
assert resp[2][0].include?("No route for host 'foo.com:80'")
|
576
|
+
|
577
|
+
env['SERVER_NAME'] = 'admin.example.com'
|
578
|
+
env['SERVER_PORT'] = '443'
|
579
|
+
resp = @app.call env
|
580
|
+
|
581
|
+
assert_equal 200, resp[0]
|
582
|
+
assert_equal 'admin.example.com:443', resp[1]['Host']
|
583
|
+
end
|
584
|
+
|
585
|
+
|
586
|
+
def test_call_validate_host_and_port
|
587
|
+
env = {'rack.input' => "", 'PATH_INFO' => '/foo', 'REQUEST_METHOD' => 'GET',
|
588
|
+
'SERVER_NAME' => 'example.com', 'SERVER_PORT' => '80'}
|
589
|
+
FooApp.hostname 'example.com:443', :enforce => true
|
590
|
+
@app = FooApp.new
|
591
|
+
resp = @app.call env
|
592
|
+
|
593
|
+
assert_equal 400, resp[0]
|
594
|
+
assert_equal 'example.com:80', resp[1]['Host']
|
595
|
+
assert resp[2][0].include?("No route for host 'example.com:80'")
|
596
|
+
|
597
|
+
env['SERVER_PORT'] = '443'
|
598
|
+
resp = @app.call env
|
599
|
+
|
600
|
+
assert_equal 200, resp[0]
|
601
|
+
assert_equal 'example.com:443', resp[1]['Host']
|
602
|
+
end
|
603
|
+
|
604
|
+
|
605
|
+
def test_call_validate_host_static
|
606
|
+
env = {'rack.input' => "", 'PATH_INFO' => '/gin.css', 'REQUEST_METHOD' => 'GET',
|
607
|
+
'SERVER_NAME' => 'foo.com', 'SERVER_PORT' => '80'}
|
608
|
+
FooApp.hostname 'example.com', :enforce => true
|
609
|
+
@app = FooApp.new
|
610
|
+
resp = @app.call env
|
611
|
+
|
612
|
+
assert_equal 400, resp[0]
|
613
|
+
assert_equal 'example.com:80', resp[1]['Host']
|
614
|
+
assert resp[2][0].include?("No route for host 'foo.com:80'")
|
615
|
+
|
616
|
+
env['SERVER_NAME'] = 'example.com'
|
617
|
+
resp = @app.call env
|
618
|
+
|
619
|
+
assert_equal 200, resp[0]
|
620
|
+
assert_equal 'example.com:80', resp[1]['Host']
|
621
|
+
end
|
622
|
+
|
623
|
+
|
624
|
+
def test_call_validate_host_rack_app
|
625
|
+
env = {'rack.input' => "", 'PATH_INFO' => '/gin.css', 'REQUEST_METHOD' => 'GET',
|
626
|
+
'SERVER_NAME' => 'foo.com', 'SERVER_PORT' => '80'}
|
627
|
+
|
628
|
+
FooApp.hostname 'example.com', :enforce => true
|
629
|
+
|
630
|
+
expected = [200, {'Content-Length'=>"5", 'Host' => 'foo.com:80'}, "AHOY!"]
|
631
|
+
myapp = lambda{|_| expected }
|
632
|
+
@app = FooApp.new myapp
|
633
|
+
resp = @app.call env
|
634
|
+
|
635
|
+
assert_equal expected, resp
|
636
|
+
|
637
|
+
env['SERVER_NAME'] = 'example.com'
|
638
|
+
resp = @app.call env
|
639
|
+
|
640
|
+
assert_equal 200, resp[0]
|
641
|
+
assert_equal 'example.com:80', resp[1]['Host']
|
642
|
+
assert resp[2].is_a?(File)
|
643
|
+
end
|
644
|
+
|
396
645
|
|
397
646
|
def test_call!
|
398
647
|
resp = @app.call! 'rack.input' => "",
|
@@ -409,7 +658,7 @@ class AppTest < Test::Unit::TestCase
|
|
409
658
|
FooApp.environment 'test'
|
410
659
|
env = {'rack.input' => "", 'PATH_INFO' => '/foo', 'REQUEST_METHOD' => 'GET'}
|
411
660
|
|
412
|
-
resp = @app.dispatch env
|
661
|
+
resp = @app.dispatch env.merge(GIN_TARGET => [FooController, :index])
|
413
662
|
assert_equal 200, resp[0]
|
414
663
|
assert_equal "3", resp[1]['Content-Length']
|
415
664
|
assert_equal 'text/html;charset=UTF-8', resp[1]['Content-Type']
|
@@ -422,7 +671,7 @@ class AppTest < Test::Unit::TestCase
|
|
422
671
|
@app = FooApp.new
|
423
672
|
env = {'rack.input' => "", 'PATH_INFO' => '/foo', 'REQUEST_METHOD' => 'GET'}
|
424
673
|
|
425
|
-
resp = @app.dispatch env
|
674
|
+
resp = @app.dispatch env.merge(GIN_TARGET => [FooController, :bad])
|
426
675
|
assert_equal 404, resp[0]
|
427
676
|
assert_equal "288", resp[1]['Content-Length']
|
428
677
|
assert_equal 'text/html;charset=UTF-8', resp[1]['Content-Type']
|
@@ -435,13 +684,13 @@ class AppTest < Test::Unit::TestCase
|
|
435
684
|
@app = FooApp.new
|
436
685
|
env = {'rack.input' => "", 'PATH_INFO' => '/foo', 'REQUEST_METHOD' => 'GET'}
|
437
686
|
|
438
|
-
resp = @app.dispatch env
|
687
|
+
resp = @app.dispatch env.merge(GIN_TARGET => [FooController, nil])
|
439
688
|
assert_equal 404, resp[0]
|
440
689
|
assert_equal "288", resp[1]['Content-Length']
|
441
690
|
assert_equal 'text/html;charset=UTF-8', resp[1]['Content-Type']
|
442
691
|
assert_equal @app.asset("404.html"), resp[2].path
|
443
692
|
|
444
|
-
msg = "[ERROR] Gin::NotFound: No
|
693
|
+
msg = "[ERROR] Gin::NotFound: No action exists for: GET /foo"
|
445
694
|
@error_io.rewind
|
446
695
|
assert @error_io.read.include?(msg)
|
447
696
|
end
|
@@ -451,7 +700,7 @@ class AppTest < Test::Unit::TestCase
|
|
451
700
|
FooApp.environment 'test'
|
452
701
|
@app = FooApp.new
|
453
702
|
env = {'rack.input' => "", 'PATH_INFO' => '/bad', 'REQUEST_METHOD' => 'GET'}
|
454
|
-
resp = @app.dispatch env
|
703
|
+
resp = @app.dispatch env.merge(GIN_TARGET => [FooController, :error])
|
455
704
|
|
456
705
|
assert_equal 500, resp[0]
|
457
706
|
assert_equal @app.asset("500.html"), resp[2].path
|
@@ -496,7 +745,7 @@ class AppTest < Test::Unit::TestCase
|
|
496
745
|
env = {'rack.input' => "", 'PATH_INFO' => '/bad', 'REQUEST_METHOD' => 'GET'}
|
497
746
|
err = ArgumentError.new("Unexpected Argument")
|
498
747
|
|
499
|
-
resp = @app.handle_error
|
748
|
+
resp = @app.handle_error err, env
|
500
749
|
assert_equal 500, resp[0]
|
501
750
|
assert_equal File.read(@app.asset("500.html")), resp[2].read
|
502
751
|
assert_equal({"Content-Type"=>"text/html;charset=UTF-8", "Content-Length"=>"348"}, resp[1])
|
@@ -663,14 +912,14 @@ class AppTest < Test::Unit::TestCase
|
|
663
912
|
|
664
913
|
|
665
914
|
def test_init_missing_routes
|
666
|
-
assert_raises Gin::
|
915
|
+
assert_raises Gin::RouterError do
|
667
916
|
MissingRouteApp.new
|
668
917
|
end
|
669
918
|
end
|
670
919
|
|
671
920
|
|
672
921
|
def test_init_extra_routes
|
673
|
-
assert_raises Gin::
|
922
|
+
assert_raises Gin::RouterError do
|
674
923
|
ExtraRouteApp.new
|
675
924
|
end
|
676
925
|
end
|
data/test/test_cache.rb
CHANGED
@@ -7,6 +7,15 @@ class CacheTest < Test::Unit::TestCase
|
|
7
7
|
end
|
8
8
|
|
9
9
|
|
10
|
+
def test_clear
|
11
|
+
@cache[:foo] = "blah"
|
12
|
+
assert @cache[:foo]
|
13
|
+
|
14
|
+
@cache.clear
|
15
|
+
assert_nil @cache[:foo]
|
16
|
+
end
|
17
|
+
|
18
|
+
|
10
19
|
def test_write_timeout
|
11
20
|
assert_equal 0.05, @cache.write_timeout
|
12
21
|
@cache.write_timeout = 0.1
|
@@ -15,20 +24,79 @@ class CacheTest < Test::Unit::TestCase
|
|
15
24
|
end
|
16
25
|
|
17
26
|
|
18
|
-
|
27
|
+
# This test only valid for non-GC Ruby implementations
|
28
|
+
def test_readwrite_thread_safe
|
19
29
|
@cache[:num] = 0
|
20
|
-
@mutex = Mutex.new
|
21
30
|
@num = 0
|
22
31
|
|
23
32
|
threads = []
|
24
|
-
|
25
|
-
threads << Thread.new{ @cache[:num]
|
33
|
+
15.times do
|
34
|
+
threads << Thread.new{ @cache[:num] = Thread.current.object_id }
|
35
|
+
end
|
36
|
+
15.times do
|
37
|
+
threads << Thread.new{ assert @cache[:num] }
|
38
|
+
end
|
39
|
+
threads.each do |t|
|
40
|
+
t.join
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
def test_increase
|
46
|
+
assert_equal 1, @cache.increase(:num)
|
47
|
+
assert_equal 1, @cache[:num]
|
48
|
+
|
49
|
+
@cache.increase(:num, 0.2)
|
50
|
+
assert_equal 1.2, @cache[:num]
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
def test_increase_invalid
|
55
|
+
@cache[:num] = "foo"
|
56
|
+
assert_nil @cache.increase(:num)
|
57
|
+
assert_equal "foo", @cache[:num]
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
def test_decrease
|
62
|
+
@cache.decrease(:num)
|
63
|
+
assert_equal -1, @cache[:num]
|
64
|
+
|
65
|
+
@cache.decrease(:num, 0.2)
|
66
|
+
assert_equal -1.2, @cache[:num]
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
def test_decrease_invalid
|
71
|
+
@cache[:num] = "foo"
|
72
|
+
assert_nil @cache.decrease(:num)
|
73
|
+
assert_equal "foo", @cache[:num]
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
def test_increase_thread_safe
|
78
|
+
threads = []
|
79
|
+
15.times do
|
80
|
+
threads << Thread.new{ @cache.increase(:num) }
|
81
|
+
end
|
82
|
+
threads.each do |t|
|
83
|
+
t.join
|
84
|
+
end
|
85
|
+
|
86
|
+
assert_equal 15, @cache[:num]
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
def test_decrease_thread_safe
|
91
|
+
threads = []
|
92
|
+
15.times do
|
93
|
+
threads << Thread.new{ @cache.decrease(:num) }
|
26
94
|
end
|
27
95
|
threads.each do |t|
|
28
96
|
t.join
|
29
97
|
end
|
30
98
|
|
31
|
-
assert_equal
|
99
|
+
assert_equal -15, @cache[:num]
|
32
100
|
end
|
33
101
|
|
34
102
|
|