b70a66f5efc7f8eb1a4d779bcb51ca2123d33227
[controller.git] / opendaylight / netconf / config-netconf-connector / src / test / java / org / opendaylight / controller / netconf / confignetconfconnector / operations / editconfig / EditConfigTest.java
1 /*
2  * Copyright (c) 2013 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.controller.netconf.confignetconfconnector.operations.editconfig;
10
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.api.ValidationException;
21 import org.opendaylight.controller.config.util.ConfigRegistryClient;
22 import org.opendaylight.controller.config.util.ConfigTransactionClient;
23 import org.opendaylight.controller.config.yang.store.api.YangStoreSnapshot;
24 import org.opendaylight.controller.netconf.api.NetconfDocumentedException;
25 import org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.fromxml.AttributeConfigElement;
26 import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.InstanceConfigElementResolved;
27 import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.ModuleElementDefinition;
28 import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.ModuleElementResolved;
29 import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.ServiceRegistryWrapper;
30 import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.Services;
31 import org.opendaylight.controller.netconf.confignetconfconnector.operations.ValidateTest;
32 import org.opendaylight.controller.netconf.confignetconfconnector.operations.editconfig.EditConfigXmlParser.EditConfigExecution;
33 import org.opendaylight.controller.netconf.confignetconfconnector.transactions.TransactionProvider;
34 import org.opendaylight.controller.netconf.util.xml.XmlUtil;
35
36 import javax.management.ObjectName;
37 import java.util.Collections;
38 import java.util.Map;
39
40 import static org.mockito.Matchers.any;
41 import static org.mockito.Matchers.anyMapOf;
42 import static org.mockito.Matchers.anyString;
43 import static org.mockito.Mockito.doNothing;
44 import static org.mockito.Mockito.doReturn;
45 import static org.mockito.Mockito.mock;
46 import static org.mockito.Mockito.times;
47 import static org.mockito.Mockito.verify;
48
49 public class EditConfigTest {
50
51     @Mock
52     private YangStoreSnapshot yangStoreSnapshot;
53     @Mock
54     private TransactionProvider provider;
55     @Mock
56     private ConfigRegistryClient configRegistry;
57     @Mock
58     private ConfigTransactionClient configTransactionClient;
59     @Mock
60     private ObjectName mockOn;
61
62     @Before
63     public void setUp() throws Exception {
64         MockitoAnnotations.initMocks(this);
65
66         doReturn("mockON").when(mockOn).toString();
67         doReturn(mockOn).when(provider).getTestTransaction();
68         doNothing().when(provider).validateTestTransaction(any(ObjectName.class));
69
70         doReturn(mockOn).when(provider).getTestTransaction();
71         doNothing().when(provider).abortTestTransaction(any(ObjectName.class));
72         doReturn(mockOn).when(provider).getOrCreateTransaction();
73
74         doNothing().when(provider).wipeTestTransaction(any(ObjectName.class));
75
76         doReturn(configTransactionClient).when(configRegistry).getConfigTransactionClient(any(ObjectName.class));
77         doReturn("mockConfigTransactionClient").when(configTransactionClient).toString();
78
79         doReturn(mockOn).when(configTransactionClient).lookupConfigBean(anyString(), anyString());
80     }
81
82     @Test
83     public void test() throws NetconfDocumentedException, ValidationException {
84         EditConfig edit = new EditConfig(yangStoreSnapshot, provider, configRegistry,
85                 ValidateTest.NETCONF_SESSION_ID_FOR_REPORTING);
86         EditConfigStrategy editStrat = mock(EditConfigStrategy.class);
87
88         doNothing().when(editStrat).executeConfiguration(anyString(), anyString(), anyMapOf(String.class, AttributeConfigElement.class),
89                 any(ConfigTransactionClient.class), any(ServiceRegistryWrapper.class));
90
91         EditConfigExecution editConfigExecution = mockExecution(editStrat);
92
93         edit.getResponseInternal(XmlUtil.newDocument(), editConfigExecution);
94
95         verify(provider).getTestTransaction();
96         verify(provider).validateTestTransaction(mockOn);
97         verify(provider).abortTestTransaction(mockOn);
98
99         verify(provider).getOrCreateTransaction();
100
101         // For every instance execute strat
102         verify(editStrat, times(2/* Test */+ 2/* Set */ + 2/*Handle missing instance Test*/ + 2 /*Handle missing instance Set*/)).executeConfiguration(anyString(),
103                 anyString(), anyMapOf(String.class, AttributeConfigElement.class),
104                 any(ConfigTransactionClient.class), any(ServiceRegistryWrapper.class));
105     }
106
107     private EditConfigExecution mockExecution(EditConfigStrategy editStrat) {
108         EditConfigExecution mock = mock(EditConfigExecution.class);
109         doReturn(getMapping(editStrat)).when(mock).getResolvedXmlElements(any(ConfigTransactionClient.class));
110         doReturn(getMappingDefinition(editStrat)).when(mock).getModulesDefinition(any(ConfigTransactionClient.class));
111         doReturn(EditStrategyType.merge).when(mock).getDefaultStrategy();
112         doReturn(true).when(mock).shouldSet();
113         doReturn(true).when(mock).shouldTest();
114         doReturn(mockServices()).when(mock).getServiceRegistryWrapper(any(ConfigTransactionClient.class));
115         doReturn(new Services()).when(mock).getServices();
116         return mock;
117     }
118
119     private Object getMappingDefinition(EditConfigStrategy editStrat) {
120         Map<String, Multimap<String, ModuleElementDefinition>> result = Maps.newHashMap();
121
122         Multimap<String, ModuleElementDefinition> innerMultimap = HashMultimap.create();
123         Map<String, AttributeConfigElement> attributes = getSimpleAttributes();
124
125         ModuleElementDefinition mockedDefinition = mock(ModuleElementDefinition.class);
126         doReturn(editStrat).when(mockedDefinition).getEditStrategy();
127         doReturn("i1").when(mockedDefinition).getInstanceName();
128         innerMultimap.put("m1", mockedDefinition);
129
130         ModuleElementDefinition mockedDefinition2 = mock(ModuleElementDefinition.class);
131         doReturn(editStrat).when(mockedDefinition2).getEditStrategy();
132         doReturn("i2").when(mockedDefinition2).getInstanceName();
133         innerMultimap.put("m1", mockedDefinition2);
134
135         result.put("n1", innerMultimap);
136
137         return result;
138     }
139
140     private static ServiceReferenceReadableRegistry mockServiceRegistry() {
141         ServiceReferenceReadableRegistry mock = mock(ServiceReferenceReadableRegistry.class);
142         doReturn(
143                 Collections.emptyMap())
144                 .when(mock).getServiceMapping();
145         doReturn("mockedServiceReg").when(mock).toString();
146
147         return mock;
148     }
149
150     static ServiceRegistryWrapper mockServices() {
151         return new ServiceRegistryWrapper(mockServiceRegistry());
152     }
153
154     private Map<String, Multimap<String, ModuleElementResolved>> getMapping(EditConfigStrategy editStrat) {
155         Map<String, Multimap<String, ModuleElementResolved>> result = Maps.newHashMap();
156
157         Multimap<String, ModuleElementResolved> innerMultimap = HashMultimap.create();
158         Map<String, AttributeConfigElement> attributes = getSimpleAttributes();
159
160         InstanceConfigElementResolved ice1 = mock(InstanceConfigElementResolved.class);
161         doReturn(attributes).when(ice1).getConfiguration();
162         doReturn(editStrat).when(ice1).getEditStrategy();
163         innerMultimap.put("m1", new ModuleElementResolved("i1", ice1));
164
165         InstanceConfigElementResolved ice2 = mock(InstanceConfigElementResolved.class);
166         doReturn(attributes).when(ice2).getConfiguration();
167         doReturn(editStrat).when(ice2).getEditStrategy();
168         innerMultimap.put("m1", new ModuleElementResolved("i2", ice2));
169
170         result.put("n1", innerMultimap);
171
172         return result;
173     }
174
175     static Map<String, AttributeConfigElement> getSimpleAttributes() {
176         Map<String, AttributeConfigElement> attributes = Maps.newHashMap();
177         AttributeConfigElement ace1 = mock(AttributeConfigElement.class);
178         doReturn("abcd").when(ace1).getResolvedDefaultValue();
179         doReturn(Optional.<String> of("abc")).when(ace1).getResolvedValue();
180         doReturn("mockedAce1").when(ace1).toString();
181         doReturn("jmxNameAce1").when(ace1).getJmxName();
182         attributes.put("a1", ace1);
183         return attributes;
184     }
185
186 }