Bump upstreams
[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.mock;
17 import static org.mockito.Mockito.verify;
18 import static org.mockito.Mockito.when;
19
20 import java.util.List;
21 import java.util.Map;
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;
56
57 /**
58  * Test for {@link LLDPPacketPuntEnforcer}.
59  */
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")));
64     @Mock
65     private DataBroker dataBroker;
66     @Mock
67     private Registration reg;
68     @Mock
69     private RpcService rpcService;
70     @Mock
71     private AddFlow addFlow;
72     @Mock
73     private DataTreeModification<FlowCapableNode> dataTreeModification;
74     @Mock
75     private DeviceOwnershipService deviceOwnershipService;
76     @Captor
77     private ArgumentCaptor<AddFlowInput> addFlowInputCaptor;
78
79     private LLDPPacketPuntEnforcer lldpPacketPuntEnforcer;
80
81     @Before
82     public void setUp() {
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);
93     }
94
95     @After
96     public void tearDown() {
97         lldpPacketPuntEnforcer.close();
98     }
99
100     @Test
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());
106     }
107
108     @Test
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());
115
116         final Instruction instruction = insns.values().iterator().next();
117         assertNotNull(instruction);
118
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());
124
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());
130     }
131 }