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.verify;
17 import static org.mockito.Mockito.when;
19 import java.util.List;
21 import org.junit.After;
22 import org.junit.Before;
23 import org.junit.Test;
24 import org.junit.runner.RunWith;
25 import org.mockito.ArgumentCaptor;
26 import org.mockito.Captor;
27 import org.mockito.Mock;
28 import org.mockito.junit.MockitoJUnitRunner;
29 import org.opendaylight.mdsal.binding.api.DataBroker;
30 import org.opendaylight.mdsal.binding.api.DataObjectModification;
31 import org.opendaylight.mdsal.binding.api.DataObjectModification.ModificationType;
32 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
33 import org.opendaylight.mdsal.binding.api.DataTreeModification;
34 import org.opendaylight.mdsal.binding.api.RpcService;
35 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
36 import org.opendaylight.openflowplugin.applications.deviceownershipservice.DeviceOwnershipService;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCase;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlow;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCase;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey;
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.NodeKey;
51 import org.opendaylight.yangtools.concepts.Registration;
52 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
53 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
54 import org.opendaylight.yangtools.yang.common.Uint16;
57 * Test for {@link LLDPPacketPuntEnforcer}.
59 @RunWith(MockitoJUnitRunner.class)
60 public class LLDPDataTreeChangeListenerTest {
61 private static final InstanceIdentifier<Node> NODE_IID = InstanceIdentifier.create(Nodes.class)
62 .child(Node.class, new NodeKey(new NodeId("testnode:1")));
64 private DataBroker dataBroker;
66 private Registration reg;
68 private RpcService rpcService;
70 private AddFlow addFlow;
72 private DataTreeModification<FlowCapableNode> dataTreeModification;
74 private DataObjectModification<FlowCapableNode> dataObjectModification;
76 private DeviceOwnershipService deviceOwnershipService;
78 private ArgumentCaptor<AddFlowInput> addFlowInputCaptor;
80 private LLDPPacketPuntEnforcer lldpPacketPuntEnforcer;
84 doReturn(reg).when(dataBroker).registerTreeChangeListener(any(), any());
85 doReturn(RpcResultBuilder.success().buildFuture()).when(addFlow).invoke(any());
86 doReturn(addFlow).when(rpcService).getRpc(any());
87 lldpPacketPuntEnforcer = new LLDPPacketPuntEnforcer(dataBroker, deviceOwnershipService, rpcService);
88 final DataTreeIdentifier<FlowCapableNode> identifier = DataTreeIdentifier.of(
89 LogicalDatastoreType.OPERATIONAL, NODE_IID.augmentation(FlowCapableNode.class));
90 when(dataTreeModification.getRootPath()).thenReturn(identifier);
91 when(dataTreeModification.getRootNode()).thenReturn(dataObjectModification);
92 when(dataTreeModification.getRootNode().modificationType()).thenReturn(ModificationType.WRITE);
93 when(deviceOwnershipService.isEntityOwned(any())).thenReturn(true);
97 public void tearDown() {
98 lldpPacketPuntEnforcer.close();
102 public void testOnDataTreeChanged() {
103 lldpPacketPuntEnforcer.onDataTreeChanged(List.of(dataTreeModification));
104 verify(addFlow).invoke(addFlowInputCaptor.capture());
105 AddFlowInput captured = addFlowInputCaptor.getValue();
106 assertEquals(NODE_IID, captured.getNode().getValue());
110 public void testCreateFlow() {
111 final Flow flow = LLDPPacketPuntEnforcer.createFlow();
112 final Instructions instructions = flow.getInstructions();
113 final Map<InstructionKey, Instruction> insns = instructions.getInstruction();
114 assertNotNull(insns);
115 assertEquals(1, insns.size());
117 final Instruction instruction = insns.values().iterator().next();
118 assertNotNull(instruction);
120 final var insn = instruction.getInstruction();
121 assertThat(insn, instanceOf(ApplyActionsCase.class));
122 final ApplyActionsCase applyActionsCase = (ApplyActionsCase) insn;
123 assertNotNull(applyActionsCase.getApplyActions().getAction());
124 assertEquals(1, applyActionsCase.getApplyActions().nonnullAction().size());
126 final Action action = applyActionsCase.getApplyActions().nonnullAction().values().iterator().next().getAction();
127 assertThat(action, instanceOf(OutputActionCase.class));
128 final OutputActionCase outputActionCase = (OutputActionCase) action;
129 assertEquals("CONTROLLER", outputActionCase.getOutputAction().getOutputNodeConnector().getValue());
130 assertEquals(Uint16.MAX_VALUE, outputActionCase.getOutputAction().getMaxLength());