File: test_proxy_connection.rb

package info (click to toggle)
ruby-eventmachine 1.0.3-6%2Bdeb8u1
  • links: PTS, VCS
  • area: main
  • in suites: jessie
  • size: 2,000 kB
  • ctags: 3,178
  • sloc: ruby: 8,641; cpp: 5,217; java: 827; makefile: 5
file content (180 lines) | stat: -rw-r--r-- 4,011 bytes parent folder | download | duplicates (4)
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
require 'em_test_helper'

class TestProxyConnection < Test::Unit::TestCase

  if EM.respond_to?(:start_proxy)
    module ProxyConnection
      def initialize(client, request)
        @client, @request = client, request
      end

      def post_init
        EM::enable_proxy(self, @client)
      end

      def connection_completed
        EM.next_tick {
          send_data @request
        }
      end

      def proxy_target_unbound
        $unbound_early = true
        EM.stop
      end

      def unbind
        $proxied_bytes = self.get_proxied_bytes
        @client.close_connection_after_writing
      end
    end

    module PartialProxyConnection
      def initialize(client, request, length)
        @client, @request, @length = client, request, length
      end

      def post_init
        EM::enable_proxy(self, @client, 0, @length)
      end

      def receive_data(data)
        $unproxied_data = data
        @client.send_data(data)
      end

      def connection_completed
        EM.next_tick {
          send_data @request
        }
      end

      def proxy_target_unbound
        $unbound_early = true
        EM.stop
      end

      def proxy_completed
        $proxy_completed = true
      end

      def unbind
        @client.close_connection_after_writing
      end
    end

    module Client
      def connection_completed
        send_data "EM rocks!"
      end

      def receive_data(data)
        $client_data = data
      end

      def unbind
        EM.stop
      end
    end

    module Client2
      include Client
      def unbind; end
    end

    module Server
      def receive_data(data)
        send_data "I know!" if data == "EM rocks!"
        close_connection_after_writing
      end
    end

    module ProxyServer
      def initialize port
        @port = port
      end

      def receive_data(data)
        @proxy = EM.connect("127.0.0.1", @port, ProxyConnection, self, data)
      end
    end

    module PartialProxyServer
      def initialize port
        @port = port
      end

      def receive_data(data)
        EM.connect("127.0.0.1", @port, PartialProxyConnection, self, data, 1)
      end
    end

    module EarlyClosingProxy
      def initialize port
        @port = port
      end

      def receive_data(data)
        EM.connect("127.0.0.1", @port, ProxyConnection, self, data)
        close_connection
      end
    end

    def setup
      @port = next_port
      @proxy_port = next_port
    end

    def test_proxy_connection
      EM.run {
        EM.start_server("127.0.0.1", @port, Server)
        EM.start_server("127.0.0.1", @proxy_port, ProxyServer, @port)
        EM.connect("127.0.0.1", @proxy_port, Client)
      }

      assert_equal("I know!", $client_data)
    end

    def test_proxied_bytes
      EM.run {
        EM.start_server("127.0.0.1", @port, Server)
        EM.start_server("127.0.0.1", @proxy_port, ProxyServer, @port)
        EM.connect("127.0.0.1", @proxy_port, Client)
      }

      assert_equal("I know!", $client_data)
      assert_equal("I know!".bytesize, $proxied_bytes)
    end

    def test_partial_proxy_connection
      EM.run {
        EM.start_server("127.0.0.1", @port, Server)
        EM.start_server("127.0.0.1", @proxy_port, PartialProxyServer, @port)
        EM.connect("127.0.0.1", @proxy_port, Client)
      }

      assert_equal("I know!", $client_data)
      assert_equal(" know!", $unproxied_data)
      assert($proxy_completed)
    end

    def test_early_close
      $client_data = nil
      EM.run {
        EM.start_server("127.0.0.1", @port, Server)
        EM.start_server("127.0.0.1", @proxy_port, EarlyClosingProxy, @port)
        EM.connect("127.0.0.1", @proxy_port, Client2)
      }

      assert($unbound_early)
    end
  else
    warn "EM.start_proxy not implemented, skipping tests in #{__FILE__}"

    # Because some rubies will complain if a TestCase class has no tests
    def test_em_start_proxy_not_implemented
      assert !EM.respond_to?(:start_proxy)
    end
  end

end