diff options
Diffstat (limited to 'actionpack/test/template/body_parts_test.rb')
-rw-r--r-- | actionpack/test/template/body_parts_test.rb | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/actionpack/test/template/body_parts_test.rb b/actionpack/test/template/body_parts_test.rb new file mode 100644 index 0000000000..209f6ec1ff --- /dev/null +++ b/actionpack/test/template/body_parts_test.rb @@ -0,0 +1,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 |