2 * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.controller.cluster.common.actor;
11 import static java.util.concurrent.TimeUnit.MILLISECONDS;
12 import static org.junit.Assert.assertEquals;
13 import static org.junit.Assert.fail;
14 import com.google.common.base.Ticker;
15 import java.util.List;
16 import org.junit.Assert;
17 import org.junit.Before;
18 import org.junit.Test;
19 import org.slf4j.Logger;
20 import org.slf4j.LoggerFactory;
22 public class MessageTrackerTest {
24 private static final class TestTicker extends Ticker {
32 void increment(final long ticks) {
37 private static final class Foo {
38 // Intentionally empty
41 private final static Logger LOG = LoggerFactory.getLogger(MessageTrackerTest.class);
43 private TestTicker ticker;
44 private MessageTracker messageTracker;
48 ticker = new TestTicker();
49 messageTracker = new MessageTracker(Foo.class, 10, ticker);
53 public void testNoTracking() {
54 MessageTracker.Context context1 = messageTracker.received(new Foo());
57 ticker.increment(MILLISECONDS.toNanos(20));
58 MessageTracker.Context context2 = messageTracker.received(new Foo());
63 public void testFailedExpectationOnTracking() {
64 messageTracker.begin();
66 MessageTracker.Context context1 = messageTracker.received(new Foo());
69 ticker.increment(MILLISECONDS.toNanos(20));
71 MessageTracker.Context context2 = messageTracker.received(new Foo());
72 Assert.assertEquals(true, context2.error().isPresent());
73 Assert.assertEquals(0, context2.error().get().getMessageProcessingTimesSinceLastExpectedMessage().size());
78 public void testFailedExpectationOnTrackingWithMessagesInBetween() {
79 messageTracker.begin();
81 MessageTracker.Context context1 = messageTracker.received(new Foo());
84 messageTracker.received("A").close();
85 messageTracker.received(10L).close();
86 MessageTracker.Context c = messageTracker.received(100);
88 ticker.increment(MILLISECONDS.toNanos(20));
92 MessageTracker.Context context2 = messageTracker.received(new Foo());
94 Assert.assertEquals(true, context2.error().isPresent());
96 MessageTracker.Error error = context2.error().get();
98 List<MessageTracker.MessageProcessingTime> messageProcessingTimes =
99 error.getMessageProcessingTimesSinceLastExpectedMessage();
101 Assert.assertEquals(3, messageProcessingTimes.size());
103 Assert.assertEquals(String.class, messageProcessingTimes.get(0).getMessageClass());
104 Assert.assertEquals(Long.class, messageProcessingTimes.get(1).getMessageClass());
105 Assert.assertEquals(Integer.class, messageProcessingTimes.get(2).getMessageClass());
106 Assert.assertTrue(messageProcessingTimes.get(2).getElapsedTimeInNanos() > MILLISECONDS.toNanos(10));
107 Assert.assertEquals(Foo.class, error.getLastExpectedMessage().getClass());
108 Assert.assertEquals(Foo.class, error.getCurrentExpectedMessage().getClass());
110 LOG.error("An error occurred : {}" , error);
115 public void testMetExpectationOnTracking() {
116 messageTracker.begin();
118 MessageTracker.Context context1 = messageTracker.received(new Foo());
121 ticker.increment(MILLISECONDS.toNanos(1));
123 MessageTracker.Context context2 = messageTracker.received(new Foo());
124 Assert.assertEquals(false, context2.error().isPresent());
129 public void testIllegalStateExceptionWhenDoneIsNotCalledWhileTracking() {
130 messageTracker.begin();
132 messageTracker.received(new Foo());
135 messageTracker.received(new Foo());
136 fail("Expected an IllegalStateException");
137 } catch (IllegalStateException e){
143 public void testNoIllegalStateExceptionWhenDoneIsNotCalledWhileNotTracking() {
144 messageTracker.received(new Foo());
145 messageTracker.received(new Foo());
149 public void testDelayInFirstExpectedMessageArrival(){
150 messageTracker.begin();
152 ticker.increment(MILLISECONDS.toNanos(20));
154 MessageTracker.Context context = messageTracker.received(new Foo());
156 Assert.assertEquals(true, context.error().isPresent());
158 MessageTracker.Error error = context.error().get();
160 Assert.assertEquals(null, error.getLastExpectedMessage());
161 Assert.assertEquals(Foo.class, error.getCurrentExpectedMessage().getClass());
163 String errorString = error.toString();
164 Assert.assertTrue(errorString.contains("Last Expected Message = null"));
166 LOG.error("An error occurred : {}", error);
170 public void testCallingBeginDoesNotResetWatch() {
171 messageTracker.begin();
173 ticker.increment(MILLISECONDS.toNanos(20));
175 messageTracker.begin();
177 MessageTracker.Context context = messageTracker.received(new Foo());
179 Assert.assertEquals(true, context.error().isPresent());
184 public void testMessagesSinceLastExpectedMessage() {
186 messageTracker.begin();
188 try (MessageTracker.Context ctx = messageTracker.received(45)) {
189 Assert.assertEquals(false, ctx.error().isPresent());
191 try (MessageTracker.Context ctx = messageTracker.received(45L)) {
192 Assert.assertEquals(false, ctx.error().isPresent());
195 List<MessageTracker.MessageProcessingTime> processingTimeList =
196 messageTracker.getMessagesSinceLastExpectedMessage();
198 Assert.assertEquals(2, processingTimeList.size());
200 assertEquals(Integer.class, processingTimeList.get(0).getMessageClass());
201 assertEquals(Long.class, processingTimeList.get(1).getMessageClass());