Fix warnings in table-miss-enforcer
[openflowplugin.git] / applications / table-miss-enforcer / src / test / java / org / opendaylight / openflowplugin / applications / tablemissenforcer / LLDPDataTreeChangeListenerTest.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. 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 package org.opendaylight.openflowplugin.applications.tablemissenforcer;
9
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;
18
19 import java.util.List;
20 import java.util.Map;
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;
55
56 /**
57  * Test for {@link LLDPPacketPuntEnforcer}.
58  */
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")));
63     @Mock
64     private DataBroker dataBroker;
65     @Mock
66     private Registration reg;
67     @Mock
68     private RpcService rpcService;
69     @Mock
70     private AddFlow addFlow;
71     @Mock
72     private DataTreeModification<FlowCapableNode> dataTreeModification;
73     @Mock
74     private DataObjectModification<FlowCapableNode> dataObjectModification;
75     @Mock
76     private DeviceOwnershipService deviceOwnershipService;
77     @Captor
78     private ArgumentCaptor<AddFlowInput> addFlowInputCaptor;
79
80     private LLDPPacketPuntEnforcer lldpPacketPuntEnforcer;
81
82     @Before
83     public void setUp() {
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);
94     }
95
96     @After
97     public void tearDown() {
98         lldpPacketPuntEnforcer.close();
99     }
100
101     @Test
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());
107     }
108
109     @Test
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());
116
117         final Instruction instruction = insns.values().iterator().next();
118         assertNotNull(instruction);
119
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());
125
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());
131     }
132 }