2 * Copyright (c) 2016 Huawei, 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
8 package org.opendaylight.nemo.user.vnspacemanager.structurestyle.updateintent;
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;
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;
71 import static org.mockito.Mockito.*;
73 * Created by zhangmeng on 2016/1/13.
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;
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);
90 dataBroker = mock(DataBroker.class);
91 tenantManage = mock(TenantManage.class);
93 updateOperation = new UpdateOperation(dataBroker,tenantManage);
97 public void testOperationHandling() throws Exception {
98 UserId userId = mock(UserId.class);
99 Operation operation = mock(Operation.class);
100 GetDefinitions getDefinitions = mock(GetDefinitions.class);
103 field_getDefinitions.set(updateOperation, getDefinitions);
105 //get into method "checkDefinition" arg(operation)
106 ////get into method "checkAction" arg(operation)
107 when(operation.getAction())
108 .thenReturn(mock(List.class))
110 when(getDefinitions.getActionDefinition()).thenReturn(null);
111 ////get into method "checkCondition" arg(operation)
112 when(operation.getConditionSegment())
113 .thenReturn(mock(List.class))
115 when(getDefinitions.getConditionParameterDefinition()).thenReturn(null);
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."));
123 public void testCheckInstance() throws Exception {
124 Method method = class1.getDeclaredMethod("checkInstance", new Class[]{
128 method.setAccessible(true);
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);
139 when(operation.getPriority())
142 Assert.assertTrue(method.invoke(updateOperation, userId, operation).equals("The priority should not be empty."));
143 verify(operation).getPriority();
144 when(operation.getTargetObject())
146 .thenReturn(objectId);
147 Assert.assertTrue(method.invoke(updateOperation, userId, operation).equals("The target should not be empty."));
148 verify(operation).getTargetObject();
150 when(tenantManage.getOperation(userId))
151 .thenReturn(operationMap)
152 .thenReturn(operationMap)
153 .thenReturn(operationMap)
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."));
162 when(tenantManage.getOperationDataStore(userId))
163 .thenReturn(operationMap)
164 .thenReturn(operationMap)
165 .thenReturn(operationMap)
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."));
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()));
187 public void testCheckAction() throws Exception {
188 Method method = class1.getDeclaredMethod("checkAction", new Class[]{Operation.class});
189 method.setAccessible(true);
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);
200 field_getDefinitions.set(updateOperation, getDefinitions);
201 actionList.add(action);
203 when(getDefinitions.getActionDefinition()).thenReturn(actionDefinitionMap);
204 when(operation.getAction())
206 .thenReturn(actionList);
208 Assert.assertTrue(method.invoke(updateOperation, operation) == null);
209 verify(getDefinitions).getActionDefinition();
212 when(actionDefinitionMap.isEmpty())
215 Assert.assertTrue(method.invoke(updateOperation, operation).equals("The action type has not been defined."));
216 verify(getDefinitions, times(2)).getActionDefinition();
218 when(action.getActionName()).thenReturn(actionName);
219 when(actionDefinitionMap.containsKey(action.getActionName()))
222 Assert.assertTrue(method.invoke(updateOperation, operation).equals("The action type has not been defined."));
223 verify(actionDefinitionMap).containsKey(action.getActionName());
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."));
242 public void testCheckCondition() throws Exception {
243 Method method = class1.getDeclaredMethod("checkCondition", new Class[]{Operation.class});
244 method.setAccessible(true);
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);
259 field_getDefinitions.set(updateOperation, getDefinitions);
260 field_valueCheck.set(updateOperation, valueCheck);
261 conditionSegmentList.add(conditionSegment);
262 conditionParameterMatchPatterns.add(ParameterMatchPatterns.ParameterMatchPattern.NotEqual);
264 when(getDefinitions.getConditionParameterDefinition()).thenReturn(conditionParameterDefinitionMap);
265 when(operation.getConditionSegment())
267 .thenReturn(conditionSegmentList);
268 Assert.assertTrue(method.invoke(updateOperation, operation) == null);
270 when(conditionParameterDefinitionMap.isEmpty())
273 Assert.assertTrue(method.invoke(updateOperation, operation).equals("This condition has not been defined in data store."));
275 when(conditionSegment.getConditionParameterName()).thenReturn(conditionParameterName);
276 when(conditionParameterName.getValue()).thenReturn(NEMOConstants.time);
277 when(conditionParameterDefinitionMap.containsKey(new ParameterName(conditionSegment.getConditionParameterName().getValue())))
280 Assert.assertTrue(method.invoke(updateOperation, operation).equals("This condition has not been defined in data store."));
282 when(conditionParameterDefinitionMap.get(new ParameterName(conditionSegment.getConditionParameterName().getValue())))
283 .thenReturn(conditionParameterDefinition);
284 when(conditionSegment.getConditionParameterMatchPattern()).thenReturn(conditionParameterMatchPattern);
285 when(conditionParameterDefinition.getParameterMatchPatterns())
287 .thenReturn(parameterMatchPatterns);
288 Assert.assertTrue(method.invoke(updateOperation, operation).equals("No match patterns have been defined in data store."));
290 when(conditionParameterDefinition.getParameterMatchPatterns().getParameterMatchPattern())
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."));
299 conditionParameterMatchPatterns.clear();
300 conditionParameterMatchPatterns.add(ParameterMatchPatterns.ParameterMatchPattern.Equal);
301 Assert.assertTrue(method.invoke(updateOperation, operation).equals("The " + NEMOConstants.time + " is not legal."));
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."));