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;
17 import java.io.IOException;
18 import java.util.Dictionary;
19 import java.util.Hashtable;
20 import org.junit.Before;
21 import org.junit.Test;
22 import org.mockito.ArgumentCaptor;
23 import org.mockito.Mock;
24 import org.mockito.MockitoAnnotations;
25 import org.osgi.framework.BundleContext;
26 import org.osgi.framework.ServiceReference;
27 import org.osgi.framework.ServiceRegistration;
28 import org.osgi.service.cm.Configuration;
29 import org.osgi.service.cm.ConfigurationAdmin;
30 import org.osgi.service.cm.ConfigurationEvent;
31 import org.osgi.service.cm.ConfigurationListener;
34 * Unit tests for DatastoreContextConfigAdminOverlay.
36 * @author Thomas Pantelis
38 @SuppressWarnings("unchecked")
39 public class DatastoreContextConfigAdminOverlayTest {
42 private BundleContext mockBundleContext;
45 private ServiceReference<ConfigurationAdmin> mockConfigAdminServiceRef;
48 private ConfigurationAdmin mockConfigAdmin;
51 private Configuration mockConfig;
54 private DatastoreContextIntrospector mockIntrospector;
57 private ServiceRegistration<?> configListenerServiceReg;
60 public void setup() throws IOException {
61 MockitoAnnotations.initMocks(this);
63 doReturn(mockConfigAdminServiceRef).when(mockBundleContext).getServiceReference(ConfigurationAdmin.class);
64 doReturn(mockConfigAdmin).when(mockBundleContext).getService(mockConfigAdminServiceRef);
65 doReturn(configListenerServiceReg).when(mockBundleContext).registerService(
66 eq(ConfigurationListener.class.getName()), any(), any(Dictionary.class));
68 doReturn(mockConfig).when(mockConfigAdmin).getConfiguration(DatastoreContextConfigAdminOverlay.CONFIG_ID);
70 doReturn(DatastoreContextConfigAdminOverlay.CONFIG_ID).when(mockConfig).getPid();
75 public void testUpdateOnConstruction() {
76 Dictionary<String, Object> properties = new Hashtable<>();
77 properties.put("property", "value");
78 doReturn(properties).when(mockConfig).getProperties();
80 DatastoreContextConfigAdminOverlay overlay = new DatastoreContextConfigAdminOverlay(
81 mockIntrospector, mockBundleContext);
83 verify(mockIntrospector).update(properties);
85 verify(mockBundleContext).ungetService(mockConfigAdminServiceRef);
91 public void testUpdateOnConfigurationEvent() {
92 DatastoreContextConfigAdminOverlay overlay = new DatastoreContextConfigAdminOverlay(
93 mockIntrospector, mockBundleContext);
95 reset(mockIntrospector);
97 DatastoreContext context = DatastoreContext.newBuilder().build();
98 doReturn(context).when(mockIntrospector).getContext();
100 DatastoreContextConfigAdminOverlay.Listener mockListener =
101 mock(DatastoreContextConfigAdminOverlay.Listener.class);
103 overlay.setListener(mockListener);
105 Dictionary<String, Object> properties = new Hashtable<>();
106 properties.put("property", "value");
107 doReturn(properties).when(mockConfig).getProperties();
109 doReturn(true).when(mockIntrospector).update(properties);
111 ArgumentCaptor<ConfigurationListener> configListener =
112 ArgumentCaptor.forClass(ConfigurationListener.class);
113 verify(mockBundleContext).registerService(eq(ConfigurationListener.class.getName()),
114 configListener.capture(), any(Dictionary.class));
116 ConfigurationEvent configEvent = mock(ConfigurationEvent.class);
117 doReturn(DatastoreContextConfigAdminOverlay.CONFIG_ID).when(configEvent).getPid();
118 doReturn(mockConfigAdminServiceRef).when(configEvent).getReference();
119 doReturn(ConfigurationEvent.CM_UPDATED).when(configEvent).getType();
121 configListener.getValue().configurationEvent(configEvent);
123 verify(mockIntrospector).update(properties);
125 verify(mockListener).onDatastoreContextUpdated(context);
127 verify(mockBundleContext, times(2)).ungetService(mockConfigAdminServiceRef);
131 verify(configListenerServiceReg).unregister();
135 public void testConfigurationEventWithDifferentPid() {
136 DatastoreContextConfigAdminOverlay overlay = new DatastoreContextConfigAdminOverlay(
137 mockIntrospector, mockBundleContext);
139 reset(mockIntrospector);
141 ArgumentCaptor<ConfigurationListener> configListener =
142 ArgumentCaptor.forClass(ConfigurationListener.class);
143 verify(mockBundleContext).registerService(eq(ConfigurationListener.class.getName()),
144 configListener.capture(), any(Dictionary.class));
146 ConfigurationEvent configEvent = mock(ConfigurationEvent.class);
147 doReturn("other-pid").when(configEvent).getPid();
148 doReturn(mockConfigAdminServiceRef).when(configEvent).getReference();
149 doReturn(ConfigurationEvent.CM_UPDATED).when(configEvent).getType();
151 configListener.getValue().configurationEvent(configEvent);
153 verify(mockIntrospector, times(0)).update(any(Dictionary.class));
159 public void testConfigurationEventWithNonUpdateEventType() {
160 DatastoreContextConfigAdminOverlay overlay = new DatastoreContextConfigAdminOverlay(
161 mockIntrospector, mockBundleContext);
163 reset(mockIntrospector);
165 ArgumentCaptor<ConfigurationListener> configListener =
166 ArgumentCaptor.forClass(ConfigurationListener.class);
167 verify(mockBundleContext).registerService(eq(ConfigurationListener.class.getName()),
168 configListener.capture(), any(Dictionary.class));
170 ConfigurationEvent configEvent = mock(ConfigurationEvent.class);
171 doReturn(DatastoreContextConfigAdminOverlay.CONFIG_ID).when(configEvent).getPid();
172 doReturn(mockConfigAdminServiceRef).when(configEvent).getReference();
173 doReturn(ConfigurationEvent.CM_DELETED).when(configEvent).getType();
175 configListener.getValue().configurationEvent(configEvent);
177 verify(mockIntrospector, times(0)).update(any(Dictionary.class));