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