Fixed following issues
[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.StatNodeRegistration;
34 import org.opendaylight.openflowplugin.applications.statistics.manager.StatisticsManager;
35 import org.opendaylight.yangtools.yang.binding.DataObject;
36 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
37 import org.opendaylight.yangtools.yang.binding.NotificationListener;
38
39 /**
40  * Unit tests for StatAbstractListenCommit.
41  *
42  * @author Thomas Pantelis
43  */
44 public class StatAbstractListenCommitTest {
45
46     @Mock
47     private NotificationProviderService mockNotificationProviderService;
48
49     @Mock
50     private StatisticsManager mockStatisticsManager;
51
52     @Mock
53     private DataBroker mockDataBroker;
54
55     @Mock
56     private NotificationListener mockNotificationListener;
57
58     @Mock
59     private StatNodeRegistration statsNodeRegistration;
60
61
62     @SuppressWarnings("rawtypes")
63     private StatAbstractListenCommit statCommit;
64
65     @SuppressWarnings({ "rawtypes", "unchecked" })
66     @Before
67     public void setup() {
68         MockitoAnnotations.initMocks(this);
69
70         statCommit = new StatAbstractListenCommit(mockStatisticsManager, mockDataBroker,
71                 mockNotificationProviderService, DataObject.class, statsNodeRegistration) {
72             @Override
73             protected InstanceIdentifier getWildCardedRegistrationPath() {
74                 return InstanceIdentifier.create(DataObject.class);
75             }
76
77             @Override
78             protected NotificationListener getStatNotificationListener() {
79                 return mockNotificationListener;
80             }
81         };
82     }
83
84
85     @SuppressWarnings("unchecked")
86     @Test
87     public void testReadLatestConfiguration() {
88
89         InstanceIdentifier<DataObject> path = InstanceIdentifier.create(DataObject.class);
90
91         ReadOnlyTransaction mockReadTx = mock(ReadOnlyTransaction.class);
92         doReturn(mockReadTx).when(mockDataBroker).newReadOnlyTransaction();
93
94         Optional<DataObject> expected = Optional.of(mock(DataObject.class));
95         doReturn(Futures.immediateCheckedFuture(expected)).when(mockReadTx).read(
96                 LogicalDatastoreType.CONFIGURATION, path);
97
98         Optional<DataObject> actual = statCommit.readLatestConfiguration(path);
99
100         assertSame("Optional instance", expected, actual);
101
102         actual = statCommit.readLatestConfiguration(path);
103
104         assertSame("Optional instance", expected, actual);
105
106         verify(mockReadTx, never()).close();
107         verify(mockDataBroker).newReadOnlyTransaction();
108     }
109
110     @SuppressWarnings("unchecked")
111     @Test
112     public void testReadLatestConfigurationWithReadFailure() {
113
114         InstanceIdentifier<DataObject> path = InstanceIdentifier.create(DataObject.class);
115
116         ReadOnlyTransaction mockReadTx1 = mock(ReadOnlyTransaction.class);
117         ReadOnlyTransaction mockReadTx2 = mock(ReadOnlyTransaction.class);
118         ReadOnlyTransaction mockReadTx3 = mock(ReadOnlyTransaction.class);
119         doReturn(mockReadTx1).doReturn(mockReadTx2).doReturn(mockReadTx3).when(mockDataBroker).newReadOnlyTransaction();
120
121         doReturn(Futures.immediateFailedCheckedFuture(new ReadFailedException("mock"))).when(mockReadTx1).read(
122                 LogicalDatastoreType.CONFIGURATION, path);
123
124         doReturn(Futures.immediateFailedCheckedFuture(new ReadFailedException("mock"))).when(mockReadTx2).read(
125                 LogicalDatastoreType.CONFIGURATION, path);
126
127         Optional<DataObject> expected = Optional.of(mock(DataObject.class));
128         doReturn(Futures.immediateCheckedFuture(expected)).when(mockReadTx3).read(
129                 LogicalDatastoreType.CONFIGURATION, path);
130
131         Optional<DataObject> actual = statCommit.readLatestConfiguration(path);
132
133         assertEquals("Optional isPresent", false, actual.isPresent());
134
135         actual = statCommit.readLatestConfiguration(path);
136
137         assertSame("Optional instance", expected, actual);
138     }
139
140     @SuppressWarnings("unchecked")
141     @Test
142     public void testReadLatestConfigurationWithInterveningOnDataChanged() {
143
144         InstanceIdentifier<DataObject> path = InstanceIdentifier.create(DataObject.class);
145
146         ReadOnlyTransaction mockReadTx1 = mock(ReadOnlyTransaction.class);
147         ReadOnlyTransaction mockReadTx2 = mock(ReadOnlyTransaction.class);
148         doReturn(mockReadTx1).doReturn(mockReadTx2).when(mockDataBroker).newReadOnlyTransaction();
149
150         final Optional<DataObject> expected1 = Optional.of(mock(DataObject.class));
151         Answer<CheckedFuture<Optional<DataObject>, ReadFailedException>> answer =
152                 new Answer<CheckedFuture<Optional<DataObject>, ReadFailedException>>() {
153                     @Override
154                     public CheckedFuture<Optional<DataObject>, ReadFailedException> answer(
155                             InvocationOnMock unused) {
156                         statCommit.onDataChanged(mock(AsyncDataChangeEvent.class));
157                         return Futures.immediateCheckedFuture(expected1);
158                     }
159                 };
160
161         doAnswer(answer).when(mockReadTx1).read(LogicalDatastoreType.CONFIGURATION, path);
162
163         Optional<DataObject> expected2 = Optional.of(mock(DataObject.class));
164         doReturn(Futures.immediateCheckedFuture(expected2)).when(mockReadTx2).read(
165                 LogicalDatastoreType.CONFIGURATION, path);
166
167         Optional<DataObject> actual = statCommit.readLatestConfiguration(path);
168
169         assertSame("Optional instance", expected1, actual);
170
171         actual = statCommit.readLatestConfiguration(path);
172
173         assertSame("Optional instance", expected2, actual);
174
175         actual = statCommit.readLatestConfiguration(path);
176
177         assertSame("Optional instance", expected2, actual);
178
179         verify(mockReadTx1).close();
180         verify(mockReadTx2, never()).close();
181         verify(mockDataBroker, times(2)).newReadOnlyTransaction();
182     }
183 }