class ClientTest::SyncClient

Attributes

pings[R]

Public Class Methods

new(port) click to toggle source
# File actioncable/test/client_test.rb, line 105
def initialize(port)
  messages = @messages = Queue.new
  closed = @closed = Concurrent::Event.new
  has_messages = @has_messages = Concurrent::Semaphore.new(0)
  pings = @pings = Concurrent::AtomicFixnum.new(0)

  open = Concurrent::Promise.new

  @ws = WebSocket::Client::Simple.connect("ws://127.0.0.1:#{port}/") do |ws|
    ws.on(:error) do |event|
      event = RuntimeError.new(event.message) unless event.is_a?(Exception)

      if open.pending?
        open.fail(event)
      else
        messages << event
        has_messages.release
      end
    end

    ws.on(:open) do |event|
      open.set(true)
    end

    ws.on(:message) do |event|
      if event.type == :close
        closed.set
      else
        message = JSON.parse(event.data)
        if message["type"] == "ping"
          pings.increment
        else
          messages << message
          has_messages.release
        end
      end
    end

    ws.on(:close) do |event|
      closed.set
    end
  end

  open.wait!(WAIT_WHEN_EXPECTING_EVENT)
end

Public Instance Methods

close() click to toggle source
# File actioncable/test/client_test.rb, line 179
def close
  sleep WAIT_WHEN_NOT_EXPECTING_EVENT

  unless @messages.empty?
    raise "#{@messages.size} messages unprocessed"
  end

  @ws.close
  wait_for_close
end
closed?() click to toggle source
# File actioncable/test/client_test.rb, line 194
def closed?
  @closed.set?
end
read_message() click to toggle source
# File actioncable/test/client_test.rb, line 151
def read_message
  @has_messages.try_acquire(1, WAIT_WHEN_EXPECTING_EVENT)

  msg = @messages.pop(true)
  raise msg if msg.is_a?(Exception)

  msg
end
read_messages(expected_size = 0) click to toggle source
# File actioncable/test/client_test.rb, line 160
def read_messages(expected_size = 0)
  list = []
  loop do
    if @has_messages.try_acquire(1, list.size < expected_size ? WAIT_WHEN_EXPECTING_EVENT : WAIT_WHEN_NOT_EXPECTING_EVENT)
      msg = @messages.pop(true)
      raise msg if msg.is_a?(Exception)

      list << msg
    else
      break
    end
  end
  list
end
send_message(message) click to toggle source
# File actioncable/test/client_test.rb, line 175
def send_message(message)
  @ws.send(JSON.generate(message))
end
wait_for_close() click to toggle source
# File actioncable/test/client_test.rb, line 190
def wait_for_close
  @closed.wait(WAIT_WHEN_EXPECTING_EVENT)
end