Merge "Bug 6366 - of-switch-config-pusher - DTCL instead of DTL"
[openflowplugin.git] / openflowplugin-impl / src / test / java / org / opendaylight / openflowplugin / impl / util / GroupUtilTest.java
1 /*
2  * Copyright (c) 2016 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
9 package org.opendaylight.openflowplugin.impl.util;
10
11 import static org.junit.Assert.assertEquals;
12
13 import com.google.common.base.Function;
14 import com.google.common.collect.Lists;
15 import java.util.Collections;
16 import java.util.List;
17 import org.apache.commons.lang3.tuple.Pair;
18 import org.junit.Assert;
19 import org.junit.Test;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupRef;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.AddGroupsBatchOutput;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.AddGroupsBatchOutputBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.BatchGroupOutputListGrouping;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.batch.group.output.list.grouping.BatchFailedGroupsOutput;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.batch.group.output.list.grouping.BatchFailedGroupsOutputBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ActionType;
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
39 /**
40  * Test for {@link GroupUtil}.
41  */
42 public class GroupUtilTest {
43
44     public static final NodeId DUMMY_NODE_ID = new NodeId("dummyNodeId");
45     private static final GroupId DUMMY_GROUP_ID = new GroupId(42L);
46     private static final GroupId DUMMY_GROUP_ID_2 = new GroupId(43L);
47     private static final Long GROUP_ACTION_BITMAP = 0b00000000000000000000000000000000000001111111111111001100000000001L;
48
49     @Test
50     public void testBuildGroupPath() throws Exception {
51         final InstanceIdentifier<Node> nodePath = InstanceIdentifier
52                 .create(Nodes.class)
53                 .child(Node.class, new NodeKey(DUMMY_NODE_ID));
54
55         final GroupRef groupRef = GroupUtil.buildGroupPath(nodePath, DUMMY_GROUP_ID);
56         final InstanceIdentifier<?> groupRefValue = groupRef.getValue();
57         Assert.assertEquals(DUMMY_NODE_ID, groupRefValue.firstKeyOf(Node.class).getId());
58         Assert.assertEquals(DUMMY_GROUP_ID, groupRefValue.firstKeyOf(Group.class).getGroupId());
59     }
60
61     @Test
62     public void testCreateCumulatingFunction() throws Exception {
63         final Function<List<RpcResult<String>>, RpcResult<List<BatchFailedGroupsOutput>>> function =
64                 GroupUtil.createCumulatingFunction(Lists.newArrayList(createBatchGroup(DUMMY_GROUP_ID),
65                         createBatchGroup(DUMMY_GROUP_ID_2)));
66
67         final RpcResult<List<BatchFailedGroupsOutput>> summary = function.apply(Lists.newArrayList(
68                 RpcResultBuilder.success("a").build(),
69                 RpcResultBuilder.<String>failed()
70                         .withError(RpcError.ErrorType.APPLICATION, "action-failed reason")
71                         .build()));
72
73         Assert.assertFalse(summary.isSuccessful());
74         Assert.assertEquals(1, summary.getResult().size());
75         Assert.assertEquals(1, summary.getErrors().size());
76         Assert.assertEquals(DUMMY_GROUP_ID_2, summary.getResult().get(0).getGroupId());
77         Assert.assertEquals(1, summary.getResult().get(0).getBatchOrder().intValue());
78     }
79
80     protected Group createBatchGroup(final GroupId groupId) {
81         return new GroupBuilder().setGroupId(groupId).build();
82     }
83
84     @Test
85     public void testGROUP_ADD_TRANSFORM__failure() throws Exception {
86         final RpcResult<List<BatchFailedGroupsOutput>> input = createBatchOutcomeWithError();
87         checkBatchErrorOutcomeTransformation(GroupUtil.GROUP_ADD_TRANSFORM.apply(input));
88     }
89
90     @Test
91     public void testGROUP_ADD_TRANSFORM__success() throws Exception {
92         final RpcResult<List<BatchFailedGroupsOutput>> input = createEmptyBatchOutcome();
93         checkBatchSuccessOutcomeTransformation(GroupUtil.GROUP_ADD_TRANSFORM.apply(input));
94     }
95
96     @Test
97     public void testGROUP_REMOVE_TRANSFORM__failure() throws Exception {
98         final RpcResult<List<BatchFailedGroupsOutput>> input = createBatchOutcomeWithError();
99         checkBatchErrorOutcomeTransformation(GroupUtil.GROUP_REMOVE_TRANSFORM.apply(input));
100     }
101
102     @Test
103     public void testFLOW_REMOVE_TRANSFORM__success() throws Exception {
104         final RpcResult<List<BatchFailedGroupsOutput>> input = createEmptyBatchOutcome();
105         checkBatchSuccessOutcomeTransformation(GroupUtil.GROUP_REMOVE_TRANSFORM.apply(input));
106     }
107
108     @Test
109     public void testFLOW_UPDATE_TRANSFORM__failure() throws Exception {
110         final RpcResult<List<BatchFailedGroupsOutput>> input = createBatchOutcomeWithError();
111         checkBatchErrorOutcomeTransformation(GroupUtil.GROUP_UPDATE_TRANSFORM.apply(input));
112     }
113
114     @Test
115     public void testFLOW_UPDATE_TRANSFORM__success() throws Exception {
116         final RpcResult<List<BatchFailedGroupsOutput>> input = createEmptyBatchOutcome();
117         checkBatchSuccessOutcomeTransformation(GroupUtil.GROUP_UPDATE_TRANSFORM.apply(input));
118     }
119
120     private <T extends BatchGroupOutputListGrouping> void checkBatchSuccessOutcomeTransformation(final RpcResult<T> output) {
121         Assert.assertTrue(output.isSuccessful());
122         Assert.assertEquals(0, output.getResult().getBatchFailedGroupsOutput().size());
123         Assert.assertEquals(0, output.getErrors().size());
124     }
125
126     private RpcResult<List<BatchFailedGroupsOutput>> createEmptyBatchOutcome() {
127         return RpcResultBuilder
128                 .<List<BatchFailedGroupsOutput>>success(Collections.<BatchFailedGroupsOutput>emptyList())
129                 .build();
130     }
131
132     private RpcResult<List<BatchFailedGroupsOutput>> createBatchOutcomeWithError() {
133         return RpcResultBuilder.<List<BatchFailedGroupsOutput>>failed()
134                 .withError(RpcError.ErrorType.APPLICATION, "ut-flowAddFail")
135                 .withResult(Collections.singletonList(new BatchFailedGroupsOutputBuilder()
136                         .setGroupId(DUMMY_GROUP_ID)
137                         .build()))
138                 .build();
139     }
140
141     private <T extends BatchGroupOutputListGrouping> void checkBatchErrorOutcomeTransformation(final RpcResult<T> output) {
142         Assert.assertFalse(output.isSuccessful());
143         Assert.assertEquals(1, output.getResult().getBatchFailedGroupsOutput().size());
144         Assert.assertEquals(DUMMY_GROUP_ID, output.getResult().getBatchFailedGroupsOutput().get(0).getGroupId());
145
146         Assert.assertEquals(1, output.getErrors().size());
147     }
148
149     @Test
150     public void testCreateComposingFunction_success_success() throws Exception {
151         final Function<Pair<RpcResult<AddGroupsBatchOutput>, RpcResult<Void>>, RpcResult<AddGroupsBatchOutput>> compositeFunction =
152                 GroupUtil.createComposingFunction();
153
154         final RpcResult<AddGroupsBatchOutput> addGroupBatchOutput = createAddGroupsBatchSuccessOutput();
155         final RpcResult<Void> barrierOutput = RpcResultBuilder.<Void>success().build();
156         final Pair<RpcResult<AddGroupsBatchOutput>, RpcResult<Void>> input = Pair.of(addGroupBatchOutput, barrierOutput);
157         final RpcResult<AddGroupsBatchOutput> composite = compositeFunction.apply(input);
158
159         Assert.assertTrue(composite.isSuccessful());
160         Assert.assertEquals(0, composite.getErrors().size());
161         Assert.assertEquals(0, composite.getResult().getBatchFailedGroupsOutput().size());
162     }
163
164     @Test
165     public void testCreateComposingFunction_failure_success() throws Exception {
166         final Function<Pair<RpcResult<AddGroupsBatchOutput>, RpcResult<Void>>, RpcResult<AddGroupsBatchOutput>> compositeFunction =
167                 GroupUtil.createComposingFunction();
168
169         final RpcResult<AddGroupsBatchOutput> addGroupBatchOutput = createAddGroupsBatchFailureOutcome();
170         final RpcResult<Void> barrierOutput = RpcResultBuilder.<Void>success().build();
171         final Pair<RpcResult<AddGroupsBatchOutput>, RpcResult<Void>> input = Pair.of(addGroupBatchOutput, barrierOutput);
172         final RpcResult<AddGroupsBatchOutput> composite = compositeFunction.apply(input);
173
174         Assert.assertFalse(composite.isSuccessful());
175         Assert.assertEquals(1, composite.getErrors().size());
176         Assert.assertEquals(1, composite.getResult().getBatchFailedGroupsOutput().size());
177     }
178
179     @Test
180     public void testCreateComposingFunction_success_failure() throws Exception {
181         final Function<Pair<RpcResult<AddGroupsBatchOutput>, RpcResult<Void>>, RpcResult<AddGroupsBatchOutput>> compositeFunction =
182                 GroupUtil.createComposingFunction();
183
184         final RpcResult<AddGroupsBatchOutput> addGroupBatchOutput = createAddGroupsBatchSuccessOutput();
185         final RpcResult<Void> barrierOutput = createBarrierFailureOutcome();
186         final Pair<RpcResult<AddGroupsBatchOutput>, RpcResult<Void>> input = Pair.of(addGroupBatchOutput, barrierOutput);
187         final RpcResult<AddGroupsBatchOutput> composite = compositeFunction.apply(input);
188
189         Assert.assertFalse(composite.isSuccessful());
190         Assert.assertEquals(1, composite.getErrors().size());
191         Assert.assertEquals(0, composite.getResult().getBatchFailedGroupsOutput().size());
192     }
193
194     @Test
195     public void testCreateComposingFunction_failure_failure() throws Exception {
196         final Function<Pair<RpcResult<AddGroupsBatchOutput>, RpcResult<Void>>, RpcResult<AddGroupsBatchOutput>> compositeFunction =
197                 GroupUtil.createComposingFunction();
198
199         final RpcResult<AddGroupsBatchOutput> addGroupBatchOutput = createAddGroupsBatchFailureOutcome();
200         final RpcResult<Void> barrierOutput = createBarrierFailureOutcome();
201         final Pair<RpcResult<AddGroupsBatchOutput>, RpcResult<Void>> input = Pair.of(addGroupBatchOutput, barrierOutput);
202         final RpcResult<AddGroupsBatchOutput> composite = compositeFunction.apply(input);
203
204         Assert.assertFalse(composite.isSuccessful());
205         Assert.assertEquals(2, composite.getErrors().size());
206         Assert.assertEquals(1, composite.getResult().getBatchFailedGroupsOutput().size());
207     }
208
209     @Test
210     public void testExtractGroupActionsSupportBitmap() {
211         ActionType actionSupported = new ActionType(true,true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true);
212         final List<Long> groupActionsSupportBitmap = GroupUtil.extractGroupActionsSupportBitmap(Lists.newArrayList(actionSupported));
213         assertEquals(1, groupActionsSupportBitmap.size());
214         final Long bitmap = groupActionsSupportBitmap.get(0);
215         assertEquals(GROUP_ACTION_BITMAP, bitmap);
216     }
217
218     private RpcResult<Void> createBarrierFailureOutcome() {
219         return RpcResultBuilder.<Void>failed()
220                 .withError(RpcError.ErrorType.APPLICATION, "ut-barrier-error")
221                 .build();
222     }
223
224     private RpcResult<AddGroupsBatchOutput> createAddGroupsBatchSuccessOutput() {
225         return RpcResultBuilder
226                 .success(new AddGroupsBatchOutputBuilder()
227                         .setBatchFailedGroupsOutput(Collections.<BatchFailedGroupsOutput>emptyList())
228                         .build())
229                 .build();
230     }
231
232     private RpcResult<AddGroupsBatchOutput> createAddGroupsBatchFailureOutcome() {
233         final RpcResult<List<BatchFailedGroupsOutput>> batchOutcomeWithError = createBatchOutcomeWithError();
234         return RpcResultBuilder.<AddGroupsBatchOutput>failed()
235                 .withResult(new AddGroupsBatchOutputBuilder()
236                         .setBatchFailedGroupsOutput(batchOutcomeWithError.getResult())
237                         .build())
238                 .withRpcErrors(batchOutcomeWithError.getErrors())
239                 .build();
240     }
241 }