aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/test/template/body_parts_test.rb
diff options
context:
space:
mode:
Diffstat (limited to 'actionpack/test/template/body_parts_test.rb')
-rw-r--r--actionpack/test/template/body_parts_test.rb102
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