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;
23 import com.google.common.base.Throwables;
24 import com.google.common.collect.Lists;
25 import com.google.common.collect.Sets;
26 import java.lang.management.ManagementFactory;
27 import java.util.Collections;
29 import java.util.TreeSet;
30 import javax.management.MBeanServerConnection;
31 import javax.management.NotificationFilter;
32 import javax.management.NotificationListener;
33 import javax.management.ObjectName;
34 import org.junit.Before;
35 import org.junit.Test;
36 import org.mockito.Mock;
37 import org.mockito.MockitoAnnotations;
38 import org.opendaylight.controller.config.api.ConflictingVersionException;
39 import org.opendaylight.controller.config.api.jmx.CommitStatus;
40 import org.opendaylight.controller.config.facade.xml.ConfigExecution;
41 import org.opendaylight.controller.config.facade.xml.ConfigSubsystemFacade;
42 import org.opendaylight.controller.config.facade.xml.ConfigSubsystemFacadeFactory;
43 import org.opendaylight.controller.config.facade.xml.mapping.config.Config;
44 import org.opendaylight.controller.config.facade.xml.osgi.YangStoreService;
45 import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder;
46 import org.opendaylight.controller.config.persist.api.Persister;
47 import org.opendaylight.controller.config.spi.Module;
48 import org.opendaylight.controller.config.util.ConfigRegistryClient;
49 import org.opendaylight.controller.config.util.capability.Capability;
50 import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
51 import org.w3c.dom.Element;
53 public class ConfigPusherImplTest {
56 private YangStoreService yangStoreService;
58 private ConfigSnapshotHolder mockedConfigSnapshot;
60 private Persister mockedAggregator;
62 private ConfigRegistryClient configRegistryClient;
64 private org.opendaylight.yangtools.yang.model.api.Module module;
66 private ConfigSubsystemFacadeFactory facadeFactory;
68 private ConfigSubsystemFacade facade;
70 private MBeanServerConnection mBeanServer;
73 public void setUp() throws Exception {
74 MockitoAnnotations.initMocks(this);
75 doReturn("content").when(yangStoreService).getModuleSource(any(SourceIdentifier.class));
76 doReturn("mocked snapshot").when(mockedConfigSnapshot).toString();
77 doReturn("<mocked-snapshot/>").when(mockedConfigSnapshot).getConfigSnapshot();
78 doReturn(Collections.<Module>emptySet()).when(yangStoreService).getModules();
79 final Config mock = mock(Config.class);
80 doReturn("mocked config").when(mock).toString();
81 doReturn(facade).when(facadeFactory).createFacade(anyString());
82 doReturn(Sets.newHashSet()).when(facadeFactory).getCurrentCapabilities();
83 doReturn(mock).when(facade).getConfigMapping();
84 doNothing().when(mBeanServer).addNotificationListener(any(ObjectName.class), any(NotificationListener.class), any(NotificationFilter.class), anyObject());
88 public void testPersisterNotAllCapabilitiesProvided() throws Exception {
89 doReturn(new TreeSet<>(Lists.newArrayList("required-cap"))).when(mockedConfigSnapshot).getCapabilities();
91 final ConfigPusherImpl configPusher = new ConfigPusherImpl(facadeFactory, 0, 0);
93 configPusher.pushConfigs(Collections.singletonList(mockedConfigSnapshot));
95 configPusher.process(Lists.<AutoCloseable>newArrayList(), ManagementFactory.getPlatformMBeanServer(),
96 mockedAggregator, true);
97 } catch(final IllegalStateException e) {
98 Throwable cause = Throwables.getRootCause(e);
99 assertTrue(cause instanceof ConfigPusherImpl.NotEnoughCapabilitiesException);
100 final Set<String> missingCaps = ((ConfigPusherImpl.NotEnoughCapabilitiesException) cause).getMissingCaps();
101 assertEquals(missingCaps.size(), 1);
102 assertEquals(missingCaps.iterator().next(), "required-cap");
110 public void testPersisterSuccessfulPush() throws Exception {
111 doReturn(new TreeSet<>(Lists.newArrayList("namespace?module=module&revision=2012-12-12"))).when(mockedConfigSnapshot).getCapabilities();
112 final Capability cap = mock(Capability.class);
113 doReturn("namespace?module=module&revision=2012-12-12").when(cap).getCapabilityUri();
114 doReturn(Sets.newHashSet(cap)).when(facadeFactory).getCurrentCapabilities();
115 final ConfigExecution cfgExec = mock(ConfigExecution.class);
116 doReturn("cfg exec").when(cfgExec).toString();
117 doReturn(cfgExec).when(facade).getConfigExecution(any(Config.class), any(Element.class));
118 doNothing().when(facade).executeConfigExecution(any(ConfigExecution.class));
119 doReturn(mock(CommitStatus.class)).when(facade).commitSilentTransaction();
120 doReturn(Sets.newHashSet(module)).when(yangStoreService).getModules();
122 final ConfigPusherImpl configPusher = new ConfigPusherImpl(facadeFactory, 0, 0);
124 configPusher.pushConfigs(Collections.singletonList(mockedConfigSnapshot));
125 configPusher.processSingle(Lists.<AutoCloseable>newArrayList(), mBeanServer, mockedAggregator, true);
127 verify(facade).executeConfigExecution(cfgExec);
128 verify(facade).commitSilentTransaction();
132 public void testPersisterConflictingVersionException() throws Exception {
133 doReturn(new TreeSet<>(Lists.newArrayList("namespace?module=module&revision=2012-12-12"))).when(mockedConfigSnapshot).getCapabilities();
134 final Capability cap = mock(Capability.class);
135 doReturn("namespace?module=module&revision=2012-12-12").when(cap).getCapabilityUri();
136 doReturn(Sets.newHashSet(cap)).when(facadeFactory).getCurrentCapabilities();
137 final ConfigExecution cfgExec = mock(ConfigExecution.class);
138 doReturn("cfg exec").when(cfgExec).toString();
139 doReturn(cfgExec).when(facade).getConfigExecution(any(Config.class), any(Element.class));
140 doNothing().when(facade).executeConfigExecution(any(ConfigExecution.class));
141 doThrow(ConflictingVersionException.class).when(facade).commitSilentTransaction();
142 doReturn(Sets.newHashSet(module)).when(yangStoreService).getModules();
144 final ConfigPusherImpl configPusher = new ConfigPusherImpl(facadeFactory, 0, 0);
146 configPusher.pushConfigs(Collections.singletonList(mockedConfigSnapshot));
148 configPusher.processSingle(Lists.<AutoCloseable>newArrayList(), mBeanServer, mockedAggregator, true);
149 } catch (final IllegalStateException e) {
150 Throwable cause = Throwables.getRootCause(e);
151 assertTrue(cause instanceof ConflictingVersionException);
159 public void testSuccessConflictingVersionException() throws Exception {
160 doReturn(new TreeSet<>(Lists.newArrayList("namespace?module=module&revision=2012-12-12"))).when(mockedConfigSnapshot).getCapabilities();
161 final Capability cap = mock(Capability.class);
162 doReturn("namespace?module=module&revision=2012-12-12").when(cap).getCapabilityUri();
163 doReturn(Sets.newHashSet(cap)).when(facadeFactory).getCurrentCapabilities();
164 final ConfigExecution cfgExec = mock(ConfigExecution.class);
165 doReturn("cfg exec").when(cfgExec).toString();
166 doReturn(cfgExec).when(facade).getConfigExecution(any(Config.class), any(Element.class));
167 doNothing().when(facade).executeConfigExecution(any(ConfigExecution.class));
169 doThrow(ConflictingVersionException.class)
170 .doThrow(ConflictingVersionException.class)
171 .doReturn(mock(CommitStatus.class)).when(facade).commitSilentTransaction();
173 doReturn(Sets.newHashSet(module)).when(yangStoreService).getModules();
175 final ConfigPusherImpl configPusher = new ConfigPusherImpl(facadeFactory, 5000, 5000);
177 configPusher.pushConfigs(Collections.singletonList(mockedConfigSnapshot));
178 configPusher.processSingle(Lists.<AutoCloseable>newArrayList(), mBeanServer, mockedAggregator, true);
180 verify(facade, times(3)).executeConfigExecution(cfgExec);
181 verify(facade, times(3)).commitSilentTransaction();