3583e32e2626ca83464e8f7e54f69cac76f3b4bb
[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.assertNotNull;
12 import static org.junit.Assert.assertTrue;
13 import static org.junit.Assert.fail;
14 import static org.mockito.Matchers.any;
15 import static org.mockito.Matchers.anyObject;
16 import static org.mockito.Matchers.anyString;
17 import static org.mockito.Mockito.doNothing;
18 import static org.mockito.Mockito.doReturn;
19 import static org.mockito.Mockito.doThrow;
20 import static org.mockito.Mockito.mock;
21 import static org.mockito.Mockito.times;
22 import static org.mockito.Mockito.verify;
23
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;
28 import java.util.Set;
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.api.ModuleIdentifier;
51 import org.w3c.dom.Element;
52
53 public class ConfigPusherImplTest {
54
55     @Mock
56     private YangStoreService yangStoreService;
57     @Mock
58     private ConfigSnapshotHolder mockedConfigSnapshot;
59     @Mock
60     private Persister mockedAggregator;
61     @Mock
62     private ConfigRegistryClient configRegistryClient;
63     @Mock
64     private org.opendaylight.yangtools.yang.model.api.Module module;
65     @Mock
66     private ConfigSubsystemFacadeFactory facadeFactory;
67     @Mock
68     private ConfigSubsystemFacade facade;
69     @Mock
70     private MBeanServerConnection mBeanServer;
71
72     @Before
73     public void setUp() throws Exception {
74         MockitoAnnotations.initMocks(this);
75         doReturn("content").when(yangStoreService).getModuleSource(any(ModuleIdentifier.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());
85     }
86
87     @Test
88     public void testPersisterNotAllCapabilitiesProvided() throws Exception {
89         doReturn(new TreeSet<>(Lists.newArrayList("required-cap"))).when(mockedConfigSnapshot).getCapabilities();
90
91         final ConfigPusherImpl configPusher = new ConfigPusherImpl(facadeFactory, 0, 0);
92
93         configPusher.pushConfigs(Collections.singletonList(mockedConfigSnapshot));
94         try {
95             configPusher.process(Lists.<AutoCloseable>newArrayList(), ManagementFactory.getPlatformMBeanServer(), mockedAggregator);
96         } catch(IllegalStateException e) {
97             assertNotNull(e.getCause());
98             assertTrue(e.getCause() instanceof ConfigPusherImpl.NotEnoughCapabilitiesException);
99             final Set<String> missingCaps = ((ConfigPusherImpl.NotEnoughCapabilitiesException) e.getCause()).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);
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);
148         } catch (IllegalStateException e) {
149             assertNotNull(e.getCause());
150             assertTrue(e.getCause() 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);
178
179         verify(facade, times(3)).executeConfigExecution(cfgExec);
180         verify(facade, times(3)).commitSilentTransaction();
181     }
182
183 }