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 java.util.List;
15 import org.junit.Assert;
16 import org.junit.Before;
17 import org.junit.Test;
18 import org.slf4j.Logger;
19 import org.slf4j.LoggerFactory;
21 public class MessageTrackerTest {
22 private static final class Foo {
23 // Intentionally empty
26 private final static Logger LOG = LoggerFactory.getLogger(MessageTrackerTest.class);
28 private TestTicker ticker;
29 private MessageTracker messageTracker;
33 ticker = new TestTicker();
34 messageTracker = new MessageTracker(Foo.class, 10, ticker);
38 public void testNoTracking() {
39 MessageTracker.Context context1 = messageTracker.received(new Foo());
42 ticker.increment(MILLISECONDS.toNanos(20));
43 MessageTracker.Context context2 = messageTracker.received(new Foo());
48 public void testFailedExpectationOnTracking() {
49 messageTracker.begin();
51 MessageTracker.Context context1 = messageTracker.received(new Foo());
54 ticker.increment(MILLISECONDS.toNanos(20));
56 MessageTracker.Context context2 = messageTracker.received(new Foo());
57 Assert.assertEquals(true, context2.error().isPresent());
58 Assert.assertEquals(0, context2.error().get().getMessageProcessingTimesSinceLastExpectedMessage().size());
63 public void testFailedExpectationOnTrackingWithMessagesInBetween() {
64 messageTracker.begin();
66 MessageTracker.Context context1 = messageTracker.received(new Foo());
69 messageTracker.received("A").close();
70 messageTracker.received(10L).close();
71 MessageTracker.Context c = messageTracker.received(100);
73 ticker.increment(MILLISECONDS.toNanos(20));
77 MessageTracker.Context context2 = messageTracker.received(new Foo());
79 Assert.assertEquals(true, context2.error().isPresent());
81 MessageTracker.Error error = context2.error().get();
83 List<MessageTracker.MessageProcessingTime> messageProcessingTimes =
84 error.getMessageProcessingTimesSinceLastExpectedMessage();
86 Assert.assertEquals(3, messageProcessingTimes.size());
88 Assert.assertEquals(String.class, messageProcessingTimes.get(0).getMessageClass());
89 Assert.assertEquals(Long.class, messageProcessingTimes.get(1).getMessageClass());
90 Assert.assertEquals(Integer.class, messageProcessingTimes.get(2).getMessageClass());
91 Assert.assertTrue(messageProcessingTimes.get(2).getElapsedTimeInNanos() > MILLISECONDS.toNanos(10));
92 Assert.assertEquals(Foo.class, error.getLastExpectedMessage().getClass());
93 Assert.assertEquals(Foo.class, error.getCurrentExpectedMessage().getClass());
95 LOG.error("An error occurred : {}" , error);
100 public void testMetExpectationOnTracking() {
101 messageTracker.begin();
103 MessageTracker.Context context1 = messageTracker.received(new Foo());
106 ticker.increment(MILLISECONDS.toNanos(1));
108 MessageTracker.Context context2 = messageTracker.received(new Foo());
109 Assert.assertEquals(false, context2.error().isPresent());
114 public void testIllegalStateExceptionWhenDoneIsNotCalledWhileTracking() {
115 messageTracker.begin();
117 messageTracker.received(new Foo());
120 messageTracker.received(new Foo());
121 fail("Expected an IllegalStateException");
122 } catch (IllegalStateException e){
128 public void testNoIllegalStateExceptionWhenDoneIsNotCalledWhileNotTracking() {
129 messageTracker.received(new Foo());
130 messageTracker.received(new Foo());
134 public void testDelayInFirstExpectedMessageArrival(){
135 messageTracker.begin();
137 ticker.increment(MILLISECONDS.toNanos(20));
139 MessageTracker.Context context = messageTracker.received(new Foo());
141 Assert.assertEquals(true, context.error().isPresent());
143 MessageTracker.Error error = context.error().get();
145 Assert.assertEquals(null, error.getLastExpectedMessage());
146 Assert.assertEquals(Foo.class, error.getCurrentExpectedMessage().getClass());
148 String errorString = error.toString();
149 Assert.assertTrue(errorString.contains("Last Expected Message = null"));
151 LOG.error("An error occurred : {}", error);
155 public void testCallingBeginDoesNotResetWatch() {
156 messageTracker.begin();
158 ticker.increment(MILLISECONDS.toNanos(20));
160 messageTracker.begin();
162 MessageTracker.Context context = messageTracker.received(new Foo());
164 Assert.assertEquals(true, context.error().isPresent());
169 public void testMessagesSinceLastExpectedMessage() {
171 messageTracker.begin();
173 try (MessageTracker.Context ctx = messageTracker.received(45)) {
174 Assert.assertEquals(false, ctx.error().isPresent());
176 try (MessageTracker.Context ctx = messageTracker.received(45L)) {
177 Assert.assertEquals(false, ctx.error().isPresent());
180 List<MessageTracker.MessageProcessingTime> processingTimeList =
181 messageTracker.getMessagesSinceLastExpectedMessage();
183 Assert.assertEquals(2, processingTimeList.size());
185 assertEquals(Integer.class, processingTimeList.get(0).getMessageClass());
186 assertEquals(Long.class, processingTimeList.get(1).getMessageClass());