class MessageTracker {

    public Context received(final Object message) {
        if (!expectedMessageWatch.isRunning()) {
            return NO_OP_CONTEXT;
        }

        if (expectedMessageClass.isInstance(message)) {
            final long actualElapsedTime = expectedMessageWatch.elapsed(NANOSECONDS);
            if (actualElapsedTime > expectedArrivalInterval) {
                return new ErrorContext(message, new FailedExpectation(lastExpectedMessage, message,
                        messagesSinceLastExpectedMessage, expectedArrivalInterval, actualElapsedTime));
            }
            lastExpectedMessage = message;
            messagesSinceLastExpectedMessage.clear();
            expectedMessageWatch.reset().start();
        }

        currentMessageContext.reset(message);
        return currentMessageContext;
    }

    @VisibleForTesting  MessageTracker(final Class<?> expectedMessageClass, final long expectedArrivalIntervalInMillis,
            final Ticker ticker);
    public  MessageTracker(final Class<?> expectedMessageClass, final long expectedArrivalIntervalInMillis);

}