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