156 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
		
		
			
		
	
	
			156 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
|  | require 'em_test_helper' | ||
|  | 
 | ||
|  | class TestHeaderAndContentProtocol < Test::Unit::TestCase | ||
|  | 
 | ||
|  |   class SimpleTest < EM::P::HeaderAndContentProtocol | ||
|  |     attr_reader :first_header, :my_headers, :request | ||
|  | 
 | ||
|  |     def receive_first_header_line hdr | ||
|  |       @first_header ||= [] | ||
|  |       @first_header << hdr | ||
|  |     end | ||
|  |     def receive_headers hdrs | ||
|  |       @my_headers ||= [] | ||
|  |       @my_headers << hdrs | ||
|  |     end | ||
|  |     def receive_request hdrs, content | ||
|  |       @request ||= [] | ||
|  |       @request << [hdrs, content] | ||
|  |     end | ||
|  |   end | ||
|  |    | ||
|  |   class StopOnUnbind < EM::Connection | ||
|  |     def unbind | ||
|  |       EM.add_timer(0.01) { EM.stop } | ||
|  |     end | ||
|  |   end | ||
|  | 
 | ||
|  |   def setup | ||
|  |     @port = next_port | ||
|  |   end | ||
|  | 
 | ||
|  |   def test_no_content | ||
|  |     the_connection = nil | ||
|  |     EM.run { | ||
|  |       EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn| | ||
|  |         the_connection = conn | ||
|  |       end | ||
|  |       setup_timeout | ||
|  | 
 | ||
|  |       EM.connect "127.0.0.1", @port, StopOnUnbind do |c| | ||
|  |         c.send_data [ "aaa\n", "bbb\r\n", "ccc\n", "\n" ].join | ||
|  |         c.close_connection_after_writing | ||
|  |       end | ||
|  |     } | ||
|  |     assert_equal( ["aaa"], the_connection.first_header ) | ||
|  |     assert_equal( [%w(aaa bbb ccc)], the_connection.my_headers ) | ||
|  |     assert_equal( [[%w(aaa bbb ccc), ""]], the_connection.request ) | ||
|  |   end | ||
|  | 
 | ||
|  |   def test_content | ||
|  |     the_connection = nil | ||
|  |     content = "A" * 50
 | ||
|  |     headers = ["aaa", "bbb", "Content-length: #{content.length}", "ccc"] | ||
|  |     EM.run { | ||
|  |       EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn| | ||
|  |         the_connection = conn | ||
|  |       end | ||
|  |       setup_timeout | ||
|  | 
 | ||
|  |       EM.connect "127.0.0.1", @port, StopOnUnbind do |c| | ||
|  |         headers.each { |h| c.send_data "#{h}\r\n" } | ||
|  |         c.send_data "\n" | ||
|  |         c.send_data content | ||
|  |         c.close_connection_after_writing | ||
|  |       end | ||
|  |     } | ||
|  |     assert_equal( ["aaa"], the_connection.first_header ) | ||
|  |     assert_equal( [headers], the_connection.my_headers ) | ||
|  |     assert_equal( [[headers, content]], the_connection.request ) | ||
|  |   end | ||
|  | 
 | ||
|  |   def test_several_requests | ||
|  |     the_connection = nil | ||
|  |     content = "A" * 50
 | ||
|  |     headers = ["aaa", "bbb", "Content-length: #{content.length}", "ccc"] | ||
|  |     EM.run { | ||
|  |       EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn| | ||
|  |         the_connection = conn | ||
|  |       end | ||
|  |       setup_timeout | ||
|  | 
 | ||
|  |       EM.connect( "127.0.0.1", @port, StopOnUnbind ) do |c| | ||
|  |         5.times do | ||
|  |           headers.each { |h| c.send_data "#{h}\r\n" } | ||
|  |           c.send_data "\n" | ||
|  |           c.send_data content | ||
|  |         end | ||
|  |         c.close_connection_after_writing | ||
|  |       end | ||
|  |     } | ||
|  |     assert_equal( ["aaa"] * 5, the_connection.first_header ) | ||
|  |     assert_equal( [headers] * 5, the_connection.my_headers ) | ||
|  |     assert_equal( [[headers, content]] * 5, the_connection.request ) | ||
|  |   end | ||
|  | 
 | ||
|  | 
 | ||
|  |   # def x_test_multiple_content_length_headers | ||
|  |   #   # This is supposed to throw a RuntimeError but it throws a C++ exception instead. | ||
|  |   #   the_connection = nil | ||
|  |   #   content = "A" * 50 | ||
|  |   #   headers = ["aaa", "bbb", ["Content-length: #{content.length}"]*2, "ccc"].flatten | ||
|  |   #   EM.run { | ||
|  |   #     EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn| | ||
|  |   #       the_connection = conn | ||
|  |   #     end | ||
|  |   #     EM.add_timer(4) {raise "test timed out"} | ||
|  |   #     test_proc = proc { | ||
|  |   #       t = TCPSocket.new "127.0.0.1", @port | ||
|  |   #       headers.each {|h| t.write "#{h}\r\n" } | ||
|  |   #       t.write "\n" | ||
|  |   #       t.write content | ||
|  |   #       t.close | ||
|  |   #     } | ||
|  |   #     EM.defer test_proc, proc { | ||
|  |   #       EM.stop | ||
|  |   #     } | ||
|  |   #   } | ||
|  |   # end | ||
|  | 
 | ||
|  |   def test_interpret_headers | ||
|  |     the_connection = nil | ||
|  |     content = "A" * 50
 | ||
|  |     headers = [ | ||
|  |       "GET / HTTP/1.0", | ||
|  |       "Accept: aaa", | ||
|  |       "User-Agent: bbb", | ||
|  |       "Host: ccc", | ||
|  |       "x-tempest-header:ddd" | ||
|  |     ] | ||
|  | 
 | ||
|  |     EM.run { | ||
|  |       EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn| | ||
|  |         the_connection = conn | ||
|  |       end | ||
|  |       setup_timeout | ||
|  | 
 | ||
|  |       EM.connect( "127.0.0.1", @port, StopOnUnbind ) do |c| | ||
|  |         headers.each { |h| c.send_data "#{h}\r\n" } | ||
|  |         c.send_data "\n" | ||
|  |         c.send_data content | ||
|  |         c.close_connection_after_writing | ||
|  |       end | ||
|  |     } | ||
|  | 
 | ||
|  |     hsh = the_connection.headers_2_hash( the_connection.my_headers.shift ) | ||
|  |     expect = { | ||
|  |       :accept => "aaa", | ||
|  |       :user_agent => "bbb", | ||
|  |       :host => "ccc", | ||
|  |       :x_tempest_header => "ddd" | ||
|  |     } | ||
|  |     assert_equal(expect, hsh) | ||
|  |   end | ||
|  | 
 | ||
|  | end |