*/
package org.opendaylight.controller.netconf.it;
-import static junit.framework.Assert.assertEquals;
+import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyLong;
import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
-import io.netty.channel.ChannelFuture;
+import static org.opendaylight.controller.netconf.util.test.XmlUnitUtil.assertContainsElementWithName;
+import static org.opendaylight.controller.netconf.util.test.XmlUnitUtil.assertElementsCount;
+import static org.opendaylight.controller.netconf.util.xml.XmlUtil.readXmlToDocument;
+import com.google.common.collect.Lists;
import java.io.IOException;
-import java.io.InputStream;
+import java.lang.management.ManagementFactory;
import java.net.InetSocketAddress;
-import java.util.Collection;
+import java.net.SocketAddress;
import java.util.List;
-import java.util.Set;
-import java.util.regex.Pattern;
-
import javax.management.InstanceNotFoundException;
import javax.management.Notification;
import javax.management.NotificationListener;
-
-import org.apache.commons.lang3.StringUtils;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
import org.junit.Test;
-import org.junit.matchers.JUnitMatchers;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
-import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder;
import org.opendaylight.controller.config.persist.api.Persister;
-import org.opendaylight.controller.config.spi.ModuleFactory;
-import org.opendaylight.controller.config.yang.store.api.YangStoreException;
-import org.opendaylight.controller.config.yang.store.impl.HardcodedYangStoreService;
import org.opendaylight.controller.netconf.api.NetconfMessage;
import org.opendaylight.controller.netconf.api.jmx.CommitJMXNotification;
-import org.opendaylight.controller.netconf.api.monitoring.NetconfManagementSession;
-import org.opendaylight.controller.netconf.client.NetconfClient;
-import org.opendaylight.controller.netconf.client.NetconfClientDispatcher;
-import org.opendaylight.controller.netconf.confignetconfconnector.osgi.NetconfOperationServiceFactoryImpl;
+import org.opendaylight.controller.netconf.client.TestingNetconfClient;
import org.opendaylight.controller.netconf.impl.DefaultCommitNotificationProducer;
-import org.opendaylight.controller.netconf.impl.NetconfServerDispatcher;
-import org.opendaylight.controller.netconf.impl.osgi.NetconfMonitoringServiceImpl;
-import org.opendaylight.controller.netconf.impl.osgi.NetconfOperationServiceFactoryListener;
-import org.opendaylight.controller.netconf.impl.osgi.NetconfOperationServiceFactoryListenerImpl;
-import org.opendaylight.controller.netconf.impl.osgi.NetconfOperationServiceSnapshot;
-import org.opendaylight.controller.netconf.impl.osgi.SessionMonitoringService;
-import org.opendaylight.controller.netconf.mapping.api.Capability;
-import org.opendaylight.controller.netconf.mapping.api.NetconfOperationService;
-import org.opendaylight.controller.netconf.monitoring.osgi.NetconfMonitoringActivator;
-import org.opendaylight.controller.netconf.monitoring.osgi.NetconfMonitoringOperationService;
import org.opendaylight.controller.netconf.persist.impl.ConfigPersisterNotificationHandler;
import org.opendaylight.controller.netconf.util.test.XmlFileLoader;
-import org.opendaylight.controller.netconf.util.xml.XmlUtil;
+import org.w3c.dom.Document;
import org.w3c.dom.Element;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
+import org.xml.sax.SAXException;
public class NetconfConfigPersisterITTest extends AbstractNetconfConfigTest {
- private static final InetSocketAddress tcpAddress = new InetSocketAddress("127.0.0.1", 12023);
-
-
-
- private NetconfClientDispatcher clientDispatcher;
-
- DefaultCommitNotificationProducer commitNotifier;
-
- @Before
- public void setUp() throws Exception {
- super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(NetconfITTest.getModuleFactoriesS().toArray(
- new ModuleFactory[0])));
-
- NetconfMonitoringServiceImpl monitoringService = new NetconfMonitoringServiceImpl(getFactoriesListener());
-
- NetconfOperationServiceFactoryListenerImpl factoriesListener = new NetconfOperationServiceFactoryListenerImpl();
- factoriesListener.onAddNetconfOperationServiceFactory(new NetconfOperationServiceFactoryImpl(getYangStore()));
- factoriesListener
- .onAddNetconfOperationServiceFactory(new NetconfMonitoringActivator.NetconfMonitoringOperationServiceFactory(
- new NetconfMonitoringOperationService(monitoringService)));
-
-
- commitNotifier = new DefaultCommitNotificationProducer(platformMBeanServer);
- NetconfServerDispatcher dispatch = createDispatcher(factoriesListener, mockSessionMonitoringService(), commitNotifier);
- ChannelFuture s = dispatch.createServer(tcpAddress);
- s.await();
-
- clientDispatcher = new NetconfClientDispatcher(nettyThreadgroup, nettyThreadgroup, 5000);
- }
+ public static final int PORT = 12026;
+ private static final InetSocketAddress TCP_ADDRESS = new InetSocketAddress(LOOPBACK_ADDRESS, PORT);
- @After
- public void cleanUp(){
- commitNotifier.close();
- }
- private HardcodedYangStoreService getYangStore() throws YangStoreException, IOException {
- final Collection<InputStream> yangDependencies = NetconfITTest.getBasicYangs();
- return new HardcodedYangStoreService(yangDependencies);
+ @Override
+ protected SocketAddress getTcpServerAddress() {
+ return TCP_ADDRESS;
}
-
- protected SessionMonitoringService mockSessionMonitoringService() {
- SessionMonitoringService mockedSessionMonitor = mock(SessionMonitoringService.class);
- doNothing().when(mockedSessionMonitor).onSessionUp(any(NetconfManagementSession.class));
- doNothing().when(mockedSessionMonitor).onSessionDown(any(NetconfManagementSession.class));
- return mockedSessionMonitor;
+ @Override
+ protected DefaultCommitNotificationProducer getNotificationProducer() {
+ return new DefaultCommitNotificationProducer(ManagementFactory.getPlatformMBeanServer());
}
-
-
@Test
public void testNetconfCommitNotifications() throws Exception {
+ final VerifyingNotificationListener notificationVerifier = createCommitNotificationListener();
+ final VerifyingPersister mockedAggregator = mockAggregator();
- VerifyingNotificationListener notificationVerifier = createCommitNotificationListener();
- VerifyingPersister mockedAggregator = mockAggregator();
-
- try (NetconfClient persisterClient = new NetconfClient("persister", tcpAddress, 4000, clientDispatcher)) {
+ try (TestingNetconfClient persisterClient = new TestingNetconfClient("persister", getClientDispatcher(), getClientConfiguration(TCP_ADDRESS, 4000))) {
try (ConfigPersisterNotificationHandler configPersisterNotificationHandler = new ConfigPersisterNotificationHandler(
- platformMBeanServer, mockedAggregator, Pattern.compile(""))) {
+ platformMBeanServer, mockedAggregator)) {
-
- try (NetconfClient netconfClient = new NetconfClient("client", tcpAddress, 4000, clientDispatcher)) {
+ try (TestingNetconfClient netconfClient = new TestingNetconfClient("client", getClientDispatcher(), getClientConfiguration(TCP_ADDRESS, 4000))) {
NetconfMessage response = netconfClient.sendMessage(loadGetConfigMessage());
- assertResponse(response, "<modules");
- assertResponse(response, "<services");
+ assertContainsElementWithName(response.getDocument(), "modules");
+ assertContainsElementWithName(response.getDocument(), "services");
response = netconfClient.sendMessage(loadCommitMessage());
- assertResponse(response, "ok");
+ assertContainsElementWithName(response.getDocument(), "ok");
response = netconfClient.sendMessage(loadEditConfigMessage());
- assertResponse(response, "ok");
+ assertContainsElementWithName(response.getDocument(), "ok");
response = netconfClient.sendMessage(loadCommitMessage());
- assertResponse(response, "ok");
+ assertContainsElementWithName(response.getDocument(), "ok");
}
}
}
notificationVerifier.assertNotificationCount(2);
- notificationVerifier.assertNotificationContent(0, 0, 0, 9);
- notificationVerifier.assertNotificationContent(1, 4, 4, 9);
+ notificationVerifier.assertNotificationContent(0, 0, 0, 8);
+ notificationVerifier.assertNotificationContent(1, 4, 3, 8);
mockedAggregator.assertSnapshotCount(2);
// Capabilities are stripped for persister
mockedAggregator.assertSnapshotContent(0, 0, 0, 1);
- mockedAggregator.assertSnapshotContent(1, 4, 4, 3);
+ mockedAggregator.assertSnapshotContent(1, 4, 3, 3);
}
private VerifyingPersister mockAggregator() throws IOException {
}
private VerifyingNotificationListener createCommitNotificationListener() throws InstanceNotFoundException {
- VerifyingNotificationListener listener = new VerifyingNotificationListener();
- platformMBeanServer.addNotificationListener(DefaultCommitNotificationProducer.objectName, listener, null, null);
+ final VerifyingNotificationListener listener = new VerifyingNotificationListener();
+ platformMBeanServer.addNotificationListener(DefaultCommitNotificationProducer.OBJECT_NAME, listener, null, null);
return listener;
}
- private void assertResponse(NetconfMessage response, String content) {
- Assert.assertThat(XmlUtil.toString(response.getDocument()), JUnitMatchers.containsString(content));
- }
-
private NetconfMessage loadGetConfigMessage() throws Exception {
return XmlFileLoader.xmlFileToNetconfMessage("netconfMessages/getConfig.xml");
}
return XmlFileLoader.xmlFileToNetconfMessage("netconfMessages/commit.xml");
}
-
- public NetconfOperationServiceFactoryListener getFactoriesListener() {
- NetconfOperationServiceFactoryListener factoriesListener = mock(NetconfOperationServiceFactoryListener.class);
- NetconfOperationServiceSnapshot snap = mock(NetconfOperationServiceSnapshot.class);
- NetconfOperationService service = mock(NetconfOperationService.class);
- Set<Capability> caps = Sets.newHashSet();
- doReturn(caps).when(service).getCapabilities();
- Set<NetconfOperationService> services = Sets.newHashSet(service);
- doReturn(services).when(snap).getServices();
- doReturn(snap).when(factoriesListener).getSnapshot(anyLong());
-
- return factoriesListener;
- }
-
private static class VerifyingNotificationListener implements NotificationListener {
public List<Notification> notifications = Lists.newArrayList();
@Override
- public void handleNotification(Notification notification, Object handback) {
+ public void handleNotification(final Notification notification, final Object handback) {
this.notifications.add(notification);
}
- void assertNotificationCount(Object size) {
+ void assertNotificationCount(final Object size) {
assertEquals(size, notifications.size());
}
- void assertNotificationContent(int notificationIndex, int expectedModulesSize, int expectedServicesSize, int expectedCapsSize) {
- Notification notification = notifications.get(notificationIndex);
+ void assertNotificationContent(final int notificationIndex, final int expectedModulesSize, final int expectedServicesSize, final int expectedCapsSize) {
+ final Notification notification = notifications.get(notificationIndex);
assertEquals(CommitJMXNotification.class, notification.getClass());
- int capsSize = ((CommitJMXNotification) notification).getCapabilities().size();
+ final int capsSize = ((CommitJMXNotification) notification).getCapabilities().size();
assertEquals("Expected capabilities count", expectedCapsSize, capsSize);
- Element configSnapshot = ((CommitJMXNotification) notification).getConfigSnapshot();
- int modulesSize = configSnapshot.getElementsByTagName("module").getLength();
+ final Element configSnapshot = ((CommitJMXNotification) notification).getConfigSnapshot();
+ final int modulesSize = configSnapshot.getElementsByTagName("module").getLength();
assertEquals("Expected modules count", expectedModulesSize, modulesSize);
- int servicesSize = configSnapshot.getElementsByTagName("instance").getLength();
+ final int servicesSize = configSnapshot.getElementsByTagName("instance").getLength();
assertEquals("Expected services count", expectedServicesSize, servicesSize);
}
}
private Persister mockedPersister;
public VerifyingPersister() throws IOException {
- Persister mockedAggregator = mock(Persister.class);
+ final Persister mockedAggregator = mock(Persister.class);
doAnswer(new Answer<Object>() {
@Override
- public Object answer(InvocationOnMock invocation) throws Throwable {
- ConfigSnapshotHolder configSnapshot = (ConfigSnapshotHolder) invocation.getArguments()[0];
+ public Object answer(final InvocationOnMock invocation) throws Throwable {
+ final ConfigSnapshotHolder configSnapshot = (ConfigSnapshotHolder) invocation.getArguments()[0];
snapshots.add(configSnapshot);
return null;
}
this.mockedPersister = mockedAggregator;
}
- void assertSnapshotCount(Object size) {
+ void assertSnapshotCount(final Object size) {
assertEquals(size, snapshots.size());
}
- void assertSnapshotContent(int notificationIndex, int expectedModulesSize, int expectedServicesSize, int expectedCapsSize) {
- ConfigSnapshotHolder snapshot = snapshots.get(notificationIndex);
- int capsSize = snapshot.getCapabilities().size();
+ void assertSnapshotContent(final int notificationIndex, final int expectedModulesSize, final int expectedServicesSize, final int expectedCapsSize)
+ throws SAXException, IOException {
+ final ConfigSnapshotHolder snapshot = snapshots.get(notificationIndex);
+ final int capsSize = snapshot.getCapabilities().size();
assertEquals("Expected capabilities count", expectedCapsSize, capsSize);
- String configSnapshot = snapshot.getConfigSnapshot();
- int modulesSize = StringUtils.countMatches(configSnapshot, "<module>");
- assertEquals("Expected modules count", expectedModulesSize, modulesSize);
- int servicesSize = StringUtils.countMatches(configSnapshot, "<instance>");
- assertEquals("Expected services count", expectedServicesSize, servicesSize);
+ final Document configSnapshot = readXmlToDocument(snapshot.getConfigSnapshot());
+ assertElementsCount(configSnapshot, "module", expectedModulesSize);
+ assertElementsCount(configSnapshot, "instance", expectedServicesSize);
}
@Override
- public void persistConfig(ConfigSnapshotHolder configSnapshotHolder) throws IOException {
+ public void persistConfig(final ConfigSnapshotHolder configSnapshotHolder) throws IOException {
mockedPersister.persistConfig(configSnapshotHolder);
}