Merge changes Ifb9ee4a4,Id0a7512b
[netvirt.git] / openstack / net-virt-providers / src / test / java / org / opendaylight / ovsdb / openstack / netvirt / providers / openflow13 / MdsalConsumerImplTest.java
1 /*
2  * Copyright (c) 2015 Inocybe Technologies.  All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13;
10
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;
23
24 import java.lang.reflect.Field;
25 import java.util.ArrayList;
26 import java.util.List;
27
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;
60
61 /**
62  * Unit test for {@link MdsalConsumerImpl}
63  */
64 @RunWith(MockitoJUnitRunner.class)
65 public class MdsalConsumerImplTest {
66
67     private MdsalConsumerImpl mdsalConsumer;
68
69     @Mock
70     private DataBroker dataBroker;
71
72     @Mock
73     private ConsumerContext session;
74
75     @Mock
76     private ProviderContext providerSession;
77
78     @Mock
79     private NotificationProviderService notificationService;
80
81     @Before
82     public void setUp(){
83
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);
89
90         when(session.getSALService(DataBroker.class)).thenReturn(dataBroker);
91         when(providerSession.getSALService(NotificationProviderService.class)).thenReturn(notificationService);
92
93         //Initialize the Mdsal consumer
94         mdsalConsumer.onSessionInitialized(session);
95         mdsalConsumer.onSessionInitiated(providerSession);
96     }
97
98     /**
99      * Test method for
100      *          {@link MdsalConsumerImpl#getConsumerContext()}
101      *          {@link MdsalConsumerImpl#getDataBroker()}
102      *          {@link MdsalConsumerImpl#getNotificationService()}
103      *
104      */
105     @Test
106     public void InitializationsTests(){
107
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());
111
112     }
113
114     /**
115      * Test method {@link MdsalConsumerImpl#notifyFlowCapableNodeCreateEvent(String, Action)}
116      */
117     @Test
118     public void notifyFlowCapableNodeCreateEventTest() throws Exception{
119
120         FlowCapableNodeDataChangeListener nodeChangeListener = (FlowCapableNodeDataChangeListener) getClassField(mdsalConsumer, "flowCapableNodeChangeListener");
121
122         //Send a notification
123         mdsalConsumer.notifyFlowCapableNodeCreateEvent("flowId1", Action.ADD);
124
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());
127     }
128
129     /**
130      * Get the specified field from MdsalConsumerImpl using reflection
131      * @param instancee - the class instance
132      * @param fieldName - the field to retrieve
133      *
134      * @return the desired field
135      */
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);
140     }
141
142     /**
143      * Get the specified field from FlowCapableNodeDataChangeListener using reflection
144      * @param instancee - the class instance
145      * @param fieldName - the field to retrieve
146      *
147      * @return the desired field
148      */
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);
153     }
154
155 }