@Test(timeout = 300000)
  public void testMessageOrder() throws InterruptedException {
    int numberOfMessages = 100;
    final CountDownLatch latch = new CountDownLatch(numberOfMessages);

    MessageDispatcher<std_msgs.Int32> messageDispatcher =
        new MessageDispatcher<std_msgs.Int32>(lazyMessages, executorService);
    messageDispatcher.addListener(
        new MessageListener<std_msgs.Int32>() {
          private AtomicInteger count = new AtomicInteger();

          public void onNewMessage(Int32 message) {
            if (this.count.compareAndSet(message.getData(), message.getData() + 1)) {
              latch.countDown();
            } else {
              fail(
                  String.format(
                      "Expected message data not equal to actual data: %d != %d",
                      count.get(), message.getData()));
            }
            try {
              // Sleeping allows the queue to fill up a bit by slowing down the
              // consumer.
              Thread.sleep(5);
            } catch (InterruptedException e) {
            }
          }
        },
        QUEUE_CAPACITY);
    executorService.execute(messageDispatcher);

    for (int i = 0; i < numberOfMessages; i++) {
      final int count = i;
      std_msgs.Int32 message = messageFactory.newFromType(std_msgs.Int32._TYPE);
      message.setData(count);
      lazyMessages.addLast(new LazyMessage<std_msgs.Int32>(message));
    }

    assertTrue(latch.await(1, TimeUnit.SECONDS));
  }
 public LookatResult newResultMessage() {
   NodeConfiguration nc = NodeConfiguration.newPrivate();
   MessageFactory mf = nc.getTopicMessageFactory();
   return mf.newFromType(LookatResult._TYPE);
 }
 public LookatFeedback newFeedbackMessage() {
   NodeConfiguration nc = NodeConfiguration.newPrivate();
   MessageFactory mf = nc.getTopicMessageFactory();
   return mf.newFromType(LookatFeedback._TYPE);
 }
 @Override
 public T newMessage() {
   return messageFactory.newFromType(serviceDeclaration.getType());
 }