config-persister-impl: final parameters
[controller.git] / opendaylight / config / config-persister-impl / src / test / java / org / opendaylight / controller / config / persist / impl / ConfigPusherImplTest.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 package org.opendaylight.controller.config.persist.impl;
9
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;
27 import java.util.Set;
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;
51
52 public class ConfigPusherImplTest {
53
54     @Mock
55     private YangStoreService yangStoreService;
56     @Mock
57     private ConfigSnapshotHolder mockedConfigSnapshot;
58     @Mock
59     private Persister mockedAggregator;
60     @Mock
61     private ConfigRegistryClient configRegistryClient;
62     @Mock
63     private org.opendaylight.yangtools.yang.model.api.Module module;
64     @Mock
65     private ConfigSubsystemFacadeFactory facadeFactory;
66     @Mock
67     private ConfigSubsystemFacade facade;
68     @Mock
69     private MBeanServerConnection mBeanServer;
70
71     @Before
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());
84     }
85
86     @Test
87     public void testPersisterNotAllCapabilitiesProvided() throws Exception {
88         doReturn(new TreeSet<>(Lists.newArrayList("required-cap"))).when(mockedConfigSnapshot).getCapabilities();
89
90         final ConfigPusherImpl configPusher = new ConfigPusherImpl(facadeFactory, 0, 0);
91
92         configPusher.pushConfigs(Collections.singletonList(mockedConfigSnapshot));
93         try {
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");
102             return;
103         }
104
105         fail();
106     }
107
108     @Test
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();
120
121         final ConfigPusherImpl configPusher = new ConfigPusherImpl(facadeFactory, 0, 0);
122
123         configPusher.pushConfigs(Collections.singletonList(mockedConfigSnapshot));
124         configPusher.processSingle(Lists.<AutoCloseable>newArrayList(), mBeanServer, mockedAggregator, true);
125
126         verify(facade).executeConfigExecution(cfgExec);
127         verify(facade).commitSilentTransaction();
128     }
129
130     @Test
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();
142
143         final ConfigPusherImpl configPusher = new ConfigPusherImpl(facadeFactory, 0, 0);
144
145         configPusher.pushConfigs(Collections.singletonList(mockedConfigSnapshot));
146         try {
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);
151             return;
152         }
153
154         fail();
155     }
156
157     @Test
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));
167
168         doThrow(ConflictingVersionException.class)
169         .doThrow(ConflictingVersionException.class)
170         .doReturn(mock(CommitStatus.class)).when(facade).commitSilentTransaction();
171
172         doReturn(Sets.newHashSet(module)).when(yangStoreService).getModules();
173
174         final ConfigPusherImpl configPusher = new ConfigPusherImpl(facadeFactory, 5000, 5000);
175
176         configPusher.pushConfigs(Collections.singletonList(mockedConfigSnapshot));
177         configPusher.processSingle(Lists.<AutoCloseable>newArrayList(), mBeanServer, mockedAggregator, true);
178
179         verify(facade, times(3)).executeConfigExecution(cfgExec);
180         verify(facade, times(3)).commitSilentTransaction();
181     }
182
183 }