2 * Copyright (c) 2013 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.controller.netconf.confignetconfconnector.operations.editconfig;
11 import com.google.common.base.Optional;
12 import com.google.common.collect.HashMultimap;
13 import com.google.common.collect.Maps;
14 import com.google.common.collect.Multimap;
15 import org.junit.Before;
16 import org.junit.Test;
17 import org.mockito.Mock;
18 import org.mockito.MockitoAnnotations;
19 import org.opendaylight.controller.config.api.ServiceReferenceReadableRegistry;
20 import org.opendaylight.controller.config.util.ConfigRegistryClient;
21 import org.opendaylight.controller.config.util.ConfigTransactionClient;
22 import org.opendaylight.controller.config.yang.store.api.YangStoreSnapshot;
23 import org.opendaylight.controller.netconf.api.NetconfDocumentedException;
24 import org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.fromxml.AttributeConfigElement;
25 import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.InstanceConfigElementResolved;
26 import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.ModuleElementDefinition;
27 import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.ModuleElementResolved;
28 import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.ServiceRegistryWrapper;
29 import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.Services;
30 import org.opendaylight.controller.netconf.confignetconfconnector.operations.ValidateTest;
31 import org.opendaylight.controller.netconf.confignetconfconnector.operations.editconfig.EditConfigXmlParser.EditConfigExecution;
32 import org.opendaylight.controller.netconf.confignetconfconnector.transactions.TransactionProvider;
33 import org.opendaylight.controller.netconf.util.xml.XmlUtil;
35 import javax.management.ObjectName;
36 import java.util.Collections;
39 import static org.mockito.Matchers.any;
40 import static org.mockito.Matchers.anyMapOf;
41 import static org.mockito.Matchers.anyString;
42 import static org.mockito.Mockito.doNothing;
43 import static org.mockito.Mockito.doReturn;
44 import static org.mockito.Mockito.mock;
45 import static org.mockito.Mockito.times;
46 import static org.mockito.Mockito.verify;
48 public class EditConfigTest {
51 private YangStoreSnapshot yangStoreSnapshot;
53 private TransactionProvider provider;
55 private ConfigRegistryClient configRegistry;
57 private ConfigTransactionClient configTransactionClient;
59 private ObjectName mockOn;
62 public void setUp() throws Exception {
63 MockitoAnnotations.initMocks(this);
65 doReturn("mockON").when(mockOn).toString();
66 doReturn(mockOn).when(provider).getTestTransaction();
67 doNothing().when(provider).validateTestTransaction(any(ObjectName.class));
69 doReturn(mockOn).when(provider).getTestTransaction();
70 doNothing().when(provider).abortTestTransaction(any(ObjectName.class));
71 doReturn(mockOn).when(provider).getOrCreateTransaction();
73 doNothing().when(provider).wipeTestTransaction(any(ObjectName.class));
75 doReturn(configTransactionClient).when(configRegistry).getConfigTransactionClient(any(ObjectName.class));
76 doReturn("mockConfigTransactionClient").when(configTransactionClient).toString();
78 doReturn(mockOn).when(configTransactionClient).lookupConfigBean(anyString(), anyString());
82 public void test() throws NetconfDocumentedException {
83 EditConfig edit = new EditConfig(yangStoreSnapshot, provider, configRegistry,
84 ValidateTest.NETCONF_SESSION_ID_FOR_REPORTING);
85 EditConfigStrategy editStrat = mock(EditConfigStrategy.class);
87 doNothing().when(editStrat).executeConfiguration(anyString(), anyString(), anyMapOf(String.class, AttributeConfigElement.class),
88 any(ConfigTransactionClient.class), any(ServiceRegistryWrapper.class));
90 EditConfigExecution editConfigExecution = mockExecution(editStrat);
92 edit.getResponseInternal(XmlUtil.newDocument(), editConfigExecution);
94 verify(provider).getTestTransaction();
95 verify(provider).validateTestTransaction(mockOn);
96 verify(provider).abortTestTransaction(mockOn);
98 verify(provider).getOrCreateTransaction();
100 // For every instance execute strat
101 verify(editStrat, times(2/* Test */+ 2/* Set */ + 2/*Handle missing instance Test*/ + 2 /*Handle missing instance Set*/)).executeConfiguration(anyString(),
102 anyString(), anyMapOf(String.class, AttributeConfigElement.class),
103 any(ConfigTransactionClient.class), any(ServiceRegistryWrapper.class));
106 private EditConfigExecution mockExecution(EditConfigStrategy editStrat) {
107 EditConfigExecution mock = mock(EditConfigExecution.class);
108 doReturn(getMapping(editStrat)).when(mock).getResolvedXmlElements(any(ConfigTransactionClient.class));
109 doReturn(getMappingDefinition(editStrat)).when(mock).getModulesDefinition(any(ConfigTransactionClient.class));
110 doReturn(EditStrategyType.merge).when(mock).getDefaultStrategy();
111 doReturn(true).when(mock).shouldSet();
112 doReturn(true).when(mock).shouldTest();
113 doReturn(mockServices()).when(mock).getServiceRegistryWrapper(any(ConfigTransactionClient.class));
114 doReturn(new Services()).when(mock).getServices();
118 private Object getMappingDefinition(EditConfigStrategy editStrat) {
119 Map<String, Multimap<String, ModuleElementDefinition>> result = Maps.newHashMap();
121 Multimap<String, ModuleElementDefinition> innerMultimap = HashMultimap.create();
122 Map<String, AttributeConfigElement> attributes = getSimpleAttributes();
124 ModuleElementDefinition mockedDefinition = mock(ModuleElementDefinition.class);
125 doReturn(editStrat).when(mockedDefinition).getEditStrategy();
126 doReturn("i1").when(mockedDefinition).getInstanceName();
127 innerMultimap.put("m1", mockedDefinition);
129 ModuleElementDefinition mockedDefinition2 = mock(ModuleElementDefinition.class);
130 doReturn(editStrat).when(mockedDefinition2).getEditStrategy();
131 doReturn("i2").when(mockedDefinition2).getInstanceName();
132 innerMultimap.put("m1", mockedDefinition2);
134 result.put("n1", innerMultimap);
139 private static ServiceReferenceReadableRegistry mockServiceRegistry() {
140 ServiceReferenceReadableRegistry mock = mock(ServiceReferenceReadableRegistry.class);
142 Collections.emptyMap())
143 .when(mock).getServiceMapping();
144 doReturn("mockedServiceReg").when(mock).toString();
149 static ServiceRegistryWrapper mockServices() {
150 return new ServiceRegistryWrapper(mockServiceRegistry());
153 private Map<String, Multimap<String, ModuleElementResolved>> getMapping(EditConfigStrategy editStrat) {
154 Map<String, Multimap<String, ModuleElementResolved>> result = Maps.newHashMap();
156 Multimap<String, ModuleElementResolved> innerMultimap = HashMultimap.create();
157 Map<String, AttributeConfigElement> attributes = getSimpleAttributes();
159 InstanceConfigElementResolved ice1 = mock(InstanceConfigElementResolved.class);
160 doReturn(attributes).when(ice1).getConfiguration();
161 doReturn(editStrat).when(ice1).getEditStrategy();
162 innerMultimap.put("m1", new ModuleElementResolved("i1", ice1));
164 InstanceConfigElementResolved ice2 = mock(InstanceConfigElementResolved.class);
165 doReturn(attributes).when(ice2).getConfiguration();
166 doReturn(editStrat).when(ice2).getEditStrategy();
167 innerMultimap.put("m1", new ModuleElementResolved("i2", ice2));
169 result.put("n1", innerMultimap);
174 static Map<String, AttributeConfigElement> getSimpleAttributes() {
175 Map<String, AttributeConfigElement> attributes = Maps.newHashMap();
176 AttributeConfigElement ace1 = mock(AttributeConfigElement.class);
177 doReturn("abcd").when(ace1).getResolvedDefaultValue();
178 doReturn(Optional.<String> of("abc")).when(ace1).getResolvedValue();
179 doReturn("mockedAce1").when(ace1).toString();
180 doReturn("jmxNameAce1").when(ace1).getJmxName();
181 attributes.put("a1", ace1);