2 * Copyright (c) 2015 Brocade Communications 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
8 package org.opendaylight.openflowplugin.applications.statistics.manager.impl;
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;
40 * Unit tests for StatAbstractListenCommit.
42 * @author Thomas Pantelis
44 public class StatAbstractListenCommitTest {
47 private NotificationProviderService mockNotificationProviderService;
50 private StatisticsManager mockStatisticsManager;
53 private DataBroker mockDataBroker;
56 private NotificationListener mockNotificationListener;
59 private StatNodeRegistration statsNodeRegistration;
62 @SuppressWarnings("rawtypes")
63 private StatAbstractListenCommit statCommit;
65 @SuppressWarnings({ "rawtypes", "unchecked" })
68 MockitoAnnotations.initMocks(this);
70 statCommit = new StatAbstractListenCommit(mockStatisticsManager, mockDataBroker,
71 mockNotificationProviderService, DataObject.class, statsNodeRegistration) {
73 protected InstanceIdentifier getWildCardedRegistrationPath() {
74 return InstanceIdentifier.create(DataObject.class);
78 protected NotificationListener getStatNotificationListener() {
79 return mockNotificationListener;
85 @SuppressWarnings("unchecked")
87 public void testReadLatestConfiguration() {
89 InstanceIdentifier<DataObject> path = InstanceIdentifier.create(DataObject.class);
91 ReadOnlyTransaction mockReadTx = mock(ReadOnlyTransaction.class);
92 doReturn(mockReadTx).when(mockDataBroker).newReadOnlyTransaction();
94 Optional<DataObject> expected = Optional.of(mock(DataObject.class));
95 doReturn(Futures.immediateCheckedFuture(expected)).when(mockReadTx).read(
96 LogicalDatastoreType.CONFIGURATION, path);
98 Optional<DataObject> actual = statCommit.readLatestConfiguration(path);
100 assertSame("Optional instance", expected, actual);
102 actual = statCommit.readLatestConfiguration(path);
104 assertSame("Optional instance", expected, actual);
106 verify(mockReadTx, never()).close();
107 verify(mockDataBroker).newReadOnlyTransaction();
110 @SuppressWarnings("unchecked")
112 public void testReadLatestConfigurationWithReadFailure() {
114 InstanceIdentifier<DataObject> path = InstanceIdentifier.create(DataObject.class);
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();
121 doReturn(Futures.immediateFailedCheckedFuture(new ReadFailedException("mock"))).when(mockReadTx1).read(
122 LogicalDatastoreType.CONFIGURATION, path);
124 doReturn(Futures.immediateFailedCheckedFuture(new ReadFailedException("mock"))).when(mockReadTx2).read(
125 LogicalDatastoreType.CONFIGURATION, path);
127 Optional<DataObject> expected = Optional.of(mock(DataObject.class));
128 doReturn(Futures.immediateCheckedFuture(expected)).when(mockReadTx3).read(
129 LogicalDatastoreType.CONFIGURATION, path);
131 Optional<DataObject> actual = statCommit.readLatestConfiguration(path);
133 assertEquals("Optional isPresent", false, actual.isPresent());
135 actual = statCommit.readLatestConfiguration(path);
137 assertSame("Optional instance", expected, actual);
140 @SuppressWarnings("unchecked")
142 public void testReadLatestConfigurationWithInterveningOnDataChanged() {
144 InstanceIdentifier<DataObject> path = InstanceIdentifier.create(DataObject.class);
146 ReadOnlyTransaction mockReadTx1 = mock(ReadOnlyTransaction.class);
147 ReadOnlyTransaction mockReadTx2 = mock(ReadOnlyTransaction.class);
148 doReturn(mockReadTx1).doReturn(mockReadTx2).when(mockDataBroker).newReadOnlyTransaction();
150 final Optional<DataObject> expected1 = Optional.of(mock(DataObject.class));
151 Answer<CheckedFuture<Optional<DataObject>, ReadFailedException>> answer =
152 new Answer<CheckedFuture<Optional<DataObject>, ReadFailedException>>() {
154 public CheckedFuture<Optional<DataObject>, ReadFailedException> answer(
155 InvocationOnMock unused) {
156 statCommit.onDataChanged(mock(AsyncDataChangeEvent.class));
157 return Futures.immediateCheckedFuture(expected1);
161 doAnswer(answer).when(mockReadTx1).read(LogicalDatastoreType.CONFIGURATION, path);
163 Optional<DataObject> expected2 = Optional.of(mock(DataObject.class));
164 doReturn(Futures.immediateCheckedFuture(expected2)).when(mockReadTx2).read(
165 LogicalDatastoreType.CONFIGURATION, path);
167 Optional<DataObject> actual = statCommit.readLatestConfiguration(path);
169 assertSame("Optional instance", expected1, actual);
171 actual = statCommit.readLatestConfiguration(path);
173 assertSame("Optional instance", expected2, actual);
175 actual = statCommit.readLatestConfiguration(path);
177 assertSame("Optional instance", expected2, actual);
179 verify(mockReadTx1).close();
180 verify(mockReadTx2, never()).close();
181 verify(mockDataBroker, times(2)).newReadOnlyTransaction();