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;
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;
39 import java.util.ArrayList;
40 import java.util.Collection;
44 * Unit tests for StatAbstractListenCommit.
46 * @author Thomas Pantelis
48 public class StatAbstractListenCommitTest {
51 private NotificationProviderService mockNotificationProviderService;
54 private StatisticsManager mockStatisticsManager;
57 private DataBroker mockDataBroker;
60 private NotificationListener mockNotificationListener;
63 private StatNodeRegistration statsNodeRegistration;
66 @SuppressWarnings("rawtypes")
67 private StatAbstractListenCommit statCommit;
69 @SuppressWarnings({ "rawtypes", "unchecked" })
72 MockitoAnnotations.initMocks(this);
74 statCommit = new StatAbstractListenCommit(mockStatisticsManager, mockDataBroker,
75 mockNotificationProviderService, DataObject.class, statsNodeRegistration) {
77 protected InstanceIdentifier getWildCardedRegistrationPath() {
78 return InstanceIdentifier.create(DataObject.class);
82 protected void processDataChange(Collection changes) {
87 protected NotificationListener getStatNotificationListener() {
88 return mockNotificationListener;
94 @SuppressWarnings("unchecked")
96 public void testReadLatestConfiguration() {
98 InstanceIdentifier<DataObject> path = InstanceIdentifier.create(DataObject.class);
100 ReadOnlyTransaction mockReadTx = mock(ReadOnlyTransaction.class);
101 doReturn(mockReadTx).when(mockDataBroker).newReadOnlyTransaction();
103 Optional<DataObject> expected = Optional.of(mock(DataObject.class));
104 doReturn(Futures.immediateCheckedFuture(expected)).when(mockReadTx).read(
105 LogicalDatastoreType.CONFIGURATION, path);
107 Optional<DataObject> actual = statCommit.readLatestConfiguration(path);
109 assertSame("Optional instance", expected, actual);
111 actual = statCommit.readLatestConfiguration(path);
113 assertSame("Optional instance", expected, actual);
115 verify(mockReadTx, never()).close();
116 verify(mockDataBroker).newReadOnlyTransaction();
119 @SuppressWarnings("unchecked")
121 public void testReadLatestConfigurationWithReadFailure() {
123 InstanceIdentifier<DataObject> path = InstanceIdentifier.create(DataObject.class);
125 ReadOnlyTransaction mockReadTx1 = mock(ReadOnlyTransaction.class);
126 ReadOnlyTransaction mockReadTx2 = mock(ReadOnlyTransaction.class);
127 ReadOnlyTransaction mockReadTx3 = mock(ReadOnlyTransaction.class);
128 doReturn(mockReadTx1).doReturn(mockReadTx2).doReturn(mockReadTx3).when(mockDataBroker).newReadOnlyTransaction();
130 doReturn(Futures.immediateFailedCheckedFuture(new ReadFailedException("mock"))).when(mockReadTx1).read(
131 LogicalDatastoreType.CONFIGURATION, path);
133 doReturn(Futures.immediateFailedCheckedFuture(new ReadFailedException("mock"))).when(mockReadTx2).read(
134 LogicalDatastoreType.CONFIGURATION, path);
136 Optional<DataObject> expected = Optional.of(mock(DataObject.class));
137 doReturn(Futures.immediateCheckedFuture(expected)).when(mockReadTx3).read(
138 LogicalDatastoreType.CONFIGURATION, path);
140 Optional<DataObject> actual = statCommit.readLatestConfiguration(path);
142 assertEquals("Optional isPresent", false, actual.isPresent());
144 actual = statCommit.readLatestConfiguration(path);
146 assertSame("Optional instance", expected, actual);
149 @SuppressWarnings("unchecked")
151 public void testReadLatestConfigurationWithInterveningOnDataTreeChanged() {
153 InstanceIdentifier<DataObject> path = InstanceIdentifier.create(DataObject.class);
155 ReadOnlyTransaction mockReadTx1 = mock(ReadOnlyTransaction.class);
156 ReadOnlyTransaction mockReadTx2 = mock(ReadOnlyTransaction.class);
157 doReturn(mockReadTx1).doReturn(mockReadTx2).when(mockDataBroker).newReadOnlyTransaction();
159 final Optional<DataObject> expected1 = Optional.of(mock(DataObject.class));
160 Answer<CheckedFuture<Optional<DataObject>, ReadFailedException>> answer =
161 new Answer<CheckedFuture<Optional<DataObject>, ReadFailedException>>() {
163 public CheckedFuture<Optional<DataObject>, ReadFailedException> answer(
164 InvocationOnMock unused) {
165 statCommit.onDataTreeChanged(new ArrayList<>());
166 return Futures.immediateCheckedFuture(expected1);
170 doAnswer(answer).when(mockReadTx1).read(LogicalDatastoreType.CONFIGURATION, path);
172 Optional<DataObject> expected2 = Optional.of(mock(DataObject.class));
173 doReturn(Futures.immediateCheckedFuture(expected2)).when(mockReadTx2).read(
174 LogicalDatastoreType.CONFIGURATION, path);
176 Optional<DataObject> actual = statCommit.readLatestConfiguration(path);
178 assertSame("Optional instance", expected1, actual);
180 actual = statCommit.readLatestConfiguration(path);
182 assertSame("Optional instance", expected2, actual);
184 actual = statCommit.readLatestConfiguration(path);
186 assertSame("Optional instance", expected2, actual);
188 verify(mockReadTx1).close();
189 verify(mockReadTx2, never()).close();
190 verify(mockDataBroker, times(2)).newReadOnlyTransaction();