2009-03-13 09:36:00 +00:00
|
|
|
require 'abstract_unit'
|
2009-03-14 01:49:53 +00:00
|
|
|
require 'action_view/body_parts/concurrent_block'
|
2009-03-13 09:36:00 +00:00
|
|
|
|
2009-03-14 01:49:53 +00:00
|
|
|
class BodyPartTest < ActionController::TestCase
|
|
|
|
module EdgeSideInclude
|
|
|
|
QUEUE_REDEMPTION_URL = 'http://render.farm/renderings/%s'
|
2009-03-13 09:55:24 +00:00
|
|
|
ESI_INCLUDE_TAG = '<esi:include src="%s" />'
|
|
|
|
|
|
|
|
def self.redemption_tag(receipt)
|
|
|
|
ESI_INCLUDE_TAG % QUEUE_REDEMPTION_URL % receipt
|
|
|
|
end
|
|
|
|
|
2009-03-14 01:49:53 +00:00
|
|
|
class BodyPart
|
|
|
|
def initialize(rendering)
|
|
|
|
@receipt = enqueue(rendering)
|
2009-03-13 09:36:00 +00:00
|
|
|
end
|
|
|
|
|
2009-03-14 01:49:53 +00:00
|
|
|
def to_s
|
|
|
|
EdgeSideInclude.redemption_tag(@receipt)
|
2009-03-13 09:36:00 +00:00
|
|
|
end
|
2009-03-14 01:49:53 +00:00
|
|
|
|
|
|
|
protected
|
|
|
|
# Pretend we sent this rendering off for processing.
|
|
|
|
def enqueue(rendering)
|
|
|
|
rendering.object_id.to_s
|
|
|
|
end
|
|
|
|
end
|
2009-03-13 09:36:00 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
class TestController < ActionController::Base
|
2009-03-14 01:49:53 +00:00
|
|
|
RENDERINGS = [Object.new, Object.new, Object.new]
|
|
|
|
|
2009-03-13 09:36:00 +00:00
|
|
|
def index
|
2009-03-14 01:49:53 +00:00
|
|
|
RENDERINGS.each do |rendering|
|
|
|
|
edge_side_include rendering
|
|
|
|
end
|
2009-03-13 09:36:00 +00:00
|
|
|
@performed_render = true
|
|
|
|
end
|
|
|
|
|
2009-03-14 01:49:53 +00:00
|
|
|
def edge_side_include(rendering)
|
|
|
|
response.template.punctuate_body! EdgeSideInclude::BodyPart.new(rendering)
|
2009-03-13 09:36:00 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
tests TestController
|
|
|
|
|
|
|
|
def test_queued_parts
|
|
|
|
get :index
|
2009-03-14 01:49:53 +00:00
|
|
|
expected = TestController::RENDERINGS.map { |rendering| EdgeSideInclude.redemption_tag(rendering.object_id) }.join
|
2009-03-13 09:55:24 +00:00
|
|
|
assert_equal expected, @response.body
|
2009-03-13 09:36:00 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2009-03-13 09:55:24 +00:00
|
|
|
|
2009-03-14 01:49:53 +00:00
|
|
|
class ConcurrentBlockPartTest < ActionController::TestCase
|
2009-03-13 09:36:00 +00:00
|
|
|
class TestController < ActionController::Base
|
|
|
|
def index
|
|
|
|
append_thread_id = lambda do |parts|
|
|
|
|
parts << Thread.current.object_id
|
|
|
|
parts << '::'
|
|
|
|
parts << Time.now.to_i
|
2009-03-14 01:49:53 +00:00
|
|
|
sleep 0.1
|
2009-03-13 09:36:00 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
future_render &append_thread_id
|
|
|
|
response.body_parts << '-'
|
|
|
|
|
|
|
|
future_render &append_thread_id
|
|
|
|
response.body_parts << '-'
|
|
|
|
|
|
|
|
future_render do |parts|
|
2009-03-14 01:49:53 +00:00
|
|
|
parts << ActionView::BodyParts::ConcurrentBlock.new(&append_thread_id)
|
2009-03-13 09:36:00 +00:00
|
|
|
parts << '-'
|
2009-03-14 01:49:53 +00:00
|
|
|
parts << ActionView::BodyParts::ConcurrentBlock.new(&append_thread_id)
|
2009-03-13 09:36:00 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
@performed_render = true
|
|
|
|
end
|
|
|
|
|
|
|
|
def future_render(&block)
|
2009-03-14 01:49:53 +00:00
|
|
|
response.template.punctuate_body! ActionView::BodyParts::ConcurrentBlock.new(&block)
|
2009-03-13 09:36:00 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
tests TestController
|
|
|
|
|
|
|
|
def test_concurrent_threaded_parts
|
|
|
|
get :index
|
|
|
|
|
2009-03-13 10:16:14 +00:00
|
|
|
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
|
2009-03-14 01:49:53 +00:00
|
|
|
assert (elapsed - 100).abs < 10, elapsed
|
2009-03-13 09:36:00 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2009-03-13 09:55:24 +00:00
|
|
|
|
2009-03-13 09:36:00 +00:00
|
|
|
class OpenUriPartTest < ActionController::TestCase
|
2009-03-14 01:49:53 +00:00
|
|
|
class OpenUriPart < ActionView::BodyParts::ConcurrentBlock
|
2009-03-13 09:55:24 +00:00
|
|
|
def initialize(url)
|
|
|
|
url = URI::Generic === url ? url : URI.parse(url)
|
2009-03-14 01:49:53 +00:00
|
|
|
super() { |body| body << url.read }
|
2009-03-13 09:55:24 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2009-03-13 09:36:00 +00:00
|
|
|
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)
|
2009-03-14 01:49:53 +00:00
|
|
|
def url.read; sleep 0.1; path end
|
2009-03-13 10:01:47 +00:00
|
|
|
response.template.punctuate_body! OpenUriPart.new(url)
|
2009-03-13 09:36:00 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
tests TestController
|
|
|
|
|
|
|
|
def test_concurrent_open_uri_parts
|
|
|
|
get :index
|
|
|
|
|
|
|
|
elapsed = Benchmark.ms do
|
|
|
|
assert_equal '/foo/bar/baz', @response.body
|
|
|
|
end
|
2009-03-14 01:49:53 +00:00
|
|
|
assert (elapsed - 100).abs < 10, elapsed
|
2009-03-13 09:36:00 +00:00
|
|
|
end
|
|
|
|
end
|