class Jabber::Test::ListenerMocker

Attributes

mock_clients[RW]
tracker_of_callers[RW]
with_socket_mocked_callback_proc[RW]

Public Class Methods

mock_out(listener) click to toggle source
# File lib/xmpp4r/test/listener_mocker.rb, line 99
def self.mock_out(listener)
  listener.instance_eval do
    class << self
      def setup_connection
        super
        @connection.instance_eval do
          class << self
            self.class_eval(&Jabber::Test::ListenerMocker.mocker_proc)
          end
        end
      end
    end
  end
    
  listener
end
mock_out_all_connections() click to toggle source
# File lib/xmpp4r/test/listener_mocker.rb, line 95
def self.mock_out_all_connections
  Jabber::Reliable::Connection.class_eval(&Jabber::Test::ListenerMocker.mocker_proc)
end
mocker_proc() click to toggle source
# File lib/xmpp4r/test/listener_mocker.rb, line 30
def self.mocker_proc
  Proc.new do      
    attr_accessor :messagecbs, :connected
    ListenerMocker.mock_clients ||= {}
    ListenerMocker.tracker_of_callers ||= {}

    def connect
      Jabber::debuglog("(in mock) connected #{@jid.bare}")
      self.connected = true          
    end

    def close!
      ListenerMocker.mock_clients[@jid.bare.to_s] = nil
      ListenerMocker.tracker_of_callers[@jid.bare.to_s] = nil
      self.connected = false
    end

    def auth(password)
      auth_nonsasl(password)
    end

    def auth_nonsasl(password, digest=true)
      Jabber::debuglog("(in mock) authed #{@jid.bare}") 

      if(ListenerMocker.mock_clients[@jid.bare.to_s])
        #raise a stack trace about multiple clients
        raise "\n\n ---> READ ME: this is actualy 2 stack traces: <---- \n\n"+
        "There is already a client connected on that jid #{@jid.bare.to_s}. "+
        "The mock library cannot support multiple listeners connected as the same user! originally called in:\n"+
        ListenerMocker.tracker_of_callers[@jid.bare.to_s].backtrace.join("\n")+"\n\n second trace: \n"
      else
        #store a stack trace so that next time we have multiple client, we can alert about it...
        begin
          throw "just saving a stack trace"
        rescue => e
          ListenerMocker.tracker_of_callers[@jid.bare.to_s] = e
        end
      end

      ListenerMocker.mock_clients[@jid.bare.to_s] = self
      true
    end

    def send(xml, &block)
      Jabber::debuglog("(in mock) sending #{xml} #{xml.class}")
      if(xml.is_a?(Jabber::Message))
        xml.from = @jid
        # unless xml.to
        #   raise "no jid!"
        # end
        if ListenerMocker.mock_clients[xml.to.bare.to_s]
          Jabber::debuglog("(in mock) to #{xml.to.bare.to_s}")
          ListenerMocker.mock_clients[xml.to.bare.to_s].messagecbs.process(xml)
        else
          Jabber::debuglog("(in mock) no client listening as #{xml.to.bare.to_s}")
        end
      end
    end          

    def is_connected?
      self.connected
    end                
  end    
end
new(*args) click to toggle source
# File lib/xmpp4r/test/listener_mocker.rb, line 13
def initialize(*args)
  initialize_old(*args) if ListenerMocker.with_socket_mocked_callback_proc.call(args)
end
setup_connection() click to toggle source
Calls superclass method
# File lib/xmpp4r/test/listener_mocker.rb, line 102
def setup_connection
  super
  @connection.instance_eval do
    class << self
      self.class_eval(&Jabber::Test::ListenerMocker.mocker_proc)
    end
  end
end
with_socket_mocked(callback_proc) { || ... } click to toggle source
# File lib/xmpp4r/test/listener_mocker.rb, line 9
def self.with_socket_mocked(callback_proc)
  TCPSocket.class_eval{ ListenerMocker.with_socket_mocked_callback_proc = callback_proc }
  TCPSocket.class_eval do
    alias_method :initialize_old, :initialize
    def initialize(*args)
      initialize_old(*args) if ListenerMocker.with_socket_mocked_callback_proc.call(args)
    end
  end
  yield
ensure
  TCPSocket.class_eval do
    if method_defined?(:initialize_old)
      alias_method :initialize, :initialize_old
    end
  end
end

Public Instance Methods

auth(password) click to toggle source
# File lib/xmpp4r/test/listener_mocker.rb, line 47
def auth(password)
  auth_nonsasl(password)
end
auth_nonsasl(password, digest=true) click to toggle source
# File lib/xmpp4r/test/listener_mocker.rb, line 51
def auth_nonsasl(password, digest=true)
  Jabber::debuglog("(in mock) authed #{@jid.bare}") 
      
  if(ListenerMocker.mock_clients[@jid.bare.to_s])
    #raise a stack trace about multiple clients
    raise "\n\n ---> READ ME: this is actualy 2 stack traces: <---- \n\n"+
    "There is already a client connected on that jid #{@jid.bare.to_s}. "+
    "The mock library cannot support multiple listeners connected as the same user! originally called in:\n"+
    ListenerMocker.tracker_of_callers[@jid.bare.to_s].backtrace.join("\n")+"\n\n second trace: \n"
  else
    #store a stack trace so that next time we have multiple client, we can alert about it...
    begin
      throw "just saving a stack trace"
    rescue => e
      ListenerMocker.tracker_of_callers[@jid.bare.to_s] = e
    end
  end

  ListenerMocker.mock_clients[@jid.bare.to_s] = self
  true
end
close!() click to toggle source
# File lib/xmpp4r/test/listener_mocker.rb, line 41
def close!
  ListenerMocker.mock_clients[@jid.bare.to_s] = nil
  ListenerMocker.tracker_of_callers[@jid.bare.to_s] = nil
  self.connected = false
end
connect() click to toggle source
# File lib/xmpp4r/test/listener_mocker.rb, line 36
def connect
  Jabber::debuglog("(in mock) connected #{@jid.bare}")
  self.connected = true          
end
is_connected?() click to toggle source
# File lib/xmpp4r/test/listener_mocker.rb, line 89
def is_connected?
  self.connected
end
send(xml, &block) click to toggle source
# File lib/xmpp4r/test/listener_mocker.rb, line 73
def send(xml, &block)
  Jabber::debuglog("(in mock) sending #{xml} #{xml.class}")
  if(xml.is_a?(Jabber::Message))
    xml.from = @jid
    # unless xml.to
    #   raise "no jid!"
    # end
    if ListenerMocker.mock_clients[xml.to.bare.to_s]
      Jabber::debuglog("(in mock) to #{xml.to.bare.to_s}")
      ListenerMocker.mock_clients[xml.to.bare.to_s].messagecbs.process(xml)
    else
      Jabber::debuglog("(in mock) no client listening as #{xml.to.bare.to_s}")
    end
  end
end