/*
* Copyright (c) 2008-2017, Hazelcast, Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.hazelcast.osgi;
import com.hazelcast.config.Config;
import com.hazelcast.config.GroupConfig;
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.osgi.impl.HazelcastInternalOSGiService;
import com.hazelcast.test.HazelcastSerialClassRunner;
import com.hazelcast.test.HazelcastTestSupport;
import com.hazelcast.test.annotation.SlowTest;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
import org.osgi.framework.BundleException;
import org.osgi.framework.ServiceReference;
import java.util.HashSet;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@RunWith(HazelcastSerialClassRunner.class)
@Category(SlowTest.class)
public class HazelcastOSGiServiceTest extends HazelcastTestSupport {
private TestBundle bundle;
private TestBundleContext bundleContext;
private TestBundleRegisterDeregisterListener registerDeregisterListener;
private class TestBundleRegisterDeregisterListener implements TestBundle.RegisterDeregisterListener {
final String className;
boolean throwExceptionOnRegister;
boolean throwExceptionOnDeregister;
private TestBundleRegisterDeregisterListener() {
this.className = null;
}
private TestBundleRegisterDeregisterListener(String className) {
this.className = className;
}
@Override
public void onRegister(String clazz, TestServiceReference serviceReference) {
if (throwExceptionOnRegister) {
if (className != null) {
if (clazz.equals(className)) {
throw new IllegalStateException("You cannot register!");
}
} else {
throw new IllegalStateException("You cannot register!");
}
}
}
@Override
public void onDeregister(String clazz, TestServiceReference serviceReference) {
if (throwExceptionOnDeregister) {
if (className != null) {
if (clazz.equals(className)) {
throw new IllegalStateException("You cannot deregister!");
}
} else {
throw new IllegalStateException("You cannot deregister!");
}
}
}
}
@Before
public void setup() throws BundleException {
registerDeregisterListener = new TestBundleRegisterDeregisterListener();
bundle = new TestBundle(registerDeregisterListener);
bundleContext = bundle.getBundleContext();
bundle.start();
}
@After
public void tearDown() throws BundleException {
try {
bundle.stop();
bundle = null;
registerDeregisterListener = null;
bundleContext = null;
} finally {
Hazelcast.shutdownAll();
}
}
private HazelcastInternalOSGiService getService(TestBundleContext bundleContext) {
ServiceReference serviceRef = bundleContext.getServiceReference(HazelcastOSGiService.class.getName());
if (serviceRef == null) {
return null;
}
return (HazelcastInternalOSGiService) bundleContext.getService(serviceRef);
}
private HazelcastInternalOSGiService getService() {
return getService(bundleContext);
}
@Test
public void serviceRetrievedSuccessfully() {
HazelcastInternalOSGiService service = getService();
assertNotNull(service);
}
@Test
public void bundleOfServiceRetrievedSuccessfully() {
HazelcastInternalOSGiService service = getService();
assertEquals(bundle, service.getOwnerBundle());
}
@Test
public void idOfServiceRetrievedSuccessfully() {
HazelcastInternalOSGiService service = getService();
assertEquals(HazelcastInternalOSGiService.DEFAULT_ID, service.getId());
}
@Test
public void serviceDeactivatedAndThenActivatedSuccessfully() throws BundleException {
HazelcastInternalOSGiService service = getService();
assertTrue(service.isActive());
bundle.stop();
assertFalse(service.isActive());
assertNull(getService());
bundle.start();
assertTrue(service.isActive());
assertNotNull(getService());
}
@Test
public void defaultInstanceNotExistWhenItIsNotSpecified() {
HazelcastInternalOSGiService service = getService();
assertNull(service.getDefaultHazelcastInstance());
}
@Test
public void defaultInstanceExistWhenItIsSpecified() throws BundleException {
String propValue = System.getProperty(HazelcastOSGiService.HAZELCAST_OSGI_START);
TestBundle testBundle = null;
try {
System.setProperty(HazelcastOSGiService.HAZELCAST_OSGI_START, "true");
testBundle = new TestBundle();
testBundle.start();
HazelcastInternalOSGiService service = getService(testBundle.getBundleContext());
assertNotNull(service);
assertNotNull(service.getDefaultHazelcastInstance());
} finally {
if (propValue != null) {
System.setProperty(HazelcastOSGiService.HAZELCAST_OSGI_START, propValue);
}
if (testBundle != null) {
testBundle.stop();
}
}
}
@Test
public void serviceCouldNotBeActivatedWhenThereIsExceptionWhileRegisteringDefaultInstance() throws BundleException {
String propValue = System.getProperty(HazelcastOSGiService.HAZELCAST_OSGI_START);
TestBundle testBundle = null;
try {
System.setProperty(HazelcastOSGiService.HAZELCAST_OSGI_START, "true");
TestBundleRegisterDeregisterListener registerDeregisterListener =
new TestBundleRegisterDeregisterListener(HazelcastInstance.class.getName());
registerDeregisterListener.throwExceptionOnRegister = true;
testBundle = new TestBundle(registerDeregisterListener);
try {
testBundle.start();
fail("OSGI service could not be activated because of exception while registering default instance. " +
"It is expected to get `IllegalStateException` here!");
} catch (IllegalStateException e) {
// Since bundle is not active, it is expected to get `IllegalStateException`
}
} finally {
if (propValue != null) {
System.setProperty(HazelcastOSGiService.HAZELCAST_OSGI_START, propValue);
}
if (testBundle != null) {
testBundle.stop();
}
}
}
@Test
public void serviceCouldNotBeActivatedWhenThereIsExceptionWhileRegisteringService() throws BundleException {
String propValue = System.getProperty(HazelcastOSGiService.HAZELCAST_OSGI_START);
TestBundle testBundle = null;
try {
System.setProperty(HazelcastOSGiService.HAZELCAST_OSGI_START, "true");
TestBundleRegisterDeregisterListener registerDeregisterListener =
new TestBundleRegisterDeregisterListener(HazelcastOSGiService.class.getName());
registerDeregisterListener.throwExceptionOnRegister = true;
testBundle = new TestBundle(registerDeregisterListener);
try {
testBundle.start();
fail("OSGI service could not be activated because of exception while registering default instance. " +
"It is expected to get `IllegalStateException` here!");
} catch (IllegalStateException e) {
// Since bundle is not active, it is expected to get `IllegalStateException`
}
} finally {
if (propValue != null) {
System.setProperty(HazelcastOSGiService.HAZELCAST_OSGI_START, propValue);
}
if (testBundle != null) {
testBundle.stop();
}
}
}
@Test
public void newInstanceRetrievedSuccessfullyWithoutConfiguration() {
HazelcastInternalOSGiService service = getService();
HazelcastOSGiInstance osgiInstance = service.newHazelcastInstance();
assertNotNull(osgiInstance);
HazelcastInstance instance = osgiInstance.getDelegatedInstance();
assertNotNull(instance);
}
@Test
public void newInstanceRetrievedSuccessfullyWithConfiguration() {
final String INSTANCE_NAME = "test-osgi-instance";
HazelcastInternalOSGiService service = getService();
Config config = new Config(INSTANCE_NAME);
HazelcastOSGiInstance osgiInstance = service.newHazelcastInstance(config);
assertNotNull(osgiInstance);
assertEquals(config, osgiInstance.getConfig());
HazelcastInstance instance = osgiInstance.getDelegatedInstance();
assertNotNull(instance);
assertEquals(config, instance.getConfig());
}
@Test
public void newInstanceRegisteredAsServiceWhenRegistrationIsNotDisabled() throws BundleException {
HazelcastInternalOSGiService service = getService();
service.newHazelcastInstance();
assertNull(bundleContext.getServiceReference(HazelcastOSGiInstance.class.getName()));
}
@Test
public void newInstanceNotRegisteredAsServiceWhenRegistrationIsDisabled() throws BundleException {
String propValue = System.getProperty(HazelcastOSGiService.HAZELCAST_OSGI_REGISTER_DISABLED);
TestBundle testBundle = null;
try {
System.setProperty(HazelcastOSGiService.HAZELCAST_OSGI_REGISTER_DISABLED, "true");
testBundle = new TestBundle();
TestBundleContext testBundleContext = testBundle.getBundleContext();
testBundle.start();
HazelcastInternalOSGiService service = getService(testBundleContext);
assertNotNull(service);
service.newHazelcastInstance();
assertNull(testBundleContext.getServiceReference(HazelcastOSGiInstance.class.getName()));
} finally {
if (propValue != null) {
System.setProperty(HazelcastOSGiService.HAZELCAST_OSGI_REGISTER_DISABLED, propValue);
}
if (testBundle != null) {
testBundle.stop();
}
}
}
@Test
public void groupNameIsSetToDefaultGroupNameOfBundleWhenGroupingIsNotDisabled() {
HazelcastInternalOSGiService service = getService();
HazelcastOSGiInstance osgiInstance = service.newHazelcastInstance();
assertEquals(HazelcastInternalOSGiService.DEFAULT_GROUP_NAME,
osgiInstance.getConfig().getGroupConfig().getName());
HazelcastInstance instance = osgiInstance.getDelegatedInstance();
assertEquals(HazelcastInternalOSGiService.DEFAULT_GROUP_NAME,
instance.getConfig().getGroupConfig().getName());
}
@Test
public void groupNameIsSetToDefaultGroupNameOfBundleWhenConfigIsGivenWithoutSpecifiedGroupConfigAndGroupingIsNotDisabled() {
Config config = new Config();
HazelcastInternalOSGiService service = getService();
HazelcastOSGiInstance osgiInstance = service.newHazelcastInstance(config);
assertEquals(HazelcastInternalOSGiService.DEFAULT_GROUP_NAME,
osgiInstance.getConfig().getGroupConfig().getName());
HazelcastInstance instance = osgiInstance.getDelegatedInstance();
assertEquals(HazelcastInternalOSGiService.DEFAULT_GROUP_NAME,
instance.getConfig().getGroupConfig().getName());
}
@Test
public void groupNameIsSetToDefaultGroupNameOfBundleWhenConfigIsGivenWithNullGroupConfigAndGroupingIsNotDisabled() {
Config config = new Config();
config.setGroupConfig(null);
HazelcastInternalOSGiService service = getService();
HazelcastOSGiInstance osgiInstance = service.newHazelcastInstance(config);
assertEquals(HazelcastInternalOSGiService.DEFAULT_GROUP_NAME,
osgiInstance.getConfig().getGroupConfig().getName());
HazelcastInstance instance = osgiInstance.getDelegatedInstance();
assertEquals(HazelcastInternalOSGiService.DEFAULT_GROUP_NAME,
instance.getConfig().getGroupConfig().getName());
}
@Test
public void groupNameIsSetToSpecifiedGroupNameWhenGroupingIsNotDisabled() {
final String GROUP_NAME = "my-osgi-group";
HazelcastInternalOSGiService service = getService();
Config config = new Config();
config.getGroupConfig().setName(GROUP_NAME);
HazelcastOSGiInstance osgiInstance = service.newHazelcastInstance(config);
assertEquals(GROUP_NAME,
osgiInstance.getConfig().getGroupConfig().getName());
HazelcastInstance instance = osgiInstance.getDelegatedInstance();
assertEquals(GROUP_NAME,
instance.getConfig().getGroupConfig().getName());
}
@Test
public void groupNameIsSetToDefaultGroupNameWhenGroupingIsDisabled() throws BundleException {
String propValue = System.getProperty(HazelcastOSGiService.HAZELCAST_OSGI_GROUPING_DISABLED);
TestBundle testBundle = null;
try {
System.setProperty(HazelcastOSGiService.HAZELCAST_OSGI_GROUPING_DISABLED, "true");
testBundle = new TestBundle();
TestBundleContext testBundleContext = testBundle.getBundleContext();
testBundle.start();
HazelcastInternalOSGiService service = getService(testBundleContext);
assertNotNull(service);
HazelcastOSGiInstance osgiInstance = service.newHazelcastInstance();
assertEquals(GroupConfig.DEFAULT_GROUP_NAME, osgiInstance.getConfig().getGroupConfig().getName());
HazelcastInstance instance = osgiInstance.getDelegatedInstance();
assertEquals(GroupConfig.DEFAULT_GROUP_NAME, instance.getConfig().getGroupConfig().getName());
} finally {
if (propValue != null) {
System.setProperty(HazelcastOSGiService.HAZELCAST_OSGI_GROUPING_DISABLED, propValue);
}
if (testBundle != null) {
testBundle.stop();
}
}
}
@Test
public void groupNameIsSetToSpecifiedGroupNameWhenGroupingIsDisabled() throws BundleException {
final String GROUP_NAME = "my-osgi-group";
String propValue = System.getProperty(HazelcastOSGiService.HAZELCAST_OSGI_GROUPING_DISABLED);
TestBundle testBundle = null;
try {
System.setProperty(HazelcastOSGiService.HAZELCAST_OSGI_GROUPING_DISABLED, "true");
testBundle = new TestBundle();
TestBundleContext testBundleContext = testBundle.getBundleContext();
testBundle.start();
HazelcastInternalOSGiService service = getService(testBundleContext);
assertNotNull(service);
Config config = new Config();
config.getGroupConfig().setName(GROUP_NAME);
HazelcastOSGiInstance osgiInstance = service.newHazelcastInstance(config);
assertEquals(GROUP_NAME, osgiInstance.getConfig().getGroupConfig().getName());
HazelcastInstance instance = osgiInstance.getDelegatedInstance();
assertEquals(GROUP_NAME, instance.getConfig().getGroupConfig().getName());
} finally {
if (propValue != null) {
System.setProperty(HazelcastOSGiService.HAZELCAST_OSGI_GROUPING_DISABLED, propValue);
}
if (testBundle != null) {
testBundle.stop();
}
}
}
@Test
public void instanceRetrievedSuccessfullyWithItsName() {
final String INSTANCE_NAME = "test-osgi-instance";
HazelcastInternalOSGiService service = getService();
Config config = new Config(INSTANCE_NAME);
service.newHazelcastInstance(config);
HazelcastOSGiInstance osgiInstance = service.getHazelcastInstanceByName(INSTANCE_NAME);
assertNotNull(osgiInstance);
assertEquals(config, osgiInstance.getConfig());
HazelcastInstance instance = osgiInstance.getDelegatedInstance();
assertNotNull(instance);
assertEquals(config, instance.getConfig());
}
@Test
public void allInstancesRetrievedSuccessfully() {
Set<HazelcastOSGiInstance> osgiInstances = new HashSet<HazelcastOSGiInstance>();
HazelcastInternalOSGiService service = getService();
osgiInstances.add(service.newHazelcastInstance());
osgiInstances.add(service.newHazelcastInstance(new Config("test-osgi-instance")));
Set<HazelcastOSGiInstance> allOSGiInstances = service.getAllHazelcastInstances();
assertEquals(osgiInstances.size(), allOSGiInstances.size());
assertContainsAll(allOSGiInstances, osgiInstances);
}
@Test
public void instanceShutdownSuccessfully() {
final String INSTANCE_NAME = "test-osgi-instance";
HazelcastInternalOSGiService service = getService();
Config config = new Config(INSTANCE_NAME);
HazelcastOSGiInstance osgiInstance = service.newHazelcastInstance(config);
assertTrue(osgiInstance.getLifecycleService().isRunning());
HazelcastInstance instance = osgiInstance.getDelegatedInstance();
assertTrue(instance.getLifecycleService().isRunning());
service.shutdownHazelcastInstance(osgiInstance);
assertFalse(osgiInstance.getLifecycleService().isRunning());
assertFalse(instance.getLifecycleService().isRunning());
assertNull(service.getHazelcastInstanceByName(INSTANCE_NAME));
assertFalse(service.getAllHazelcastInstances().contains(osgiInstance));
}
@Test
public void instanceShutdownSuccessfullyAlthoughThereIsExceptionWhileDeregister() {
final String INSTANCE_NAME = "test-osgi-instance";
registerDeregisterListener.throwExceptionOnDeregister = true;
HazelcastInternalOSGiService service = getService();
Config config = new Config(INSTANCE_NAME);
HazelcastOSGiInstance osgiInstance = service.newHazelcastInstance(config);
assertTrue(osgiInstance.getLifecycleService().isRunning());
HazelcastInstance instance = osgiInstance.getDelegatedInstance();
assertTrue(instance.getLifecycleService().isRunning());
service.shutdownHazelcastInstance(osgiInstance);
assertFalse(osgiInstance.getLifecycleService().isRunning());
assertFalse(instance.getLifecycleService().isRunning());
assertNull(service.getHazelcastInstanceByName(INSTANCE_NAME));
assertFalse(service.getAllHazelcastInstances().contains(osgiInstance));
}
@Test
public void allInstancesShutdownSuccessfully() {
Set<HazelcastOSGiInstance> osgiInstances = new HashSet<HazelcastOSGiInstance>();
HazelcastInternalOSGiService service = getService();
osgiInstances.add(service.newHazelcastInstance());
osgiInstances.add(service.newHazelcastInstance(new Config("test-osgi-instance")));
Set<HazelcastOSGiInstance> allOSGiInstances = service.getAllHazelcastInstances();
for (HazelcastOSGiInstance osgiInstance : allOSGiInstances) {
assertTrue(osgiInstance.getLifecycleService().isRunning());
HazelcastInstance instance = osgiInstance.getDelegatedInstance();
assertTrue(instance.getLifecycleService().isRunning());
}
service.shutdownAll();
for (HazelcastOSGiInstance osgiInstance : osgiInstances) {
assertFalse(osgiInstance.getLifecycleService().isRunning());
HazelcastInstance instance = osgiInstance.getDelegatedInstance();
assertFalse(instance.getLifecycleService().isRunning());
}
allOSGiInstances = service.getAllHazelcastInstances();
assertEquals(0, allOSGiInstances.size());
}
@Test
public void allInstancesShutdownSuccessfullyAlthoughThereIsExceptionWhileDeregister() {
Set<HazelcastOSGiInstance> osgiInstances = new HashSet<HazelcastOSGiInstance>();
registerDeregisterListener.throwExceptionOnDeregister = true;
HazelcastInternalOSGiService service = getService();
osgiInstances.add(service.newHazelcastInstance());
osgiInstances.add(service.newHazelcastInstance(new Config("test-osgi-instance")));
Set<HazelcastOSGiInstance> allOSGiInstances = service.getAllHazelcastInstances();
for (HazelcastOSGiInstance osgiInstance : allOSGiInstances) {
assertTrue(osgiInstance.getLifecycleService().isRunning());
HazelcastInstance instance = osgiInstance.getDelegatedInstance();
assertTrue(instance.getLifecycleService().isRunning());
}
service.shutdownAll();
for (HazelcastOSGiInstance osgiInstance : osgiInstances) {
assertFalse(osgiInstance.getLifecycleService().isRunning());
HazelcastInstance instance = osgiInstance.getDelegatedInstance();
assertFalse(instance.getLifecycleService().isRunning());
}
allOSGiInstances = service.getAllHazelcastInstances();
assertEquals(0, allOSGiInstances.size());
}
@Test
public void serviceIsNotOperationalWhenItIsNotActive() throws BundleException {
TestBundle testBundle = null;
try {
testBundle = new TestBundle();
TestBundleContext testBundleContext = testBundle.getBundleContext();
testBundle.start();
HazelcastInternalOSGiService service = getService(testBundleContext);
assertNotNull(service);
testBundle.stop();
testBundle = null;
try {
service.newHazelcastInstance();
fail("OSGI service is not active so it is not in operation mode."
+ " It is expected to get `IllegalStateException` here!");
} catch (IllegalStateException e) {
// since the bundle is not active, it is expected to get `IllegalStateException`
}
} finally {
if (testBundle != null) {
testBundle.stop();
}
}
}
}