2 * Copyright (c) 2015 Cisco Systems, Inc. and others. 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
8 package org.opendaylight.openflowplugin.applications.tablemissenforcer;
10 import static org.hamcrest.CoreMatchers.instanceOf;
11 import static org.hamcrest.MatcherAssert.assertThat;
12 import static org.junit.Assert.assertEquals;
13 import static org.junit.Assert.assertNotNull;
14 import static org.mockito.ArgumentMatchers.any;
15 import static org.mockito.Mockito.doReturn;
16 import static org.mockito.Mockito.mock;
17 import static org.mockito.Mockito.verify;
18 import static org.mockito.Mockito.when;
20 import java.util.List;
22 import org.junit.After;
23 import org.junit.Before;
24 import org.junit.Test;
25 import org.junit.runner.RunWith;
26 import org.mockito.ArgumentCaptor;
27 import org.mockito.Captor;
28 import org.mockito.Mock;
29 import org.mockito.junit.MockitoJUnitRunner;
30 import org.opendaylight.mdsal.binding.api.DataBroker;
31 import org.opendaylight.mdsal.binding.api.DataObjectModification;
32 import org.opendaylight.mdsal.binding.api.DataObjectModification.ModificationType;
33 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
34 import org.opendaylight.mdsal.binding.api.DataTreeModification;
35 import org.opendaylight.mdsal.binding.api.RpcService;
36 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
37 import org.opendaylight.openflowplugin.applications.deviceownershipservice.DeviceOwnershipService;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCase;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlow;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCase;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
52 import org.opendaylight.yangtools.concepts.Registration;
53 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
54 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
55 import org.opendaylight.yangtools.yang.common.Uint16;
58 * Test for {@link LLDPPacketPuntEnforcer}.
60 @RunWith(MockitoJUnitRunner.class)
61 public class LLDPDataTreeChangeListenerTest {
62 private static final InstanceIdentifier<Node> NODE_IID = InstanceIdentifier.create(Nodes.class)
63 .child(Node.class, new NodeKey(new NodeId("testnode:1")));
65 private DataBroker dataBroker;
67 private Registration reg;
69 private RpcService rpcService;
71 private AddFlow addFlow;
73 private DataTreeModification<FlowCapableNode> dataTreeModification;
75 private DeviceOwnershipService deviceOwnershipService;
77 private ArgumentCaptor<AddFlowInput> addFlowInputCaptor;
79 private LLDPPacketPuntEnforcer lldpPacketPuntEnforcer;
83 doReturn(reg).when(dataBroker).registerDataTreeChangeListener(any(), any());
84 doReturn(RpcResultBuilder.success().buildFuture()).when(addFlow).invoke(any());
85 doReturn(addFlow).when(rpcService).getRpc(any());
86 lldpPacketPuntEnforcer = new LLDPPacketPuntEnforcer(dataBroker, deviceOwnershipService, rpcService);
87 final DataTreeIdentifier<FlowCapableNode> identifier = DataTreeIdentifier.create(
88 LogicalDatastoreType.OPERATIONAL, NODE_IID.augmentation(FlowCapableNode.class));
89 when(dataTreeModification.getRootPath()).thenReturn(identifier);
90 when(dataTreeModification.getRootNode()).thenReturn(mock(DataObjectModification.class));
91 when(dataTreeModification.getRootNode().modificationType()).thenReturn(ModificationType.WRITE);
92 when(deviceOwnershipService.isEntityOwned(any())).thenReturn(true);
96 public void tearDown() {
97 lldpPacketPuntEnforcer.close();
101 public void testOnDataTreeChanged() {
102 lldpPacketPuntEnforcer.onDataTreeChanged(List.of(dataTreeModification));
103 verify(addFlow).invoke(addFlowInputCaptor.capture());
104 AddFlowInput captured = addFlowInputCaptor.getValue();
105 assertEquals(NODE_IID, captured.getNode().getValue());
109 public void testCreateFlow() {
110 final Flow flow = LLDPPacketPuntEnforcer.createFlow();
111 final Instructions instructions = flow.getInstructions();
112 final Map<InstructionKey, Instruction> insns = instructions.getInstruction();
113 assertNotNull(insns);
114 assertEquals(1, insns.size());
116 final Instruction instruction = insns.values().iterator().next();
117 assertNotNull(instruction);
119 final var insn = instruction.getInstruction();
120 assertThat(insn, instanceOf(ApplyActionsCase.class));
121 final ApplyActionsCase applyActionsCase = (ApplyActionsCase) insn;
122 assertNotNull(applyActionsCase.getApplyActions().getAction());
123 assertEquals(1, applyActionsCase.getApplyActions().nonnullAction().size());
125 final Action action = applyActionsCase.getApplyActions().nonnullAction().values().iterator().next().getAction();
126 assertThat(action, instanceOf(OutputActionCase.class));
127 final OutputActionCase outputActionCase = (OutputActionCase) action;
128 assertEquals("CONTROLLER", outputActionCase.getOutputAction().getOutputNodeConnector().getValue());
129 assertEquals(Uint16.MAX_VALUE, outputActionCase.getOutputAction().getMaxLength());