Bug 4957 TxChainManager lifecycle startup cleaning
[openflowplugin.git] / applications / statistics-manager / src / test / java / org / opendaylight / openflowplugin / applications / statistics / manager / impl / StatAbstractListenCommitTest.java
1 /*
2  * Copyright (c) 2015 Brocade Communications 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 package org.opendaylight.openflowplugin.applications.statistics.manager.impl;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertSame;
12 import static org.mockito.Mockito.doAnswer;
13 import static org.mockito.Mockito.doReturn;
14 import static org.mockito.Mockito.mock;
15 import static org.mockito.Mockito.never;
16 import static org.mockito.Mockito.times;
17 import static org.mockito.Mockito.verify;
18 import com.google.common.base.Optional;
19 import com.google.common.util.concurrent.CheckedFuture;
20 import com.google.common.util.concurrent.Futures;
21 import org.junit.Before;
22 import org.junit.Test;
23 import org.mockito.Mock;
24 import org.mockito.MockitoAnnotations;
25 import org.mockito.invocation.InvocationOnMock;
26 import org.mockito.stubbing.Answer;
27 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
28 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
29 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
30 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
31 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
32 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
33 import org.opendaylight.openflowplugin.applications.statistics.manager.StatisticsManager;
34 import org.opendaylight.yangtools.yang.binding.DataObject;
35 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
36 import org.opendaylight.yangtools.yang.binding.NotificationListener;
37
38 /**
39  * Unit tests for StatAbstractListenCommit.
40  *
41  * @author Thomas Pantelis
42  */
43 public class StatAbstractListenCommitTest {
44
45     @Mock
46     private NotificationProviderService mockNotificationProviderService;
47
48     @Mock
49     private StatisticsManager mockStatisticsManager;
50
51     @Mock
52     private DataBroker mockDataBroker;
53
54     @Mock
55     private NotificationListener mockNotificationListener;
56
57     @SuppressWarnings("rawtypes")
58     private StatAbstractListenCommit statCommit;
59
60     @SuppressWarnings({ "rawtypes", "unchecked" })
61     @Before
62     public void setup() {
63         MockitoAnnotations.initMocks(this);
64
65         statCommit = new StatAbstractListenCommit(mockStatisticsManager, mockDataBroker,
66                 mockNotificationProviderService, DataObject.class) {
67             @Override
68             protected InstanceIdentifier getWildCardedRegistrationPath() {
69                 return InstanceIdentifier.create(DataObject.class);
70             }
71
72             @Override
73             protected NotificationListener getStatNotificationListener() {
74                 return mockNotificationListener;
75             }
76         };
77     }
78
79
80     @SuppressWarnings("unchecked")
81     @Test
82     public void testReadLatestConfiguration() {
83
84         InstanceIdentifier<DataObject> path = InstanceIdentifier.create(DataObject.class);
85
86         ReadOnlyTransaction mockReadTx = mock(ReadOnlyTransaction.class);
87         doReturn(mockReadTx).when(mockDataBroker).newReadOnlyTransaction();
88
89         Optional<DataObject> expected = Optional.of(mock(DataObject.class));
90         doReturn(Futures.immediateCheckedFuture(expected)).when(mockReadTx).read(
91                 LogicalDatastoreType.CONFIGURATION, path);
92
93         Optional<DataObject> actual = statCommit.readLatestConfiguration(path);
94
95         assertSame("Optional instance", expected, actual);
96
97         actual = statCommit.readLatestConfiguration(path);
98
99         assertSame("Optional instance", expected, actual);
100
101         verify(mockReadTx, never()).close();
102         verify(mockDataBroker).newReadOnlyTransaction();
103     }
104
105     @SuppressWarnings("unchecked")
106     @Test
107     public void testReadLatestConfigurationWithReadFailure() {
108
109         InstanceIdentifier<DataObject> path = InstanceIdentifier.create(DataObject.class);
110
111         ReadOnlyTransaction mockReadTx1 = mock(ReadOnlyTransaction.class);
112         ReadOnlyTransaction mockReadTx2 = mock(ReadOnlyTransaction.class);
113         ReadOnlyTransaction mockReadTx3 = mock(ReadOnlyTransaction.class);
114         doReturn(mockReadTx1).doReturn(mockReadTx2).doReturn(mockReadTx3).when(mockDataBroker).newReadOnlyTransaction();
115
116         doReturn(Futures.immediateFailedCheckedFuture(new ReadFailedException("mock"))).when(mockReadTx1).read(
117                 LogicalDatastoreType.CONFIGURATION, path);
118
119         doReturn(Futures.immediateFailedCheckedFuture(new ReadFailedException("mock"))).when(mockReadTx2).read(
120                 LogicalDatastoreType.CONFIGURATION, path);
121
122         Optional<DataObject> expected = Optional.of(mock(DataObject.class));
123         doReturn(Futures.immediateCheckedFuture(expected)).when(mockReadTx3).read(
124                 LogicalDatastoreType.CONFIGURATION, path);
125
126         Optional<DataObject> actual = statCommit.readLatestConfiguration(path);
127
128         assertEquals("Optional isPresent", false, actual.isPresent());
129
130         actual = statCommit.readLatestConfiguration(path);
131
132         assertSame("Optional instance", expected, actual);
133     }
134
135     @SuppressWarnings("unchecked")
136     @Test
137     public void testReadLatestConfigurationWithInterveningOnDataChanged() {
138
139         InstanceIdentifier<DataObject> path = InstanceIdentifier.create(DataObject.class);
140
141         ReadOnlyTransaction mockReadTx1 = mock(ReadOnlyTransaction.class);
142         ReadOnlyTransaction mockReadTx2 = mock(ReadOnlyTransaction.class);
143         doReturn(mockReadTx1).doReturn(mockReadTx2).when(mockDataBroker).newReadOnlyTransaction();
144
145         final Optional<DataObject> expected1 = Optional.of(mock(DataObject.class));
146         Answer<CheckedFuture<Optional<DataObject>, ReadFailedException>> answer =
147                 new Answer<CheckedFuture<Optional<DataObject>, ReadFailedException>>() {
148                     @Override
149                     public CheckedFuture<Optional<DataObject>, ReadFailedException> answer(
150                             InvocationOnMock unused) {
151                         statCommit.onDataChanged(mock(AsyncDataChangeEvent.class));
152                         return Futures.immediateCheckedFuture(expected1);
153                     }
154                 };
155
156         doAnswer(answer).when(mockReadTx1).read(LogicalDatastoreType.CONFIGURATION, path);
157
158         Optional<DataObject> expected2 = Optional.of(mock(DataObject.class));
159         doReturn(Futures.immediateCheckedFuture(expected2)).when(mockReadTx2).read(
160                 LogicalDatastoreType.CONFIGURATION, path);
161
162         Optional<DataObject> actual = statCommit.readLatestConfiguration(path);
163
164         assertSame("Optional instance", expected1, actual);
165
166         actual = statCommit.readLatestConfiguration(path);
167
168         assertSame("Optional instance", expected2, actual);
169
170         actual = statCommit.readLatestConfiguration(path);
171
172         assertSame("Optional instance", expected2, actual);
173
174         verify(mockReadTx1).close();
175         verify(mockReadTx2, never()).close();
176         verify(mockDataBroker, times(2)).newReadOnlyTransaction();
177     }
178 }