require 'evma_httpserver'
class ExternalSystem < TestActor
def initialize(*args)
@messages = []
EM.start_server("0.0.0.0", port, system, @env.server_options) do |c|
c.messages = @messages
after_initialize(c)
end
end
def after_initialize(system_instance)
end
def received?(options = {}, &block)
message = fetch_message(options[:timeout])
yield message if block_given?
message
end
def receive_message!(options = {}, &block)
msg = received?(options)
env.assert_not_nil msg
yield msg if block_given?
msg
end
protected
def fetch_message(timeout = nil)
timeout ||= @default_timeout
f, message = Fiber.current, Observer.new(@messages, timeout)
message.callback { |msg| f.resume(msg) }
message.errback { f.resume(nil) }
return Fiber.yield
end
def system; raise NotImplementedError; end
def port; raise NotImplementedError; end
end