2 * Copyright (c) 2015 Inocybe Technologies. 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
9 package org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertSame;
14 import static org.junit.Assert.assertTrue;
15 import static org.mockito.Matchers.any;
16 import static org.mockito.Matchers.anyString;
17 import static org.mockito.Matchers.eq;
18 import static org.mockito.Matchers.same;
19 import static org.mockito.Mockito.mock;
20 import static org.mockito.Mockito.times;
21 import static org.mockito.Mockito.verify;
22 import static org.mockito.Mockito.when;
24 import java.lang.reflect.Field;
25 import java.util.ArrayList;
26 import java.util.List;
28 import org.junit.Before;
29 import org.junit.Test;
30 import org.junit.runner.RunWith;
31 import org.mockito.InjectMocks;
32 import org.mockito.Mock;
33 import org.mockito.Mockito;
34 import org.mockito.runners.MockitoJUnitRunner;
35 import org.powermock.api.mockito.PowerMockito;
36 import org.powermock.core.classloader.annotations.PrepareForTest;
37 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
38 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
39 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
40 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker;
41 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
42 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
43 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
44 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ConsumerContext;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
51 import org.opendaylight.yangtools.concepts.ListenerRegistration;
52 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
53 import org.opendaylight.neutron.spi.INeutronPortCRUD;
54 import org.opendaylight.neutron.spi.INeutronSubnetCRUD;
55 import org.opendaylight.ovsdb.openstack.netvirt.NeutronCacheUtils;
56 import org.opendaylight.ovsdb.openstack.netvirt.api.Action;
57 import org.opendaylight.ovsdb.openstack.netvirt.api.NodeCacheManager;
58 import org.opendaylight.ovsdb.openstack.netvirt.impl.EventDispatcherImpl;
59 import org.opendaylight.ovsdb.utils.servicehelper.ServiceHelper;
62 * Unit test for {@link MdsalConsumerImpl}
64 @RunWith(MockitoJUnitRunner.class)
65 public class MdsalConsumerImplTest {
67 private MdsalConsumerImpl mdsalConsumer;
70 private DataBroker dataBroker;
73 private ConsumerContext session;
76 private ProviderContext providerSession;
79 private NotificationProviderService notificationService;
84 mdsalConsumer = new MdsalConsumerImpl();
85 dataBroker = Mockito.mock(DataBroker.class);
86 session = Mockito.mock(ConsumerContext.class);
87 providerSession = Mockito.mock(ProviderContext.class);
88 notificationService = Mockito.mock(NotificationProviderService.class);
90 when(session.getSALService(DataBroker.class)).thenReturn(dataBroker);
91 when(providerSession.getSALService(NotificationProviderService.class)).thenReturn(notificationService);
93 //Initialize the Mdsal consumer
94 mdsalConsumer.onSessionInitialized(session);
95 mdsalConsumer.onSessionInitiated(providerSession);
100 * {@link MdsalConsumerImpl#getConsumerContext()}
101 * {@link MdsalConsumerImpl#getDataBroker()}
102 * {@link MdsalConsumerImpl#getNotificationService()}
106 public void InitializationsTests(){
108 assertSame("Error, getConsumerContext - returned context is invalid", session, mdsalConsumer.getConsumerContext());
109 assertSame("Error, getDataBroker - returned broker is invalid", dataBroker, mdsalConsumer.getDataBroker());
110 assertSame("Error, getNotificationService - returned notification service provider is invalid", notificationService, mdsalConsumer.getNotificationService());
115 * Test method {@link MdsalConsumerImpl#notifyFlowCapableNodeCreateEvent(String, Action)}
118 public void notifyFlowCapableNodeCreateEventTest() throws Exception{
120 FlowCapableNodeDataChangeListener nodeChangeListener = (FlowCapableNodeDataChangeListener) getClassField(mdsalConsumer, "flowCapableNodeChangeListener");
122 //Send a notification
123 mdsalConsumer.notifyFlowCapableNodeCreateEvent("flowId1", Action.ADD);
125 List<Node> nodeCache = (List<Node>) getClassField(nodeChangeListener, "nodeCache");
126 assertEquals("Error, notifyFlowCapableNodeEvent() - MdsalConsumerImpl NodeDataChangeLister inventory size after an ADD operation is incorrect", 1, nodeCache.size());
130 * Get the specified field from MdsalConsumerImpl using reflection
131 * @param instancee - the class instance
132 * @param fieldName - the field to retrieve
134 * @return the desired field
136 private Object getClassField(MdsalConsumerImpl instance, String fieldName) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
137 Field field = MdsalConsumerImpl.class.getDeclaredField(fieldName);
138 field.setAccessible(true);
139 return field.get(instance);
143 * Get the specified field from FlowCapableNodeDataChangeListener using reflection
144 * @param instancee - the class instance
145 * @param fieldName - the field to retrieve
147 * @return the desired field
149 private Object getClassField(FlowCapableNodeDataChangeListener instance, String fieldName) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
150 Field field = FlowCapableNodeDataChangeListener.class.getDeclaredField(fieldName);
151 field.setAccessible(true);
152 return field.get(instance);