/* * Copyright (c) 2015 Brocade Communications Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.openflowplugin.applications.statistics.manager.impl; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import com.google.common.base.Optional; import com.google.common.util.concurrent.CheckedFuture; import com.google.common.util.concurrent.Futures; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; import org.opendaylight.controller.sal.binding.api.NotificationProviderService; import org.opendaylight.openflowplugin.applications.statistics.manager.StatNodeRegistration; import org.opendaylight.openflowplugin.applications.statistics.manager.StatisticsManager; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.NotificationListener; import java.util.ArrayList; import java.util.Collection; /** * Unit tests for StatAbstractListenCommit. * * @author Thomas Pantelis */ public class StatAbstractListenCommitTest { @Mock private NotificationProviderService mockNotificationProviderService; @Mock private StatisticsManager mockStatisticsManager; @Mock private DataBroker mockDataBroker; @Mock private NotificationListener mockNotificationListener; @Mock private StatNodeRegistration statsNodeRegistration; @SuppressWarnings("rawtypes") private StatAbstractListenCommit statCommit; @SuppressWarnings({ "rawtypes", "unchecked" }) @Before public void setup() { MockitoAnnotations.initMocks(this); statCommit = new StatAbstractListenCommit(mockStatisticsManager, mockDataBroker, mockNotificationProviderService, DataObject.class, statsNodeRegistration) { @Override protected InstanceIdentifier getWildCardedRegistrationPath() { return InstanceIdentifier.create(DataObject.class); } @Override protected void processDataChange(Collection changes) { } @Override protected NotificationListener getStatNotificationListener() { return mockNotificationListener; } }; } @SuppressWarnings("unchecked") @Test public void testReadLatestConfiguration() { InstanceIdentifier<DataObject> path = InstanceIdentifier.create(DataObject.class); ReadOnlyTransaction mockReadTx = mock(ReadOnlyTransaction.class); doReturn(mockReadTx).when(mockDataBroker).newReadOnlyTransaction(); Optional<DataObject> expected = Optional.of(mock(DataObject.class)); doReturn(Futures.immediateCheckedFuture(expected)).when(mockReadTx).read( LogicalDatastoreType.CONFIGURATION, path); Optional<DataObject> actual = statCommit.readLatestConfiguration(path); assertSame("Optional instance", expected, actual); actual = statCommit.readLatestConfiguration(path); assertSame("Optional instance", expected, actual); verify(mockReadTx, never()).close(); verify(mockDataBroker).newReadOnlyTransaction(); } @SuppressWarnings("unchecked") @Test public void testReadLatestConfigurationWithReadFailure() { InstanceIdentifier<DataObject> path = InstanceIdentifier.create(DataObject.class); ReadOnlyTransaction mockReadTx1 = mock(ReadOnlyTransaction.class); ReadOnlyTransaction mockReadTx2 = mock(ReadOnlyTransaction.class); ReadOnlyTransaction mockReadTx3 = mock(ReadOnlyTransaction.class); doReturn(mockReadTx1).doReturn(mockReadTx2).doReturn(mockReadTx3).when(mockDataBroker).newReadOnlyTransaction(); doReturn(Futures.immediateFailedCheckedFuture(new ReadFailedException("mock"))).when(mockReadTx1).read( LogicalDatastoreType.CONFIGURATION, path); doReturn(Futures.immediateFailedCheckedFuture(new ReadFailedException("mock"))).when(mockReadTx2).read( LogicalDatastoreType.CONFIGURATION, path); Optional<DataObject> expected = Optional.of(mock(DataObject.class)); doReturn(Futures.immediateCheckedFuture(expected)).when(mockReadTx3).read( LogicalDatastoreType.CONFIGURATION, path); Optional<DataObject> actual = statCommit.readLatestConfiguration(path); assertEquals("Optional isPresent", false, actual.isPresent()); actual = statCommit.readLatestConfiguration(path); assertSame("Optional instance", expected, actual); } @SuppressWarnings("unchecked") @Test public void testReadLatestConfigurationWithInterveningOnDataTreeChanged() { InstanceIdentifier<DataObject> path = InstanceIdentifier.create(DataObject.class); ReadOnlyTransaction mockReadTx1 = mock(ReadOnlyTransaction.class); ReadOnlyTransaction mockReadTx2 = mock(ReadOnlyTransaction.class); doReturn(mockReadTx1).doReturn(mockReadTx2).when(mockDataBroker).newReadOnlyTransaction(); final Optional<DataObject> expected1 = Optional.of(mock(DataObject.class)); Answer<CheckedFuture<Optional<DataObject>, ReadFailedException>> answer = new Answer<CheckedFuture<Optional<DataObject>, ReadFailedException>>() { @Override public CheckedFuture<Optional<DataObject>, ReadFailedException> answer( InvocationOnMock unused) { statCommit.onDataTreeChanged(new ArrayList<>()); return Futures.immediateCheckedFuture(expected1); } }; doAnswer(answer).when(mockReadTx1).read(LogicalDatastoreType.CONFIGURATION, path); Optional<DataObject> expected2 = Optional.of(mock(DataObject.class)); doReturn(Futures.immediateCheckedFuture(expected2)).when(mockReadTx2).read( LogicalDatastoreType.CONFIGURATION, path); Optional<DataObject> actual = statCommit.readLatestConfiguration(path); assertSame("Optional instance", expected1, actual); actual = statCommit.readLatestConfiguration(path); assertSame("Optional instance", expected2, actual); actual = statCommit.readLatestConfiguration(path); assertSame("Optional instance", expected2, actual); verify(mockReadTx1).close(); verify(mockReadTx2, never()).close(); verify(mockDataBroker, times(2)).newReadOnlyTransaction(); } }