2 * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.impl.services.sal;
10 import static org.mockito.ArgumentMatchers.any;
11 import static org.mockito.Mockito.verify;
12 import static org.mockito.Mockito.when;
14 import com.google.common.util.concurrent.SettableFuture;
15 import java.util.List;
16 import org.junit.Test;
17 import org.junit.runner.RunWith;
18 import org.mockito.Mock;
19 import org.mockito.junit.MockitoJUnitRunner;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.SendExperimenter;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.SendExperimenterInputBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.AddBundleMessagesInputBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.ControlBundleInputBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.add.bundle.messages.input.MessagesBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.add.bundle.messages.input.messages.Message;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.add.bundle.messages.input.messages.MessageBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.bundle.inner.message.grouping.bundle.inner.message.BundleAddFlowCaseBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.bundle.inner.message.grouping.bundle.inner.message.BundleAddGroupCaseBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.bundle.inner.message.grouping.bundle.inner.message.BundleRemoveFlowCaseBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.bundle.inner.message.grouping.bundle.inner.message.BundleRemoveGroupCaseBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.bundle.inner.message.grouping.bundle.inner.message.BundleUpdateFlowCaseBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.bundle.inner.message.grouping.bundle.inner.message.BundleUpdateGroupCaseBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.bundle.inner.message.grouping.bundle.inner.message.BundleUpdatePortCaseBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.send.experimenter.input.experimenter.message.of.choice.BundleAddMessageSalBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.send.experimenter.input.experimenter.message.of.choice.BundleControlSalBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.send.experimenter.input.experimenter.message.of.choice.bundle.add.message.sal.SalAddMessageDataBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.send.experimenter.input.experimenter.message.of.choice.bundle.control.sal.SalControlDataBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.rev170124.BundleControlType;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.rev170124.BundleFlags;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.rev170124.BundleId;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.rev170124.bundle.common.grouping.BundleProperty;
47 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
48 import org.opendaylight.yangtools.yang.common.Uint32;
50 @RunWith(MockitoJUnitRunner.class)
51 public class SalBundleServiceImplTest {
52 private static final NodeRef NODE_REF = new NodeRef(InstanceIdentifier.create(Nodes.class)
53 .child(Node.class, new NodeKey(new NodeId("openflow:1"))));
54 private static final BundleId BUNDLE_ID = new BundleId(Uint32.ONE);
55 private static final BundleFlags BUNDLE_FLAGS = new BundleFlags(true, false);
58 private SendExperimenter sendExperimenter;
60 private List<BundleProperty> properties;
63 public void testControlBundle() {
64 final var service = new ControlBundleImpl(sendExperimenter);
66 final var input = new ControlBundleInputBuilder()
68 .setBundleId(BUNDLE_ID)
69 .setFlags(BUNDLE_FLAGS)
70 .setType(BundleControlType.ONFBCTOPENREQUEST)
71 .setBundleProperty(properties)
73 when(sendExperimenter.invoke(any())).thenReturn(SettableFuture.create());
74 service.invoke(input);
75 verify(sendExperimenter).invoke(new SendExperimenterInputBuilder()
77 .setExperimenterMessageOfChoice(new BundleControlSalBuilder()
78 .setSalControlData(new SalControlDataBuilder(input).build())
84 public void testAddBundleMessages() {
85 final var service = new AddBundleMessagesImpl(sendExperimenter);
87 final var innerMessages = createMessages();
88 final var messages = new MessagesBuilder().setMessage(innerMessages).build();
89 final var input = new AddBundleMessagesInputBuilder()
91 .setBundleId(BUNDLE_ID)
92 .setFlags(BUNDLE_FLAGS)
93 .setBundleProperty(properties)
94 .setMessages(messages)
96 final var dataBuilder = new SalAddMessageDataBuilder();
97 dataBuilder.setBundleId(BUNDLE_ID).setFlags(BUNDLE_FLAGS).setBundleProperty(properties);
99 final var addMessageBuilder = new BundleAddMessageSalBuilder();
100 final var experimenterBuilder = new SendExperimenterInputBuilder()
102 when(sendExperimenter.invoke(any())).thenReturn(SettableFuture.create());
103 service.invoke(input);
104 for (var msg : innerMessages) {
105 verify(sendExperimenter).invoke(experimenterBuilder
106 .setExperimenterMessageOfChoice(addMessageBuilder
107 .setSalAddMessageData(
108 dataBuilder.setNode(NODE_REF).setBundleInnerMessage(
109 msg.getBundleInnerMessage())
116 private static List<Message> createMessages() {
117 final var builder = new MessageBuilder().setNode(NODE_REF);
119 builder.setBundleInnerMessage(new BundleAddFlowCaseBuilder().build()).build(),
120 builder.setBundleInnerMessage(new BundleUpdateFlowCaseBuilder().build()).build(),
121 builder.setBundleInnerMessage(new BundleRemoveFlowCaseBuilder().build()).build(),
122 builder.setBundleInnerMessage(new BundleAddGroupCaseBuilder().build()).build(),
123 builder.setBundleInnerMessage(new BundleUpdateGroupCaseBuilder().build()).build(),
124 builder.setBundleInnerMessage(new BundleRemoveGroupCaseBuilder().build()).build(),
125 builder.setBundleInnerMessage(new BundleUpdatePortCaseBuilder().build()).build());