import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.MoreExecutors;
+import java.util.Collection;
+import java.util.Collections;
import org.junit.Before;
import org.junit.Test;
+import org.mockito.ArgumentCaptor;
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.DataTreeChangeListener;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
-import org.opendaylight.groupbasedpolicy.renderer.faas.test.DataChangeListenerTester;
+import org.opendaylight.groupbasedpolicy.util.IidFactory;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
import org.opendaylight.yang.gen.v1.urn.opendaylight.faas.faas.endpoint.rev151009.FaasEndpointContext;
import org.opendaylight.yang.gen.v1.urn.opendaylight.faas.faas.endpoint.rev151009.FaasEndpointContextBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoint.fields.L3AddressBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Builder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Prefix;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3PrefixBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.faas.rev151009.mapped.tenants.entities.mapped.entity.MappedEndpoint;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.faas.rev151009.mapped.tenants.entities.mapped.entity.MappedEndpointKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.faas.rev151009.mapped.tenants.entities.mapped.entity.MappedSubnet;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.ResolvedPolicies;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
private static final L2BridgeDomainId L_2_BRIDGE_DOMAIN_ID = new L2BridgeDomainId("L2BridgeDomainId");
private static final MacAddress MAC_ADDRESS = new MacAddress("00:00:00:00:35:02");
- private InstanceIdentifier<Endpoint> epIid;
private FaasEndpointManagerListener listener;
- private TenantId gbpTenantId = new TenantId("gbpTenantId");
- private Uuid faasTenantId = new Uuid("b4511aac-ae43-11e5-bf7f-feff819cdc9f");
- private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
- private DataChangeListenerTester tester;
- private DataBroker dataProvider;
- private FaasPolicyManager faasPolicyManager;
+ private final TenantId gbpTenantId = new TenantId("gbpTenantId");
+ private final Uuid faasTenantId = new Uuid("b4511aac-ae43-11e5-bf7f-feff819cdc9f");
+ private final DataBroker dataProvider = mock(DataBroker.class);
+ private final FaasPolicyManager faasPolicyManager = mock(FaasPolicyManager.class);
@SuppressWarnings("unchecked")
@Before
- public void init() throws ReadFailedException {
- MappedEndpointKey mappedEndpointKey = new MappedEndpointKey(L_2_BRIDGE_DOMAIN_ID, MAC_ADDRESS);
-
- dataProvider = mock(DataBroker.class);
-
- WriteTransaction woTx = mock(WriteTransaction.class);
- ReadWriteTransaction rwTx = mock(ReadWriteTransaction.class);
-
- CheckedFuture<Void, TransactionCommitFailedException> futureVoid = mock(CheckedFuture.class);
- when(woTx.submit()).thenReturn(futureVoid);
- when(rwTx.submit()).thenReturn(futureVoid);
- doNothing().when(woTx).put(any(LogicalDatastoreType.class), any(InstanceIdentifier.class),
- any(DataObject.class));
-
- CheckedFuture<Optional<MappedEndpoint>, ReadFailedException> futureMappedEndpoint = mock(CheckedFuture.class);
- Optional<MappedEndpoint> optMappedEndpoint = mock(Optional.class);
- when(optMappedEndpoint.isPresent()).thenReturn(false);
- when(futureMappedEndpoint.checkedGet()).thenReturn(optMappedEndpoint);
- when(rwTx.read(LogicalDatastoreType.OPERATIONAL,
- FaasIidFactory.mappedEndpointIid(gbpTenantId, mappedEndpointKey))).thenReturn(futureMappedEndpoint);
+ public void init() {
+ doNothing().when(faasPolicyManager).removeTenantLogicalNetwork(gbpTenantId, faasTenantId);
+ doNothing().when(faasPolicyManager).registerTenant(any(TenantId.class), any(EndpointGroupId.class));
- when(dataProvider.newWriteOnlyTransaction()).thenReturn(woTx);
- when(dataProvider.newReadWriteTransaction()).thenReturn(rwTx);
+ listener = new FaasEndpointManagerListener(faasPolicyManager, dataProvider, MoreExecutors.directExecutor());
- epIid = mock(InstanceIdentifier.class);
- faasPolicyManager = spy(new FaasPolicyManager(dataProvider, executor));
- doNothing().when(faasPolicyManager).removeTenantLogicalNetwork(gbpTenantId, faasTenantId);
- listener = new FaasEndpointManagerListener(faasPolicyManager, dataProvider, executor);
- tester = new DataChangeListenerTester(listener);
- tester.setRemovedPath(epIid);
+ doReturn(mock(ListenerRegistration.class)).when(dataProvider).registerDataTreeChangeListener(
+ any(DataTreeIdentifier.class), any(DataTreeChangeListener.class));
}
+ @SuppressWarnings({ "rawtypes", "unchecked" })
@Test
public void testOnDataChanged_Endpoint() {
- Endpoint ep = new EndpointBuilder().setTenant(gbpTenantId)
+ ArgumentCaptor<DataTreeChangeListener> dtclCaptor = ArgumentCaptor.forClass(DataTreeChangeListener.class);
+ verify(dataProvider).registerDataTreeChangeListener(eq(new DataTreeIdentifier<>(
+ LogicalDatastoreType.OPERATIONAL, IidFactory.endpointsIidWildcard().child(Endpoint.class))),
+ dtclCaptor.capture());
+
+ Endpoint endpoint = new EndpointBuilder().setTenant(gbpTenantId)
.setL2Context(L_2_BRIDGE_DOMAIN_ID)
.setMacAddress(MAC_ADDRESS)
+ .setL3Address(Collections.emptyList())
+ .setEndpointGroup(new EndpointGroupId("test"))
+ .addAugmentation(FaasEndpointContext.class, new FaasEndpointContextBuilder().setFaasPortRefId(
+ new Uuid("12345678-ae43-11e5-bf7f-feff819cdc9f")).build())
.build();
- tester.setDataObject(epIid, ep);
- tester.callOnDataChanged();
- listener.executeEvent(tester.getChangeMock());
+
+ dtclCaptor.getValue().onDataTreeChanged(newMockDataTreeModification(null, endpoint,
+ DataObjectModification.ModificationType.WRITE));
+
+ verify(faasPolicyManager).registerTenant(endpoint.getTenant(), endpoint.getEndpointGroup());
}
@Test
assertNull(listener.getFaasSubnetId(ep));
}
- @Test
- public void testOnDataChanged_EndpointL3() {
- EndpointL3 ep = new EndpointL3Builder().setTenant(gbpTenantId)
- .setL2Context(L_2_BRIDGE_DOMAIN_ID)
- .setMacAddress(MAC_ADDRESS)
- .build();
- tester.setDataObject(epIid, ep);
- tester.callOnDataChanged();
- listener.executeEvent(tester.getChangeMock());
- }
-
- @Test
- public void testOnDataChanged_EndpointL3Prefix() {
- EndpointL3Prefix ep = new EndpointL3PrefixBuilder().setTenant(gbpTenantId).build();
- tester.setDataObject(epIid, ep);
- tester.callOnDataChanged();
- listener.executeEvent(tester.getChangeMock());
+ @SuppressWarnings("unchecked")
+ private static <T extends DataObject> Collection<DataTreeModification<T>> newMockDataTreeModification(T dataBefore,
+ T dataAfter, DataObjectModification.ModificationType type) {
+ DataTreeModification<T> mockDataTreeModification = mock(DataTreeModification.class);
+ DataObjectModification<T> mockModification = mock(DataObjectModification.class);
+ doReturn(type).when(mockModification).getModificationType();
+ doReturn(dataBefore).when(mockModification).getDataBefore();
+ doReturn(dataAfter).when(mockModification).getDataAfter();
+ doReturn(mockModification).when(mockDataTreeModification).getRootNode();
+
+ return Collections.singletonList(mockDataTreeModification);
}
-
}