/* * 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.vpp.listener; import java.util.Arrays; import java.util.Collection; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.groupbasedpolicy.renderer.vpp.event.VppEndpointConfEvent; import org.opendaylight.groupbasedpolicy.test.CustomDataBrokerTest; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContextId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint_location_provider.rev160419.LocationProviders; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.AddressType; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.ContextType; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.Forwarding; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.Config; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpoint; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpointBuilder; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import com.google.common.base.Optional; import com.google.common.eventbus.EventBus; public class VppEndpointListenerTest extends CustomDataBrokerTest { private final static String ADDRESS = "1.1.1.1/32"; private final static ContextId CONTEXT_ID = new ContextId("ctx1"); private final static String IFACE_NAME = "ifaceName"; private DataBroker dataBroker; private VppEndpointListener listener; private EventBus eventBusMock; @Override public Collection<Class<?>> getClassesFromModules() { return Arrays.asList(Node.class, VppEndpoint.class, Forwarding.class, LocationProviders.class); } @Before public void init() { dataBroker = getDataBroker(); eventBusMock = Mockito.mock(EventBus.class); listener = new VppEndpointListener(dataBroker, eventBusMock); } @Test public void testOnWrite() throws Exception { ArgumentCaptor<VppEndpointConfEvent> argVppEpEvent = ArgumentCaptor.forClass(VppEndpointConfEvent.class); VppEndpoint vppEndpoint = new VppEndpointBuilder().setAddress(ADDRESS) .setAddressType(AddressType.class) .setContextId(CONTEXT_ID) .setContextType(ContextType.class) .build(); InstanceIdentifier<VppEndpoint> vppEpIid = InstanceIdentifier.builder(Config.class).child(VppEndpoint.class, vppEndpoint.getKey()).build(); WriteTransaction wTx = getDataBroker().newWriteOnlyTransaction(); wTx.put(LogicalDatastoreType.CONFIGURATION, vppEpIid, vppEndpoint); wTx.submit().get(); Mockito.verify(eventBusMock).post(argVppEpEvent.capture()); VppEndpointConfEvent capturedVppEpEvent = argVppEpEvent.getValue(); Assert.assertEquals(vppEpIid, capturedVppEpEvent.getIid()); assertEqualsOptional(null, capturedVppEpEvent.getBefore()); assertEqualsOptional(vppEndpoint, capturedVppEpEvent.getAfter()); } @Test public void testOnDelete() throws Exception { ArgumentCaptor<VppEndpointConfEvent> argVppEpEvent = ArgumentCaptor.forClass(VppEndpointConfEvent.class); VppEndpoint vppEndpoint = new VppEndpointBuilder().setAddress(ADDRESS) .setAddressType(AddressType.class) .setContextId(CONTEXT_ID) .setContextType(ContextType.class) .build(); InstanceIdentifier<VppEndpoint> vppEpIid = InstanceIdentifier.builder(Config.class).child(VppEndpoint.class, vppEndpoint.getKey()).build(); WriteTransaction wTx = getDataBroker().newWriteOnlyTransaction(); wTx.put(LogicalDatastoreType.CONFIGURATION, vppEpIid, vppEndpoint); wTx.submit().get(); wTx = getDataBroker().newWriteOnlyTransaction(); wTx.delete(LogicalDatastoreType.CONFIGURATION, vppEpIid); wTx.submit().get(); Mockito.verify(eventBusMock, Mockito.times(2)).post(argVppEpEvent.capture()); VppEndpointConfEvent capturedVppEpEvent = argVppEpEvent.getAllValues().get(1); Assert.assertEquals(vppEpIid, capturedVppEpEvent.getIid()); assertEqualsOptional(vppEndpoint, capturedVppEpEvent.getBefore()); assertEqualsOptional(null, capturedVppEpEvent.getAfter()); } @Test public void testOnSubtreeModified() throws Exception { ArgumentCaptor<VppEndpointConfEvent> argVppEpEvent = ArgumentCaptor.forClass(VppEndpointConfEvent.class); VppEndpointBuilder vppEndpointBuilder = new VppEndpointBuilder().setAddress(ADDRESS) .setAddressType(AddressType.class) .setContextId(CONTEXT_ID) .setContextType(ContextType.class); VppEndpoint vppEndpoint = vppEndpointBuilder.build(); InstanceIdentifier<VppEndpoint> vppEpIid = InstanceIdentifier.builder(Config.class).child(VppEndpoint.class, vppEndpoint.getKey()).build(); WriteTransaction wTx = getDataBroker().newWriteOnlyTransaction(); wTx.put(LogicalDatastoreType.CONFIGURATION, vppEpIid, vppEndpoint); wTx.submit().get(); VppEndpoint modifiedVppEndpoint = vppEndpointBuilder.setVppInterfaceName(IFACE_NAME).build(); wTx = getDataBroker().newWriteOnlyTransaction(); wTx.put(LogicalDatastoreType.CONFIGURATION, vppEpIid, modifiedVppEndpoint); wTx.submit().get(); Mockito.verify(eventBusMock, Mockito.times(2)).post(argVppEpEvent.capture()); VppEndpointConfEvent capturedFirstVppEpEvent = argVppEpEvent.getAllValues().get(0); Assert.assertEquals(vppEpIid, capturedFirstVppEpEvent.getIid()); assertEqualsOptional(null, capturedFirstVppEpEvent.getBefore()); assertEqualsOptional(vppEndpoint, capturedFirstVppEpEvent.getAfter()); VppEndpointConfEvent capturedSecondVppEpEvent = argVppEpEvent.getAllValues().get(1); Assert.assertEquals(vppEpIid, capturedSecondVppEpEvent.getIid()); assertEqualsOptional(vppEndpoint, capturedSecondVppEpEvent.getBefore()); assertEqualsOptional(modifiedVppEndpoint, capturedSecondVppEpEvent.getAfter()); } private <T> void assertEqualsOptional(T expected, Optional<T> actual) { if (expected == null) { Assert.assertFalse(actual.isPresent()); } else { Assert.assertTrue(actual.isPresent()); Assert.assertEquals(expected, actual.get()); } } }