Move MessageTracker to sal-clustering-commons
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / test / java / org / opendaylight / controller / cluster / common / actor / MessageTrackerTest.java
1 /*
2  * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.controller.cluster.common.actor;
10
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;
20
21 public class MessageTrackerTest {
22
23     private final static Logger LOG = LoggerFactory.getLogger(MessageTrackerTest.class);
24
25     private class Foo {
26
27     }
28
29     @Test
30     public void testNoTracking() {
31         MessageTracker messageTracker = new MessageTracker(Foo.class, 10);
32
33         MessageTracker.Context context1 = messageTracker.received(new Foo());
34         context1.done();
35
36         Uninterruptibles.sleepUninterruptibly(20, TimeUnit.MILLISECONDS);
37
38         MessageTracker.Context context2 = messageTracker.received(new Foo());
39         context2.done();
40
41     }
42
43     @Test
44     public void testFailedExpectationOnTracking() {
45         MessageTracker messageTracker = new MessageTracker(Foo.class, 10);
46         messageTracker.begin();
47
48         MessageTracker.Context context1 = messageTracker.received(new Foo());
49         context1.done();
50
51         Uninterruptibles.sleepUninterruptibly(20, TimeUnit.MILLISECONDS);
52
53         MessageTracker.Context context2 = messageTracker.received(new Foo());
54         Assert.assertEquals(true, context2.error().isPresent());
55         Assert.assertEquals(0, context2.error().get().getMessageProcessingTimesSinceLastExpectedMessage().size());
56
57     }
58
59     @Test
60     public void testFailedExpectationOnTrackingWithMessagesInBetween() {
61         MessageTracker messageTracker = new MessageTracker(Foo.class, 10);
62         messageTracker.begin();
63
64         MessageTracker.Context context1 = messageTracker.received(new Foo());
65         context1.done();
66
67         messageTracker.received("A").done();
68         messageTracker.received(Long.valueOf(10)).done();
69         MessageTracker.Context c = messageTracker.received(Integer.valueOf(100));
70
71         Uninterruptibles.sleepUninterruptibly(20, TimeUnit.MILLISECONDS);
72
73         c.done();
74
75         MessageTracker.Context context2 = messageTracker.received(new Foo());
76
77         Assert.assertEquals(true, context2.error().isPresent());
78
79         MessageTracker.Error error = context2.error().get();
80
81         List<MessageTracker.MessageProcessingTime> messageProcessingTimes =
82                 error.getMessageProcessingTimesSinceLastExpectedMessage();
83
84         Assert.assertEquals(3, messageProcessingTimes.size());
85
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());
92
93         LOG.error("An error occurred : {}" , error);
94     }
95
96
97     @Test
98     public void testMetExpectationOnTracking() {
99         MessageTracker messageTracker = new MessageTracker(Foo.class, 10);
100         messageTracker.begin();
101
102         MessageTracker.Context context1 = messageTracker.received(new Foo());
103         context1.done();
104
105         Uninterruptibles.sleepUninterruptibly(1, TimeUnit.MILLISECONDS);
106
107         MessageTracker.Context context2 = messageTracker.received(new Foo());
108         Assert.assertEquals(false, context2.error().isPresent());
109
110     }
111
112     @Test
113     public void testIllegalStateExceptionWhenDoneIsNotCalledWhileTracking() {
114         MessageTracker messageTracker = new MessageTracker(Foo.class, 10);
115         messageTracker.begin();
116
117         messageTracker.received(new Foo());
118
119         try {
120             messageTracker.received(new Foo());
121             fail("Expected an IllegalStateException");
122         } catch (IllegalStateException e){
123
124         }
125     }
126
127     @Test
128     public void testNoIllegalStateExceptionWhenDoneIsNotCalledWhileNotTracking() {
129         MessageTracker messageTracker = new MessageTracker(Foo.class, 10);
130
131         messageTracker.received(new Foo());
132         messageTracker.received(new Foo());
133     }
134
135     @Test
136     public void testDelayInFirstExpectedMessageArrival(){
137
138         MessageTracker messageTracker = new MessageTracker(Foo.class, 10);
139         messageTracker.begin();
140
141         Uninterruptibles.sleepUninterruptibly(20, TimeUnit.MILLISECONDS);
142
143         MessageTracker.Context context = messageTracker.received(new Foo());
144
145         Assert.assertEquals(true, context.error().isPresent());
146
147         MessageTracker.Error error = context.error().get();
148
149         Assert.assertEquals(null, error.getLastExpectedMessage());
150         Assert.assertEquals(Foo.class, error.getCurrentExpectedMessage().getClass());
151
152         String errorString = error.toString();
153         Assert.assertTrue(errorString.contains("Last Expected Message = null"));
154
155         LOG.error("An error occurred : {}", error);
156     }
157
158     @Test
159     public void testCallingBeginDoesNotResetWatch() {
160         MessageTracker messageTracker = new MessageTracker(Foo.class, 10);
161         messageTracker.begin();
162
163         Uninterruptibles.sleepUninterruptibly(20, TimeUnit.MILLISECONDS);
164
165         messageTracker.begin();
166
167         MessageTracker.Context context = messageTracker.received(new Foo());
168
169         Assert.assertEquals(true, context.error().isPresent());
170
171     }
172
173     @Test
174     public void testMessagesSinceLastExpectedMessage() {
175
176         MessageTracker messageTracker = new MessageTracker(Foo.class, 10);
177         messageTracker.begin();
178
179         MessageTracker.Context context1 = messageTracker.received(Integer.valueOf(45)).done();
180
181         Assert.assertEquals(false, context1.error().isPresent());
182
183         MessageTracker.Context context2 = messageTracker.received(Long.valueOf(45)).done();
184
185         Assert.assertEquals(false, context2.error().isPresent());
186
187         List<MessageTracker.MessageProcessingTime> processingTimeList =
188                 messageTracker.getMessagesSinceLastExpectedMessage();
189
190         Assert.assertEquals(2, processingTimeList.size());
191
192         assertEquals(Integer.class, processingTimeList.get(0).getMessageClass());
193         assertEquals(Long.class, processingTimeList.get(1).getMessageClass());
194
195     }
196
197 }