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.datastore.utils;
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 Logger LOG = LoggerFactory.getLogger(getClass());
28 public void testNoTracking(){
29 MessageTracker messageTracker = new MessageTracker(Foo.class, 10);
31 MessageTracker.Context context1 = messageTracker.received(new Foo());
34 Uninterruptibles.sleepUninterruptibly(20, TimeUnit.MILLISECONDS);
36 MessageTracker.Context context2 = messageTracker.received(new Foo());
42 public void testFailedExpectationOnTracking(){
43 MessageTracker messageTracker = new MessageTracker(Foo.class, 10);
44 messageTracker.begin();
46 MessageTracker.Context context1 = messageTracker.received(new Foo());
49 Uninterruptibles.sleepUninterruptibly(20, TimeUnit.MILLISECONDS);
51 MessageTracker.Context context2 = messageTracker.received(new Foo());
52 Assert.assertEquals(true, context2.error().isPresent());
53 Assert.assertEquals(0, context2.error().get().getMessageProcessingTimesSinceLastExpectedMessage().size());
58 public void testFailedExpectationOnTrackingWithMessagesInBetween(){
59 MessageTracker messageTracker = new MessageTracker(Foo.class, 10);
60 messageTracker.begin();
62 MessageTracker.Context context1 = messageTracker.received(new Foo());
65 messageTracker.received("A").done();
66 messageTracker.received(Long.valueOf(10)).done();
67 MessageTracker.Context c = messageTracker.received(Integer.valueOf(100));
69 Uninterruptibles.sleepUninterruptibly(20, TimeUnit.MILLISECONDS);
73 MessageTracker.Context context2 = messageTracker.received(new Foo());
75 Assert.assertEquals(true, context2.error().isPresent());
77 MessageTracker.Error error = context2.error().get();
79 List<MessageTracker.MessageProcessingTime> messageProcessingTimes =
80 error.getMessageProcessingTimesSinceLastExpectedMessage();
82 Assert.assertEquals(3, messageProcessingTimes.size());
84 Assert.assertEquals(String.class, messageProcessingTimes.get(0).getMessageClass());
85 Assert.assertEquals(Long.class, messageProcessingTimes.get(1).getMessageClass());
86 Assert.assertEquals(Integer.class, messageProcessingTimes.get(2).getMessageClass());
87 Assert.assertTrue(messageProcessingTimes.get(2).getElapsedTimeInNanos() > TimeUnit.MILLISECONDS.toNanos(10));
88 Assert.assertEquals(Foo.class, error.getLastExpectedMessage().getClass());
89 Assert.assertEquals(Foo.class, error.getCurrentExpectedMessage().getClass());
91 LOG.error("An error occurred : {}" , error);
97 public void testMetExpectationOnTracking(){
98 MessageTracker messageTracker = new MessageTracker(Foo.class, 10);
99 messageTracker.begin();
101 MessageTracker.Context context1 = messageTracker.received(new Foo());
104 Uninterruptibles.sleepUninterruptibly(1, TimeUnit.MILLISECONDS);
106 MessageTracker.Context context2 = messageTracker.received(new Foo());
107 Assert.assertEquals(false, context2.error().isPresent());
112 public void testIllegalStateExceptionWhenDoneIsNotCalledWhileTracking(){
113 MessageTracker messageTracker = new MessageTracker(Foo.class, 10);
114 messageTracker.begin();
116 messageTracker.received(new Foo());
119 messageTracker.received(new Foo());
120 fail("Expected an IllegalStateException");
121 } catch (IllegalStateException e){
127 public void testNoIllegalStateExceptionWhenDoneIsNotCalledWhileNotTracking(){
128 MessageTracker messageTracker = new MessageTracker(Foo.class, 10);
130 messageTracker.received(new Foo());
131 messageTracker.received(new Foo());
135 public void testDelayInFirstExpectedMessageArrival(){
137 MessageTracker messageTracker = new MessageTracker(Foo.class, 10);
138 messageTracker.begin();
140 Uninterruptibles.sleepUninterruptibly(20, TimeUnit.MILLISECONDS);
142 MessageTracker.Context context = messageTracker.received(new Foo());
144 Assert.assertEquals(true, context.error().isPresent());
146 MessageTracker.Error error = context.error().get();
148 Assert.assertEquals(null, error.getLastExpectedMessage());
149 Assert.assertEquals(Foo.class, error.getCurrentExpectedMessage().getClass());
151 String errorString = error.toString();
152 Assert.assertTrue(errorString.contains("Last Expected Message = null"));
154 LOG.error("An error occurred : {}", error);
158 public void testCallingBeginDoesNotResetWatch(){
159 MessageTracker messageTracker = new MessageTracker(Foo.class, 10);
160 messageTracker.begin();
162 Uninterruptibles.sleepUninterruptibly(20, TimeUnit.MILLISECONDS);
164 messageTracker.begin();
166 MessageTracker.Context context = messageTracker.received(new Foo());
168 Assert.assertEquals(true, context.error().isPresent());
173 public void testMessagesSinceLastExpectedMessage(){
175 MessageTracker messageTracker = new MessageTracker(Foo.class, 10);
176 messageTracker.begin();
178 MessageTracker.Context context1 = messageTracker.received(Integer.valueOf(45)).done();
180 Assert.assertEquals(false, context1.error().isPresent());
182 MessageTracker.Context context2 = messageTracker.received(Long.valueOf(45)).done();
184 Assert.assertEquals(false, context2.error().isPresent());
186 List<MessageTracker.MessageProcessingTime> processingTimeList =
187 messageTracker.getMessagesSinceLastExpectedMessage();
189 Assert.assertEquals(2, processingTimeList.size());
191 assertEquals(Integer.class, processingTimeList.get(0).getMessageClass());
192 assertEquals(Long.class, processingTimeList.get(1).getMessageClass());