Merge "delete all .class files" into stable/beryllium
[nemo.git] / nemo-impl / src / test / java / org / opendaylight / nemo / user / vnspacemanager / structurestyle / updateintent / UpdateOperationTest.java
1 /*
2  * Copyright (c) 2016 Huawei, 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.nemo.user.vnspacemanager.structurestyle.updateintent;
9
10 import junit.framework.TestCase;
11 import org.junit.Assert;
12 import org.junit.Before;
13 import org.junit.Test;
14 import com.google.common.base.Function;
15 import com.google.common.base.Optional;
16 import com.google.common.collect.Maps;
17 import com.google.common.util.concurrent.CheckedFuture;
18 import com.google.common.util.concurrent.FutureCallback;
19 import com.google.common.util.concurrent.Futures;
20 import com.google.common.util.concurrent.ListenableFuture;
21 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
22 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
23 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
24 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
25 import org.opendaylight.nemo.user.vnspacemanager.languagestyle.NEMOConstants;
26 import org.opendaylight.nemo.user.vnspacemanager.languagestyle.NEMOParse.NEMOparserConstants;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.*;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.RegisterUserInput;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.Users;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.Objects;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.Operations;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.TemplateDefinitions;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.TemplateInstances;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.*;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.operations.Operation;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.operations.OperationKey;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.template.definitions.TemplateDefinition;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.template.definitions.TemplateDefinitionKey;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.template.instances.TemplateInstance;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.template.instances.TemplateInstanceKey;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.User;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.UserBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.UserKey;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.user.rev151010.UserRoles;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.condition.instance.ConditionSegment.ConditionParameterMatchPattern;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.user.rev151010.user.roles.UserRole;
47 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
48 import org.slf4j.Logger;
49 import org.slf4j.LoggerFactory;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.ConditionParameterName;
51 import java.lang.reflect.Field;
52 import java.util.*;
53 import java.util.concurrent.ExecutionException;
54 import static org.junit.Assert.*;
55 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
56 import org.opendaylight.nemo.user.tenantmanager.TenantManage;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.OperationName;
58 import org.opendaylight.nemo.user.vnspacemanager.languagestyle.NEMOConstants;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.*;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.operations.Operation;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.definitions.ActionDefinition;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.instance.ParameterValues;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.condition.instance.ConditionSegment;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.condition.instance.condition.segment.ConditionParameterTargetValue;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.condition.parameter.definitions.ConditionParameterDefinition;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.condition.parameter.definitions.condition.parameter.definition.ParameterMatchPatterns;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.operation.instance.Action;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.ObjectId;
69 import java.lang.reflect.Method;
70 import java.util.Map;
71 import static org.mockito.Mockito.*;
72 /**
73  * Created by zhangmeng on 2016/1/13.
74  */
75 public class UpdateOperationTest extends TestCase {
76     private DataBroker dataBroker;
77     private TenantManage tenantManage;
78     private UpdateOperation updateOperation;
79     private Class<UpdateOperation> class1;
80     private Field field_getDefinitions;
81     private Field field_valueCheck;
82     @Before
83     public void setUp() throws Exception {
84         class1 = UpdateOperation.class;
85         field_getDefinitions = class1.getDeclaredField("getDefinitions");
86         field_getDefinitions.setAccessible(true);
87         field_valueCheck = class1.getDeclaredField("valueCheck");
88         field_valueCheck.setAccessible(true);
89
90         dataBroker = mock(DataBroker.class);
91         tenantManage = mock(TenantManage.class);
92
93         updateOperation = new UpdateOperation(dataBroker,tenantManage);
94     }
95
96     @Test
97     public void testOperationHandling() throws Exception {
98         UserId userId = mock(UserId.class);
99         Operation operation = mock(Operation.class);
100         GetDefinitions getDefinitions = mock(GetDefinitions.class);
101
102
103         field_getDefinitions.set(updateOperation, getDefinitions);
104
105         //get into method "checkDefinition" arg(operation)
106         ////get into method "checkAction" arg(operation)
107         when(operation.getAction())
108                 .thenReturn(mock(List.class))
109                 .thenReturn(null);
110         when(getDefinitions.getActionDefinition()).thenReturn(null);
111         ////get into method "checkCondition" arg(operation)
112         when(operation.getConditionSegment())
113                 .thenReturn(mock(List.class))
114                 .thenReturn(null);
115         when(getDefinitions.getConditionParameterDefinition()).thenReturn(null);
116
117         //get into method "checkInstance" arg(userId,operation)
118         when(operation.getPriority()).thenReturn(null);
119         Assert.assertTrue(updateOperation.OperationHandling(userId, operation).equals("The priority should not be empty."));
120     }
121
122     @Test
123     public void testCheckInstance() throws Exception {
124         Method method = class1.getDeclaredMethod("checkInstance", new Class[]{
125                 UserId.class,
126                 Operation.class
127         });
128         method.setAccessible(true);
129
130         UserId userId = mock(UserId.class);
131         ObjectId objectId = mock(ObjectId.class);
132         Operation operation = mock(Operation.class);
133         Operation operation1 = mock(Operation.class);
134         Map<NodeId, Node> nodeMap = mock(Map.class);
135         Map<FlowId,Flow> flowMap = mock(Map.class);
136         Map<ConnectionId, Connection> connectionMap = mock(Map.class);
137         Map<OperationId, Operation> operationMap = mock(Map.class);
138
139         when(operation.getPriority())
140                 .thenReturn(null)
141                 .thenReturn(1L);
142         Assert.assertTrue(method.invoke(updateOperation, userId, operation).equals("The priority should not be empty."));
143         verify(operation).getPriority();
144         when(operation.getTargetObject())
145                 .thenReturn(null)
146                 .thenReturn(objectId);
147         Assert.assertTrue(method.invoke(updateOperation, userId, operation).equals("The target should not be empty."));
148         verify(operation).getTargetObject();
149
150         when(tenantManage.getOperation(userId))
151                 .thenReturn(operationMap)
152                 .thenReturn(operationMap)
153                 .thenReturn(operationMap)
154                 .thenReturn(null);
155         when(operation.getOperationId()).thenReturn(mock(OperationId.class));
156         when(operationMap.containsKey(operation.getOperationId())).thenReturn(true);
157         when(operationMap.get(operation.getOperationId())).thenReturn(operation1);
158         when(operation.getOperationName()).thenReturn(mock(OperationName.class));
159         when(operation1.getOperationName()).thenReturn(mock(OperationName.class));
160         Assert.assertTrue(method.invoke(updateOperation, userId, operation).equals("The operation name should not be changed."));
161
162         when(tenantManage.getOperationDataStore(userId))
163                 .thenReturn(operationMap)
164                 .thenReturn(operationMap)
165                 .thenReturn(operationMap)
166                 .thenReturn(null);
167         Assert.assertTrue(method.invoke(updateOperation, userId, operation).equals("The operation name should not be changed."));
168         verify(operation1,times(2)).getOperationName();
169         Assert.assertTrue(method.invoke(updateOperation, userId, operation).equals("The target " + operation.getTargetObject().getValue() + " is not exist."));
170
171         when(tenantManage.getNode(userId)).thenReturn(nodeMap);
172         when(tenantManage.getConnection(userId)).thenReturn(connectionMap);
173         when(tenantManage.getFlow(userId)).thenReturn(flowMap);
174         when(tenantManage.getNodeDataStore(userId)).thenReturn(nodeMap);
175         when(tenantManage.getConnectionDataStore(userId)).thenReturn(connectionMap);
176         when(tenantManage.getFlowDataStore(userId)).thenReturn(flowMap);
177         when(nodeMap.containsKey(new NodeId(operation.getTargetObject()))).thenReturn(true);
178         when(connectionMap.containsKey(new ConnectionId(operation.getTargetObject()))).thenReturn(true);
179         when(flowMap.containsKey(new FlowId(operation.getTargetObject()))).thenReturn(true);
180         Assert.assertTrue(method.invoke(updateOperation, userId, operation) == null);
181         verify(nodeMap,times(2)).containsKey(new NodeId(operation.getTargetObject()));
182         verify(connectionMap,times(2)).containsKey(new ConnectionId(operation.getTargetObject()));
183         verify(flowMap,times(2)).containsKey(new FlowId(operation.getTargetObject()));
184     }
185
186     @Test
187     public void testCheckAction() throws Exception {
188         Method method = class1.getDeclaredMethod("checkAction", new Class[]{Operation.class});
189         method.setAccessible(true);
190
191         Action action = mock(Action.class);
192         ActionName actionName = mock(ActionName.class);
193         Operation operation = mock(Operation.class);
194         ParameterValues parameterValues = mock(ParameterValues.class);
195         GetDefinitions getDefinitions = mock(GetDefinitions.class);
196         ActionDefinition.ParameterValueType parameterValueType = ActionDefinition.ParameterValueType.Int;
197         List<Action> actionList = new ArrayList<Action>();
198         Map<ActionName, ActionDefinition> actionDefinitionMap = mock(Map.class);
199
200         field_getDefinitions.set(updateOperation, getDefinitions);
201         actionList.add(action);
202
203         when(getDefinitions.getActionDefinition()).thenReturn(actionDefinitionMap);
204         when(operation.getAction())
205                 .thenReturn(null)
206                 .thenReturn(actionList);
207         //test null
208         Assert.assertTrue(method.invoke(updateOperation, operation) == null);
209         verify(getDefinitions).getActionDefinition();
210
211         //test empty
212         when(actionDefinitionMap.isEmpty())
213                 .thenReturn(true)
214                 .thenReturn(false);
215         Assert.assertTrue(method.invoke(updateOperation, operation).equals("The action type has not been defined."));
216         verify(getDefinitions, times(2)).getActionDefinition();
217         //test not empty
218         when(action.getActionName()).thenReturn(actionName);
219         when(actionDefinitionMap.containsKey(action.getActionName()))
220                 .thenReturn(false)
221                 .thenReturn(true);
222         Assert.assertTrue(method.invoke(updateOperation, operation).equals("The action type has not been defined."));
223         verify(actionDefinitionMap).containsKey(action.getActionName());
224
225         when(action.getParameterValues()).thenReturn(parameterValues);
226         when(actionDefinitionMap.get(action.getActionName())).thenReturn(mock(ActionDefinition.class));
227         when(actionDefinitionMap.get(action.getActionName()).getParameterValueType())
228                 .thenReturn(ActionDefinition.ParameterValueType.String)
229                 .thenReturn(parameterValueType)
230                 .thenReturn(ActionDefinition.ParameterValueType.Range);
231         when(parameterValues.getIntValue()).thenReturn(null);
232         when(parameterValues.getStringValue()).thenReturn(null);
233         when(parameterValues.getRangeValue()).thenReturn(null);
234         //org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.instance.parameter.values.IntValue
235         Assert.assertTrue(method.invoke(updateOperation, operation).equals("The value type of" + action.getActionName().toString() + "should be string."));
236         Assert.assertTrue(method.invoke(updateOperation, operation).equals("The value type of" + action.getActionName().toString() + "should be integer."));
237         Assert.assertTrue(method.invoke(updateOperation, operation).equals("The value type of" + action.getActionName().toString() + "should be range."));
238
239     }
240
241     @Test
242     public void testCheckCondition() throws Exception {
243         Method method = class1.getDeclaredMethod("checkCondition", new Class[]{Operation.class});
244         method.setAccessible(true);
245
246         ValueCheck valueCheck = mock(ValueCheck.class);
247         Operation operation = mock(Operation.class);
248         ConditionSegment conditionSegment = mock(ConditionSegment.class);
249         ConditionParameterName conditionParameterName = mock(ConditionParameterName.class);
250         GetDefinitions getDefinitions = mock(GetDefinitions.class);
251         ConditionParameterTargetValue conditionParameterTargetValue = mock(ConditionParameterTargetValue.class);
252         ParameterMatchPatterns parameterMatchPatterns = mock(ParameterMatchPatterns.class);
253         ConditionParameterMatchPattern conditionParameterMatchPattern = ConditionParameterMatchPattern.Equal;
254         ConditionParameterDefinition conditionParameterDefinition = mock(ConditionParameterDefinition.class);
255         List<ParameterMatchPatterns.ParameterMatchPattern> conditionParameterMatchPatterns = new ArrayList<ParameterMatchPatterns.ParameterMatchPattern>();
256         List<ConditionSegment> conditionSegmentList = new ArrayList<ConditionSegment>();
257         Map<ParameterName, ConditionParameterDefinition> conditionParameterDefinitionMap = mock(Map.class);
258
259         field_getDefinitions.set(updateOperation, getDefinitions);
260         field_valueCheck.set(updateOperation, valueCheck);
261         conditionSegmentList.add(conditionSegment);
262         conditionParameterMatchPatterns.add(ParameterMatchPatterns.ParameterMatchPattern.NotEqual);
263
264         when(getDefinitions.getConditionParameterDefinition()).thenReturn(conditionParameterDefinitionMap);
265         when(operation.getConditionSegment())
266                 .thenReturn(null)
267                 .thenReturn(conditionSegmentList);
268         Assert.assertTrue(method.invoke(updateOperation, operation) == null);
269
270         when(conditionParameterDefinitionMap.isEmpty())
271                 .thenReturn(true)
272                 .thenReturn(false);
273         Assert.assertTrue(method.invoke(updateOperation, operation).equals("This condition has not been defined in data store."));
274
275         when(conditionSegment.getConditionParameterName()).thenReturn(conditionParameterName);
276         when(conditionParameterName.getValue()).thenReturn(NEMOConstants.time);
277         when(conditionParameterDefinitionMap.containsKey(new ParameterName(conditionSegment.getConditionParameterName().getValue())))
278                 .thenReturn(false)
279                 .thenReturn(true);
280         Assert.assertTrue(method.invoke(updateOperation, operation).equals("This condition has not been defined in data store."));
281
282         when(conditionParameterDefinitionMap.get(new ParameterName(conditionSegment.getConditionParameterName().getValue())))
283                 .thenReturn(conditionParameterDefinition);
284         when(conditionSegment.getConditionParameterMatchPattern()).thenReturn(conditionParameterMatchPattern);
285         when(conditionParameterDefinition.getParameterMatchPatterns())
286                 .thenReturn(null)
287                 .thenReturn(parameterMatchPatterns);
288         Assert.assertTrue(method.invoke(updateOperation, operation).equals("No match patterns have been defined in data store."));
289
290         when(conditionParameterDefinition.getParameterMatchPatterns().getParameterMatchPattern())
291                 .thenReturn(null)
292                 .thenReturn(conditionParameterMatchPatterns);
293         when(conditionSegment.getConditionParameterTargetValue()).thenReturn(conditionParameterTargetValue);
294         when(conditionSegment.getConditionParameterTargetValue().getStringValue()).thenReturn("test");
295         when(valueCheck.checkTime(conditionSegment.getConditionParameterTargetValue().getStringValue())).thenReturn(false);
296         Assert.assertTrue(method.invoke(updateOperation, operation).equals("There are no match pattern in match pattrn list."));
297         Assert.assertTrue(method.invoke(updateOperation, operation).equals("The " + NEMOConstants.time + " is not legal."));
298
299         conditionParameterMatchPatterns.clear();
300         conditionParameterMatchPatterns.add(ParameterMatchPatterns.ParameterMatchPattern.Equal);
301         Assert.assertTrue(method.invoke(updateOperation, operation).equals("The " + NEMOConstants.time + " is not legal."));
302
303         when(conditionParameterDefinition.getParameterValueType())
304                 .thenReturn(ConditionParameterDefinition.ParameterValueType.String)
305                 .thenReturn(ConditionParameterDefinition.ParameterValueType.String)
306                 .thenReturn(ConditionParameterDefinition.ParameterValueType.Int)
307                 .thenReturn(ConditionParameterDefinition.ParameterValueType.Int)
308                 .thenReturn(ConditionParameterDefinition.ParameterValueType.Range)
309                 .thenReturn(ConditionParameterDefinition.ParameterValueType.Range);
310         when(conditionParameterTargetValue.getIntValue()).thenReturn(null);
311         when(conditionParameterTargetValue.getStringValue()).thenReturn(null);
312         when(conditionParameterTargetValue.getRangeValue()).thenReturn(null);
313 //        System.out.println(method.invoke(updateOperation, operation));
314 //        System.out.println(method.invoke(updateOperation, operation));
315 //        System.out.println(method.invoke(updateOperation, operation));
316         Assert.assertTrue(method.invoke(updateOperation, operation).equals("The value type of " + conditionSegment.getConditionParameterName().getValue() + " should be string."));
317         Assert.assertTrue(method.invoke(updateOperation, operation).equals("The value type of " + conditionSegment.getConditionParameterName().getValue() + " should be integer."));
318         Assert.assertTrue(method.invoke(updateOperation, operation).equals("The value type of " + conditionSegment.getConditionParameterName().getValue() + " should be range."));
319
320     }
321 }