aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/test/template/body_parts_test.rb
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