Changeset 206
- Timestamp:
- 06/18/06 15:32:24 (2 years ago)
- Files:
-
- experiments/EventMachine/lib/machine/protocol.rb (modified) (1 diff)
- experiments/EventMachine/lib/machine/protocols/http.rb (modified) (1 diff)
- experiments/EventMachine/lib/machine/protocols/line.rb (modified) (1 diff)
- experiments/EventMachine/lib/machine/protocols/netstring.rb (modified) (2 diffs)
- experiments/EventMachine/test/io_test.rb (modified) (2 diffs)
- experiments/EventMachine/test/netstring_test.rb (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
experiments/EventMachine/lib/machine/protocol.rb
r202 r206 1 1 module Machine 2 # This might not be necessary any more... 3 class Protocol < Handler 4 end 2 $:.unshift(File.join(File.dirname(__FILE__), 'protocols')) 5 3 6 require ' machine/protocols/line'7 require ' machine/protocols/http'8 require ' machine/protocols/netstring'4 require 'line' 5 require 'http' 6 require 'netstring' 9 7 end experiments/EventMachine/lib/machine/protocols/http.rb
r166 r206 9 9 10 10 # Simple HTTP handler. 11 class HttpHandler < Protocol11 class HttpHandler < Handler 12 12 def initialize(dispatcher) 13 13 super experiments/EventMachine/lib/machine/protocols/line.rb
r202 r206 10 10 11 11 # Basic line handler that breaks up raw input based on a delimiter. 12 class LineHandler < Protocol12 class LineHandler < Handler 13 13 LINE_DELIMITER = "/r/n" 14 14 LINE_DELIMITER_RE = /\r?\n/m experiments/EventMachine/lib/machine/protocols/netstring.rb
r159 r206 1 1 module Machine 2 class NetString < Protocol 2 SendNetStringEvent = EventType.new :data 3 RecvNetStringEvent = EventType.new :data 4 5 class NetString 3 6 BadStringError = Class.new(StandardError) 4 7 InvalidDataLengthError = Class.new(BadStringError) … … 61 64 end 62 65 end 66 67 class NetStringHandler < Handler 68 def initialize(dispatcher) 69 super 70 71 @dispatcher.add_handler(:RecvRawDataEvent, self, :recv_raw_data) 72 @dispatcher.add_handler(:SendNetStringEvent, self, :send_net_string) 73 end 74 75 def recv_raw_data(event) 76 log.debug 'net string got raw data' 77 send_event(RecvNetStringEvent.new(NetString.unpack(event.data))) 78 end 79 80 def send_net_string(event) 81 log.debug 'sending net string' 82 send_event(SendRawDataEvent.new(NetString.pack(event.data))) 83 end 84 end 85 63 86 end experiments/EventMachine/test/io_test.rb
r203 r206 7 7 require 'socket' 8 8 9 require 'util' 10 9 11 class TestIOHandler < Test::Unit::TestCase 10 12 include Machine 11 13 12 14 TEST_DATA_1 = "aaabbbccc" 15 TEST_DATA_2 = ["aaaa", "Cz", "q043;askdjf"] 16 TEST_PORT = 1234 13 17 14 18 def setup … … 49 53 end 50 54 55 def test_client_server 56 c_result = [] 57 s_result = [] 58 server = Machine::TCPServer.new('localhost', TEST_PORT, []) 59 server.dispatcher.add_handler(RecvRawDataEvent) do |event| 60 s_result << event.data 61 end 62 63 client = Machine::TCPClient.new('localhost', TEST_PORT, []) 64 client.dispatcher.add_handler(RecvRawDataEvent) do |event| 65 c_result << event.data 66 end 67 68 TEST_DATA_2.each_with_index do |data, i| 69 Timer.new(i) {client.dispatcher.send_event(SendRawDataEvent.new(data)) } 70 end 71 72 Timer.new(TEST_DATA_2.size) {Reactor.stop} 73 Reactor.run 74 75 s_result.each_with_index do |res, i| 76 assert_equal(TEST_DATA_2, res) 77 assert_equal(TEST_DATA_2, c_result[i]) 78 end 79 end 80 51 81 end 52 82 experiments/EventMachine/test/netstring_test.rb
r200 r206 49 49 end 50 50 51 def test_handler 52 Reactor.instance.verbose 53 results = [] 54 test_data = ["asdf", "rewkhsgi"] 55 56 ad, bd = test_pair([NetStringHandler]) 57 58 bd.add_handler(RecvNetStringEvent) do |event| 59 results << event.data 60 Reactor.stop if results.size == test_data.size 61 end 62 63 test_data.each {|data| ad.send_event(SendNetStringEvent.new(data)) } 64 # Timer.new(2) { Reactor.stop } 65 Reactor.run 66 67 assert_equal(test_data.size, results.size) 68 results.each_with_index {|data, i| assert_equal(test_data[i], data) } 69 end 70 71 def test_pair(stack) 72 a,b = Socket::socketpair( Socket::AF_UNIX, Socket::SOCK_STREAM, 0) 73 74 return build_stack(a, stack), build_stack(b, stack) 75 end 76 77 def build_stack(sock, stack) 78 dispatch = EventDispatcher.new 79 IOHandler.new(dispatch, sock) 80 stack.each {|proto| proto.new(dispatch) } 81 dispatch 82 end 83 51 84 def try_read(netstr, limit = nil) 52 85 NetString.read(StringIO.new(netstr), limit)