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
9 package org.opendaylight.openflowplugin.impl.util;
11 import com.google.common.collect.Lists;
12 import java.util.Collections;
13 import java.util.List;
14 import java.util.function.Function;
15 import org.apache.commons.lang3.tuple.Pair;
16 import org.junit.Assert;
17 import org.junit.Test;
18 import org.mockito.Mockito;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrierOutput;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowRef;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.AddFlowsBatchOutput;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.AddFlowsBatchOutputBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.BatchFlowIdGrouping;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.BatchFlowOutputListGrouping;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.batch.flow.output.list.grouping.BatchFailedFlowsOutput;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flows.service.rev160314.batch.flow.output.list.grouping.BatchFailedFlowsOutputBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
34 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
35 import org.opendaylight.yangtools.yang.common.RpcError;
36 import org.opendaylight.yangtools.yang.common.RpcResult;
37 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
38 import org.opendaylight.yangtools.yang.common.Uint8;
40 public class FlowUtilTest {
41 public static final NodeId DUMMY_NODE_ID = new NodeId("dummyNodeId");
42 public static final FlowId DUMMY_FLOW_ID = new FlowId("dummyFlowId");
43 public static final FlowId DUMMY_FLOW_ID_2 = new FlowId("dummyFlowId_2");
44 public static final Uint8 DUMMY_TABLE_ID = Uint8.ONE;
47 public void testBuildFlowPath() {
48 final InstanceIdentifier<Node> nodePath = InstanceIdentifier
50 .child(Node.class, new NodeKey(DUMMY_NODE_ID));
52 final FlowRef flowRef = FlowUtil.buildFlowPath(nodePath, DUMMY_TABLE_ID, DUMMY_FLOW_ID);
53 final InstanceIdentifier<?> flowRefValue = flowRef.getValue();
54 Assert.assertEquals(DUMMY_NODE_ID, flowRefValue.firstKeyOf(Node.class).getId());
55 Assert.assertEquals(DUMMY_TABLE_ID, flowRefValue.firstKeyOf(Table.class).getId());
56 Assert.assertEquals(DUMMY_FLOW_ID, flowRefValue.firstKeyOf(Flow.class).getId());
60 public void testCreateCumulatingFunction() {
61 final Function<List<RpcResult<String>>, RpcResult<List<BatchFailedFlowsOutput>>> function =
62 FlowUtil.createCumulatingFunction(Lists.newArrayList(createBatchFlowIdGrouping(DUMMY_FLOW_ID),
63 createBatchFlowIdGrouping(DUMMY_FLOW_ID_2)));
65 final RpcResult<List<BatchFailedFlowsOutput>> summary = function.apply(Lists.newArrayList(
66 RpcResultBuilder.success("a").build(),
67 RpcResultBuilder.<String>failed()
68 .withError(RpcError.ErrorType.APPLICATION, "action-failed reason")
71 Assert.assertFalse(summary.isSuccessful());
72 Assert.assertEquals(1, summary.getResult().size());
73 Assert.assertEquals(1, summary.getErrors().size());
74 Assert.assertEquals(DUMMY_FLOW_ID_2, summary.getResult().get(0).getFlowId());
75 Assert.assertEquals(1, summary.getResult().get(0).getBatchOrder().intValue());
78 protected BatchFlowIdGrouping createBatchFlowIdGrouping(final FlowId flowId) {
79 final BatchFlowIdGrouping mock = Mockito.mock(BatchFlowIdGrouping.class);
80 Mockito.when(mock.getFlowId()).thenReturn(flowId);
85 public void testFlowAddTransformFailure() {
86 final RpcResult<List<BatchFailedFlowsOutput>> input = createBatchOutcomeWithError();
87 checkBatchErrorOutcomeTransformation(FlowUtil.FLOW_ADD_TRANSFORM.apply(input));
91 public void testFlowAddTransformSuccess() {
92 final RpcResult<List<BatchFailedFlowsOutput>> input = createEmptyBatchOutcome();
93 checkBatchSuccessOutcomeTransformation(FlowUtil.FLOW_ADD_TRANSFORM.apply(input));
97 public void testFlowRemoveTransformFailure() {
98 final RpcResult<List<BatchFailedFlowsOutput>> input = createBatchOutcomeWithError();
99 checkBatchErrorOutcomeTransformation(FlowUtil.FLOW_REMOVE_TRANSFORM.apply(input));
103 public void testFlowRemoveTransformSuccess() {
104 final RpcResult<List<BatchFailedFlowsOutput>> input = createEmptyBatchOutcome();
105 checkBatchSuccessOutcomeTransformation(FlowUtil.FLOW_REMOVE_TRANSFORM.apply(input));
109 public void testFlowUpdateTransformFailure() {
110 final RpcResult<List<BatchFailedFlowsOutput>> input = createBatchOutcomeWithError();
111 checkBatchErrorOutcomeTransformation(FlowUtil.FLOW_UPDATE_TRANSFORM.apply(input));
115 public void testFlowUpdateTransformSuccess() {
116 final RpcResult<List<BatchFailedFlowsOutput>> input = createEmptyBatchOutcome();
117 checkBatchSuccessOutcomeTransformation(FlowUtil.FLOW_UPDATE_TRANSFORM.apply(input));
120 private <T extends BatchFlowOutputListGrouping> void checkBatchSuccessOutcomeTransformation(
121 final RpcResult<T> output) {
122 Assert.assertTrue(output.isSuccessful());
123 Assert.assertEquals(0, output.getResult().getBatchFailedFlowsOutput().size());
124 Assert.assertEquals(0, output.getErrors().size());
127 private RpcResult<List<BatchFailedFlowsOutput>> createEmptyBatchOutcome() {
128 return RpcResultBuilder
129 .success(Collections.<BatchFailedFlowsOutput>emptyList())
133 private RpcResult<List<BatchFailedFlowsOutput>> createBatchOutcomeWithError() {
134 return RpcResultBuilder.<List<BatchFailedFlowsOutput>>failed()
135 .withError(RpcError.ErrorType.APPLICATION, "ut-flowAddFail")
136 .withResult(Collections.singletonList(new BatchFailedFlowsOutputBuilder()
137 .setFlowId(DUMMY_FLOW_ID)
142 private <T extends BatchFlowOutputListGrouping> void checkBatchErrorOutcomeTransformation(
143 final RpcResult<T> output) {
144 Assert.assertFalse(output.isSuccessful());
145 Assert.assertEquals(1, output.getResult().getBatchFailedFlowsOutput().size());
146 Assert.assertEquals(DUMMY_FLOW_ID, output.getResult().getBatchFailedFlowsOutput().get(0).getFlowId());
148 Assert.assertEquals(1, output.getErrors().size());
152 public void testCreateComposingFunction_success_success() {
153 final Function<Pair<RpcResult<AddFlowsBatchOutput>, RpcResult<SendBarrierOutput>>,
154 RpcResult<AddFlowsBatchOutput>> compositeFunction = FlowUtil.createComposingFunction();
156 final RpcResult<AddFlowsBatchOutput> addFlowBatchOutput = createAddFlowsBatchSuccessOutput();
157 final RpcResult<SendBarrierOutput> barrierOutput = RpcResultBuilder.<SendBarrierOutput>success().build();
158 final Pair<RpcResult<AddFlowsBatchOutput>, RpcResult<SendBarrierOutput>> input
159 = Pair.of(addFlowBatchOutput, barrierOutput);
160 final RpcResult<AddFlowsBatchOutput> composite = compositeFunction.apply(input);
162 Assert.assertTrue(composite.isSuccessful());
163 Assert.assertEquals(0, composite.getErrors().size());
164 Assert.assertEquals(0, composite.getResult().getBatchFailedFlowsOutput().size());
168 public void testCreateComposingFunction_failure_success() {
169 final Function<Pair<RpcResult<AddFlowsBatchOutput>, RpcResult<SendBarrierOutput>>,
170 RpcResult<AddFlowsBatchOutput>> compositeFunction = FlowUtil.createComposingFunction();
172 final RpcResult<AddFlowsBatchOutput> addFlowBatchOutput = createAddFlowsBatchFailureOutcome();
173 final RpcResult<SendBarrierOutput> barrierOutput = RpcResultBuilder.<SendBarrierOutput>success().build();
174 final Pair<RpcResult<AddFlowsBatchOutput>, RpcResult<SendBarrierOutput>> input
175 = Pair.of(addFlowBatchOutput, barrierOutput);
176 final RpcResult<AddFlowsBatchOutput> composite = compositeFunction.apply(input);
178 Assert.assertFalse(composite.isSuccessful());
179 Assert.assertEquals(1, composite.getErrors().size());
180 Assert.assertEquals(1, composite.getResult().getBatchFailedFlowsOutput().size());
184 public void testCreateComposingFunction_success_failure() {
185 final Function<Pair<RpcResult<AddFlowsBatchOutput>, RpcResult<SendBarrierOutput>>,
186 RpcResult<AddFlowsBatchOutput>> compositeFunction = FlowUtil.createComposingFunction();
188 final RpcResult<AddFlowsBatchOutput> addFlowBatchOutput = createAddFlowsBatchSuccessOutput();
189 final RpcResult<SendBarrierOutput> barrierOutput = createBarrierFailureOutcome();
190 final Pair<RpcResult<AddFlowsBatchOutput>, RpcResult<SendBarrierOutput>> input
191 = Pair.of(addFlowBatchOutput, barrierOutput);
192 final RpcResult<AddFlowsBatchOutput> composite = compositeFunction.apply(input);
194 Assert.assertFalse(composite.isSuccessful());
195 Assert.assertEquals(1, composite.getErrors().size());
196 Assert.assertEquals(0, composite.getResult().getBatchFailedFlowsOutput().size());
200 public void testCreateComposingFunction_failure_failure() {
201 final Function<Pair<RpcResult<AddFlowsBatchOutput>, RpcResult<SendBarrierOutput>>,
202 RpcResult<AddFlowsBatchOutput>> compositeFunction = FlowUtil.createComposingFunction();
204 final RpcResult<AddFlowsBatchOutput> addFlowBatchOutput = createAddFlowsBatchFailureOutcome();
205 final RpcResult<SendBarrierOutput> barrierOutput = createBarrierFailureOutcome();
206 final Pair<RpcResult<AddFlowsBatchOutput>, RpcResult<SendBarrierOutput>> input
207 = Pair.of(addFlowBatchOutput, barrierOutput);
208 final RpcResult<AddFlowsBatchOutput> composite = compositeFunction.apply(input);
210 Assert.assertFalse(composite.isSuccessful());
211 Assert.assertEquals(2, composite.getErrors().size());
212 Assert.assertEquals(1, composite.getResult().getBatchFailedFlowsOutput().size());
215 private RpcResult<SendBarrierOutput> createBarrierFailureOutcome() {
216 return RpcResultBuilder.<SendBarrierOutput>failed()
217 .withError(RpcError.ErrorType.APPLICATION, "ut-barrier-error")
221 private RpcResult<AddFlowsBatchOutput> createAddFlowsBatchSuccessOutput() {
222 return RpcResultBuilder
223 .success(new AddFlowsBatchOutputBuilder()
224 .setBatchFailedFlowsOutput(Collections.emptyList())
229 private RpcResult<AddFlowsBatchOutput> createAddFlowsBatchFailureOutcome() {
230 final RpcResult<List<BatchFailedFlowsOutput>> batchOutcomeWithError = createBatchOutcomeWithError();
231 return RpcResultBuilder.<AddFlowsBatchOutput>failed()
232 .withResult(new AddFlowsBatchOutputBuilder()
233 .setBatchFailedFlowsOutput(batchOutcomeWithError.getResult())
235 .withRpcErrors(batchOutcomeWithError.getErrors())