Fix findbugs violations in openflowjava
[openflowplugin.git] / applications / lldp-speaker / src / test / java / org / opendaylight / openflowplugin / applications / lldpspeaker / LLDPSpeakerTest.java
1 /*
2  * Copyright (c) 2014 Pacnet and others.  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.openflowplugin.applications.lldpspeaker;
10
11 import static org.mockito.Matchers.any;
12 import static org.mockito.Matchers.anyLong;
13 import static org.mockito.Mockito.never;
14 import static org.mockito.Mockito.times;
15 import static org.mockito.Mockito.verify;
16 import static org.mockito.Mockito.verifyNoMoreInteractions;
17 import static org.mockito.Mockito.when;
18
19 import com.google.common.base.Optional;
20 import java.util.concurrent.ScheduledExecutorService;
21 import java.util.concurrent.ScheduledFuture;
22 import java.util.concurrent.TimeUnit;
23 import org.junit.Before;
24 import org.junit.Test;
25 import org.junit.runner.RunWith;
26 import org.mockito.Mock;
27 import org.mockito.runners.MockitoJUnitRunner;
28 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService;
29 import org.opendaylight.mdsal.eos.common.api.EntityOwnershipState;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortNumberUni;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInputBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow.applications.lldp.speaker.rev141023.OperStatus;
43 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
44
45 /**
46  * Tests for {@link LLDPSpeaker}.
47  */
48 @RunWith(MockitoJUnitRunner.class)
49 public class LLDPSpeakerTest {
50     private static final InstanceIdentifier<NodeConnector> ID = TestUtils.createNodeConnectorId("openflow:1",
51             "openflow:1:1");
52     private static final MacAddress MAC_ADDRESS = new MacAddress("01:23:45:67:89:AB");
53     private static final FlowCapableNodeConnector FLOW_CAPABLE_NODE_CONNECTOR =
54             TestUtils.createFlowCapableNodeConnector(MAC_ADDRESS, 1L).build();
55     private static final byte[] LLDP_FRAME = LLDPUtil.buildLldpFrame(new NodeId("openflow:1"),
56             new NodeConnectorId("openflow:1:1"), MAC_ADDRESS, 1L);
57     private static final TransmitPacketInput PACKET_INPUT = new TransmitPacketInputBuilder()
58             .setEgress(new NodeConnectorRef(ID))
59             .setNode(new NodeRef(ID.firstIdentifierOf(Node.class)))
60             .setPayload(LLDP_FRAME).build();
61
62     @Mock
63     private PacketProcessingService packetProcessingService;
64     @Mock
65     private ScheduledExecutorService scheduledExecutorService;
66     @Mock
67     private ScheduledFuture scheduledSpeakerTask;
68     @Mock
69     private EntityOwnershipService entityOwnershipService;
70
71     private final MacAddress destinationMACAddress = null;
72     private LLDPSpeaker lldpSpeaker;
73
74     @Before
75     public void setUp() {
76         when(
77                 scheduledExecutorService.scheduleAtFixedRate(
78                         any(Runnable.class), anyLong(), anyLong(),
79                         any(TimeUnit.class))).thenReturn(scheduledSpeakerTask);
80         lldpSpeaker = new LLDPSpeaker(packetProcessingService,
81                 scheduledExecutorService, destinationMACAddress, entityOwnershipService);
82         when(entityOwnershipService.getOwnershipState(any())).thenReturn(Optional.of(EntityOwnershipState.IS_OWNER));
83         lldpSpeaker.setOperationalStatus(OperStatus.RUN);
84     }
85
86     /**
87      * Test that speaker does nothing when in {@link OperStatus.STANDBY} mode.
88      */
89     @Test
90     public void testStandBy() {
91         lldpSpeaker.setOperationalStatus(OperStatus.STANDBY);
92         // Add node connector - LLDP packet should be transmitted through
93         // packetProcessingService
94         lldpSpeaker.nodeConnectorAdded(ID, FLOW_CAPABLE_NODE_CONNECTOR);
95
96         // Execute one iteration of periodic task - LLDP packet should be
97         // transmitted second time
98         lldpSpeaker.run();
99
100         // Check packet transmission
101         verify(packetProcessingService, times(1)).transmitPacket(PACKET_INPUT);
102         verifyNoMoreInteractions(packetProcessingService);
103     }
104
105     /**
106      * Test that LLDP frame is transmitted after port appeared in inventory and
107      * periodically after that.
108      */
109     @Test
110     public void testNodeConnectorAdd() {
111         // Add node connector - LLDP packet should be transmitted through
112         // packetProcessingService
113         lldpSpeaker.nodeConnectorAdded(ID, FLOW_CAPABLE_NODE_CONNECTOR);
114
115
116         when(entityOwnershipService.getOwnershipState(any()))
117                 .thenReturn(Optional.of(EntityOwnershipState.OWNED_BY_OTHER));
118         // Execute one iteration of periodic task - LLDP packet should be
119         // not transmit second packet because it doesn't own the device.
120         lldpSpeaker.run();
121
122         // Check packet transmission
123         verify(packetProcessingService, times(1)).transmitPacket(PACKET_INPUT);
124         verifyNoMoreInteractions(packetProcessingService);
125     }
126
127     /**
128      * Test that LLDP frame stop to periodically transmit after port disappeared
129      * from inventory.
130      */
131     @Test
132     public void testNodeConnectorRemoval() {
133         // Prepare for test - add node connector first
134         lldpSpeaker.nodeConnectorAdded(ID, FLOW_CAPABLE_NODE_CONNECTOR);
135
136         // Trigger removal of packet
137         lldpSpeaker.nodeConnectorRemoved(ID);
138
139         // Run one iteration of LLDP flood
140         lldpSpeaker.run();
141
142         // Verify that LLDP frame sent only once (by nodeConnectorAdded),
143         // e.g. no flood after removal
144         verify(packetProcessingService, times(1)).transmitPacket(PACKET_INPUT);
145         verifyNoMoreInteractions(packetProcessingService);
146     }
147
148     /**
149      * Test that when {@link LLDPSpeaker#nodeConnectorAdded} is called multiple times
150      * with same arguments, only the first one have effect.
151      */
152     @Test
153     public void testMultipleSameNodeConnectorAddEvents() {
154         // Add node connector - LLDP packet should be transmitted through
155         // packetProcessingService
156         for (int i = 0; i < 10; i++) {
157             lldpSpeaker.nodeConnectorAdded(ID, FLOW_CAPABLE_NODE_CONNECTOR);
158         }
159
160         // Check packet transmission
161         verify(packetProcessingService, times(1)).transmitPacket(PACKET_INPUT);
162         verifyNoMoreInteractions(packetProcessingService);
163     }
164
165     /**
166      * Test that checks if LLDPSpeaker working fine with local ports.
167      */
168     @Test
169     public void testLocalNodeConnectorCreation() {
170         // Call nodeConnectorAdded with local port
171         FlowCapableNodeConnector fcnc = TestUtils
172                 .createFlowCapableNodeConnector()
173                 .setPortNumber(new PortNumberUni("LOCAL")).build();
174         lldpSpeaker.nodeConnectorAdded(ID, fcnc);
175
176         // Verify that nothing happened for local port
177         verify(packetProcessingService, never()).transmitPacket(
178                 any(TransmitPacketInput.class));
179     }
180 }