+ verify(mockBundleContext).ungetService(mockConfigAdminServiceRef);
+
+ overlay.close();
+ }
+
+ @Test
+ public void testUpdateOnConfigurationEvent() {
+ final DatastoreContextConfigAdminOverlay overlay = new DatastoreContextConfigAdminOverlay(
+ mockIntrospector, mockBundleContext);
+
+ reset(mockIntrospector);
+
+ DatastoreContext context = DatastoreContext.newBuilder().build();
+ doReturn(context).when(mockIntrospector).getContext();
+ DatastoreContextFactory contextFactory = new DatastoreContextFactory(mockIntrospector);
+ doReturn(contextFactory).when(mockIntrospector).newContextFactory();
+
+ DatastoreContextConfigAdminOverlay.Listener mockListener =
+ mock(DatastoreContextConfigAdminOverlay.Listener.class);
+
+ overlay.setListener(mockListener);
+
+ Dictionary<String, Object> properties = new Hashtable<>();
+ properties.put("property", "value");
+ doReturn(properties).when(mockConfig).getProperties();
+
+ doReturn(true).when(mockIntrospector).update(properties);
+
+ ArgumentCaptor<ConfigurationListener> configListener =
+ ArgumentCaptor.forClass(ConfigurationListener.class);
+ verify(mockBundleContext).registerService(eq(ConfigurationListener.class.getName()),
+ configListener.capture(), any(Dictionary.class));
+
+ ConfigurationEvent configEvent = mock(ConfigurationEvent.class);
+ doReturn(DatastoreContextConfigAdminOverlay.CONFIG_ID).when(configEvent).getPid();
+ doReturn(mockConfigAdminServiceRef).when(configEvent).getReference();
+ doReturn(ConfigurationEvent.CM_UPDATED).when(configEvent).getType();
+
+ configListener.getValue().configurationEvent(configEvent);
+
+ verify(mockIntrospector).update(properties);
+
+ verify(mockListener).onDatastoreContextUpdated(contextFactory);
+
+ verify(mockBundleContext, times(2)).ungetService(mockConfigAdminServiceRef);
+
+ overlay.close();
+
+ verify(configListenerServiceReg).unregister();
+ }
+
+ @Test
+ public void testConfigurationEventWithDifferentPid() {
+ final DatastoreContextConfigAdminOverlay overlay = new DatastoreContextConfigAdminOverlay(
+ mockIntrospector, mockBundleContext);
+
+ reset(mockIntrospector);
+
+ ArgumentCaptor<ConfigurationListener> configListener =
+ ArgumentCaptor.forClass(ConfigurationListener.class);
+ verify(mockBundleContext).registerService(eq(ConfigurationListener.class.getName()),
+ configListener.capture(), any(Dictionary.class));
+
+ ConfigurationEvent configEvent = mock(ConfigurationEvent.class);
+ doReturn("other-pid").when(configEvent).getPid();
+ doReturn(mockConfigAdminServiceRef).when(configEvent).getReference();
+ doReturn(ConfigurationEvent.CM_UPDATED).when(configEvent).getType();
+
+ configListener.getValue().configurationEvent(configEvent);
+
+ verify(mockIntrospector, times(0)).update(any(Dictionary.class));
+
+ overlay.close();
+ }
+
+ @Test
+ public void testConfigurationEventWithNonUpdateEventType() {
+ final DatastoreContextConfigAdminOverlay overlay = new DatastoreContextConfigAdminOverlay(
+ mockIntrospector, mockBundleContext);
+
+ reset(mockIntrospector);
+
+ ArgumentCaptor<ConfigurationListener> configListener =
+ ArgumentCaptor.forClass(ConfigurationListener.class);
+ verify(mockBundleContext).registerService(eq(ConfigurationListener.class.getName()),
+ configListener.capture(), any(Dictionary.class));
+
+ ConfigurationEvent configEvent = mock(ConfigurationEvent.class);
+ doReturn(DatastoreContextConfigAdminOverlay.CONFIG_ID).when(configEvent).getPid();
+ doReturn(mockConfigAdminServiceRef).when(configEvent).getReference();
+ doReturn(ConfigurationEvent.CM_DELETED).when(configEvent).getType();
+
+ configListener.getValue().configurationEvent(configEvent);
+
+ verify(mockIntrospector, times(0)).update(any(Dictionary.class));
+
+ overlay.close();