/*
* Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.controller.netconf.confignetconfconnector.operations.editconfig;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyMapOf;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import com.google.common.base.Optional;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import java.util.Collections;
import java.util.Map;
import javax.management.ObjectName;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.opendaylight.controller.config.api.ServiceReferenceReadableRegistry;
import org.opendaylight.controller.config.facade.xml.ConfigExecution;
import org.opendaylight.controller.config.facade.xml.ConfigSubsystemFacade;
import org.opendaylight.controller.config.facade.xml.mapping.attributes.fromxml.AttributeConfigElement;
import org.opendaylight.controller.config.facade.xml.mapping.config.InstanceConfigElementResolved;
import org.opendaylight.controller.config.facade.xml.mapping.config.ModuleElementDefinition;
import org.opendaylight.controller.config.facade.xml.mapping.config.ModuleElementResolved;
import org.opendaylight.controller.config.facade.xml.mapping.config.ServiceRegistryWrapper;
import org.opendaylight.controller.config.facade.xml.mapping.config.Services;
import org.opendaylight.controller.config.facade.xml.osgi.YangStoreService;
import org.opendaylight.controller.config.facade.xml.strategy.EditConfigStrategy;
import org.opendaylight.controller.config.facade.xml.strategy.EditStrategyType;
import org.opendaylight.controller.config.facade.xml.transactions.TransactionProvider;
import org.opendaylight.controller.config.util.ConfigRegistryClient;
import org.opendaylight.controller.config.util.ConfigTransactionClient;
import org.opendaylight.controller.config.util.xml.XmlElement;
import org.opendaylight.controller.config.util.xml.XmlUtil;
import org.opendaylight.controller.netconf.confignetconfconnector.operations.ValidateTest;
public class EditConfigTest {
@Mock
private YangStoreService yangStoreSnapshot;
@Mock
private TransactionProvider provider;
@Mock
private ConfigRegistryClient configRegistry;
@Mock
private ConfigTransactionClient configTransactionClient;
@Mock
private ObjectName mockOn;
private ConfigSubsystemFacade cfgFacade;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
doReturn("mockON").when(mockOn).toString();
doReturn(mockOn).when(provider).getTestTransaction();
doNothing().when(provider).validateTestTransaction(any(ObjectName.class));
doReturn(mockOn).when(provider).getTestTransaction();
doNothing().when(provider).abortTestTransaction(any(ObjectName.class));
doReturn(mockOn).when(provider).getOrCreateTransaction();
doNothing().when(provider).wipeTestTransaction(any(ObjectName.class));
doReturn(configTransactionClient).when(configRegistry).getConfigTransactionClient(any(ObjectName.class));
doReturn("mockConfigTransactionClient").when(configTransactionClient).toString();
doReturn(mockOn).when(configTransactionClient).lookupConfigBean(anyString(), anyString());
cfgFacade = new ConfigSubsystemFacade(configRegistry, configRegistry, yangStoreSnapshot, provider);
}
@Test
public void test() throws Exception {
EditConfig edit = new EditConfig(cfgFacade, ValidateTest.NETCONF_SESSION_ID_FOR_REPORTING);
EditConfigStrategy editStrat = mock(EditConfigStrategy.class);
doNothing().when(editStrat).executeConfiguration(anyString(), anyString(), anyMapOf(String.class, AttributeConfigElement.class),
any(ConfigTransactionClient.class), any(ServiceRegistryWrapper.class));
ConfigExecution editConfigExecution = mockExecution(editStrat);
edit.getResponseInternal(XmlUtil.newDocument(), editConfigExecution);
verify(provider).getTestTransaction();
verify(provider).validateTestTransaction(mockOn);
verify(provider).abortTestTransaction(mockOn);
verify(provider).getOrCreateTransaction();
// For every instance execute strat
verify(editStrat, times(2/* Test */+ 2/* Set */ + 2/*Handle missing instance Test*/ + 2 /*Handle missing instance Set*/)).executeConfiguration(anyString(),
anyString(), anyMapOf(String.class, AttributeConfigElement.class),
any(ConfigTransactionClient.class), any(ServiceRegistryWrapper.class));
}
private ConfigExecution mockExecution(EditConfigStrategy editStrat) throws Exception {
ConfigExecution mock = mock(ConfigExecution.class);
doReturn(getMapping(editStrat)).when(mock).getResolvedXmlElements(any(ConfigTransactionClient.class));
doReturn(getMappingDefinition(editStrat)).when(mock).getModulesDefinition(any(ConfigTransactionClient.class));
doReturn(EditStrategyType.merge).when(mock).getDefaultStrategy();
doReturn(true).when(mock).shouldSet();
doReturn(true).when(mock).shouldTest();
doReturn(mockServices()).when(mock).getServiceRegistryWrapper(any(ConfigTransactionClient.class));
doReturn(new Services()).when(mock).getServices();
doReturn(XmlElement.fromDomElement(XmlUtil.readXmlToElement(""))).when(mock).getConfigElement();
return mock;
}
private Object getMappingDefinition(EditConfigStrategy editStrat) {
Map> result = Maps.newHashMap();
Multimap innerMultimap = HashMultimap.create();
Map attributes = getSimpleAttributes();
ModuleElementDefinition mockedDefinition = mock(ModuleElementDefinition.class);
doReturn(editStrat).when(mockedDefinition).getEditStrategy();
doReturn("i1").when(mockedDefinition).getInstanceName();
innerMultimap.put("m1", mockedDefinition);
ModuleElementDefinition mockedDefinition2 = mock(ModuleElementDefinition.class);
doReturn(editStrat).when(mockedDefinition2).getEditStrategy();
doReturn("i2").when(mockedDefinition2).getInstanceName();
innerMultimap.put("m1", mockedDefinition2);
result.put("n1", innerMultimap);
return result;
}
private static ServiceReferenceReadableRegistry mockServiceRegistry() {
ServiceReferenceReadableRegistry mock = mock(ServiceReferenceReadableRegistry.class);
doReturn(
Collections.emptyMap())
.when(mock).getServiceMapping();
doReturn("mockedServiceReg").when(mock).toString();
return mock;
}
static ServiceRegistryWrapper mockServices() {
return new ServiceRegistryWrapper(mockServiceRegistry());
}
private Map> getMapping(EditConfigStrategy editStrat) {
Map> result = Maps.newHashMap();
Multimap innerMultimap = HashMultimap.create();
Map attributes = getSimpleAttributes();
InstanceConfigElementResolved ice1 = mock(InstanceConfigElementResolved.class);
doReturn(attributes).when(ice1).getConfiguration();
doReturn(editStrat).when(ice1).getEditStrategy();
innerMultimap.put("m1", new ModuleElementResolved("i1", ice1));
InstanceConfigElementResolved ice2 = mock(InstanceConfigElementResolved.class);
doReturn(attributes).when(ice2).getConfiguration();
doReturn(editStrat).when(ice2).getEditStrategy();
innerMultimap.put("m1", new ModuleElementResolved("i2", ice2));
result.put("n1", innerMultimap);
return result;
}
static Map getSimpleAttributes() {
Map attributes = Maps.newHashMap();
AttributeConfigElement ace1 = mock(AttributeConfigElement.class);
doReturn("abcd").when(ace1).getResolvedDefaultValue();
doReturn(Optional. of("abc")).when(ace1).getResolvedValue();
doReturn("mockedAce1").when(ace1).toString();
doReturn("jmxNameAce1").when(ace1).getJmxName();
attributes.put("a1", ace1);
return attributes;
}
}