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
8 package org.opendaylight.controller.config.persist.impl;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertTrue;
12 import static org.junit.Assert.fail;
13 import static org.mockito.Matchers.any;
14 import static org.mockito.Matchers.anyObject;
15 import static org.mockito.Matchers.anyString;
16 import static org.mockito.Mockito.doNothing;
17 import static org.mockito.Mockito.doReturn;
18 import static org.mockito.Mockito.doThrow;
19 import static org.mockito.Mockito.mock;
20 import static org.mockito.Mockito.times;
21 import static org.mockito.Mockito.verify;
22 import com.google.common.base.Throwables;
23 import com.google.common.collect.Lists;
24 import com.google.common.collect.Sets;
25 import java.lang.management.ManagementFactory;
26 import java.util.Collections;
28 import java.util.TreeSet;
29 import javax.management.MBeanServerConnection;
30 import javax.management.NotificationFilter;
31 import javax.management.NotificationListener;
32 import javax.management.ObjectName;
33 import org.junit.Before;
34 import org.junit.Test;
35 import org.mockito.Mock;
36 import org.mockito.MockitoAnnotations;
37 import org.opendaylight.controller.config.api.ConflictingVersionException;
38 import org.opendaylight.controller.config.api.jmx.CommitStatus;
39 import org.opendaylight.controller.config.facade.xml.ConfigExecution;
40 import org.opendaylight.controller.config.facade.xml.ConfigSubsystemFacade;
41 import org.opendaylight.controller.config.facade.xml.ConfigSubsystemFacadeFactory;
42 import org.opendaylight.controller.config.facade.xml.mapping.config.Config;
43 import org.opendaylight.controller.config.facade.xml.osgi.YangStoreService;
44 import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder;
45 import org.opendaylight.controller.config.persist.api.Persister;
46 import org.opendaylight.controller.config.spi.Module;
47 import org.opendaylight.controller.config.util.ConfigRegistryClient;
48 import org.opendaylight.controller.config.util.capability.Capability;
49 import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier;
50 import org.w3c.dom.Element;
52 public class ConfigPusherImplTest {
55 private YangStoreService yangStoreService;
57 private ConfigSnapshotHolder mockedConfigSnapshot;
59 private Persister mockedAggregator;
61 private ConfigRegistryClient configRegistryClient;
63 private org.opendaylight.yangtools.yang.model.api.Module module;
65 private ConfigSubsystemFacadeFactory facadeFactory;
67 private ConfigSubsystemFacade facade;
69 private MBeanServerConnection mBeanServer;
72 public void setUp() throws Exception {
73 MockitoAnnotations.initMocks(this);
74 doReturn("content").when(yangStoreService).getModuleSource(any(ModuleIdentifier.class));
75 doReturn("mocked snapshot").when(mockedConfigSnapshot).toString();
76 doReturn("<mocked-snapshot/>").when(mockedConfigSnapshot).getConfigSnapshot();
77 doReturn(Collections.<Module>emptySet()).when(yangStoreService).getModules();
78 final Config mock = mock(Config.class);
79 doReturn("mocked config").when(mock).toString();
80 doReturn(facade).when(facadeFactory).createFacade(anyString());
81 doReturn(Sets.newHashSet()).when(facadeFactory).getCurrentCapabilities();
82 doReturn(mock).when(facade).getConfigMapping();
83 doNothing().when(mBeanServer).addNotificationListener(any(ObjectName.class), any(NotificationListener.class), any(NotificationFilter.class), anyObject());
87 public void testPersisterNotAllCapabilitiesProvided() throws Exception {
88 doReturn(new TreeSet<>(Lists.newArrayList("required-cap"))).when(mockedConfigSnapshot).getCapabilities();
90 final ConfigPusherImpl configPusher = new ConfigPusherImpl(facadeFactory, 0, 0);
92 configPusher.pushConfigs(Collections.singletonList(mockedConfigSnapshot));
94 configPusher.process(Lists.<AutoCloseable>newArrayList(), ManagementFactory.getPlatformMBeanServer(),
95 mockedAggregator, true);
96 } catch(final IllegalStateException e) {
97 Throwable cause = Throwables.getRootCause(e);
98 assertTrue(cause instanceof ConfigPusherImpl.NotEnoughCapabilitiesException);
99 final Set<String> missingCaps = ((ConfigPusherImpl.NotEnoughCapabilitiesException) cause).getMissingCaps();
100 assertEquals(missingCaps.size(), 1);
101 assertEquals(missingCaps.iterator().next(), "required-cap");
109 public void testPersisterSuccessfulPush() throws Exception {
110 doReturn(new TreeSet<>(Lists.newArrayList("namespace?module=module&revision=2012-12-12"))).when(mockedConfigSnapshot).getCapabilities();
111 final Capability cap = mock(Capability.class);
112 doReturn("namespace?module=module&revision=2012-12-12").when(cap).getCapabilityUri();
113 doReturn(Sets.newHashSet(cap)).when(facadeFactory).getCurrentCapabilities();
114 final ConfigExecution cfgExec = mock(ConfigExecution.class);
115 doReturn("cfg exec").when(cfgExec).toString();
116 doReturn(cfgExec).when(facade).getConfigExecution(any(Config.class), any(Element.class));
117 doNothing().when(facade).executeConfigExecution(any(ConfigExecution.class));
118 doReturn(mock(CommitStatus.class)).when(facade).commitSilentTransaction();
119 doReturn(Sets.newHashSet(module)).when(yangStoreService).getModules();
121 final ConfigPusherImpl configPusher = new ConfigPusherImpl(facadeFactory, 0, 0);
123 configPusher.pushConfigs(Collections.singletonList(mockedConfigSnapshot));
124 configPusher.processSingle(Lists.<AutoCloseable>newArrayList(), mBeanServer, mockedAggregator, true);
126 verify(facade).executeConfigExecution(cfgExec);
127 verify(facade).commitSilentTransaction();
131 public void testPersisterConflictingVersionException() throws Exception {
132 doReturn(new TreeSet<>(Lists.newArrayList("namespace?module=module&revision=2012-12-12"))).when(mockedConfigSnapshot).getCapabilities();
133 final Capability cap = mock(Capability.class);
134 doReturn("namespace?module=module&revision=2012-12-12").when(cap).getCapabilityUri();
135 doReturn(Sets.newHashSet(cap)).when(facadeFactory).getCurrentCapabilities();
136 final ConfigExecution cfgExec = mock(ConfigExecution.class);
137 doReturn("cfg exec").when(cfgExec).toString();
138 doReturn(cfgExec).when(facade).getConfigExecution(any(Config.class), any(Element.class));
139 doNothing().when(facade).executeConfigExecution(any(ConfigExecution.class));
140 doThrow(ConflictingVersionException.class).when(facade).commitSilentTransaction();
141 doReturn(Sets.newHashSet(module)).when(yangStoreService).getModules();
143 final ConfigPusherImpl configPusher = new ConfigPusherImpl(facadeFactory, 0, 0);
145 configPusher.pushConfigs(Collections.singletonList(mockedConfigSnapshot));
147 configPusher.processSingle(Lists.<AutoCloseable>newArrayList(), mBeanServer, mockedAggregator, true);
148 } catch (final IllegalStateException e) {
149 Throwable cause = Throwables.getRootCause(e);
150 assertTrue(cause instanceof ConflictingVersionException);
158 public void testSuccessConflictingVersionException() throws Exception {
159 doReturn(new TreeSet<>(Lists.newArrayList("namespace?module=module&revision=2012-12-12"))).when(mockedConfigSnapshot).getCapabilities();
160 final Capability cap = mock(Capability.class);
161 doReturn("namespace?module=module&revision=2012-12-12").when(cap).getCapabilityUri();
162 doReturn(Sets.newHashSet(cap)).when(facadeFactory).getCurrentCapabilities();
163 final ConfigExecution cfgExec = mock(ConfigExecution.class);
164 doReturn("cfg exec").when(cfgExec).toString();
165 doReturn(cfgExec).when(facade).getConfigExecution(any(Config.class), any(Element.class));
166 doNothing().when(facade).executeConfigExecution(any(ConfigExecution.class));
168 doThrow(ConflictingVersionException.class)
169 .doThrow(ConflictingVersionException.class)
170 .doReturn(mock(CommitStatus.class)).when(facade).commitSilentTransaction();
172 doReturn(Sets.newHashSet(module)).when(yangStoreService).getModules();
174 final ConfigPusherImpl configPusher = new ConfigPusherImpl(facadeFactory, 5000, 5000);
176 configPusher.pushConfigs(Collections.singletonList(mockedConfigSnapshot));
177 configPusher.processSingle(Lists.<AutoCloseable>newArrayList(), mBeanServer, mockedAggregator, true);
179 verify(facade, times(3)).executeConfigExecution(cfgExec);
180 verify(facade, times(3)).commitSilentTransaction();