summaryrefslogtreecommitdiff
path: root/vendor/bundle/ruby/3.4.0/gems/eventmachine-1.2.7/tests/test_ltp.rb
blob: 06c268514520db093475ade03473adfa2b5f03f6 (plain)
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
require 'em_test_helper'

class TestLineAndTextProtocol < Test::Unit::TestCase

  class TLP_LineBuffer < EM::P::LineAndTextProtocol
    attr_reader :line_buffer

    def initialize
      super
      @line_buffer = []
    end

    def receive_line line
      @line_buffer << line
    end
  end

  module StopClient
    def set_receive_data(&blk)
      @rdb = blk
    end

    def receive_data data
      @rdb.call(data) if @rdb
    end

    def unbind
      EM.add_timer(0.1) { EM.stop }
    end
  end

  def setup
    @port = next_port
  end

  def test_simple_lines
    conn = nil
    EM.run {
      EM.start_server( "127.0.0.1", @port, TLP_LineBuffer ) do |c|
        conn = c
      end
      setup_timeout

      EM.connect "127.0.0.1", @port, StopClient do |c|
        c.send_data "aaa\nbbb\r\nccc\n"
        c.close_connection_after_writing
      end
    }
    assert_equal( %w(aaa bbb ccc), conn.line_buffer)
  end

  #--------------------------------------------------------------------

  class TLP_ErrorMessage < EM::P::LineAndTextProtocol
    attr_reader :error_message

    def initialize
      super
      @error_message = []
    end

    def receive_line text
      raise
    end

    def receive_error text
      @error_message << text
    end
  end

  def test_overlength_lines
    conn = nil
    EM.run {
      EM.start_server( "127.0.0.1", @port, TLP_ErrorMessage ) do |c|
        conn = c
      end
      setup_timeout
      EM.connect "127.0.0.1", @port, StopClient do |c|
        c.send_data "a" * (16*1024 + 1)
        c.send_data "\n"
        c.close_connection_after_writing
      end

    }
    assert_equal( ["overlength line"], conn.error_message )
  end


  #--------------------------------------------------------------------

  class LineAndTextTest < EM::P::LineAndTextProtocol
    def receive_line line
      if line =~ /content-length:\s*(\d+)/i
        @content_length = $1.to_i
      elsif line.length == 0
        set_binary_mode @content_length
      end
    end
    def receive_binary_data text
      send_data "received #{text.length} bytes"
      close_connection_after_writing
    end
  end

  def test_lines_and_text
    output = ''
    EM.run {
      EM.start_server( "127.0.0.1", @port, LineAndTextTest )
      setup_timeout

      EM.connect "127.0.0.1", @port, StopClient do |c|
        c.set_receive_data { |data| output << data }
        c.send_data "Content-length: 400\n"
        c.send_data "\n"
        c.send_data "A" * 400
        EM.add_timer(0.1) { c.close_connection_after_writing }
      end
    }
    assert_equal( "received 400 bytes", output )
  end

  #--------------------------------------------------------------------


  class BinaryTextTest < EM::P::LineAndTextProtocol
    def receive_line line
      if line =~ /content-length:\s*(\d+)/i
        set_binary_mode $1.to_i
      else
        raise "protocol error"
      end
    end
    def receive_binary_data text
      send_data "received #{text.length} bytes"
      close_connection_after_writing
    end
  end

  def test_binary_text
    output = ''
    EM.run {
      EM.start_server( "127.0.0.1", @port, BinaryTextTest )
      setup_timeout

      EM.connect "127.0.0.1", @port, StopClient do |c|
        c.set_receive_data { |data| output << data }
        c.send_data "Content-length: 10000\n"
        c.send_data "A" * 10000
        EM.add_timer(0.1) { c.close_connection_after_writing }
      end
    }
    assert_equal( "received 10000 bytes", output )
  end

end