blob: 209f6ec1ff5a88a03e05b43b6ca611b17b30ae0a (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
require 'abstract_unit'
require 'action_view/body_parts/concurrent_block'
class BodyPartsTest < ActionController::TestCase
RENDERINGS = [Object.new, Object.new, Object.new]
class TestController < ActionController::Base
def index
RENDERINGS.each do |rendering|
response.template.punctuate_body! rendering
end
@performed_render = true
end
end
tests TestController
def test_body_parts
get :index
assert_equal RENDERINGS, @response.body_parts
assert_equal RENDERINGS.join, @response.body
end
end
class ConcurrentBlockPartTest < ActionController::TestCase
class TestController < ActionController::Base
def index
append_thread_id = lambda do |parts|
parts << Thread.current.object_id
parts << '::'
parts << Time.now.to_i
sleep 0.1
end
future_render &append_thread_id
response.body_parts << '-'
future_render &append_thread_id
response.body_parts << '-'
future_render do |parts|
parts << ActionView::BodyParts::ConcurrentBlock.new(&append_thread_id)
parts << '-'
parts << ActionView::BodyParts::ConcurrentBlock.new(&append_thread_id)
end
@performed_render = true
end
def future_render(&block)
response.template.punctuate_body! ActionView::BodyParts::ConcurrentBlock.new(&block)
end
end
tests TestController
def test_concurrent_threaded_parts
get :index
elapsed = Benchmark.ms do
thread_ids = @response.body.split('-').map { |part| part.split('::').first.to_i }
assert_equal thread_ids.size, thread_ids.uniq.size
end
assert (elapsed - 100).abs < 10, elapsed
end
end
class OpenUriPartTest < ActionController::TestCase
class OpenUriPart < ActionView::BodyParts::ConcurrentBlock
def initialize(url)
url = URI::Generic === url ? url : URI.parse(url)
super() { |body| body << url.read }
end
end
class TestController < ActionController::Base
def index
render_url 'http://localhost/foo'
render_url 'http://localhost/bar'
render_url 'http://localhost/baz'
@performed_render = true
end
def render_url(url)
url = URI.parse(url)
def url.read; sleep 0.1; path end
response.template.punctuate_body! OpenUriPart.new(url)
end
end
tests TestController
def test_concurrent_open_uri_parts
get :index
elapsed = Benchmark.ms do
assert_equal '/foo/bar/baz', @response.body
end
assert (elapsed - 100).abs < 10, elapsed
end
end
|