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 org.junit.Assert.assertEquals;
12 import static org.junit.Assert.fail;
13 import com.google.common.util.concurrent.Uninterruptibles;
14 import java.util.List;
15 import java.util.concurrent.TimeUnit;
16 import org.junit.Assert;
17 import org.junit.Test;
18 import org.slf4j.Logger;
19 import org.slf4j.LoggerFactory;
21 public class MessageTrackerTest {
23 private final static Logger LOG = LoggerFactory.getLogger(MessageTrackerTest.class);
30 public void testNoTracking() {
31 MessageTracker messageTracker = new MessageTracker(Foo.class, 10);
33 MessageTracker.Context context1 = messageTracker.received(new Foo());
36 Uninterruptibles.sleepUninterruptibly(20, TimeUnit.MILLISECONDS);
38 MessageTracker.Context context2 = messageTracker.received(new Foo());
44 public void testFailedExpectationOnTracking() {
45 MessageTracker messageTracker = new MessageTracker(Foo.class, 10);
46 messageTracker.begin();
48 MessageTracker.Context context1 = messageTracker.received(new Foo());
51 Uninterruptibles.sleepUninterruptibly(20, TimeUnit.MILLISECONDS);
53 MessageTracker.Context context2 = messageTracker.received(new Foo());
54 Assert.assertEquals(true, context2.error().isPresent());
55 Assert.assertEquals(0, context2.error().get().getMessageProcessingTimesSinceLastExpectedMessage().size());
60 public void testFailedExpectationOnTrackingWithMessagesInBetween() {
61 MessageTracker messageTracker = new MessageTracker(Foo.class, 10);
62 messageTracker.begin();
64 MessageTracker.Context context1 = messageTracker.received(new Foo());
67 messageTracker.received("A").done();
68 messageTracker.received(Long.valueOf(10)).done();
69 MessageTracker.Context c = messageTracker.received(Integer.valueOf(100));
71 Uninterruptibles.sleepUninterruptibly(20, TimeUnit.MILLISECONDS);
75 MessageTracker.Context context2 = messageTracker.received(new Foo());
77 Assert.assertEquals(true, context2.error().isPresent());
79 MessageTracker.Error error = context2.error().get();
81 List<MessageTracker.MessageProcessingTime> messageProcessingTimes =
82 error.getMessageProcessingTimesSinceLastExpectedMessage();
84 Assert.assertEquals(3, messageProcessingTimes.size());
86 Assert.assertEquals(String.class, messageProcessingTimes.get(0).getMessageClass());
87 Assert.assertEquals(Long.class, messageProcessingTimes.get(1).getMessageClass());
88 Assert.assertEquals(Integer.class, messageProcessingTimes.get(2).getMessageClass());
89 Assert.assertTrue(messageProcessingTimes.get(2).getElapsedTimeInNanos() > TimeUnit.MILLISECONDS.toNanos(10));
90 Assert.assertEquals(Foo.class, error.getLastExpectedMessage().getClass());
91 Assert.assertEquals(Foo.class, error.getCurrentExpectedMessage().getClass());
93 LOG.error("An error occurred : {}" , error);
98 public void testMetExpectationOnTracking() {
99 MessageTracker messageTracker = new MessageTracker(Foo.class, 10);
100 messageTracker.begin();
102 MessageTracker.Context context1 = messageTracker.received(new Foo());
105 Uninterruptibles.sleepUninterruptibly(1, TimeUnit.MILLISECONDS);
107 MessageTracker.Context context2 = messageTracker.received(new Foo());
108 Assert.assertEquals(false, context2.error().isPresent());
113 public void testIllegalStateExceptionWhenDoneIsNotCalledWhileTracking() {
114 MessageTracker messageTracker = new MessageTracker(Foo.class, 10);
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 messageTracker = new MessageTracker(Foo.class, 10);
131 messageTracker.received(new Foo());
132 messageTracker.received(new Foo());
136 public void testDelayInFirstExpectedMessageArrival(){
138 MessageTracker messageTracker = new MessageTracker(Foo.class, 10);
139 messageTracker.begin();
141 Uninterruptibles.sleepUninterruptibly(20, TimeUnit.MILLISECONDS);
143 MessageTracker.Context context = messageTracker.received(new Foo());
145 Assert.assertEquals(true, context.error().isPresent());
147 MessageTracker.Error error = context.error().get();
149 Assert.assertEquals(null, error.getLastExpectedMessage());
150 Assert.assertEquals(Foo.class, error.getCurrentExpectedMessage().getClass());
152 String errorString = error.toString();
153 Assert.assertTrue(errorString.contains("Last Expected Message = null"));
155 LOG.error("An error occurred : {}", error);
159 public void testCallingBeginDoesNotResetWatch() {
160 MessageTracker messageTracker = new MessageTracker(Foo.class, 10);
161 messageTracker.begin();
163 Uninterruptibles.sleepUninterruptibly(20, TimeUnit.MILLISECONDS);
165 messageTracker.begin();
167 MessageTracker.Context context = messageTracker.received(new Foo());
169 Assert.assertEquals(true, context.error().isPresent());
174 public void testMessagesSinceLastExpectedMessage() {
176 MessageTracker messageTracker = new MessageTracker(Foo.class, 10);
177 messageTracker.begin();
179 MessageTracker.Context context1 = messageTracker.received(Integer.valueOf(45)).done();
181 Assert.assertEquals(false, context1.error().isPresent());
183 MessageTracker.Context context2 = messageTracker.received(Long.valueOf(45)).done();
185 Assert.assertEquals(false, context2.error().isPresent());
187 List<MessageTracker.MessageProcessingTime> processingTimeList =
188 messageTracker.getMessagesSinceLastExpectedMessage();
190 Assert.assertEquals(2, processingTimeList.size());
192 assertEquals(Integer.class, processingTimeList.get(0).getMessageClass());
193 assertEquals(Long.class, processingTimeList.get(1).getMessageClass());