2 * Copyright (c) 2015 Brocade Communications 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.cluster.datastore;
10 import static org.mockito.Matchers.any;
11 import static org.mockito.Matchers.eq;
12 import static org.mockito.Mockito.doReturn;
13 import static org.mockito.Mockito.mock;
14 import static org.mockito.Mockito.reset;
15 import static org.mockito.Mockito.times;
16 import static org.mockito.Mockito.verify;
18 import java.io.IOException;
19 import java.util.Dictionary;
20 import java.util.Hashtable;
21 import org.junit.Before;
22 import org.junit.Test;
23 import org.mockito.ArgumentCaptor;
24 import org.mockito.Mock;
25 import org.mockito.MockitoAnnotations;
26 import org.osgi.framework.BundleContext;
27 import org.osgi.framework.ServiceReference;
28 import org.osgi.framework.ServiceRegistration;
29 import org.osgi.service.cm.Configuration;
30 import org.osgi.service.cm.ConfigurationAdmin;
31 import org.osgi.service.cm.ConfigurationEvent;
32 import org.osgi.service.cm.ConfigurationListener;
35 * Unit tests for DatastoreContextConfigAdminOverlay.
37 * @author Thomas Pantelis
39 @SuppressWarnings("unchecked")
40 public class DatastoreContextConfigAdminOverlayTest {
43 private BundleContext mockBundleContext;
46 private ServiceReference<ConfigurationAdmin> mockConfigAdminServiceRef;
49 private ConfigurationAdmin mockConfigAdmin;
52 private Configuration mockConfig;
55 private DatastoreContextIntrospector mockIntrospector;
58 private ServiceRegistration<?> configListenerServiceReg;
61 public void setup() throws IOException {
62 MockitoAnnotations.initMocks(this);
64 doReturn(mockConfigAdminServiceRef).when(mockBundleContext).getServiceReference(ConfigurationAdmin.class);
65 doReturn(mockConfigAdmin).when(mockBundleContext).getService(mockConfigAdminServiceRef);
66 doReturn(configListenerServiceReg).when(mockBundleContext).registerService(
67 eq(ConfigurationListener.class.getName()), any(), any(Dictionary.class));
69 doReturn(mockConfig).when(mockConfigAdmin).getConfiguration(DatastoreContextConfigAdminOverlay.CONFIG_ID);
71 doReturn(DatastoreContextConfigAdminOverlay.CONFIG_ID).when(mockConfig).getPid();
76 public void testUpdateOnConstruction() {
77 Dictionary<String, Object> properties = new Hashtable<>();
78 properties.put("property", "value");
79 doReturn(properties).when(mockConfig).getProperties();
81 DatastoreContextConfigAdminOverlay overlay = new DatastoreContextConfigAdminOverlay(
82 mockIntrospector, mockBundleContext);
84 verify(mockIntrospector).update(properties);
86 verify(mockBundleContext).ungetService(mockConfigAdminServiceRef);
92 public void testUpdateOnConfigurationEvent() {
93 final DatastoreContextConfigAdminOverlay overlay = new DatastoreContextConfigAdminOverlay(
94 mockIntrospector, mockBundleContext);
96 reset(mockIntrospector);
98 DatastoreContext context = DatastoreContext.newBuilder().build();
99 doReturn(context).when(mockIntrospector).getContext();
100 DatastoreContextFactory contextFactory = new DatastoreContextFactory(mockIntrospector);
101 doReturn(contextFactory).when(mockIntrospector).newContextFactory();
103 DatastoreContextConfigAdminOverlay.Listener mockListener =
104 mock(DatastoreContextConfigAdminOverlay.Listener.class);
106 overlay.setListener(mockListener);
108 Dictionary<String, Object> properties = new Hashtable<>();
109 properties.put("property", "value");
110 doReturn(properties).when(mockConfig).getProperties();
112 doReturn(true).when(mockIntrospector).update(properties);
114 ArgumentCaptor<ConfigurationListener> configListener =
115 ArgumentCaptor.forClass(ConfigurationListener.class);
116 verify(mockBundleContext).registerService(eq(ConfigurationListener.class.getName()),
117 configListener.capture(), any(Dictionary.class));
119 ConfigurationEvent configEvent = mock(ConfigurationEvent.class);
120 doReturn(DatastoreContextConfigAdminOverlay.CONFIG_ID).when(configEvent).getPid();
121 doReturn(mockConfigAdminServiceRef).when(configEvent).getReference();
122 doReturn(ConfigurationEvent.CM_UPDATED).when(configEvent).getType();
124 configListener.getValue().configurationEvent(configEvent);
126 verify(mockIntrospector).update(properties);
128 verify(mockListener).onDatastoreContextUpdated(contextFactory);
130 verify(mockBundleContext, times(2)).ungetService(mockConfigAdminServiceRef);
134 verify(configListenerServiceReg).unregister();
138 public void testConfigurationEventWithDifferentPid() {
139 final DatastoreContextConfigAdminOverlay overlay = new DatastoreContextConfigAdminOverlay(
140 mockIntrospector, mockBundleContext);
142 reset(mockIntrospector);
144 ArgumentCaptor<ConfigurationListener> configListener =
145 ArgumentCaptor.forClass(ConfigurationListener.class);
146 verify(mockBundleContext).registerService(eq(ConfigurationListener.class.getName()),
147 configListener.capture(), any(Dictionary.class));
149 ConfigurationEvent configEvent = mock(ConfigurationEvent.class);
150 doReturn("other-pid").when(configEvent).getPid();
151 doReturn(mockConfigAdminServiceRef).when(configEvent).getReference();
152 doReturn(ConfigurationEvent.CM_UPDATED).when(configEvent).getType();
154 configListener.getValue().configurationEvent(configEvent);
156 verify(mockIntrospector, times(0)).update(any(Dictionary.class));
162 public void testConfigurationEventWithNonUpdateEventType() {
163 final DatastoreContextConfigAdminOverlay overlay = new DatastoreContextConfigAdminOverlay(
164 mockIntrospector, mockBundleContext);
166 reset(mockIntrospector);
168 ArgumentCaptor<ConfigurationListener> configListener =
169 ArgumentCaptor.forClass(ConfigurationListener.class);
170 verify(mockBundleContext).registerService(eq(ConfigurationListener.class.getName()),
171 configListener.capture(), any(Dictionary.class));
173 ConfigurationEvent configEvent = mock(ConfigurationEvent.class);
174 doReturn(DatastoreContextConfigAdminOverlay.CONFIG_ID).when(configEvent).getPid();
175 doReturn(mockConfigAdminServiceRef).when(configEvent).getReference();
176 doReturn(ConfigurationEvent.CM_DELETED).when(configEvent).getType();
178 configListener.getValue().configurationEvent(configEvent);
180 verify(mockIntrospector, times(0)).update(any(Dictionary.class));