diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml b/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml index 40f3ab5f850..fca68e4c5f8 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml @@ -345,7 +345,23 @@ javassist javassist - + + + org.powermock + powermock-api-mockito + + + org.powermock + powermock-module-junit4 + test + + + + + + + + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/geo/service/GeoLocationProviderServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/geo/service/GeoLocationProviderServiceImpl.java index 36b56e357a4..91102990091 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/geo/service/GeoLocationProviderServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/geo/service/GeoLocationProviderServiceImpl.java @@ -390,7 +390,7 @@ public class GeoLocationProviderServiceImpl implements GeoLocationProviderServic } } - private EventProcessorAdminServiceStub getEventProcessorAdminServiceStub() throws JWTClientException { + protected EventProcessorAdminServiceStub getEventProcessorAdminServiceStub() throws JWTClientException { //send alert to event-processing String eventProcessorAdminServiceWSUrl = Utils.replaceSystemProperty(GeoServices.DAS_URL) + "/services/EventProcessorAdminService"; diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/geo/service/GeoLocationProviderServiceTest.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/geo/service/GeoLocationProviderServiceTest.java new file mode 100644 index 00000000000..233f6c06e14 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/geo/service/GeoLocationProviderServiceTest.java @@ -0,0 +1,264 @@ +package org.wso2.carbon.device.mgt.core.geo.service; + +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.powermock.core.classloader.annotations.PrepareForTest; + +import org.testng.Assert; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; +import org.wso2.carbon.device.mgt.common.Device; +import org.wso2.carbon.device.mgt.common.DeviceIdentifier; +import org.wso2.carbon.device.mgt.common.DeviceManagementConstants; +import org.wso2.carbon.device.mgt.common.geo.service.Alert; +import org.wso2.carbon.device.mgt.common.geo.service.GeoFence; +import org.wso2.carbon.device.mgt.core.TestDeviceManagementService; +import org.wso2.carbon.device.mgt.core.authorization.DeviceAccessAuthorizationServiceImpl; +import org.wso2.carbon.device.mgt.core.common.TestDataHolder; +import org.wso2.carbon.device.mgt.core.internal.DeviceManagementDataHolder; +import org.wso2.carbon.device.mgt.core.internal.DeviceManagementServiceComponent; +import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; +import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderServiceImpl; +import org.wso2.carbon.device.mgt.core.service.GroupManagementProviderServiceImpl; +import org.wso2.carbon.event.processor.stub.EventProcessorAdminServiceStub; +import org.wso2.carbon.identity.jwt.client.extension.exception.JWTClientException; +import org.wso2.carbon.registry.core.config.RegistryContext; +import org.wso2.carbon.registry.core.exceptions.RegistryException; +import org.wso2.carbon.registry.core.internal.RegistryDataHolder; +import org.wso2.carbon.registry.core.jdbc.realm.InMemoryRealmService; +import org.wso2.carbon.registry.core.service.RegistryService; +import org.wso2.carbon.user.core.service.RealmService; +import org.wso2.carbon.utils.multitenancy.MultitenantConstants; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.io.InputStream; +import java.rmi.RemoteException; +import java.util.List; + +import static org.powermock.api.mockito.PowerMockito.*; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(GeoLocationProviderServiceImpl.class) +public class GeoLocationProviderServiceTest { + + private static final Log log = LogFactory.getLog(GeoLocationProviderServiceTest.class); + private static final String DEVICE_TYPE = "GL_TEST_TYPE"; + private static final String DEVICE_ID = "GL-TEST-DEVICE-ID-1"; + private static final String SAMPLE_GEO_JSON = "12121"; + private static final String SAMPLE_AREA_NAME = "CUSTOM_NAME"; + private static final String SAMPLE_QUERY_NAME = "QUERY_NAME"; + private static final String SAMPLE_PROXIMITY_DISATANCE = "100"; + private static final String SAMPLE_PROXIMITY_TIME = "50"; + private static final String SAMPLE_SPEED_ALERT_VALUE = "120"; + private static final String SAMPLE_STATIONARY_TIME = "1500"; + private static final String SAMPLE_FLUCTUATION_RADIUS = "2000"; + + private EventProcessorAdminServiceStub mockEventProcessorAdminServiceStub; + private GeoLocationProviderServiceImpl geoLocationProviderServiceImpl; + + @BeforeClass + public void init() throws Exception { + initMocks(); + enrollTestDevice(); + } + + @Test + public void createGeoExitAlert() throws Exception { + Boolean result = geoLocationProviderServiceImpl. + createGeoAlert(getTestAlert(), getDeviceIdentifier(), DeviceManagementConstants.GeoServices.ALERT_TYPE_EXIT); + Assert.assertEquals(result, Boolean.TRUE); + verifyPrivate(geoLocationProviderServiceImpl).invoke("getEventProcessorAdminServiceStub"); + } + + @Test + public void createGeoWithinAlert() throws Exception { + Boolean result = geoLocationProviderServiceImpl. + createGeoAlert(getTestAlert(), getDeviceIdentifier(), DeviceManagementConstants.GeoServices.ALERT_TYPE_WITHIN); + Assert.assertEquals(result, Boolean.TRUE); + } + + @Test + public void createGeoProximityAlert() throws Exception { + Boolean result = geoLocationProviderServiceImpl. + createGeoAlert(getProximityAlert(), getDeviceIdentifier(), DeviceManagementConstants.GeoServices.ALERT_TYPE_PROXIMITY); + Assert.assertEquals(result, Boolean.TRUE); + } + + @Test + public void createGeoSpeedAlert() throws Exception { + Boolean result = geoLocationProviderServiceImpl. + createGeoAlert(getSpeedAlert(), getDeviceIdentifier(), DeviceManagementConstants.GeoServices.ALERT_TYPE_SPEED); + Assert.assertEquals(result, Boolean.TRUE); + } + + @Test + public void createGeoStationaryAlert() throws Exception { + Boolean result = geoLocationProviderServiceImpl. + createGeoAlert(getStationaryAlert(), getDeviceIdentifier(), DeviceManagementConstants.GeoServices.ALERT_TYPE_STATIONARY); + Assert.assertEquals(result, Boolean.TRUE); + } + + @Test + public void createGeoTrafficAlert() throws Exception { + Boolean result = geoLocationProviderServiceImpl. + createGeoAlert(getTrafficAlert(), getDeviceIdentifier(), DeviceManagementConstants.GeoServices.ALERT_TYPE_TRAFFIC); + Assert.assertEquals(result, Boolean.TRUE); + } + + //Test methods to retrieve saved Data. + @Test(dependsOnMethods = "createGeoExitAlert") + public void getGeoExitAlerts() throws Exception { + List geoFences; + geoFences = geoLocationProviderServiceImpl.getExitAlerts(getDeviceIdentifier()); + Assert.assertNotNull(geoFences); + GeoFence geoFenceNode = geoFences.get(0); + Assert.assertEquals(geoFenceNode.getGeoJson(), SAMPLE_GEO_JSON); + Assert.assertEquals(geoFenceNode.getAreaName(), SAMPLE_AREA_NAME); + Assert.assertEquals(geoFenceNode.getQueryName(), SAMPLE_QUERY_NAME); + } + + @Test(dependsOnMethods = "createGeoWithinAlert") + public void getGeoWithinAlerts() throws Exception { + List geoFences; + geoFences = geoLocationProviderServiceImpl.getWithinAlerts(getDeviceIdentifier()); + Assert.assertNotNull(geoFences); + GeoFence geoFenceNode = geoFences.get(0); + Assert.assertEquals(geoFenceNode.getAreaName(), SAMPLE_AREA_NAME); + Assert.assertEquals(geoFenceNode.getQueryName(), SAMPLE_QUERY_NAME); + } + +// @Test(dependsOnMethods = "createGeoProximityAlert") +// public void getGeoProximityAlerts() throws Exception { +// String result; +// result = geoLocationProviderServiceImpl.getProximityAlerts(getDeviceIdentifier()); +// Assert.assertNotNull(result); +// Assert.assertEquals(result,"{proximityDistance:100\"\", proximityTime:50\"\"}"); +// } + + @Test(dependsOnMethods = "createGeoSpeedAlert") + public void getGeoSpeedAlerts() throws Exception { + String result; + result = geoLocationProviderServiceImpl.getSpeedAlerts(getDeviceIdentifier()); + Assert.assertNotNull(result); + Assert.assertEquals(result, "{'speedLimit':"+SAMPLE_SPEED_ALERT_VALUE+"}"); + } + + @Test(dependsOnMethods = "createGeoTrafficAlert") + public void getGeoTrafficAlerts() throws Exception { + List geoFences; + geoFences = geoLocationProviderServiceImpl.getTrafficAlerts(getDeviceIdentifier()); + Assert.assertNotNull(geoFences); + GeoFence geoFenceNode = geoFences.get(0); + Assert.assertEquals(geoFenceNode.getGeoJson(), "{\n" + + " \"geoFenceGeoJSON\": \"" + SAMPLE_GEO_JSON + "\"\n" + + "}"); + } + + @Test(dependsOnMethods = "createGeoStationaryAlert") + public void getGeoStationaryAlerts() throws Exception { + List geoFences; + geoFences = geoLocationProviderServiceImpl.getStationaryAlerts(getDeviceIdentifier()); + Assert.assertNotNull(geoFences); + GeoFence geoFenceNode = geoFences.get(0); + Assert.assertEquals(geoFenceNode.getAreaName(), SAMPLE_AREA_NAME); + Assert.assertEquals(geoFenceNode.getQueryName(), SAMPLE_QUERY_NAME); + Assert.assertEquals(geoFenceNode.getStationaryTime(), SAMPLE_STATIONARY_TIME); + } + + private void initMocks() throws JWTClientException, RemoteException { + mockEventProcessorAdminServiceStub = Mockito.mock(EventProcessorAdminServiceStub.class); + geoLocationProviderServiceImpl = Mockito.mock(GeoLocationProviderServiceImpl.class, Mockito.CALLS_REAL_METHODS); + doReturn(mockEventProcessorAdminServiceStub).when(geoLocationProviderServiceImpl).getEventProcessorAdminServiceStub(); + doReturn("success").when(mockEventProcessorAdminServiceStub).validateExecutionPlan(Mockito.anyString()); + } + + private DeviceIdentifier getDeviceIdentifier() { + DeviceIdentifier deviceIdentifier = new DeviceIdentifier(); + deviceIdentifier.setId("1234"); + deviceIdentifier.setType("TEST"); + return deviceIdentifier; + } + private RegistryService getRegistryService() throws RegistryException { + RealmService realmService = new InMemoryRealmService(); + RegistryDataHolder.getInstance().setRealmService(realmService); + DeviceManagementDataHolder.getInstance().setRealmService(realmService); + InputStream is = this.getClass().getClassLoader().getResourceAsStream("carbon-home/repository/conf/registry.xml"); + RegistryContext context = RegistryContext.getBaseInstance(is, realmService); + context.setSetup(true); + return context.getEmbeddedRegistryService(); + } + + private void enrollTestDevice() throws Exception { + Device device = TestDataHolder.generateDummyDeviceData(DEVICE_ID); + DeviceManagementProviderService deviceMgtService = new DeviceManagementProviderServiceImpl(); + DeviceManagementServiceComponent.notifyStartupListeners(); + DeviceManagementDataHolder.getInstance().setDeviceManagementProvider(deviceMgtService); + DeviceManagementDataHolder.getInstance().setRegistryService(getRegistryService()); + DeviceManagementDataHolder.getInstance().setDeviceAccessAuthorizationService(new DeviceAccessAuthorizationServiceImpl()); + DeviceManagementDataHolder.getInstance().setGroupManagementProviderService(new GroupManagementProviderServiceImpl()); + DeviceManagementDataHolder.getInstance().setDeviceTaskManagerService(null); + deviceMgtService.registerDeviceType(new TestDeviceManagementService(DEVICE_TYPE, + MultitenantConstants.SUPER_TENANT_DOMAIN_NAME)); + deviceMgtService.enrollDevice(device); + } + + private Alert getTestAlert() { + Alert alert = new Alert(); + alert.setDeviceId(DEVICE_ID); + alert.setCepAction("CEP_ACTION"); + alert.setParseData("{\n" + + " \"geoFenceGeoJSON\": \""+SAMPLE_GEO_JSON+"\"\n" + + "}"); + alert.setCustomName(SAMPLE_AREA_NAME); + alert.setExecutionPlan("EXECUTION_PLAN"); + alert.setQueryName(SAMPLE_QUERY_NAME); + return alert; + } + + private Alert getProximityAlert() { + Alert alert = new Alert(); + alert.setDeviceId(DEVICE_ID); + alert.setProximityTime(SAMPLE_PROXIMITY_TIME); + alert.setProximityDistance(SAMPLE_PROXIMITY_DISATANCE); + alert.setParseData("{\n" + + " \"geoFenceGeoJSON\": \""+SAMPLE_GEO_JSON+"\"\n" + + "}"); + return alert; + } + + private Alert getSpeedAlert() { + Alert alert = getTestAlert(); + alert.setParseData("{\n" + + " \"geoFenceGeoJSON\": \"" + SAMPLE_GEO_JSON + "\",\n" + + " \"speedAlertValue\": \"" + SAMPLE_SPEED_ALERT_VALUE + "\"\n" + + "}"); + return alert; + } + + private Alert getStationaryAlert() { + Alert alert = new Alert(); + alert.setDeviceId(DEVICE_ID); + alert.setQueryName(SAMPLE_QUERY_NAME); + alert.setCustomName(SAMPLE_AREA_NAME); + alert.setStationeryTime(SAMPLE_STATIONARY_TIME); + alert.setFluctuationRadius(SAMPLE_FLUCTUATION_RADIUS); + alert.setParseData("{\n" + + " \"geoFenceGeoJSON\": \"" + SAMPLE_GEO_JSON + "\"\n" + + "}"); + return alert; + } + + private Alert getTrafficAlert() { + Alert alert = new Alert(); + alert.setDeviceId(DEVICE_ID); + alert.setParseData("{\n" + + " \"geoFenceGeoJSON\": \"" + SAMPLE_GEO_JSON + "\"\n" + + "}"); + alert.setCustomName(SAMPLE_AREA_NAME); + alert.setExecutionPlan("EXECUTION_PLAN"); + alert.setQueryName(SAMPLE_QUERY_NAME); + return alert; + } +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/resources/testng.xml b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/resources/testng.xml index 3315b7109a1..5d6ce5fe1cc 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/resources/testng.xml +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/resources/testng.xml @@ -32,7 +32,7 @@ - + @@ -42,6 +42,7 @@ + diff --git a/pom.xml b/pom.xml index c30878f9e14..1757d6e0eee 100644 --- a/pom.xml +++ b/pom.xml @@ -1532,6 +1532,13 @@ ${power.mock.version} test + + org.powermock + powermock-module-junit4 + ${power.mock.version} + + test +