Remove yang-test
[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
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;
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.repo.api.SourceIdentifier;
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(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());
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(),
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");
103             return;
104         }
105
106         fail();
107     }
108
109     @Test
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();
121
122         final ConfigPusherImpl configPusher = new ConfigPusherImpl(facadeFactory, 0, 0);
123
124         configPusher.pushConfigs(Collections.singletonList(mockedConfigSnapshot));
125         configPusher.processSingle(Lists.<AutoCloseable>newArrayList(), mBeanServer, mockedAggregator, true);
126
127         verify(facade).executeConfigExecution(cfgExec);
128         verify(facade).commitSilentTransaction();
129     }
130
131     @Test
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();
143
144         final ConfigPusherImpl configPusher = new ConfigPusherImpl(facadeFactory, 0, 0);
145
146         configPusher.pushConfigs(Collections.singletonList(mockedConfigSnapshot));
147         try {
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);
152             return;
153         }
154
155         fail();
156     }
157
158     @Test
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));
168
169         doThrow(ConflictingVersionException.class)
170         .doThrow(ConflictingVersionException.class)
171         .doReturn(mock(CommitStatus.class)).when(facade).commitSilentTransaction();
172
173         doReturn(Sets.newHashSet(module)).when(yangStoreService).getModules();
174
175         final ConfigPusherImpl configPusher = new ConfigPusherImpl(facadeFactory, 5000, 5000);
176
177         configPusher.pushConfigs(Collections.singletonList(mockedConfigSnapshot));
178         configPusher.processSingle(Lists.<AutoCloseable>newArrayList(), mBeanServer, mockedAggregator, true);
179
180         verify(facade, times(3)).executeConfigExecution(cfgExec);
181         verify(facade, times(3)).commitSilentTransaction();
182     }
183
184 }