Show
Ignore:
Timestamp:
06/18/06 15:32:24 (3 years ago)
Author:
rosejn
Message:

Working on client & server

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • experiments/EventMachine/lib/machine/protocol.rb

    r202 r206  
    11module Machine 
    2   # This might not be necessary any more... 
    3   class Protocol < Handler 
    4   end 
     2  $:.unshift(File.join(File.dirname(__FILE__), 'protocols')) 
    53 
    6   require 'machine/protocols/line' 
    7   require 'machine/protocols/http' 
    8   require 'machine/protocols/netstring' 
     4  require 'line' 
     5  require 'http' 
     6  require 'netstring' 
    97end 
  • experiments/EventMachine/lib/machine/protocols/http.rb

    r166 r206  
    99   
    1010  # Simple HTTP handler. 
    11   class HttpHandler < Protocol 
     11  class HttpHandler < Handler 
    1212    def initialize(dispatcher) 
    1313      super 
  • experiments/EventMachine/lib/machine/protocols/line.rb

    r202 r206  
    1010 
    1111  # Basic line handler that breaks up raw input based on a delimiter. 
    12   class LineHandler < Protocol 
     12  class LineHandler < Handler 
    1313    LINE_DELIMITER = "/r/n" 
    1414    LINE_DELIMITER_RE = /\r?\n/m 
  • experiments/EventMachine/lib/machine/protocols/netstring.rb

    r159 r206  
    11module Machine 
    2   class NetString < Protocol 
     2  SendNetStringEvent = EventType.new :data 
     3  RecvNetStringEvent = EventType.new :data 
     4 
     5  class NetString  
    36    BadStringError = Class.new(StandardError) 
    47    InvalidDataLengthError = Class.new(BadStringError) 
     
    6164    end 
    6265  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 
    6386end 
  • experiments/EventMachine/test/io_test.rb

    r203 r206  
    77require 'socket' 
    88 
     9require 'util' 
     10 
    911class TestIOHandler < Test::Unit::TestCase 
    1012  include Machine 
    1113 
    1214  TEST_DATA_1 = "aaabbbccc" 
     15  TEST_DATA_2 = ["aaaa", "Cz", "q043;askdjf"] 
     16  TEST_PORT = 1234 
    1317 
    1418  def setup 
     
    4953  end 
    5054 
     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 
    5181end 
    5282 
  • experiments/EventMachine/test/netstring_test.rb

    r200 r206  
    4949  end 
    5050 
     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 
    5184  def try_read(netstr, limit = nil) 
    5285    NetString.read(StringIO.new(netstr), limit)