/* * Copyright (c) 2016 Cisco 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.groupbasedpolicy.renderer.ios_xe_provider.impl.listener; import java.util.Collections; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.DataObjectModification; import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier; import org.opendaylight.controller.md.sal.binding.api.DataTreeModification; import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.RendererPolicy; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.RendererPolicyBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.ConfigurationBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.RuleGroupsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.rule.groups.RuleGroupBuilder; import org.opendaylight.yangtools.concepts.ListenerRegistration; /** * Test for {@link RendererConfigurationListenerImpl}. */ @RunWith(MockitoJUnitRunner.class) public class RendererConfigurationListenerImplTest { private final RendererPolicy policy1; private final RendererPolicy policy2; @Mock private DataBroker dataBroker; @Mock private PolicyManagerImpl policyManager; @Mock private ListenerRegistration<RendererConfigurationListenerImpl> listenerRegistration; @Mock private DataTreeModification<RendererPolicy> dataTreeModification; @Mock private DataObjectModification<RendererPolicy> rootNode; private RendererConfigurationListenerImpl listener; public RendererConfigurationListenerImplTest() { policy1 = createRendererPolicy(0); policy2 = createRendererPolicy(1); } private RendererPolicy createRendererPolicy(final int order) { return new RendererPolicyBuilder() .setConfiguration(new ConfigurationBuilder().setRuleGroups( new RuleGroupsBuilder() .setRuleGroup(Collections.singletonList(new RuleGroupBuilder() .setOrder(order) .build())) .build()) .build()) .setVersion((long) order) .build(); } private RendererPolicy createVersion(final int order) { return new RendererPolicyBuilder() .setVersion((long) order) .build(); } @Before public void setUp() throws Exception { Mockito.when(dataBroker.registerDataTreeChangeListener( Matchers.<DataTreeIdentifier<RendererPolicy>>any(), Matchers.<RendererConfigurationListenerImpl>any())) .thenReturn(listenerRegistration); listener = new RendererConfigurationListenerImpl(dataBroker, policyManager); Mockito.verify(dataBroker).registerDataTreeChangeListener(Matchers.<DataTreeIdentifier<RendererPolicy>>any(), Matchers.<RendererConfigurationListenerImpl>any()); } @After public void tearDown() throws Exception { Mockito.verifyNoMoreInteractions(listenerRegistration, dataBroker, policyManager); } @Test public void testOnDataTreeChanged_add() throws Exception { Mockito.when(rootNode.getDataBefore()).thenReturn(null); Mockito.when(rootNode.getDataAfter()).thenReturn(policy1); Mockito.when(rootNode.getModificationType()).thenReturn(DataObjectModification.ModificationType.WRITE); Mockito.when(dataTreeModification.getRootNode()).thenReturn(rootNode); listener.onDataTreeChanged(Collections.singleton(dataTreeModification)); Mockito.verify(policyManager).syncPolicy(policy1.getConfiguration(), null, 0); } @Test public void testOnDataTreeChanged_update() throws Exception { Mockito.when(rootNode.getDataBefore()).thenReturn(policy1); Mockito.when(rootNode.getDataAfter()).thenReturn(policy2); Mockito.when(rootNode.getModificationType()).thenReturn(DataObjectModification.ModificationType.WRITE); Mockito.when(dataTreeModification.getRootNode()).thenReturn(rootNode); listener.onDataTreeChanged(Collections.singleton(dataTreeModification)); Mockito.verify(policyManager).syncPolicy(policy2.getConfiguration(), policy1.getConfiguration(), 1); } @Test public void testOnDataTreeChanged_remove() throws Exception { Mockito.when(rootNode.getDataBefore()).thenReturn(policy2); Mockito.when(rootNode.getDataAfter()).thenReturn(createVersion(1)); Mockito.when(rootNode.getModificationType()).thenReturn(DataObjectModification.ModificationType.WRITE); Mockito.when(dataTreeModification.getRootNode()).thenReturn(rootNode); listener.onDataTreeChanged(Collections.singleton(dataTreeModification)); Mockito.verify(policyManager).syncPolicy(null, policy2.getConfiguration(), 1); } @Test public void testClose() throws Exception { Mockito.verify(listenerRegistration, Mockito.never()).close(); listener.close(); Mockito.verify(listenerRegistration).close(); listener.close(); Mockito.verify(listenerRegistration, Mockito.times(2)).close(); } }