From e8d7675269be5dbf75f739be150aaa86db76ac22 Mon Sep 17 00:00:00 2001 From: mp-loki Date: Thu, 29 Jun 2017 22:30:35 -0400 Subject: [PATCH 1/8] Application module postgres tests added --- .mvn/jvm.config | 2 +- .../controller/BaseAdminControllerTest.java | 146 ++++ .../controller/BaseAssetControllerTest.java | 658 ++++++++++++++++++ ...rTest.java => BaseAuthControllerTest.java} | 2 +- ...aseComponentDescriptorControllerTest.java} | 2 +- ...t.java => BaseCustomerControllerTest.java} | 2 +- ....java => BaseDashboardControllerTest.java} | 2 +- ...est.java => BaseDeviceControllerTest.java} | 2 +- ...est.java => BasePluginControllerTest.java} | 6 +- ...rTest.java => BaseRuleControllerTest.java} | 2 +- ...est.java => BaseTenantControllerTest.java} | 4 +- ...rTest.java => BaseUserControllerTest.java} | 2 +- ...java => BaseWidgetTypeControllerTest.java} | 2 +- ...a => BaseWidgetsBundleControllerTest.java} | 2 +- ...ite.java => ControllerNoSqlTestSuite.java} | 4 +- .../controller/ControllerSqlTestSuite.java | 37 + .../nosql/AdminControllerNoSqlTest.java | 26 + .../nosql/AssetControllerNoSqlTest.java | 27 + .../nosql/AuthControllerNoSqlTest.java | 26 + ...omponentDescriptorControllerNoSqlTest.java | 26 + .../nosql/CustomerControllerNoSqlTest.java | 26 + .../nosql/DashboardControllerNoSqlTest.java | 26 + .../nosql/DeviceControllerNoSqlTest.java | 26 + .../nosql/PluginControllerNoSqlTest.java | 26 + .../nosql/RuleControllerNoSqlTest.java | 26 + .../nosql/TenantControllerNoSqlTest.java | 26 + .../nosql/UserControllerNoSqlTest.java | 26 + .../nosql/WidgetTypeControllerNoSqlTest.java | 26 + .../WidgetsBundleControllerNoSqlTest.java | 26 + .../sql/AdminControllerSqlTest.java | 26 + .../sql/AssetControllerSqlTest.java | 26 + .../controller/sql/AuthControllerSqlTest.java | 26 + .../ComponentDescriptorControllerSqlTest.java | 26 + .../sql/CustomerControllerSqlTest.java | 26 + .../sql/DashboardControllerSqlTest.java | 26 + .../sql/DeviceControllerSqlTest.java | 26 + .../sql/PluginControllerSqlTest.java | 26 + .../controller/sql/RuleControllerSqlTest.java | 26 + .../sql/TenantControllerSqlTest.java | 26 + .../controller/sql/UserControllerSqlTest.java | 26 + .../sql/WidgetTypeControllerSqlTest.java | 26 + .../sql/WidgetsBundleControllerSqlTest.java | 26 + 42 files changed, 1535 insertions(+), 17 deletions(-) create mode 100644 application/src/test/java/org/thingsboard/server/controller/BaseAdminControllerTest.java create mode 100644 application/src/test/java/org/thingsboard/server/controller/BaseAssetControllerTest.java rename application/src/test/java/org/thingsboard/server/controller/{AuthControllerTest.java => BaseAuthControllerTest.java} (97%) rename application/src/test/java/org/thingsboard/server/controller/{ComponentDescriptorControllerTest.java => BaseComponentDescriptorControllerTest.java} (97%) rename application/src/test/java/org/thingsboard/server/controller/{CustomerControllerTest.java => BaseCustomerControllerTest.java} (99%) rename application/src/test/java/org/thingsboard/server/controller/{DashboardControllerTest.java => BaseDashboardControllerTest.java} (99%) rename application/src/test/java/org/thingsboard/server/controller/{DeviceControllerTest.java => BaseDeviceControllerTest.java} (99%) rename application/src/test/java/org/thingsboard/server/controller/{PluginControllerTest.java => BasePluginControllerTest.java} (97%) rename application/src/test/java/org/thingsboard/server/controller/{RuleControllerTest.java => BaseRuleControllerTest.java} (99%) rename application/src/test/java/org/thingsboard/server/controller/{TenantControllerTest.java => BaseTenantControllerTest.java} (99%) rename application/src/test/java/org/thingsboard/server/controller/{UserControllerTest.java => BaseUserControllerTest.java} (99%) rename application/src/test/java/org/thingsboard/server/controller/{WidgetTypeControllerTest.java => BaseWidgetTypeControllerTest.java} (99%) rename application/src/test/java/org/thingsboard/server/controller/{WidgetsBundleControllerTest.java => BaseWidgetsBundleControllerTest.java} (99%) rename application/src/test/java/org/thingsboard/server/controller/{ControllerTestSuite.java => ControllerNoSqlTestSuite.java} (93%) create mode 100644 application/src/test/java/org/thingsboard/server/controller/ControllerSqlTestSuite.java create mode 100644 application/src/test/java/org/thingsboard/server/controller/nosql/AdminControllerNoSqlTest.java create mode 100644 application/src/test/java/org/thingsboard/server/controller/nosql/AssetControllerNoSqlTest.java create mode 100644 application/src/test/java/org/thingsboard/server/controller/nosql/AuthControllerNoSqlTest.java create mode 100644 application/src/test/java/org/thingsboard/server/controller/nosql/ComponentDescriptorControllerNoSqlTest.java create mode 100644 application/src/test/java/org/thingsboard/server/controller/nosql/CustomerControllerNoSqlTest.java create mode 100644 application/src/test/java/org/thingsboard/server/controller/nosql/DashboardControllerNoSqlTest.java create mode 100644 application/src/test/java/org/thingsboard/server/controller/nosql/DeviceControllerNoSqlTest.java create mode 100644 application/src/test/java/org/thingsboard/server/controller/nosql/PluginControllerNoSqlTest.java create mode 100644 application/src/test/java/org/thingsboard/server/controller/nosql/RuleControllerNoSqlTest.java create mode 100644 application/src/test/java/org/thingsboard/server/controller/nosql/TenantControllerNoSqlTest.java create mode 100644 application/src/test/java/org/thingsboard/server/controller/nosql/UserControllerNoSqlTest.java create mode 100644 application/src/test/java/org/thingsboard/server/controller/nosql/WidgetTypeControllerNoSqlTest.java create mode 100644 application/src/test/java/org/thingsboard/server/controller/nosql/WidgetsBundleControllerNoSqlTest.java create mode 100644 application/src/test/java/org/thingsboard/server/controller/sql/AdminControllerSqlTest.java create mode 100644 application/src/test/java/org/thingsboard/server/controller/sql/AssetControllerSqlTest.java create mode 100644 application/src/test/java/org/thingsboard/server/controller/sql/AuthControllerSqlTest.java create mode 100644 application/src/test/java/org/thingsboard/server/controller/sql/ComponentDescriptorControllerSqlTest.java create mode 100644 application/src/test/java/org/thingsboard/server/controller/sql/CustomerControllerSqlTest.java create mode 100644 application/src/test/java/org/thingsboard/server/controller/sql/DashboardControllerSqlTest.java create mode 100644 application/src/test/java/org/thingsboard/server/controller/sql/DeviceControllerSqlTest.java create mode 100644 application/src/test/java/org/thingsboard/server/controller/sql/PluginControllerSqlTest.java create mode 100644 application/src/test/java/org/thingsboard/server/controller/sql/RuleControllerSqlTest.java create mode 100644 application/src/test/java/org/thingsboard/server/controller/sql/TenantControllerSqlTest.java create mode 100644 application/src/test/java/org/thingsboard/server/controller/sql/UserControllerSqlTest.java create mode 100644 application/src/test/java/org/thingsboard/server/controller/sql/WidgetTypeControllerSqlTest.java create mode 100644 application/src/test/java/org/thingsboard/server/controller/sql/WidgetsBundleControllerSqlTest.java diff --git a/.mvn/jvm.config b/.mvn/jvm.config index 4dd7491565..16e2988be2 100644 --- a/.mvn/jvm.config +++ b/.mvn/jvm.config @@ -1 +1 @@ --Xmx4096m -Xms1024m \ No newline at end of file +-Xmx6G -Xms1024m \ No newline at end of file diff --git a/application/src/test/java/org/thingsboard/server/controller/BaseAdminControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseAdminControllerTest.java new file mode 100644 index 0000000000..cda5f3ad9f --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/BaseAdminControllerTest.java @@ -0,0 +1,146 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller; + +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.thingsboard.server.common.data.AdminSettings; +import org.junit.Test; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; + +public abstract class BaseAdminControllerTest extends AbstractControllerTest { + + @Test + public void testFindAdminSettingsByKey() throws Exception { + loginSysAdmin(); + doGet("/api/admin/settings/general") + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$.id", notNullValue())) + .andExpect(jsonPath("$.key", is("general"))) + .andExpect(jsonPath("$.jsonValue.baseUrl", is("http://localhost:8080"))); + + doGet("/api/admin/settings/mail") + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$.id", notNullValue())) + .andExpect(jsonPath("$.key", is("mail"))) + .andExpect(jsonPath("$.jsonValue.smtpProtocol", is("smtp"))) + .andExpect(jsonPath("$.jsonValue.smtpHost", is("localhost"))) + .andExpect(jsonPath("$.jsonValue.smtpPort", is("25"))); + + doGet("/api/admin/settings/unknown") + .andExpect(status().isNotFound()); + + } + + @Test + public void testSaveAdminSettings() throws Exception { + loginSysAdmin(); + AdminSettings adminSettings = doGet("/api/admin/settings/general", AdminSettings.class); + + JsonNode jsonValue = adminSettings.getJsonValue(); + ((ObjectNode) jsonValue).put("baseUrl", "http://myhost.org"); + adminSettings.setJsonValue(jsonValue); + + doPost("/api/admin/settings", adminSettings).andExpect(status().isOk()); + + doGet("/api/admin/settings/general") + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$.jsonValue.baseUrl", is("http://myhost.org"))); + + ((ObjectNode) jsonValue).put("baseUrl", "http://localhost:8080"); + adminSettings.setJsonValue(jsonValue); + + doPost("/api/admin/settings", adminSettings) + .andExpect(status().isOk()); + } + + @Test + public void testCreateAdminSettings() throws Exception { + loginSysAdmin(); + + AdminSettings adminSettings = new AdminSettings(); + adminSettings.setKey("someKey"); + adminSettings.setJsonValue(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); + + doPost("/api/admin/settings", adminSettings) + .andExpect(status().isBadRequest()) + .andExpect(statusReason(containsString("is prohibited"))); + } + + @Test + public void testSaveAdminSettingsWithEmptyKey() throws Exception { + loginSysAdmin(); + AdminSettings adminSettings = doGet("/api/admin/settings/mail", AdminSettings.class); + adminSettings.setKey(null); + doPost("/api/admin/settings", adminSettings) + .andExpect(status().isBadRequest()) + .andExpect(statusReason(containsString("Key should be specified"))); + } + + @Test + public void testChangeAdminSettingsKey() throws Exception { + loginSysAdmin(); + AdminSettings adminSettings = doGet("/api/admin/settings/mail", AdminSettings.class); + adminSettings.setKey("newKey"); + doPost("/api/admin/settings", adminSettings) + .andExpect(status().isBadRequest()) + .andExpect(statusReason(containsString("is prohibited"))); + } + + @Test + public void testSaveAdminSettingsWithNewJsonStructure() throws Exception { + loginSysAdmin(); + AdminSettings adminSettings = doGet("/api/admin/settings/mail", AdminSettings.class); + JsonNode json = adminSettings.getJsonValue(); + ((ObjectNode) json).put("newKey", "my new value"); + adminSettings.setJsonValue(json); + doPost("/api/admin/settings", adminSettings) + .andExpect(status().isBadRequest()) + .andExpect(statusReason(containsString("Provided json structure is different"))); + } + + @Test + public void testSaveAdminSettingsWithNonTextValue() throws Exception { + loginSysAdmin(); + AdminSettings adminSettings = doGet("/api/admin/settings/mail", AdminSettings.class); + JsonNode json = adminSettings.getJsonValue(); + ((ObjectNode) json).put("timeout", 10000L); + adminSettings.setJsonValue(json); + doPost("/api/admin/settings", adminSettings) + .andExpect(status().isBadRequest()) + .andExpect(statusReason(containsString("Provided json structure can't contain non-text values"))); + } + + @Test + public void testSendTestMail() throws Exception { + loginSysAdmin(); + AdminSettings adminSettings = doGet("/api/admin/settings/mail", AdminSettings.class); + doPost("/api/admin/settings/testMail", adminSettings) + .andExpect(status().isOk()); + } + +} diff --git a/application/src/test/java/org/thingsboard/server/controller/BaseAssetControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseAssetControllerTest.java new file mode 100644 index 0000000000..1350aaed4a --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/BaseAssetControllerTest.java @@ -0,0 +1,658 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller; + +import static org.hamcrest.Matchers.containsString; +import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.apache.commons.lang3.RandomStringUtils; +import org.thingsboard.server.common.data.*; +import org.thingsboard.server.common.data.asset.Asset; +import org.thingsboard.server.common.data.asset.TenantAssetType; +import org.thingsboard.server.common.data.id.CustomerId; +import org.thingsboard.server.common.data.page.TextPageData; +import org.thingsboard.server.common.data.page.TextPageLink; +import org.thingsboard.server.common.data.security.Authority; +import org.thingsboard.server.dao.model.ModelConstants; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.datastax.driver.core.utils.UUIDs; +import com.fasterxml.jackson.core.type.TypeReference; + +public abstract class BaseAssetControllerTest extends AbstractControllerTest { + + private IdComparator idComparator = new IdComparator<>(); + + private Tenant savedTenant; + private User tenantAdmin; + + @Before + public void beforeTest() throws Exception { + loginSysAdmin(); + + Tenant tenant = new Tenant(); + tenant.setTitle("My tenant"); + savedTenant = doPost("/api/tenant", tenant, Tenant.class); + Assert.assertNotNull(savedTenant); + + tenantAdmin = new User(); + tenantAdmin.setAuthority(Authority.TENANT_ADMIN); + tenantAdmin.setTenantId(savedTenant.getId()); + tenantAdmin.setEmail("tenant2@thingsboard.org"); + tenantAdmin.setFirstName("Joe"); + tenantAdmin.setLastName("Downs"); + + tenantAdmin = createUserAndLogin(tenantAdmin, "testPassword1"); + } + + @After + public void afterTest() throws Exception { + loginSysAdmin(); + + doDelete("/api/tenant/"+savedTenant.getId().getId().toString()) + .andExpect(status().isOk()); + } + + @Test + public void testSaveAsset() throws Exception { + Asset asset = new Asset(); + asset.setName("My asset"); + asset.setType("default"); + Asset savedAsset = doPost("/api/asset", asset, Asset.class); + + Assert.assertNotNull(savedAsset); + Assert.assertNotNull(savedAsset.getId()); + Assert.assertTrue(savedAsset.getCreatedTime() > 0); + Assert.assertEquals(savedTenant.getId(), savedAsset.getTenantId()); + Assert.assertNotNull(savedAsset.getCustomerId()); + Assert.assertEquals(NULL_UUID, savedAsset.getCustomerId().getId()); + Assert.assertEquals(asset.getName(), savedAsset.getName()); + + savedAsset.setName("My new asset"); + doPost("/api/asset", savedAsset, Asset.class); + + Asset foundAsset = doGet("/api/asset/" + savedAsset.getId().getId().toString(), Asset.class); + Assert.assertEquals(foundAsset.getName(), savedAsset.getName()); + } + + @Test + public void testFindAssetById() throws Exception { + Asset asset = new Asset(); + asset.setName("My asset"); + asset.setType("default"); + Asset savedAsset = doPost("/api/asset", asset, Asset.class); + Asset foundAsset = doGet("/api/asset/" + savedAsset.getId().getId().toString(), Asset.class); + Assert.assertNotNull(foundAsset); + Assert.assertEquals(savedAsset, foundAsset); + } + + @Test + public void testFindAssetTypesByTenantId() throws Exception { + List assets = new ArrayList<>(); + for (int i=0;i<3;i++) { + Asset asset = new Asset(); + asset.setName("My asset B"+i); + asset.setType("typeB"); + assets.add(doPost("/api/asset", asset, Asset.class)); + } + for (int i=0;i<7;i++) { + Asset asset = new Asset(); + asset.setName("My asset C"+i); + asset.setType("typeC"); + assets.add(doPost("/api/asset", asset, Asset.class)); + } + for (int i=0;i<9;i++) { + Asset asset = new Asset(); + asset.setName("My asset A"+i); + asset.setType("typeA"); + assets.add(doPost("/api/asset", asset, Asset.class)); + } + List assetTypes = doGetTyped("/api/asset/types", + new TypeReference>(){}); + + Assert.assertNotNull(assetTypes); + Assert.assertEquals(3, assetTypes.size()); + Assert.assertEquals("typeA", assetTypes.get(0).getType()); + Assert.assertEquals("typeB", assetTypes.get(1).getType()); + Assert.assertEquals("typeC", assetTypes.get(2).getType()); + } + + @Test + public void testDeleteAsset() throws Exception { + Asset asset = new Asset(); + asset.setName("My asset"); + asset.setType("default"); + Asset savedAsset = doPost("/api/asset", asset, Asset.class); + + doDelete("/api/asset/"+savedAsset.getId().getId().toString()) + .andExpect(status().isOk()); + + doGet("/api/asset/"+savedAsset.getId().getId().toString()) + .andExpect(status().isNotFound()); + } + + @Test + public void testSaveAssetWithEmptyType() throws Exception { + Asset asset = new Asset(); + asset.setName("My asset"); + doPost("/api/asset", asset) + .andExpect(status().isBadRequest()) + .andExpect(statusReason(containsString("Asset type should be specified"))); + } + + @Test + public void testSaveAssetWithEmptyName() throws Exception { + Asset asset = new Asset(); + asset.setType("default"); + doPost("/api/asset", asset) + .andExpect(status().isBadRequest()) + .andExpect(statusReason(containsString("Asset name should be specified"))); + } + + @Test + public void testAssignUnassignAssetToCustomer() throws Exception { + Asset asset = new Asset(); + asset.setName("My asset"); + asset.setType("default"); + Asset savedAsset = doPost("/api/asset", asset, Asset.class); + + Customer customer = new Customer(); + customer.setTitle("My customer"); + Customer savedCustomer = doPost("/api/customer", customer, Customer.class); + + Asset assignedAsset = doPost("/api/customer/" + savedCustomer.getId().getId().toString() + + "/asset/" + savedAsset.getId().getId().toString(), Asset.class); + Assert.assertEquals(savedCustomer.getId(), assignedAsset.getCustomerId()); + + Asset foundAsset = doGet("/api/asset/" + savedAsset.getId().getId().toString(), Asset.class); + Assert.assertEquals(savedCustomer.getId(), foundAsset.getCustomerId()); + + Asset unassignedAsset = + doDelete("/api/customer/asset/" + savedAsset.getId().getId().toString(), Asset.class); + Assert.assertEquals(ModelConstants.NULL_UUID, unassignedAsset.getCustomerId().getId()); + + foundAsset = doGet("/api/asset/" + savedAsset.getId().getId().toString(), Asset.class); + Assert.assertEquals(ModelConstants.NULL_UUID, foundAsset.getCustomerId().getId()); + } + + @Test + public void testAssignAssetToNonExistentCustomer() throws Exception { + Asset asset = new Asset(); + asset.setName("My asset"); + asset.setType("default"); + Asset savedAsset = doPost("/api/asset", asset, Asset.class); + + doPost("/api/customer/" + UUIDs.timeBased().toString() + + "/asset/" + savedAsset.getId().getId().toString()) + .andExpect(status().isNotFound()); + } + + @Test + public void testAssignAssetToCustomerFromDifferentTenant() throws Exception { + loginSysAdmin(); + + Tenant tenant2 = new Tenant(); + tenant2.setTitle("Different tenant"); + Tenant savedTenant2 = doPost("/api/tenant", tenant2, Tenant.class); + Assert.assertNotNull(savedTenant2); + + User tenantAdmin2 = new User(); + tenantAdmin2.setAuthority(Authority.TENANT_ADMIN); + tenantAdmin2.setTenantId(savedTenant2.getId()); + tenantAdmin2.setEmail("tenant3@thingsboard.org"); + tenantAdmin2.setFirstName("Joe"); + tenantAdmin2.setLastName("Downs"); + + tenantAdmin2 = createUserAndLogin(tenantAdmin2, "testPassword1"); + + Customer customer = new Customer(); + customer.setTitle("Different customer"); + Customer savedCustomer = doPost("/api/customer", customer, Customer.class); + + login(tenantAdmin.getEmail(), "testPassword1"); + + Asset asset = new Asset(); + asset.setName("My asset"); + asset.setType("default"); + Asset savedAsset = doPost("/api/asset", asset, Asset.class); + + doPost("/api/customer/" + savedCustomer.getId().getId().toString() + + "/asset/" + savedAsset.getId().getId().toString()) + .andExpect(status().isForbidden()); + + loginSysAdmin(); + + doDelete("/api/tenant/"+savedTenant2.getId().getId().toString()) + .andExpect(status().isOk()); + } + + @Test + public void testFindTenantAssets() throws Exception { + List assets = new ArrayList<>(); + for (int i=0;i<178;i++) { + Asset asset = new Asset(); + asset.setName("Asset"+i); + asset.setType("default"); + assets.add(doPost("/api/asset", asset, Asset.class)); + } + List loadedAssets = new ArrayList<>(); + TextPageLink pageLink = new TextPageLink(23); + TextPageData pageData = null; + do { + pageData = doGetTypedWithPageLink("/api/tenant/assets?", + new TypeReference>(){}, pageLink); + loadedAssets.addAll(pageData.getData()); + if (pageData.hasNext()) { + pageLink = pageData.getNextPageLink(); + } + } while (pageData.hasNext()); + + Collections.sort(assets, idComparator); + Collections.sort(loadedAssets, idComparator); + + Assert.assertEquals(assets, loadedAssets); + } + + @Test + public void testFindTenantAssetsByName() throws Exception { + String title1 = "Asset title 1"; + List assetsTitle1 = new ArrayList<>(); + for (int i=0;i<143;i++) { + Asset asset = new Asset(); + String suffix = RandomStringUtils.randomAlphanumeric(15); + String name = title1+suffix; + name = i % 2 == 0 ? name.toLowerCase() : name.toUpperCase(); + asset.setName(name); + asset.setType("default"); + assetsTitle1.add(doPost("/api/asset", asset, Asset.class)); + } + String title2 = "Asset title 2"; + List assetsTitle2 = new ArrayList<>(); + for (int i=0;i<75;i++) { + Asset asset = new Asset(); + String suffix = RandomStringUtils.randomAlphanumeric(15); + String name = title2+suffix; + name = i % 2 == 0 ? name.toLowerCase() : name.toUpperCase(); + asset.setName(name); + asset.setType("default"); + assetsTitle2.add(doPost("/api/asset", asset, Asset.class)); + } + + List loadedAssetsTitle1 = new ArrayList<>(); + TextPageLink pageLink = new TextPageLink(15, title1); + TextPageData pageData = null; + do { + pageData = doGetTypedWithPageLink("/api/tenant/assets?", + new TypeReference>(){}, pageLink); + loadedAssetsTitle1.addAll(pageData.getData()); + if (pageData.hasNext()) { + pageLink = pageData.getNextPageLink(); + } + } while (pageData.hasNext()); + + Collections.sort(assetsTitle1, idComparator); + Collections.sort(loadedAssetsTitle1, idComparator); + + Assert.assertEquals(assetsTitle1, loadedAssetsTitle1); + + List loadedAssetsTitle2 = new ArrayList<>(); + pageLink = new TextPageLink(4, title2); + do { + pageData = doGetTypedWithPageLink("/api/tenant/assets?", + new TypeReference>(){}, pageLink); + loadedAssetsTitle2.addAll(pageData.getData()); + if (pageData.hasNext()) { + pageLink = pageData.getNextPageLink(); + } + } while (pageData.hasNext()); + + Collections.sort(assetsTitle2, idComparator); + Collections.sort(loadedAssetsTitle2, idComparator); + + Assert.assertEquals(assetsTitle2, loadedAssetsTitle2); + + for (Asset asset : loadedAssetsTitle1) { + doDelete("/api/asset/"+asset.getId().getId().toString()) + .andExpect(status().isOk()); + } + + pageLink = new TextPageLink(4, title1); + pageData = doGetTypedWithPageLink("/api/tenant/assets?", + new TypeReference>(){}, pageLink); + Assert.assertFalse(pageData.hasNext()); + Assert.assertEquals(0, pageData.getData().size()); + + for (Asset asset : loadedAssetsTitle2) { + doDelete("/api/asset/"+asset.getId().getId().toString()) + .andExpect(status().isOk()); + } + + pageLink = new TextPageLink(4, title2); + pageData = doGetTypedWithPageLink("/api/tenant/assets?", + new TypeReference>(){}, pageLink); + Assert.assertFalse(pageData.hasNext()); + Assert.assertEquals(0, pageData.getData().size()); + } + + @Test + public void testFindTenantAssetsByType() throws Exception { + String title1 = "Asset title 1"; + String type1 = "typeA"; + List assetsType1 = new ArrayList<>(); + for (int i=0;i<143;i++) { + Asset asset = new Asset(); + String suffix = RandomStringUtils.randomAlphanumeric(15); + String name = title1+suffix; + name = i % 2 == 0 ? name.toLowerCase() : name.toUpperCase(); + asset.setName(name); + asset.setType(type1); + assetsType1.add(doPost("/api/asset", asset, Asset.class)); + } + String title2 = "Asset title 2"; + String type2 = "typeB"; + List assetsType2 = new ArrayList<>(); + for (int i=0;i<75;i++) { + Asset asset = new Asset(); + String suffix = RandomStringUtils.randomAlphanumeric(15); + String name = title2+suffix; + name = i % 2 == 0 ? name.toLowerCase() : name.toUpperCase(); + asset.setName(name); + asset.setType(type2); + assetsType2.add(doPost("/api/asset", asset, Asset.class)); + } + + List loadedAssetsType1 = new ArrayList<>(); + TextPageLink pageLink = new TextPageLink(15); + TextPageData pageData = null; + do { + pageData = doGetTypedWithPageLink("/api/tenant/assets?type={type}&", + new TypeReference>(){}, pageLink, type1); + loadedAssetsType1.addAll(pageData.getData()); + if (pageData.hasNext()) { + pageLink = pageData.getNextPageLink(); + } + } while (pageData.hasNext()); + + Collections.sort(assetsType1, idComparator); + Collections.sort(loadedAssetsType1, idComparator); + + Assert.assertEquals(assetsType1, loadedAssetsType1); + + List loadedAssetsType2 = new ArrayList<>(); + pageLink = new TextPageLink(4); + do { + pageData = doGetTypedWithPageLink("/api/tenant/assets?type={type}&", + new TypeReference>(){}, pageLink, type2); + loadedAssetsType2.addAll(pageData.getData()); + if (pageData.hasNext()) { + pageLink = pageData.getNextPageLink(); + } + } while (pageData.hasNext()); + + Collections.sort(assetsType2, idComparator); + Collections.sort(loadedAssetsType2, idComparator); + + Assert.assertEquals(assetsType2, loadedAssetsType2); + + for (Asset asset : loadedAssetsType1) { + doDelete("/api/asset/"+asset.getId().getId().toString()) + .andExpect(status().isOk()); + } + + pageLink = new TextPageLink(4); + pageData = doGetTypedWithPageLink("/api/tenant/assets?type={type}&", + new TypeReference>(){}, pageLink, type1); + Assert.assertFalse(pageData.hasNext()); + Assert.assertEquals(0, pageData.getData().size()); + + for (Asset asset : loadedAssetsType2) { + doDelete("/api/asset/"+asset.getId().getId().toString()) + .andExpect(status().isOk()); + } + + pageLink = new TextPageLink(4); + pageData = doGetTypedWithPageLink("/api/tenant/assets?type={type}&", + new TypeReference>(){}, pageLink, type2); + Assert.assertFalse(pageData.hasNext()); + Assert.assertEquals(0, pageData.getData().size()); + } + + @Test + public void testFindCustomerAssets() throws Exception { + Customer customer = new Customer(); + customer.setTitle("Test customer"); + customer = doPost("/api/customer", customer, Customer.class); + CustomerId customerId = customer.getId(); + + List assets = new ArrayList<>(); + for (int i=0;i<128;i++) { + Asset asset = new Asset(); + asset.setName("Asset"+i); + asset.setType("default"); + asset = doPost("/api/asset", asset, Asset.class); + assets.add(doPost("/api/customer/" + customerId.getId().toString() + + "/asset/" + asset.getId().getId().toString(), Asset.class)); + } + + List loadedAssets = new ArrayList<>(); + TextPageLink pageLink = new TextPageLink(23); + TextPageData pageData = null; + do { + pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/assets?", + new TypeReference>(){}, pageLink); + loadedAssets.addAll(pageData.getData()); + if (pageData.hasNext()) { + pageLink = pageData.getNextPageLink(); + } + } while (pageData.hasNext()); + + Collections.sort(assets, idComparator); + Collections.sort(loadedAssets, idComparator); + + Assert.assertEquals(assets, loadedAssets); + } + + @Test + public void testFindCustomerAssetsByName() throws Exception { + Customer customer = new Customer(); + customer.setTitle("Test customer"); + customer = doPost("/api/customer", customer, Customer.class); + CustomerId customerId = customer.getId(); + + String title1 = "Asset title 1"; + List assetsTitle1 = new ArrayList<>(); + for (int i=0;i<125;i++) { + Asset asset = new Asset(); + String suffix = RandomStringUtils.randomAlphanumeric(15); + String name = title1+suffix; + name = i % 2 == 0 ? name.toLowerCase() : name.toUpperCase(); + asset.setName(name); + asset.setType("default"); + asset = doPost("/api/asset", asset, Asset.class); + assetsTitle1.add(doPost("/api/customer/" + customerId.getId().toString() + + "/asset/" + asset.getId().getId().toString(), Asset.class)); + } + String title2 = "Asset title 2"; + List assetsTitle2 = new ArrayList<>(); + for (int i=0;i<143;i++) { + Asset asset = new Asset(); + String suffix = RandomStringUtils.randomAlphanumeric(15); + String name = title2+suffix; + name = i % 2 == 0 ? name.toLowerCase() : name.toUpperCase(); + asset.setName(name); + asset.setType("default"); + asset = doPost("/api/asset", asset, Asset.class); + assetsTitle2.add(doPost("/api/customer/" + customerId.getId().toString() + + "/asset/" + asset.getId().getId().toString(), Asset.class)); + } + + List loadedAssetsTitle1 = new ArrayList<>(); + TextPageLink pageLink = new TextPageLink(15, title1); + TextPageData pageData = null; + do { + pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/assets?", + new TypeReference>(){}, pageLink); + loadedAssetsTitle1.addAll(pageData.getData()); + if (pageData.hasNext()) { + pageLink = pageData.getNextPageLink(); + } + } while (pageData.hasNext()); + + Collections.sort(assetsTitle1, idComparator); + Collections.sort(loadedAssetsTitle1, idComparator); + + Assert.assertEquals(assetsTitle1, loadedAssetsTitle1); + + List loadedAssetsTitle2 = new ArrayList<>(); + pageLink = new TextPageLink(4, title2); + do { + pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/assets?", + new TypeReference>(){}, pageLink); + loadedAssetsTitle2.addAll(pageData.getData()); + if (pageData.hasNext()) { + pageLink = pageData.getNextPageLink(); + } + } while (pageData.hasNext()); + + Collections.sort(assetsTitle2, idComparator); + Collections.sort(loadedAssetsTitle2, idComparator); + + Assert.assertEquals(assetsTitle2, loadedAssetsTitle2); + + for (Asset asset : loadedAssetsTitle1) { + doDelete("/api/customer/asset/" + asset.getId().getId().toString()) + .andExpect(status().isOk()); + } + + pageLink = new TextPageLink(4, title1); + pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/assets?", + new TypeReference>(){}, pageLink); + Assert.assertFalse(pageData.hasNext()); + Assert.assertEquals(0, pageData.getData().size()); + + for (Asset asset : loadedAssetsTitle2) { + doDelete("/api/customer/asset/" + asset.getId().getId().toString()) + .andExpect(status().isOk()); + } + + pageLink = new TextPageLink(4, title2); + pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/assets?", + new TypeReference>(){}, pageLink); + Assert.assertFalse(pageData.hasNext()); + Assert.assertEquals(0, pageData.getData().size()); + } + + @Test + public void testFindCustomerAssetsByType() throws Exception { + Customer customer = new Customer(); + customer.setTitle("Test customer"); + customer = doPost("/api/customer", customer, Customer.class); + CustomerId customerId = customer.getId(); + + String title1 = "Asset title 1"; + String type1 = "typeC"; + List assetsType1 = new ArrayList<>(); + for (int i=0;i<125;i++) { + Asset asset = new Asset(); + String suffix = RandomStringUtils.randomAlphanumeric(15); + String name = title1+suffix; + name = i % 2 == 0 ? name.toLowerCase() : name.toUpperCase(); + asset.setName(name); + asset.setType(type1); + asset = doPost("/api/asset", asset, Asset.class); + assetsType1.add(doPost("/api/customer/" + customerId.getId().toString() + + "/asset/" + asset.getId().getId().toString(), Asset.class)); + } + String title2 = "Asset title 2"; + String type2 = "typeD"; + List assetsType2 = new ArrayList<>(); + for (int i=0;i<143;i++) { + Asset asset = new Asset(); + String suffix = RandomStringUtils.randomAlphanumeric(15); + String name = title2+suffix; + name = i % 2 == 0 ? name.toLowerCase() : name.toUpperCase(); + asset.setName(name); + asset.setType(type2); + asset = doPost("/api/asset", asset, Asset.class); + assetsType2.add(doPost("/api/customer/" + customerId.getId().toString() + + "/asset/" + asset.getId().getId().toString(), Asset.class)); + } + + List loadedAssetsType1 = new ArrayList<>(); + TextPageLink pageLink = new TextPageLink(15); + TextPageData pageData = null; + do { + pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/assets?type={type}&", + new TypeReference>(){}, pageLink, type1); + loadedAssetsType1.addAll(pageData.getData()); + if (pageData.hasNext()) { + pageLink = pageData.getNextPageLink(); + } + } while (pageData.hasNext()); + + Collections.sort(assetsType1, idComparator); + Collections.sort(loadedAssetsType1, idComparator); + + Assert.assertEquals(assetsType1, loadedAssetsType1); + + List loadedAssetsType2 = new ArrayList<>(); + pageLink = new TextPageLink(4); + do { + pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/assets?type={type}&", + new TypeReference>(){}, pageLink, type2); + loadedAssetsType2.addAll(pageData.getData()); + if (pageData.hasNext()) { + pageLink = pageData.getNextPageLink(); + } + } while (pageData.hasNext()); + + Collections.sort(assetsType2, idComparator); + Collections.sort(loadedAssetsType2, idComparator); + + Assert.assertEquals(assetsType2, loadedAssetsType2); + + for (Asset asset : loadedAssetsType1) { + doDelete("/api/customer/asset/" + asset.getId().getId().toString()) + .andExpect(status().isOk()); + } + + pageLink = new TextPageLink(4); + pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/assets?type={type}&", + new TypeReference>(){}, pageLink, type1); + Assert.assertFalse(pageData.hasNext()); + Assert.assertEquals(0, pageData.getData().size()); + + for (Asset asset : loadedAssetsType2) { + doDelete("/api/customer/asset/" + asset.getId().getId().toString()) + .andExpect(status().isOk()); + } + + pageLink = new TextPageLink(4); + pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/assets?type={type}&", + new TypeReference>(){}, pageLink, type2); + Assert.assertFalse(pageData.hasNext()); + Assert.assertEquals(0, pageData.getData().size()); + } + +} diff --git a/application/src/test/java/org/thingsboard/server/controller/AuthControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseAuthControllerTest.java similarity index 97% rename from application/src/test/java/org/thingsboard/server/controller/AuthControllerTest.java rename to application/src/test/java/org/thingsboard/server/controller/BaseAuthControllerTest.java index fad9e54039..ba7f90dc64 100644 --- a/application/src/test/java/org/thingsboard/server/controller/AuthControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseAuthControllerTest.java @@ -22,7 +22,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import org.thingsboard.server.common.data.security.Authority; import org.junit.Test; -public class AuthControllerTest extends AbstractControllerTest { +public abstract class BaseAuthControllerTest extends AbstractControllerTest { @Test public void testGetUser() throws Exception { diff --git a/application/src/test/java/org/thingsboard/server/controller/ComponentDescriptorControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseComponentDescriptorControllerTest.java similarity index 97% rename from application/src/test/java/org/thingsboard/server/controller/ComponentDescriptorControllerTest.java rename to application/src/test/java/org/thingsboard/server/controller/BaseComponentDescriptorControllerTest.java index 0cf7c1f446..175c1387f1 100644 --- a/application/src/test/java/org/thingsboard/server/controller/ComponentDescriptorControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseComponentDescriptorControllerTest.java @@ -33,7 +33,7 @@ import java.util.List; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -public class ComponentDescriptorControllerTest extends AbstractControllerTest { +public abstract class BaseComponentDescriptorControllerTest extends AbstractControllerTest { private static final int AMOUNT_OF_DEFAULT_PLUGINS_DESCRIPTORS = 5; private Tenant savedTenant; diff --git a/application/src/test/java/org/thingsboard/server/controller/CustomerControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseCustomerControllerTest.java similarity index 99% rename from application/src/test/java/org/thingsboard/server/controller/CustomerControllerTest.java rename to application/src/test/java/org/thingsboard/server/controller/BaseCustomerControllerTest.java index b1076e0413..f4ed22898e 100644 --- a/application/src/test/java/org/thingsboard/server/controller/CustomerControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseCustomerControllerTest.java @@ -35,7 +35,7 @@ import org.junit.Test; import com.fasterxml.jackson.core.type.TypeReference; -public class CustomerControllerTest extends AbstractControllerTest { +public abstract class BaseCustomerControllerTest extends AbstractControllerTest { private IdComparator idComparator = new IdComparator<>(); diff --git a/application/src/test/java/org/thingsboard/server/controller/DashboardControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseDashboardControllerTest.java similarity index 99% rename from application/src/test/java/org/thingsboard/server/controller/DashboardControllerTest.java rename to application/src/test/java/org/thingsboard/server/controller/BaseDashboardControllerTest.java index dda68a64ef..bb064116f1 100644 --- a/application/src/test/java/org/thingsboard/server/controller/DashboardControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseDashboardControllerTest.java @@ -38,7 +38,7 @@ import org.junit.Test; import com.fasterxml.jackson.core.type.TypeReference; -public class DashboardControllerTest extends AbstractControllerTest { +public abstract class BaseDashboardControllerTest extends AbstractControllerTest { private IdComparator idComparator = new IdComparator<>(); diff --git a/application/src/test/java/org/thingsboard/server/controller/DeviceControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseDeviceControllerTest.java similarity index 99% rename from application/src/test/java/org/thingsboard/server/controller/DeviceControllerTest.java rename to application/src/test/java/org/thingsboard/server/controller/BaseDeviceControllerTest.java index 26eaa5dbb7..7a742aa462 100644 --- a/application/src/test/java/org/thingsboard/server/controller/DeviceControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseDeviceControllerTest.java @@ -42,7 +42,7 @@ import org.junit.Test; import com.fasterxml.jackson.core.type.TypeReference; -public class DeviceControllerTest extends AbstractControllerTest { +public abstract class BaseDeviceControllerTest extends AbstractControllerTest { private IdComparator idComparator = new IdComparator<>(); diff --git a/application/src/test/java/org/thingsboard/server/controller/PluginControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BasePluginControllerTest.java similarity index 97% rename from application/src/test/java/org/thingsboard/server/controller/PluginControllerTest.java rename to application/src/test/java/org/thingsboard/server/controller/BasePluginControllerTest.java index 65f9840cb9..6933c5eb13 100644 --- a/application/src/test/java/org/thingsboard/server/controller/PluginControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BasePluginControllerTest.java @@ -37,7 +37,7 @@ import java.util.stream.Collectors; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -public class PluginControllerTest extends AbstractControllerTest { +public abstract class BasePluginControllerTest extends AbstractControllerTest { private IdComparator idComparator = new IdComparator<>(); @@ -130,7 +130,7 @@ public class PluginControllerTest extends AbstractControllerTest { doPost("/api/plugin/" + savedPlugin.getId().getId().toString() + "/activate").andExpect(status().isOk()); - RuleMetaData rule = RuleControllerTest.createRuleMetaData(savedPlugin); + RuleMetaData rule = BaseRuleControllerTest.createRuleMetaData(savedPlugin); RuleMetaData savedRule = doPost("/api/rule", rule, RuleMetaData.class); doPost("/api/rule/" + savedRule.getId().getId().toString() + "/activate").andExpect(status().isOk()); @@ -151,7 +151,7 @@ public class PluginControllerTest extends AbstractControllerTest { PluginMetaData savedPlugin = doPost("/api/plugin", plugin, PluginMetaData.class); - RuleMetaData rule = RuleControllerTest.createRuleMetaData(savedPlugin); + RuleMetaData rule = BaseRuleControllerTest.createRuleMetaData(savedPlugin); RuleMetaData savedRule = doPost("/api/rule", rule, RuleMetaData.class); doDelete("/api/plugin/" + savedPlugin.getId().getId()).andExpect(status().isBadRequest()); diff --git a/application/src/test/java/org/thingsboard/server/controller/RuleControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseRuleControllerTest.java similarity index 99% rename from application/src/test/java/org/thingsboard/server/controller/RuleControllerTest.java rename to application/src/test/java/org/thingsboard/server/controller/BaseRuleControllerTest.java index 8a52216e99..bb4cc4994a 100644 --- a/application/src/test/java/org/thingsboard/server/controller/RuleControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseRuleControllerTest.java @@ -38,7 +38,7 @@ import java.util.stream.Collectors; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -public class RuleControllerTest extends AbstractControllerTest { +public abstract class BaseRuleControllerTest extends AbstractControllerTest { private IdComparator idComparator = new IdComparator<>(); diff --git a/application/src/test/java/org/thingsboard/server/controller/TenantControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseTenantControllerTest.java similarity index 99% rename from application/src/test/java/org/thingsboard/server/controller/TenantControllerTest.java rename to application/src/test/java/org/thingsboard/server/controller/BaseTenantControllerTest.java index dc4a4228f3..35ed1de643 100644 --- a/application/src/test/java/org/thingsboard/server/controller/TenantControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseTenantControllerTest.java @@ -31,7 +31,7 @@ import org.junit.Test; import com.fasterxml.jackson.core.type.TypeReference; -public class TenantControllerTest extends AbstractControllerTest { +public class BaseTenantControllerTest extends AbstractControllerTest { private IdComparator idComparator = new IdComparator<>(); @@ -107,7 +107,7 @@ public class TenantControllerTest extends AbstractControllerTest { Assert.assertFalse(pageData.hasNext()); Assert.assertEquals(1, pageData.getData().size()); tenants.addAll(pageData.getData()); - + for (int i=0;i<56;i++) { Tenant tenant = new Tenant(); tenant.setTitle("Tenant"+i); diff --git a/application/src/test/java/org/thingsboard/server/controller/UserControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseUserControllerTest.java similarity index 99% rename from application/src/test/java/org/thingsboard/server/controller/UserControllerTest.java rename to application/src/test/java/org/thingsboard/server/controller/BaseUserControllerTest.java index d57871bba9..8dac038772 100644 --- a/application/src/test/java/org/thingsboard/server/controller/UserControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseUserControllerTest.java @@ -39,7 +39,7 @@ import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.is; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; -public class UserControllerTest extends AbstractControllerTest { +public abstract class BaseUserControllerTest extends AbstractControllerTest { private IdComparator idComparator = new IdComparator<>(); diff --git a/application/src/test/java/org/thingsboard/server/controller/WidgetTypeControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseWidgetTypeControllerTest.java similarity index 99% rename from application/src/test/java/org/thingsboard/server/controller/WidgetTypeControllerTest.java rename to application/src/test/java/org/thingsboard/server/controller/BaseWidgetTypeControllerTest.java index fbeaa8f826..08720e2dce 100644 --- a/application/src/test/java/org/thingsboard/server/controller/WidgetTypeControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseWidgetTypeControllerTest.java @@ -35,7 +35,7 @@ import java.util.List; import static org.hamcrest.Matchers.containsString; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -public class WidgetTypeControllerTest extends AbstractControllerTest { +public abstract class BaseWidgetTypeControllerTest extends AbstractControllerTest { private IdComparator idComparator = new IdComparator<>(); diff --git a/application/src/test/java/org/thingsboard/server/controller/WidgetsBundleControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseWidgetsBundleControllerTest.java similarity index 99% rename from application/src/test/java/org/thingsboard/server/controller/WidgetsBundleControllerTest.java rename to application/src/test/java/org/thingsboard/server/controller/BaseWidgetsBundleControllerTest.java index f8e89db52f..5a9a2bf114 100644 --- a/application/src/test/java/org/thingsboard/server/controller/WidgetsBundleControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseWidgetsBundleControllerTest.java @@ -34,7 +34,7 @@ import java.util.List; import static org.hamcrest.Matchers.containsString; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -public class WidgetsBundleControllerTest extends AbstractControllerTest { +public abstract class BaseWidgetsBundleControllerTest extends AbstractControllerTest { private IdComparator idComparator = new IdComparator<>(); diff --git a/application/src/test/java/org/thingsboard/server/controller/ControllerTestSuite.java b/application/src/test/java/org/thingsboard/server/controller/ControllerNoSqlTestSuite.java similarity index 93% rename from application/src/test/java/org/thingsboard/server/controller/ControllerTestSuite.java rename to application/src/test/java/org/thingsboard/server/controller/ControllerNoSqlTestSuite.java index 84e9ecdb33..b773eab87c 100644 --- a/application/src/test/java/org/thingsboard/server/controller/ControllerTestSuite.java +++ b/application/src/test/java/org/thingsboard/server/controller/ControllerNoSqlTestSuite.java @@ -25,8 +25,8 @@ import java.util.Arrays; @RunWith(ClasspathSuite.class) @ClasspathSuite.ClassnameFilters({ - "org.thingsboard.server.controller.*Test"}) -public class ControllerTestSuite { + "org.thingsboard.server.controller.nosql.*Test"}) +public class ControllerNoSqlTestSuite { @ClassRule public static CustomCassandraCQLUnit cassandraUnit = diff --git a/application/src/test/java/org/thingsboard/server/controller/ControllerSqlTestSuite.java b/application/src/test/java/org/thingsboard/server/controller/ControllerSqlTestSuite.java new file mode 100644 index 0000000000..b49a0df04a --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/ControllerSqlTestSuite.java @@ -0,0 +1,37 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller; + +import org.cassandraunit.dataset.cql.ClassPathCQLDataSet; +import org.junit.ClassRule; +import org.junit.extensions.cpsuite.ClasspathSuite; +import org.junit.runner.RunWith; +import org.thingsboard.server.dao.CustomCassandraCQLUnit; +import org.thingsboard.server.dao.CustomPostgresUnit; + +import java.util.Arrays; + +@RunWith(ClasspathSuite.class) +@ClasspathSuite.ClassnameFilters({ + "org.thingsboard.server.controller.sql.*SqlTest", + }) +public class ControllerSqlTestSuite { + + @ClassRule + public static CustomPostgresUnit postgresUnit = new CustomPostgresUnit( + Arrays.asList("postgres/schema.sql", "postgres/system-data.sql"), + "postgres-embedded-test.properties"); +} diff --git a/application/src/test/java/org/thingsboard/server/controller/nosql/AdminControllerNoSqlTest.java b/application/src/test/java/org/thingsboard/server/controller/nosql/AdminControllerNoSqlTest.java new file mode 100644 index 0000000000..6ec28e7ccd --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/nosql/AdminControllerNoSqlTest.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller.nosql; + +import org.thingsboard.server.controller.BaseAdminControllerTest; +import org.thingsboard.server.dao.service.DaoNoSqlTest; + +/** + * Created by Valerii Sosliuk on 6/28/2017. + */ +@DaoNoSqlTest +public class AdminControllerNoSqlTest extends BaseAdminControllerTest { +} diff --git a/application/src/test/java/org/thingsboard/server/controller/nosql/AssetControllerNoSqlTest.java b/application/src/test/java/org/thingsboard/server/controller/nosql/AssetControllerNoSqlTest.java new file mode 100644 index 0000000000..a4bd152f07 --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/nosql/AssetControllerNoSqlTest.java @@ -0,0 +1,27 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller.nosql; + +import org.thingsboard.server.controller.BaseAssetControllerTest; +import org.thingsboard.server.dao.service.DaoNoSqlTest; +import org.thingsboard.server.dao.util.NoSqlDao; + +/** + * Created by Valerii Sosliuk on 6/28/2017. + */ +@DaoNoSqlTest +public class AssetControllerNoSqlTest extends BaseAssetControllerTest { +} diff --git a/application/src/test/java/org/thingsboard/server/controller/nosql/AuthControllerNoSqlTest.java b/application/src/test/java/org/thingsboard/server/controller/nosql/AuthControllerNoSqlTest.java new file mode 100644 index 0000000000..4896d22aad --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/nosql/AuthControllerNoSqlTest.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller.nosql; + +import org.thingsboard.server.controller.BaseAuthControllerTest; +import org.thingsboard.server.dao.service.DaoNoSqlTest; + +/** + * Created by Valerii Sosliuk on 6/28/2017. + */ +@DaoNoSqlTest +public class AuthControllerNoSqlTest extends BaseAuthControllerTest { +} diff --git a/application/src/test/java/org/thingsboard/server/controller/nosql/ComponentDescriptorControllerNoSqlTest.java b/application/src/test/java/org/thingsboard/server/controller/nosql/ComponentDescriptorControllerNoSqlTest.java new file mode 100644 index 0000000000..f3aa3e8d95 --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/nosql/ComponentDescriptorControllerNoSqlTest.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller.nosql; + +import org.thingsboard.server.controller.BaseComponentDescriptorControllerTest; +import org.thingsboard.server.dao.service.DaoNoSqlTest; + +/** + * Created by Valerii Sosliuk on 6/28/2017. + */ +@DaoNoSqlTest +public class ComponentDescriptorControllerNoSqlTest extends BaseComponentDescriptorControllerTest { +} diff --git a/application/src/test/java/org/thingsboard/server/controller/nosql/CustomerControllerNoSqlTest.java b/application/src/test/java/org/thingsboard/server/controller/nosql/CustomerControllerNoSqlTest.java new file mode 100644 index 0000000000..2fa306797d --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/nosql/CustomerControllerNoSqlTest.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller.nosql; + +import org.thingsboard.server.controller.BaseCustomerControllerTest; +import org.thingsboard.server.dao.service.DaoNoSqlTest; + +/** + * Created by Valerii Sosliuk on 6/28/2017. + */ +@DaoNoSqlTest +public class CustomerControllerNoSqlTest extends BaseCustomerControllerTest { +} diff --git a/application/src/test/java/org/thingsboard/server/controller/nosql/DashboardControllerNoSqlTest.java b/application/src/test/java/org/thingsboard/server/controller/nosql/DashboardControllerNoSqlTest.java new file mode 100644 index 0000000000..2a7af40c03 --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/nosql/DashboardControllerNoSqlTest.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller.nosql; + +import org.thingsboard.server.controller.BaseDashboardControllerTest; +import org.thingsboard.server.dao.service.DaoNoSqlTest; + +/** + * Created by Valerii Sosliuk on 6/28/2017. + */ +@DaoNoSqlTest +public class DashboardControllerNoSqlTest extends BaseDashboardControllerTest { +} diff --git a/application/src/test/java/org/thingsboard/server/controller/nosql/DeviceControllerNoSqlTest.java b/application/src/test/java/org/thingsboard/server/controller/nosql/DeviceControllerNoSqlTest.java new file mode 100644 index 0000000000..47f1c9e376 --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/nosql/DeviceControllerNoSqlTest.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller.nosql; + +import org.thingsboard.server.controller.BaseDeviceControllerTest; +import org.thingsboard.server.dao.service.DaoNoSqlTest; + +/** + * Created by Valerii Sosliuk on 6/28/2017. + */ +@DaoNoSqlTest +public class DeviceControllerNoSqlTest extends BaseDeviceControllerTest { +} diff --git a/application/src/test/java/org/thingsboard/server/controller/nosql/PluginControllerNoSqlTest.java b/application/src/test/java/org/thingsboard/server/controller/nosql/PluginControllerNoSqlTest.java new file mode 100644 index 0000000000..c25eca170d --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/nosql/PluginControllerNoSqlTest.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller.nosql; + +import org.thingsboard.server.controller.BasePluginControllerTest; +import org.thingsboard.server.dao.service.DaoNoSqlTest; + +/** + * Created by Valerii Sosliuk on 6/28/2017. + */ +@DaoNoSqlTest +public class PluginControllerNoSqlTest extends BasePluginControllerTest { +} diff --git a/application/src/test/java/org/thingsboard/server/controller/nosql/RuleControllerNoSqlTest.java b/application/src/test/java/org/thingsboard/server/controller/nosql/RuleControllerNoSqlTest.java new file mode 100644 index 0000000000..3bf64fbe54 --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/nosql/RuleControllerNoSqlTest.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller.nosql; + +import org.thingsboard.server.controller.BaseRuleControllerTest; +import org.thingsboard.server.dao.service.DaoNoSqlTest; + +/** + * Created by Valerii Sosliuk on 6/28/2017. + */ +@DaoNoSqlTest +public class RuleControllerNoSqlTest extends BaseRuleControllerTest { +} diff --git a/application/src/test/java/org/thingsboard/server/controller/nosql/TenantControllerNoSqlTest.java b/application/src/test/java/org/thingsboard/server/controller/nosql/TenantControllerNoSqlTest.java new file mode 100644 index 0000000000..7cb34d3117 --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/nosql/TenantControllerNoSqlTest.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller.nosql; + +import org.thingsboard.server.controller.BaseTenantControllerTest; +import org.thingsboard.server.dao.service.DaoNoSqlTest; + +/** + * Created by Valerii Sosliuk on 6/28/2017. + */ +@DaoNoSqlTest +public class TenantControllerNoSqlTest extends BaseTenantControllerTest { +} diff --git a/application/src/test/java/org/thingsboard/server/controller/nosql/UserControllerNoSqlTest.java b/application/src/test/java/org/thingsboard/server/controller/nosql/UserControllerNoSqlTest.java new file mode 100644 index 0000000000..6540347f52 --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/nosql/UserControllerNoSqlTest.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller.nosql; + +import org.thingsboard.server.controller.BaseUserControllerTest; +import org.thingsboard.server.dao.service.DaoNoSqlTest; + +/** + * Created by Valerii Sosliuk on 6/28/2017. + */ +@DaoNoSqlTest +public class UserControllerNoSqlTest extends BaseUserControllerTest { +} diff --git a/application/src/test/java/org/thingsboard/server/controller/nosql/WidgetTypeControllerNoSqlTest.java b/application/src/test/java/org/thingsboard/server/controller/nosql/WidgetTypeControllerNoSqlTest.java new file mode 100644 index 0000000000..852f453af1 --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/nosql/WidgetTypeControllerNoSqlTest.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller.nosql; + +import org.thingsboard.server.controller.BaseWidgetTypeControllerTest; +import org.thingsboard.server.dao.service.DaoNoSqlTest; + +/** + * Created by Valerii Sosliuk on 6/28/2017. + */ +@DaoNoSqlTest +public class WidgetTypeControllerNoSqlTest extends BaseWidgetTypeControllerTest { +} diff --git a/application/src/test/java/org/thingsboard/server/controller/nosql/WidgetsBundleControllerNoSqlTest.java b/application/src/test/java/org/thingsboard/server/controller/nosql/WidgetsBundleControllerNoSqlTest.java new file mode 100644 index 0000000000..02b4c07639 --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/nosql/WidgetsBundleControllerNoSqlTest.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller.nosql; + +import org.thingsboard.server.controller.BaseWidgetsBundleControllerTest; +import org.thingsboard.server.dao.service.DaoNoSqlTest; + +/** + * Created by Valerii Sosliuk on 6/28/2017. + */ +@DaoNoSqlTest +public class WidgetsBundleControllerNoSqlTest extends BaseWidgetsBundleControllerTest { +} diff --git a/application/src/test/java/org/thingsboard/server/controller/sql/AdminControllerSqlTest.java b/application/src/test/java/org/thingsboard/server/controller/sql/AdminControllerSqlTest.java new file mode 100644 index 0000000000..2491c32a1b --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/sql/AdminControllerSqlTest.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller.sql; + +import org.thingsboard.server.controller.BaseAdminControllerTest; +import org.thingsboard.server.dao.service.DaoSqlTest; + +/** + * Created by Valerii Sosliuk on 6/28/2017. + */ +@DaoSqlTest +public class AdminControllerSqlTest extends BaseAdminControllerTest { +} diff --git a/application/src/test/java/org/thingsboard/server/controller/sql/AssetControllerSqlTest.java b/application/src/test/java/org/thingsboard/server/controller/sql/AssetControllerSqlTest.java new file mode 100644 index 0000000000..519cc382f2 --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/sql/AssetControllerSqlTest.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller.sql; + +import org.thingsboard.server.controller.BaseAssetControllerTest; +import org.thingsboard.server.dao.service.DaoSqlTest; + +/** + * Created by Valerii Sosliuk on 6/28/2017. + */ +@DaoSqlTest +public class AssetControllerSqlTest extends BaseAssetControllerTest { +} diff --git a/application/src/test/java/org/thingsboard/server/controller/sql/AuthControllerSqlTest.java b/application/src/test/java/org/thingsboard/server/controller/sql/AuthControllerSqlTest.java new file mode 100644 index 0000000000..cb2b1f0346 --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/sql/AuthControllerSqlTest.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller.sql; + +import org.thingsboard.server.controller.BaseAuthControllerTest; +import org.thingsboard.server.dao.service.DaoSqlTest; + +/** + * Created by Valerii Sosliuk on 6/28/2017. + */ +@DaoSqlTest +public class AuthControllerSqlTest extends BaseAuthControllerTest { +} diff --git a/application/src/test/java/org/thingsboard/server/controller/sql/ComponentDescriptorControllerSqlTest.java b/application/src/test/java/org/thingsboard/server/controller/sql/ComponentDescriptorControllerSqlTest.java new file mode 100644 index 0000000000..d96b3dd764 --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/sql/ComponentDescriptorControllerSqlTest.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller.sql; + +import org.thingsboard.server.controller.BaseComponentDescriptorControllerTest; +import org.thingsboard.server.dao.service.DaoSqlTest; + +/** + * Created by Valerii Sosliuk on 6/28/2017. + */ +@DaoSqlTest +public class ComponentDescriptorControllerSqlTest extends BaseComponentDescriptorControllerTest { +} diff --git a/application/src/test/java/org/thingsboard/server/controller/sql/CustomerControllerSqlTest.java b/application/src/test/java/org/thingsboard/server/controller/sql/CustomerControllerSqlTest.java new file mode 100644 index 0000000000..8d3ba4906a --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/sql/CustomerControllerSqlTest.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller.sql; + +import org.thingsboard.server.controller.BaseCustomerControllerTest; +import org.thingsboard.server.dao.service.DaoSqlTest; + +/** + * Created by Valerii Sosliuk on 6/28/2017. + */ +@DaoSqlTest +public class CustomerControllerSqlTest extends BaseCustomerControllerTest { +} diff --git a/application/src/test/java/org/thingsboard/server/controller/sql/DashboardControllerSqlTest.java b/application/src/test/java/org/thingsboard/server/controller/sql/DashboardControllerSqlTest.java new file mode 100644 index 0000000000..7ce48c747f --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/sql/DashboardControllerSqlTest.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller.sql; + +import org.thingsboard.server.controller.BaseDashboardControllerTest; +import org.thingsboard.server.dao.service.DaoSqlTest; + +/** + * Created by Valerii Sosliuk on 6/28/2017. + */ +@DaoSqlTest +public class DashboardControllerSqlTest extends BaseDashboardControllerTest { +} diff --git a/application/src/test/java/org/thingsboard/server/controller/sql/DeviceControllerSqlTest.java b/application/src/test/java/org/thingsboard/server/controller/sql/DeviceControllerSqlTest.java new file mode 100644 index 0000000000..8505e642d3 --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/sql/DeviceControllerSqlTest.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller.sql; + +import org.thingsboard.server.controller.BaseDeviceControllerTest; +import org.thingsboard.server.dao.service.DaoSqlTest; + +/** + * Created by Valerii Sosliuk on 6/28/2017. + */ +@DaoSqlTest +public class DeviceControllerSqlTest extends BaseDeviceControllerTest { +} diff --git a/application/src/test/java/org/thingsboard/server/controller/sql/PluginControllerSqlTest.java b/application/src/test/java/org/thingsboard/server/controller/sql/PluginControllerSqlTest.java new file mode 100644 index 0000000000..3d750c596c --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/sql/PluginControllerSqlTest.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller.sql; + +import org.thingsboard.server.controller.BasePluginControllerTest; +import org.thingsboard.server.dao.service.DaoSqlTest; + +/** + * Created by Valerii Sosliuk on 6/28/2017. + */ +@DaoSqlTest +public class PluginControllerSqlTest extends BasePluginControllerTest { +} diff --git a/application/src/test/java/org/thingsboard/server/controller/sql/RuleControllerSqlTest.java b/application/src/test/java/org/thingsboard/server/controller/sql/RuleControllerSqlTest.java new file mode 100644 index 0000000000..d70d55042e --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/sql/RuleControllerSqlTest.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller.sql; + +import org.thingsboard.server.controller.BaseRuleControllerTest; +import org.thingsboard.server.dao.service.DaoSqlTest; + +/** + * Created by Valerii Sosliuk on 6/28/2017. + */ +@DaoSqlTest +public class RuleControllerSqlTest extends BaseRuleControllerTest { +} diff --git a/application/src/test/java/org/thingsboard/server/controller/sql/TenantControllerSqlTest.java b/application/src/test/java/org/thingsboard/server/controller/sql/TenantControllerSqlTest.java new file mode 100644 index 0000000000..582dc610fd --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/sql/TenantControllerSqlTest.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller.sql; + +import org.thingsboard.server.controller.BaseTenantControllerTest; +import org.thingsboard.server.dao.service.DaoSqlTest; + +/** + * Created by Valerii Sosliuk on 6/28/2017. + */ +@DaoSqlTest +public class TenantControllerSqlTest extends BaseTenantControllerTest { +} diff --git a/application/src/test/java/org/thingsboard/server/controller/sql/UserControllerSqlTest.java b/application/src/test/java/org/thingsboard/server/controller/sql/UserControllerSqlTest.java new file mode 100644 index 0000000000..9b7fc3bee7 --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/sql/UserControllerSqlTest.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller.sql; + +import org.thingsboard.server.controller.BaseUserControllerTest; +import org.thingsboard.server.dao.service.DaoSqlTest; + +/** + * Created by Valerii Sosliuk on 6/28/2017. + */ +@DaoSqlTest +public class UserControllerSqlTest extends BaseUserControllerTest { +} diff --git a/application/src/test/java/org/thingsboard/server/controller/sql/WidgetTypeControllerSqlTest.java b/application/src/test/java/org/thingsboard/server/controller/sql/WidgetTypeControllerSqlTest.java new file mode 100644 index 0000000000..db0cd3ac0b --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/sql/WidgetTypeControllerSqlTest.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller.sql; + +import org.thingsboard.server.controller.BaseWidgetTypeControllerTest; +import org.thingsboard.server.dao.service.DaoSqlTest; + +/** + * Created by Valerii Sosliuk on 6/28/2017. + */ +@DaoSqlTest +public class WidgetTypeControllerSqlTest extends BaseWidgetTypeControllerTest { +} diff --git a/application/src/test/java/org/thingsboard/server/controller/sql/WidgetsBundleControllerSqlTest.java b/application/src/test/java/org/thingsboard/server/controller/sql/WidgetsBundleControllerSqlTest.java new file mode 100644 index 0000000000..7e2e48137d --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/controller/sql/WidgetsBundleControllerSqlTest.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.controller.sql; + +import org.thingsboard.server.controller.BaseWidgetsBundleControllerTest; +import org.thingsboard.server.dao.service.DaoSqlTest; + +/** + * Created by Valerii Sosliuk on 6/28/2017. + */ +@DaoSqlTest +public class WidgetsBundleControllerSqlTest extends BaseWidgetsBundleControllerTest { +} From 36e4bba0408d9ecf4388adb9198cd4888a02e75f Mon Sep 17 00:00:00 2001 From: Andrew Shvayka Date: Mon, 3 Jul 2017 10:22:29 +0300 Subject: [PATCH 2/8] TB-69: Implementation --- .../server/actors/ActorSystemContext.java | 4 + .../actors/rule/RuleProcessingContext.java | 35 +++- .../common/data/relation/EntityRelation.java | 1 - .../server/dao/alarm/AlarmService.java | 3 + .../server/dao/alarm/BaseAlarmService.java | 37 ++-- .../extensions/api/rules/RuleContext.java | 10 +- .../extensions/api/rules/RuleProcessor.java | 2 + .../extensions/core/filter/BasicJsFilter.java | 14 -- .../core/filter/DeviceAttributesFilter.java | 42 +--- .../core/filter/DeviceTelemetryFilter.java | 12 +- .../core/filter/NashornJsEvaluator.java | 80 ++++++- .../AlarmDeduplicationProcessor.java | 2 +- .../core/processor/AlarmProcessor.java | 198 ++++++++++++++++++ .../AlarmProcessorConfiguration.java | 38 ++++ .../extensions/core/utils/VelocityUtils.java | 8 +- .../resources/AlarmProcessorDescriptor.json | 113 ++++++++++ 16 files changed, 500 insertions(+), 99 deletions(-) create mode 100644 extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmProcessor.java create mode 100644 extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmProcessorConfiguration.java create mode 100644 extensions-core/src/main/resources/AlarmProcessorDescriptor.json diff --git a/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java b/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java index ae9d9677c7..5dd738b029 100644 --- a/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java +++ b/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java @@ -37,6 +37,7 @@ import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; import org.thingsboard.server.common.msg.cluster.ServerAddress; import org.thingsboard.server.common.transport.auth.DeviceAuthService; import org.thingsboard.server.controller.plugin.PluginWebSocketMsgEndpoint; +import org.thingsboard.server.dao.alarm.AlarmService; import org.thingsboard.server.dao.asset.AssetService; import org.thingsboard.server.dao.attributes.AttributesService; import org.thingsboard.server.dao.customer.CustomerService; @@ -105,6 +106,9 @@ public class ActorSystemContext { @Autowired @Getter private EventService eventService; + @Autowired + @Getter private AlarmService alarmService; + @Autowired @Getter @Setter private PluginWebSocketMsgEndpoint wsMsgEndpoint; diff --git a/application/src/main/java/org/thingsboard/server/actors/rule/RuleProcessingContext.java b/application/src/main/java/org/thingsboard/server/actors/rule/RuleProcessingContext.java index f425f8f8b3..630177292c 100644 --- a/application/src/main/java/org/thingsboard/server/actors/rule/RuleProcessingContext.java +++ b/application/src/main/java/org/thingsboard/server/actors/rule/RuleProcessingContext.java @@ -1,12 +1,12 @@ /** * Copyright © 2016-2017 The Thingsboard Authors - * + *

* 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 - * + *

+ * 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. @@ -15,22 +15,27 @@ */ package org.thingsboard.server.actors.rule; +import com.google.common.util.concurrent.ListenableFuture; import org.thingsboard.server.actors.ActorSystemContext; import org.thingsboard.server.common.data.Event; +import org.thingsboard.server.common.data.alarm.Alarm; +import org.thingsboard.server.common.data.alarm.AlarmId; import org.thingsboard.server.common.data.id.*; +import org.thingsboard.server.dao.alarm.AlarmService; import org.thingsboard.server.dao.event.EventService; import org.thingsboard.server.dao.timeseries.TimeseriesService; -import org.thingsboard.server.extensions.api.device.DeviceAttributes; import org.thingsboard.server.common.msg.device.ToDeviceActorMsg; import org.thingsboard.server.extensions.api.device.DeviceMetaData; import org.thingsboard.server.extensions.api.rules.RuleContext; import java.util.Optional; +import java.util.concurrent.ExecutionException; public class RuleProcessingContext implements RuleContext { private final TimeseriesService tsService; private final EventService eventService; + private final AlarmService alarmService; private final RuleId ruleId; private TenantId tenantId; private CustomerId customerId; @@ -40,6 +45,7 @@ public class RuleProcessingContext implements RuleContext { RuleProcessingContext(ActorSystemContext systemContext, RuleId ruleId) { this.tsService = systemContext.getTsService(); this.eventService = systemContext.getEventService(); + this.alarmService = systemContext.getAlarmService(); this.ruleId = ruleId; } @@ -77,6 +83,25 @@ public class RuleProcessingContext implements RuleContext { return eventService.findEvent(tenantId, deviceId, eventType, eventUid); } + @Override + public Alarm createOrUpdateAlarm(Alarm alarm) { + alarm.setTenantId(tenantId); + return alarmService.createOrUpdateAlarm(alarm); + } + + public Optional findLatestAlarm(EntityId originator, String alarmType) { + try { + return Optional.ofNullable(alarmService.findLatestByOriginatorAndType(tenantId, originator, alarmType).get()); + } catch (InterruptedException | ExecutionException e) { + throw new RuntimeException("Failed to lookup alarm!", e); + } + } + + @Override + public ListenableFuture clearAlarm(AlarmId alarmId, long clearTs) { + return alarmService.clearAlarm(alarmId, clearTs); + } + private void checkEvent(Event event) { if (event.getTenantId() == null) { event.setTenantId(tenantId); diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/relation/EntityRelation.java b/common/data/src/main/java/org/thingsboard/server/common/data/relation/EntityRelation.java index 8dab589596..427cd0dd29 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/relation/EntityRelation.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/relation/EntityRelation.java @@ -112,7 +112,6 @@ public class EntityRelation { if (to != null ? !to.equals(that.to) : that.to != null) return false; if (type != null ? !type.equals(that.type) : that.type != null) return false; return typeGroup == that.typeGroup; - } @Override diff --git a/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java b/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java index 63fba03a52..0c54f717b7 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmService.java @@ -18,6 +18,7 @@ package org.thingsboard.server.dao.alarm; import com.google.common.util.concurrent.ListenableFuture; import org.thingsboard.server.common.data.alarm.*; import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.page.TimePageData; /** @@ -40,4 +41,6 @@ public interface AlarmService { AlarmSeverity findHighestAlarmSeverity(EntityId entityId, AlarmSearchStatus alarmSearchStatus, AlarmStatus alarmStatus); + ListenableFuture findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type); + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java index 785d029850..4819945a87 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java @@ -1,12 +1,12 @@ /** * Copyright © 2016-2017 The Thingsboard Authors - * + *

* 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 - * + *

+ * 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. @@ -26,6 +26,7 @@ import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import org.thingsboard.server.common.data.alarm.*; import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.page.TimePageData; import org.thingsboard.server.common.data.page.TimePageLink; import org.thingsboard.server.common.data.relation.EntityRelation; @@ -113,6 +114,10 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ } } + public ListenableFuture findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type) { + return alarmDao.findLatestByOriginatorAndType(tenantId, originator, type); + } + private Alarm createAlarm(Alarm alarm) throws InterruptedException, ExecutionException { log.debug("New Alarm : {}", alarm); Alarm saved = getData(alarmDao.save(new AlarmEntity(alarm))); @@ -206,15 +211,15 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ validateId(alarmId, "Incorrect alarmId " + alarmId); return Futures.transform(alarmDao.findAlarmByIdAsync(alarmId.getId()), (AsyncFunction) alarm1 -> { - AlarmInfo alarmInfo = new AlarmInfo(alarm1); - return Futures.transform( - entityService.fetchEntityNameAsync(alarmInfo.getOriginator()), (Function) - originatorName -> { - alarmInfo.setOriginatorName(originatorName); - return alarmInfo; - } - ); - }); + AlarmInfo alarmInfo = new AlarmInfo(alarm1); + return Futures.transform( + entityService.fetchEntityNameAsync(alarmInfo.getOriginator()), (Function) + originatorName -> { + alarmInfo.setOriginatorName(originatorName); + return alarmInfo; + } + ); + }); } @Override @@ -236,7 +241,7 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ )); } return Futures.successfulAsList(alarmFutures); - }); + }); } return Futures.transform(alarms, new Function, TimePageData>() { @Nullable @@ -249,7 +254,7 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ @Override public AlarmSeverity findHighestAlarmSeverity(EntityId entityId, AlarmSearchStatus alarmSearchStatus, - AlarmStatus alarmStatus) { + AlarmStatus alarmStatus) { TimePageLink nextPageLink = new TimePageLink(100); boolean hasNext = true; AlarmSeverity highestSeverity = null; @@ -323,7 +328,7 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ List parentEntities = relationService.findByQuery(query).get().stream().map(r -> r.getFrom()).collect(Collectors.toList()); for (EntityId parentId : parentEntities) { updateAlarmRelation(parentId, alarm.getId(), oldStatus, newStatus); - } + } updateAlarmRelation(alarm.getOriginator(), alarm.getId(), oldStatus, newStatus); } catch (ExecutionException | InterruptedException e) { log.warn("[{}] Failed to update relations. Old status: [{}], New status: [{}]", alarm.getId(), oldStatus, newStatus); diff --git a/extensions-api/src/main/java/org/thingsboard/server/extensions/api/rules/RuleContext.java b/extensions-api/src/main/java/org/thingsboard/server/extensions/api/rules/RuleContext.java index 73f657635f..6b381bebc0 100644 --- a/extensions-api/src/main/java/org/thingsboard/server/extensions/api/rules/RuleContext.java +++ b/extensions-api/src/main/java/org/thingsboard/server/extensions/api/rules/RuleContext.java @@ -15,9 +15,12 @@ */ package org.thingsboard.server.extensions.api.rules; +import com.google.common.util.concurrent.ListenableFuture; import org.thingsboard.server.common.data.Event; +import org.thingsboard.server.common.data.alarm.Alarm; +import org.thingsboard.server.common.data.alarm.AlarmId; +import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.RuleId; -import org.thingsboard.server.extensions.api.device.DeviceAttributes; import org.thingsboard.server.extensions.api.device.DeviceMetaData; import java.util.Optional; @@ -34,4 +37,9 @@ public interface RuleContext { Optional findEvent(String eventType, String eventUid); + Optional findLatestAlarm(EntityId originator, String alarmType); + + Alarm createOrUpdateAlarm(Alarm alarm); + + ListenableFuture clearAlarm(AlarmId id, long clearTs); } diff --git a/extensions-api/src/main/java/org/thingsboard/server/extensions/api/rules/RuleProcessor.java b/extensions-api/src/main/java/org/thingsboard/server/extensions/api/rules/RuleProcessor.java index a4125b3df4..1e4fbf2bc9 100644 --- a/extensions-api/src/main/java/org/thingsboard/server/extensions/api/rules/RuleProcessor.java +++ b/extensions-api/src/main/java/org/thingsboard/server/extensions/api/rules/RuleProcessor.java @@ -18,6 +18,8 @@ package org.thingsboard.server.extensions.api.rules; import org.thingsboard.server.common.msg.device.ToDeviceActorMsg; import org.thingsboard.server.extensions.api.component.ConfigurableComponent; +import javax.script.ScriptException; + /** * @author Andrew Shvayka */ diff --git a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/BasicJsFilter.java b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/BasicJsFilter.java index ed9402520d..8e99807cc9 100644 --- a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/BasicJsFilter.java +++ b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/BasicJsFilter.java @@ -75,18 +75,4 @@ public abstract class BasicJsFilter implements RuleFilter } } - protected static Object getValue(KvEntry attr) { - switch (attr.getDataType()) { - case STRING: - return attr.getStrValue().get(); - case LONG: - return attr.getLongValue().get(); - case DOUBLE: - return attr.getDoubleValue().get(); - case BOOLEAN: - return attr.getBooleanValue().get(); - } - return null; - } - } diff --git a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/DeviceAttributesFilter.java b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/DeviceAttributesFilter.java index a63fcab8e7..323de921bd 100644 --- a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/DeviceAttributesFilter.java +++ b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/DeviceAttributesFilter.java @@ -16,9 +16,6 @@ package org.thingsboard.server.extensions.core.filter; import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.thingsboard.server.common.data.kv.AttributeKvEntry; import org.thingsboard.server.common.msg.core.UpdateAttributesRequest; import org.thingsboard.server.common.msg.device.ToDeviceActorMsg; import org.thingsboard.server.common.msg.session.FromDeviceMsg; @@ -28,10 +25,6 @@ import org.thingsboard.server.extensions.api.rules.RuleContext; import javax.script.Bindings; import javax.script.ScriptException; -import javax.script.SimpleBindings; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; /** * @author Andrew Shvayka @@ -40,25 +33,18 @@ import java.util.Map; @Slf4j public class DeviceAttributesFilter extends BasicJsFilter { - public static final String CLIENT_SIDE = "cs"; - public static final String SERVER_SIDE = "ss"; - public static final String SHARED = "shared"; - @Override protected boolean doFilter(RuleContext ctx, ToDeviceActorMsg msg) throws ScriptException { return evaluator.execute(toBindings(ctx.getDeviceMetaData().getDeviceAttributes(), msg != null ? msg.getPayload() : null)); } private Bindings toBindings(DeviceAttributes attributes, FromDeviceMsg msg) { - Bindings bindings = new SimpleBindings(); - convertListEntries(bindings, CLIENT_SIDE, attributes.getClientSideAttributes()); - convertListEntries(bindings, SERVER_SIDE, attributes.getServerSideAttributes()); - convertListEntries(bindings, SHARED, attributes.getServerSidePublicAttributes()); + Bindings bindings = NashornJsEvaluator.getAttributeBindings(attributes); if (msg != null) { switch (msg.getMsgType()) { case POST_ATTRIBUTES_REQUEST: - updateBindings(bindings, (UpdateAttributesRequest) msg); + bindings = NashornJsEvaluator.updateBindings(bindings, (UpdateAttributesRequest) msg); break; } } @@ -66,28 +52,4 @@ public class DeviceAttributesFilter extends BasicJsFilter { return bindings; } - private void updateBindings(Bindings bindings, UpdateAttributesRequest msg) { - Map attrMap = (Map) bindings.get(CLIENT_SIDE); - for (AttributeKvEntry attr : msg.getAttributes()) { - if (!CLIENT_SIDE.equalsIgnoreCase(attr.getKey()) && !SERVER_SIDE.equalsIgnoreCase(attr.getKey()) - && !SHARED.equalsIgnoreCase(attr.getKey())) { - bindings.put(attr.getKey(), getValue(attr)); - } - attrMap.put(attr.getKey(), getValue(attr)); - } - bindings.put(CLIENT_SIDE, attrMap); - } - - public static Bindings convertListEntries(Bindings bindings, String attributesVarName, Collection attributes) { - Map attrMap = new HashMap<>(); - for (AttributeKvEntry attr : attributes) { - if (!CLIENT_SIDE.equalsIgnoreCase(attr.getKey()) && !SERVER_SIDE.equalsIgnoreCase(attr.getKey()) - && !SHARED.equalsIgnoreCase(attr.getKey())) { - bindings.put(attr.getKey(), getValue(attr)); - } - attrMap.put(attr.getKey(), getValue(attr)); - } - bindings.put(attributesVarName, attrMap); - return bindings; - } } diff --git a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/DeviceTelemetryFilter.java b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/DeviceTelemetryFilter.java index 8eaa2336c6..d16258e082 100644 --- a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/DeviceTelemetryFilter.java +++ b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/DeviceTelemetryFilter.java @@ -23,9 +23,7 @@ import org.thingsboard.server.common.msg.session.FromDeviceMsg; import org.thingsboard.server.extensions.api.component.Filter; import org.thingsboard.server.extensions.api.rules.RuleContext; -import javax.script.Bindings; import javax.script.ScriptException; -import javax.script.SimpleBindings; import java.util.List; /** @@ -41,7 +39,7 @@ public class DeviceTelemetryFilter extends BasicJsFilter { if (deviceMsg instanceof TelemetryUploadRequest) { TelemetryUploadRequest telemetryMsg = (TelemetryUploadRequest) deviceMsg; for (List entries : telemetryMsg.getData().values()) { - if (evaluator.execute(toBindings(entries))) { + if (evaluator.execute(NashornJsEvaluator.toBindings(entries))) { return true; } } @@ -49,12 +47,4 @@ public class DeviceTelemetryFilter extends BasicJsFilter { return false; } - private Bindings toBindings(List entries) { - Bindings bindings = new SimpleBindings(); - for (KvEntry entry : entries) { - bindings.put(entry.getKey(), getValue(entry)); - } - return bindings; - } - } diff --git a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/NashornJsEvaluator.java b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/NashornJsEvaluator.java index cd3cd07d5f..cdf9422bf6 100644 --- a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/NashornJsEvaluator.java +++ b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/NashornJsEvaluator.java @@ -1,12 +1,12 @@ /** * Copyright © 2016-2017 The Thingsboard Authors - * + *

* 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 - * + *

+ * 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. @@ -17,10 +17,16 @@ package org.thingsboard.server.extensions.core.filter; import jdk.nashorn.api.scripting.NashornScriptEngineFactory; import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.thingsboard.server.common.data.kv.AttributeKvEntry; +import org.thingsboard.server.common.data.kv.KvEntry; +import org.thingsboard.server.common.msg.core.UpdateAttributesRequest; +import org.thingsboard.server.extensions.api.device.DeviceAttributes; import javax.script.*; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * @author Andrew Shvayka @@ -28,6 +34,9 @@ import javax.script.*; @Slf4j public class NashornJsEvaluator { + public static final String CLIENT_SIDE = "cs"; + public static final String SERVER_SIDE = "ss"; + public static final String SHARED = "shared"; private static NashornScriptEngineFactory factory = new NashornScriptEngineFactory(); private CompiledScript engine; @@ -47,6 +56,65 @@ public class NashornJsEvaluator { } } + public static Bindings convertListEntries(Bindings bindings, String attributesVarName, Collection attributes) { + Map attrMap = new HashMap<>(); + for (AttributeKvEntry attr : attributes) { + if (!CLIENT_SIDE.equalsIgnoreCase(attr.getKey()) && !SERVER_SIDE.equalsIgnoreCase(attr.getKey()) + && !SHARED.equalsIgnoreCase(attr.getKey())) { + bindings.put(attr.getKey(), getValue(attr)); + } + attrMap.put(attr.getKey(), getValue(attr)); + } + bindings.put(attributesVarName, attrMap); + return bindings; + } + + public static Bindings updateBindings(Bindings bindings, UpdateAttributesRequest msg) { + Map attrMap = (Map) bindings.get(CLIENT_SIDE); + for (AttributeKvEntry attr : msg.getAttributes()) { + if (!CLIENT_SIDE.equalsIgnoreCase(attr.getKey()) && !SERVER_SIDE.equalsIgnoreCase(attr.getKey()) + && !SHARED.equalsIgnoreCase(attr.getKey())) { + bindings.put(attr.getKey(), getValue(attr)); + } + attrMap.put(attr.getKey(), getValue(attr)); + } + bindings.put(CLIENT_SIDE, attrMap); + return bindings; + } + + protected static Object getValue(KvEntry attr) { + switch (attr.getDataType()) { + case STRING: + return attr.getStrValue().get(); + case LONG: + return attr.getLongValue().get(); + case DOUBLE: + return attr.getDoubleValue().get(); + case BOOLEAN: + return attr.getBooleanValue().get(); + } + return null; + } + + public static Bindings toBindings(List entries) { + return toBindings(new SimpleBindings(), entries); + } + + public static Bindings toBindings(Bindings bindings, List entries) { + for (KvEntry entry : entries) { + bindings.put(entry.getKey(), getValue(entry)); + } + return bindings; + } + + public static Bindings getAttributeBindings(DeviceAttributes attributes) { + Bindings bindings = new SimpleBindings(); + convertListEntries(bindings, CLIENT_SIDE, attributes.getClientSideAttributes()); + convertListEntries(bindings, SERVER_SIDE, attributes.getServerSideAttributes()); + convertListEntries(bindings, SHARED, attributes.getServerSidePublicAttributes()); + return bindings; + } + public Boolean execute(Bindings bindings) throws ScriptException { Object eval = engine.eval(bindings); if (eval instanceof Boolean) { diff --git a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmDeduplicationProcessor.java b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmDeduplicationProcessor.java index d7ebfec64e..4a39ee1449 100644 --- a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmDeduplicationProcessor.java +++ b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmDeduplicationProcessor.java @@ -32,7 +32,7 @@ import java.util.Optional; /** * @author Andrew Shvayka */ -@Processor(name = "Alarm Deduplication Processor", descriptor = "AlarmDeduplicationProcessorDescriptor.json", +@Processor(name = "(Deprecated) Alarm Deduplication Processor", descriptor = "AlarmDeduplicationProcessorDescriptor.json", configuration = AlarmDeduplicationProcessorConfiguration.class) @Slf4j public class AlarmDeduplicationProcessor extends SimpleRuleLifecycleComponent diff --git a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmProcessor.java b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmProcessor.java new file mode 100644 index 0000000000..eb3d67ba06 --- /dev/null +++ b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmProcessor.java @@ -0,0 +1,198 @@ +package org.thingsboard.server.extensions.core.processor; + +import java.util.Optional; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.runtime.parser.ParseException; +import org.thingsboard.server.common.data.alarm.Alarm; +import org.thingsboard.server.common.data.alarm.AlarmSeverity; +import org.thingsboard.server.common.data.alarm.AlarmStatus; +import org.thingsboard.server.common.data.kv.KvEntry; +import org.thingsboard.server.common.msg.core.TelemetryUploadRequest; +import org.thingsboard.server.common.msg.core.UpdateAttributesRequest; +import org.thingsboard.server.common.msg.device.ToDeviceActorMsg; +import org.thingsboard.server.common.msg.session.FromDeviceMsg; +import org.thingsboard.server.extensions.api.component.Processor; +import org.thingsboard.server.extensions.api.rules.*; +import org.thingsboard.server.extensions.core.filter.NashornJsEvaluator; +import org.thingsboard.server.extensions.core.utils.VelocityUtils; + +import javax.script.Bindings; +import javax.script.ScriptException; +import java.io.IOException; +import java.util.List; + +/** + * @author Andrew Shvayka + */ +@Processor(name = "Alarm Processor", descriptor = "AlarmProcessorDescriptor.json", + configuration = AlarmProcessorConfiguration.class) +@Slf4j +public class AlarmProcessor implements RuleProcessor { + + static final String IS_NEW_ALARM = "isNewAlarm"; + static final String IS_EXISTING_ALARM = "isExistingAlarm"; + static final String IS_CLEARED_ALARM = "isClearedAlarm"; + + protected NashornJsEvaluator newAlarmEvaluator; + protected NashornJsEvaluator clearAlarmEvaluator; + + private ObjectMapper mapper = new ObjectMapper(); + private AlarmProcessorConfiguration configuration; + private AlarmStatus status; + private AlarmSeverity severity; + private Template alarmTypeTemplate; + private Template alarmDetailsTemplate; + + + @Override + public void init(AlarmProcessorConfiguration configuration) { + this.configuration = configuration; + try { + this.alarmTypeTemplate = VelocityUtils.create(configuration.getAlarmTypeTemplate(), "Alarm Type Template"); + this.alarmDetailsTemplate = VelocityUtils.create(configuration.getAlarmDetailsTemplate(), "Alarm Details Template"); + this.status = AlarmStatus.valueOf(configuration.getAlarmStatus()); + this.severity = AlarmSeverity.valueOf(configuration.getAlarmSeverity()); + initEvaluators(); + } catch (Exception e) { + log.error("Failed to create templates based on provided configuration!", e); + throw new RuntimeException("Failed to create templates based on provided configuration!", e); + } + } + + @Override + public void resume() { + initEvaluators(); + log.debug("Resume method was called, but no impl provided!"); + } + + @Override + public void suspend() { + destroyEvaluators(); + log.debug("Suspend method was called, but no impl provided!"); + } + + @Override + public void stop() { + destroyEvaluators(); + log.debug("Stop method was called, but no impl provided!"); + } + + @Override + public RuleProcessingMetaData process(RuleContext ctx, ToDeviceActorMsg wrapper) throws RuleException { + RuleProcessingMetaData md = new RuleProcessingMetaData(); + + FromDeviceMsg msg = wrapper.getPayload(); + Bindings bindings = buildBindings(ctx, msg); + + boolean isActiveAlarm; + boolean isClearedAlarm; + + try { + isActiveAlarm = newAlarmEvaluator.execute(bindings); + isClearedAlarm = clearAlarmEvaluator.execute(bindings); + } catch (ScriptException e) { + log.debug("[{}] Failed to evaluate alarm expressions!", ctx.getRuleId(), e); + throw new RuleException("Failed to evaluate alarm expressions!", e); + } + + if (!isActiveAlarm && !isClearedAlarm) { + log.debug("[{}] Incoming message do not trigger alarm", ctx.getRuleId()); + return md; + } + + Alarm existing = null; + if (isActiveAlarm) { + Alarm alarm = buildAlarm(ctx, msg); + existing = ctx.createOrUpdateAlarm(alarm); + if (existing.getStartTs() == alarm.getStartTs()) { + log.debug("[{}][{}] New Active Alarm detected"); + md.put(IS_NEW_ALARM, Boolean.TRUE); + } else { + log.debug("[{}][{}] Existing Active Alarm detected"); + md.put(IS_EXISTING_ALARM, Boolean.TRUE); + } + } else if (isClearedAlarm) { + VelocityContext context = VelocityUtils.createContext(ctx.getDeviceMetaData(), msg); + String alarmType = VelocityUtils.merge(alarmTypeTemplate, context); + Optional alarm = ctx.findLatestAlarm(ctx.getDeviceMetaData().getDeviceId(), alarmType); + if (alarm.isPresent()) { + ctx.clearAlarm(alarm.get().getId(), System.currentTimeMillis()); + log.debug("[{}][{}] Existing Active Alarm cleared"); + md.put(IS_CLEARED_ALARM, Boolean.TRUE); + existing = alarm.get(); + } + } + //TODO: handle cleared alarms + + if (existing != null) { + md.put("alarmId", existing.getId().getId()); + md.put("alarmType", existing.getType()); + md.put("alarmSeverity", existing.getSeverity()); + try { + md.put("alarmDetails", mapper.writeValueAsString(existing.getDetails())); + } catch (JsonProcessingException e) { + throw new RuleException("Failed to serialize alarm details", e); + } + } + + return md; + } + + private Alarm buildAlarm(RuleContext ctx, FromDeviceMsg msg) throws RuleException { + VelocityContext context = VelocityUtils.createContext(ctx.getDeviceMetaData(), msg); + String alarmType = VelocityUtils.merge(alarmTypeTemplate, context); + String alarmDetails = VelocityUtils.merge(alarmDetailsTemplate, context); + + Alarm alarm = new Alarm(); + alarm.setOriginator(ctx.getDeviceMetaData().getDeviceId()); + alarm.setType(alarmType); + + alarm.setStatus(status); + alarm.setSeverity(severity); + alarm.setPropagate(configuration.isAlarmPropagateFlag()); + + try { + alarm.setDetails(mapper.readTree(alarmDetails)); + } catch (IOException e) { + log.debug("[{}] Failed to parse alarm details {} as json string after evaluation.", ctx.getRuleId(), e); + throw new RuleException("Failed to parse alarm details as json string after evaluation!", e); + } + return alarm; + } + + private Bindings buildBindings(RuleContext ctx, FromDeviceMsg msg) { + Bindings bindings = NashornJsEvaluator.getAttributeBindings(ctx.getDeviceMetaData().getDeviceAttributes()); + if (msg != null) { + switch (msg.getMsgType()) { + case POST_ATTRIBUTES_REQUEST: + bindings = NashornJsEvaluator.updateBindings(bindings, (UpdateAttributesRequest) msg); + break; + case POST_TELEMETRY_REQUEST: + TelemetryUploadRequest telemetryMsg = (TelemetryUploadRequest) msg; + for (List entries : telemetryMsg.getData().values()) { + bindings = NashornJsEvaluator.toBindings(bindings, entries); + } + } + } + return bindings; + } + + private void initEvaluators() { + newAlarmEvaluator = new NashornJsEvaluator(configuration.getNewAlarmExpression()); + clearAlarmEvaluator = new NashornJsEvaluator(configuration.getClearAlarmExpression()); + } + + private void destroyEvaluators() { + if (newAlarmEvaluator != null) { + newAlarmEvaluator.destroy(); + } + if (clearAlarmEvaluator != null) { + clearAlarmEvaluator.destroy(); + } + } +} diff --git a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmProcessorConfiguration.java b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmProcessorConfiguration.java new file mode 100644 index 0000000000..197cc44acc --- /dev/null +++ b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmProcessorConfiguration.java @@ -0,0 +1,38 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.extensions.core.processor; + +import lombok.Data; + +import java.util.List; + +/** + * @author Andrew Shvayka + */ +@Data +public class AlarmProcessorConfiguration { + + private String newAlarmExpression; + private String clearAlarmExpression; + + private String alarmTypeTemplate; + private String alarmSeverity; + private String alarmStatus; + private boolean alarmPropagateFlag; + + private String alarmDetailsTemplate; + +} \ No newline at end of file diff --git a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/utils/VelocityUtils.java b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/utils/VelocityUtils.java index 6844234661..fbb7612c68 100644 --- a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/utils/VelocityUtils.java +++ b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/utils/VelocityUtils.java @@ -29,7 +29,7 @@ import org.thingsboard.server.common.msg.session.FromDeviceMsg; import org.thingsboard.server.extensions.api.device.DeviceAttributes; import org.thingsboard.server.extensions.api.device.DeviceMetaData; import org.thingsboard.server.extensions.api.rules.RuleProcessingMetaData; -import org.thingsboard.server.extensions.core.filter.DeviceAttributesFilter; +import org.thingsboard.server.extensions.core.filter.NashornJsEvaluator; import java.io.StringReader; import java.io.StringWriter; @@ -70,9 +70,9 @@ public class VelocityUtils { context.put("date", new DateTool()); DeviceAttributes deviceAttributes = deviceMetaData.getDeviceAttributes(); - pushAttributes(context, deviceAttributes.getClientSideAttributes(), DeviceAttributesFilter.CLIENT_SIDE); - pushAttributes(context, deviceAttributes.getServerSideAttributes(), DeviceAttributesFilter.SERVER_SIDE); - pushAttributes(context, deviceAttributes.getServerSidePublicAttributes(), DeviceAttributesFilter.SHARED); + pushAttributes(context, deviceAttributes.getClientSideAttributes(), NashornJsEvaluator.CLIENT_SIDE); + pushAttributes(context, deviceAttributes.getServerSideAttributes(), NashornJsEvaluator.SERVER_SIDE); + pushAttributes(context, deviceAttributes.getServerSidePublicAttributes(), NashornJsEvaluator.SHARED); switch (payload.getMsgType()) { case POST_TELEMETRY_REQUEST: diff --git a/extensions-core/src/main/resources/AlarmProcessorDescriptor.json b/extensions-core/src/main/resources/AlarmProcessorDescriptor.json new file mode 100644 index 0000000000..32a4a50010 --- /dev/null +++ b/extensions-core/src/main/resources/AlarmProcessorDescriptor.json @@ -0,0 +1,113 @@ +{ + "schema": { + "title": "Alarm Configuration", + "type": "object", + "properties": { + "newAlarmExpression": { + "title": "Alarm trigger expression", + "type": "string", + "default": "" + }, + "clearAlarmExpression": { + "title": "Alarm clear expression", + "type": "string", + "default": "" + }, + "alarmTypeTemplate": { + "title": "Alarm type", + "type": "string" + }, + "alarmSeverity": { + "title": "Severity", + "type": "string" + }, + "alarmStatus": { + "title": "Status", + "type": "string" + }, + "alarmPropagateFlag": { + "title": "Propagate Alarm", + "type": "boolean" + }, + "alarmDetailsTemplate": { + "title": "Alarm details", + "type": "string" + } + }, + "required": [ + "newAlarmExpression", + "clearAlarmExpression", + "alarmSeverity", + "alarmStatus", + "alarmTypeTemplate", + "alarmDetailsTemplate" + ] + }, + "form": [ + { + "key": "newAlarmExpression", + "type": "javascript" + }, + { + "key": "clearAlarmExpression", + "type": "javascript" + }, + { + "key": "alarmSeverity", + "type": "rc-select", + "multiple": false, + "items": [ + { + "value": "CRITICAL", + "label": "Critical" + }, + { + "value": "MAJOR", + "label": "Major" + }, + { + "value": "MINOR", + "label": "Minor" + }, + { + "value": "WARNING", + "label": "Warning" + }, + { + "value": "INDETERMINATE", + "label": "Indeterminate" + } + ] + }, + { + "key": "alarmStatus", + "type": "rc-select", + "multiple": false, + "items": [ + { + "value": "ACTIVE_UNACK", + "label": "Active Unacknowledged" + }, + { + "value": "ACTIVE_ACK", + "label": "Active Acknowledged" + }, + { + "value": "CLEARED_UNACK", + "label": "Cleared Unacknowledged" + }, + { + "value": "CLEARED_ACK", + "label": "Cleared Acknowledged" + } + ] + }, + "alarmTypeTemplate", + "alarmPropagateFlag", + { + "key": "alarmDetailsTemplate", + "type": "textarea", + "rows": 5 + } + ] +} \ No newline at end of file From 2deeecdfbac22c216c71fcce2ee73ac25efb142c Mon Sep 17 00:00:00 2001 From: Andrew Shvayka Date: Mon, 3 Jul 2017 12:46:13 +0300 Subject: [PATCH 3/8] License file fixes --- .../server/actors/rule/RuleProcessingContext.java | 8 ++++---- .../server/dao/alarm/BaseAlarmService.java | 8 ++++---- .../core/filter/NashornJsEvaluator.java | 8 ++++---- .../extensions/core/processor/AlarmProcessor.java | 15 +++++++++++++++ 4 files changed, 27 insertions(+), 12 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/actors/rule/RuleProcessingContext.java b/application/src/main/java/org/thingsboard/server/actors/rule/RuleProcessingContext.java index 630177292c..4c31fd04d4 100644 --- a/application/src/main/java/org/thingsboard/server/actors/rule/RuleProcessingContext.java +++ b/application/src/main/java/org/thingsboard/server/actors/rule/RuleProcessingContext.java @@ -1,12 +1,12 @@ /** * Copyright © 2016-2017 The Thingsboard Authors - *

+ * * 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 - *

+ * + * 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. diff --git a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java index 4819945a87..2af43a83ac 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java @@ -1,12 +1,12 @@ /** * Copyright © 2016-2017 The Thingsboard Authors - *

+ * * 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 - *

+ * + * 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. diff --git a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/NashornJsEvaluator.java b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/NashornJsEvaluator.java index cdf9422bf6..84b76cad5d 100644 --- a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/NashornJsEvaluator.java +++ b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/NashornJsEvaluator.java @@ -1,12 +1,12 @@ /** * Copyright © 2016-2017 The Thingsboard Authors - *

+ * * 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 - *

+ * + * 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. diff --git a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmProcessor.java b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmProcessor.java index eb3d67ba06..3dec45e482 100644 --- a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmProcessor.java +++ b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmProcessor.java @@ -1,3 +1,18 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * 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 org.thingsboard.server.extensions.core.processor; import java.util.Optional; From 1cc21c2eca3978086aaaea718e281efcad95d140 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Mon, 3 Jul 2017 13:41:17 +0300 Subject: [PATCH 4/8] TB-65: Fix spring boot configuration. --- .../thingsboard/server/ThingsboardInstallApplication.java | 6 ++---- .../server/service/install/SqlDatabaseSchemaService.java | 2 ++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/ThingsboardInstallApplication.java b/application/src/main/java/org/thingsboard/server/ThingsboardInstallApplication.java index e6f27a4492..3caca2b6e8 100644 --- a/application/src/main/java/org/thingsboard/server/ThingsboardInstallApplication.java +++ b/application/src/main/java/org/thingsboard/server/ThingsboardInstallApplication.java @@ -17,16 +17,14 @@ package org.thingsboard.server; import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.SpringBootConfiguration; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.ComponentScan; import org.thingsboard.server.install.ThingsboardInstallService; import java.util.Arrays; -@EnableAutoConfiguration -@SpringBootApplication +@SpringBootConfiguration @ComponentScan({"org.thingsboard.server.install", "org.thingsboard.server.service.component", "org.thingsboard.server.service.install", diff --git a/application/src/main/java/org/thingsboard/server/service/install/SqlDatabaseSchemaService.java b/application/src/main/java/org/thingsboard/server/service/install/SqlDatabaseSchemaService.java index f5fad0928c..fc92de81ea 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/SqlDatabaseSchemaService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/SqlDatabaseSchemaService.java @@ -20,10 +20,12 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Service; +import org.thingsboard.server.dao.util.SqlDao; @Service @Profile("install") @Slf4j +@SqlDao public class SqlDatabaseSchemaService implements DatabaseSchemaService { @Value("${install.data_dir}") From b8b078e590dda599b8a1e518fc7eb5da0caa9920 Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Mon, 3 Jul 2017 18:43:26 +0300 Subject: [PATCH 5/8] Fixed controller tests --- .mvn/jvm.config | 1 - .../controller/AbstractControllerTest.java | 1 - .../controller/AdminControllerTest.java | 133 ---- .../controller/AssetControllerTest.java | 658 ------------------ .../controller/BaseAdminControllerTest.java | 13 - .../controller/BaseTenantControllerTest.java | 2 +- .../controller/ControllerSqlTestSuite.java | 11 +- .../server/system/SystemSqlTestSuite.java | 3 +- 8 files changed, 7 insertions(+), 815 deletions(-) delete mode 100644 .mvn/jvm.config delete mode 100644 application/src/test/java/org/thingsboard/server/controller/AdminControllerTest.java delete mode 100644 application/src/test/java/org/thingsboard/server/controller/AssetControllerTest.java diff --git a/.mvn/jvm.config b/.mvn/jvm.config deleted file mode 100644 index 16e2988be2..0000000000 --- a/.mvn/jvm.config +++ /dev/null @@ -1 +0,0 @@ --Xmx6G -Xms1024m \ No newline at end of file diff --git a/application/src/test/java/org/thingsboard/server/controller/AbstractControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/AbstractControllerTest.java index 052b61ac6b..8be6105e35 100644 --- a/application/src/test/java/org/thingsboard/server/controller/AbstractControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/AbstractControllerTest.java @@ -80,7 +80,6 @@ import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppC @ActiveProfiles("test") @RunWith(SpringRunner.class) @ContextConfiguration(classes = AbstractControllerTest.class, loader = SpringBootContextLoader.class) -@TestPropertySource(locations = {"classpath:cassandra-test.properties", "classpath:application-test.properties", "classpath:nosql-test.properties"}) @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) @Configuration @ComponentScan({"org.thingsboard.server"}) diff --git a/application/src/test/java/org/thingsboard/server/controller/AdminControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/AdminControllerTest.java deleted file mode 100644 index 8f6bef66a7..0000000000 --- a/application/src/test/java/org/thingsboard/server/controller/AdminControllerTest.java +++ /dev/null @@ -1,133 +0,0 @@ -/** - * Copyright © 2016-2017 The Thingsboard Authors - * - * 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 org.thingsboard.server.controller; - -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.notNullValue; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import org.thingsboard.server.common.data.AdminSettings; -import org.junit.Test; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; - -public class AdminControllerTest extends AbstractControllerTest { - - @Test - public void testFindAdminSettingsByKey() throws Exception { - loginSysAdmin(); - doGet("/api/admin/settings/general") - .andExpect(status().isOk()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$.id", notNullValue())) - .andExpect(jsonPath("$.key", is("general"))) - .andExpect(jsonPath("$.jsonValue.baseUrl", is("http://localhost:8080"))); - - doGet("/api/admin/settings/mail") - .andExpect(status().isOk()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$.id", notNullValue())) - .andExpect(jsonPath("$.key", is("mail"))) - .andExpect(jsonPath("$.jsonValue.smtpProtocol", is("smtp"))) - .andExpect(jsonPath("$.jsonValue.smtpHost", is("localhost"))) - .andExpect(jsonPath("$.jsonValue.smtpPort", is("25"))); - - doGet("/api/admin/settings/unknown") - .andExpect(status().isNotFound()); - - } - - @Test - public void testSaveAdminSettings() throws Exception { - loginSysAdmin(); - AdminSettings adminSettings = doGet("/api/admin/settings/general", AdminSettings.class); - - JsonNode jsonValue = adminSettings.getJsonValue(); - ((ObjectNode) jsonValue).put("baseUrl", "http://myhost.org"); - adminSettings.setJsonValue(jsonValue); - - doPost("/api/admin/settings", adminSettings).andExpect(status().isOk()); - - doGet("/api/admin/settings/general") - .andExpect(status().isOk()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$.jsonValue.baseUrl", is("http://myhost.org"))); - - ((ObjectNode) jsonValue).put("baseUrl", "http://localhost:8080"); - adminSettings.setJsonValue(jsonValue); - - doPost("/api/admin/settings", adminSettings) - .andExpect(status().isOk()); - } - - @Test - public void testSaveAdminSettingsWithEmptyKey() throws Exception { - loginSysAdmin(); - AdminSettings adminSettings = doGet("/api/admin/settings/mail", AdminSettings.class); - adminSettings.setKey(null); - doPost("/api/admin/settings", adminSettings) - .andExpect(status().isBadRequest()) - .andExpect(statusReason(containsString("Key should be specified"))); - } - - @Test - public void testChangeAdminSettingsKey() throws Exception { - loginSysAdmin(); - AdminSettings adminSettings = doGet("/api/admin/settings/mail", AdminSettings.class); - adminSettings.setKey("newKey"); - doPost("/api/admin/settings", adminSettings) - .andExpect(status().isBadRequest()) - .andExpect(statusReason(containsString("is prohibited"))); - } - - @Test - public void testSaveAdminSettingsWithNewJsonStructure() throws Exception { - loginSysAdmin(); - AdminSettings adminSettings = doGet("/api/admin/settings/mail", AdminSettings.class); - JsonNode json = adminSettings.getJsonValue(); - ((ObjectNode) json).put("newKey", "my new value"); - adminSettings.setJsonValue(json); - doPost("/api/admin/settings", adminSettings) - .andExpect(status().isBadRequest()) - .andExpect(statusReason(containsString("Provided json structure is different"))); - } - - @Test - public void testSaveAdminSettingsWithNonTextValue() throws Exception { - loginSysAdmin(); - AdminSettings adminSettings = doGet("/api/admin/settings/mail", AdminSettings.class); - JsonNode json = adminSettings.getJsonValue(); - ((ObjectNode) json).put("timeout", 10000L); - adminSettings.setJsonValue(json); - doPost("/api/admin/settings", adminSettings) - .andExpect(status().isBadRequest()) - .andExpect(statusReason(containsString("Provided json structure can't contain non-text values"))); - } - - @Test - public void testSendTestMail() throws Exception { - loginSysAdmin(); - AdminSettings adminSettings = doGet("/api/admin/settings/mail", AdminSettings.class); - doPost("/api/admin/settings/testMail", adminSettings) - .andExpect(status().isOk()); - } - -} diff --git a/application/src/test/java/org/thingsboard/server/controller/AssetControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/AssetControllerTest.java deleted file mode 100644 index d15023b91f..0000000000 --- a/application/src/test/java/org/thingsboard/server/controller/AssetControllerTest.java +++ /dev/null @@ -1,658 +0,0 @@ -/** - * Copyright © 2016-2017 The Thingsboard Authors - * - * 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 org.thingsboard.server.controller; - -import static org.hamcrest.Matchers.containsString; -import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import org.apache.commons.lang3.RandomStringUtils; -import org.thingsboard.server.common.data.*; -import org.thingsboard.server.common.data.asset.Asset; -import org.thingsboard.server.common.data.asset.TenantAssetType; -import org.thingsboard.server.common.data.id.CustomerId; -import org.thingsboard.server.common.data.page.TextPageData; -import org.thingsboard.server.common.data.page.TextPageLink; -import org.thingsboard.server.common.data.security.Authority; -import org.thingsboard.server.dao.model.ModelConstants; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.datastax.driver.core.utils.UUIDs; -import com.fasterxml.jackson.core.type.TypeReference; - -public class AssetControllerTest extends AbstractControllerTest { - - private IdComparator idComparator = new IdComparator<>(); - - private Tenant savedTenant; - private User tenantAdmin; - - @Before - public void beforeTest() throws Exception { - loginSysAdmin(); - - Tenant tenant = new Tenant(); - tenant.setTitle("My tenant"); - savedTenant = doPost("/api/tenant", tenant, Tenant.class); - Assert.assertNotNull(savedTenant); - - tenantAdmin = new User(); - tenantAdmin.setAuthority(Authority.TENANT_ADMIN); - tenantAdmin.setTenantId(savedTenant.getId()); - tenantAdmin.setEmail("tenant2@thingsboard.org"); - tenantAdmin.setFirstName("Joe"); - tenantAdmin.setLastName("Downs"); - - tenantAdmin = createUserAndLogin(tenantAdmin, "testPassword1"); - } - - @After - public void afterTest() throws Exception { - loginSysAdmin(); - - doDelete("/api/tenant/"+savedTenant.getId().getId().toString()) - .andExpect(status().isOk()); - } - - @Test - public void testSaveAsset() throws Exception { - Asset asset = new Asset(); - asset.setName("My asset"); - asset.setType("default"); - Asset savedAsset = doPost("/api/asset", asset, Asset.class); - - Assert.assertNotNull(savedAsset); - Assert.assertNotNull(savedAsset.getId()); - Assert.assertTrue(savedAsset.getCreatedTime() > 0); - Assert.assertEquals(savedTenant.getId(), savedAsset.getTenantId()); - Assert.assertNotNull(savedAsset.getCustomerId()); - Assert.assertEquals(NULL_UUID, savedAsset.getCustomerId().getId()); - Assert.assertEquals(asset.getName(), savedAsset.getName()); - - savedAsset.setName("My new asset"); - doPost("/api/asset", savedAsset, Asset.class); - - Asset foundAsset = doGet("/api/asset/" + savedAsset.getId().getId().toString(), Asset.class); - Assert.assertEquals(foundAsset.getName(), savedAsset.getName()); - } - - @Test - public void testFindAssetById() throws Exception { - Asset asset = new Asset(); - asset.setName("My asset"); - asset.setType("default"); - Asset savedAsset = doPost("/api/asset", asset, Asset.class); - Asset foundAsset = doGet("/api/asset/" + savedAsset.getId().getId().toString(), Asset.class); - Assert.assertNotNull(foundAsset); - Assert.assertEquals(savedAsset, foundAsset); - } - - @Test - public void testFindAssetTypesByTenantId() throws Exception { - List assets = new ArrayList<>(); - for (int i=0;i<3;i++) { - Asset asset = new Asset(); - asset.setName("My asset B"+i); - asset.setType("typeB"); - assets.add(doPost("/api/asset", asset, Asset.class)); - } - for (int i=0;i<7;i++) { - Asset asset = new Asset(); - asset.setName("My asset C"+i); - asset.setType("typeC"); - assets.add(doPost("/api/asset", asset, Asset.class)); - } - for (int i=0;i<9;i++) { - Asset asset = new Asset(); - asset.setName("My asset A"+i); - asset.setType("typeA"); - assets.add(doPost("/api/asset", asset, Asset.class)); - } - List assetTypes = doGetTyped("/api/asset/types", - new TypeReference>(){}); - - Assert.assertNotNull(assetTypes); - Assert.assertEquals(3, assetTypes.size()); - Assert.assertEquals("typeA", assetTypes.get(0).getType()); - Assert.assertEquals("typeB", assetTypes.get(1).getType()); - Assert.assertEquals("typeC", assetTypes.get(2).getType()); - } - - @Test - public void testDeleteAsset() throws Exception { - Asset asset = new Asset(); - asset.setName("My asset"); - asset.setType("default"); - Asset savedAsset = doPost("/api/asset", asset, Asset.class); - - doDelete("/api/asset/"+savedAsset.getId().getId().toString()) - .andExpect(status().isOk()); - - doGet("/api/asset/"+savedAsset.getId().getId().toString()) - .andExpect(status().isNotFound()); - } - - @Test - public void testSaveAssetWithEmptyType() throws Exception { - Asset asset = new Asset(); - asset.setName("My asset"); - doPost("/api/asset", asset) - .andExpect(status().isBadRequest()) - .andExpect(statusReason(containsString("Asset type should be specified"))); - } - - @Test - public void testSaveAssetWithEmptyName() throws Exception { - Asset asset = new Asset(); - asset.setType("default"); - doPost("/api/asset", asset) - .andExpect(status().isBadRequest()) - .andExpect(statusReason(containsString("Asset name should be specified"))); - } - - @Test - public void testAssignUnassignAssetToCustomer() throws Exception { - Asset asset = new Asset(); - asset.setName("My asset"); - asset.setType("default"); - Asset savedAsset = doPost("/api/asset", asset, Asset.class); - - Customer customer = new Customer(); - customer.setTitle("My customer"); - Customer savedCustomer = doPost("/api/customer", customer, Customer.class); - - Asset assignedAsset = doPost("/api/customer/" + savedCustomer.getId().getId().toString() - + "/asset/" + savedAsset.getId().getId().toString(), Asset.class); - Assert.assertEquals(savedCustomer.getId(), assignedAsset.getCustomerId()); - - Asset foundAsset = doGet("/api/asset/" + savedAsset.getId().getId().toString(), Asset.class); - Assert.assertEquals(savedCustomer.getId(), foundAsset.getCustomerId()); - - Asset unassignedAsset = - doDelete("/api/customer/asset/" + savedAsset.getId().getId().toString(), Asset.class); - Assert.assertEquals(ModelConstants.NULL_UUID, unassignedAsset.getCustomerId().getId()); - - foundAsset = doGet("/api/asset/" + savedAsset.getId().getId().toString(), Asset.class); - Assert.assertEquals(ModelConstants.NULL_UUID, foundAsset.getCustomerId().getId()); - } - - @Test - public void testAssignAssetToNonExistentCustomer() throws Exception { - Asset asset = new Asset(); - asset.setName("My asset"); - asset.setType("default"); - Asset savedAsset = doPost("/api/asset", asset, Asset.class); - - doPost("/api/customer/" + UUIDs.timeBased().toString() - + "/asset/" + savedAsset.getId().getId().toString()) - .andExpect(status().isNotFound()); - } - - @Test - public void testAssignAssetToCustomerFromDifferentTenant() throws Exception { - loginSysAdmin(); - - Tenant tenant2 = new Tenant(); - tenant2.setTitle("Different tenant"); - Tenant savedTenant2 = doPost("/api/tenant", tenant2, Tenant.class); - Assert.assertNotNull(savedTenant2); - - User tenantAdmin2 = new User(); - tenantAdmin2.setAuthority(Authority.TENANT_ADMIN); - tenantAdmin2.setTenantId(savedTenant2.getId()); - tenantAdmin2.setEmail("tenant3@thingsboard.org"); - tenantAdmin2.setFirstName("Joe"); - tenantAdmin2.setLastName("Downs"); - - tenantAdmin2 = createUserAndLogin(tenantAdmin2, "testPassword1"); - - Customer customer = new Customer(); - customer.setTitle("Different customer"); - Customer savedCustomer = doPost("/api/customer", customer, Customer.class); - - login(tenantAdmin.getEmail(), "testPassword1"); - - Asset asset = new Asset(); - asset.setName("My asset"); - asset.setType("default"); - Asset savedAsset = doPost("/api/asset", asset, Asset.class); - - doPost("/api/customer/" + savedCustomer.getId().getId().toString() - + "/asset/" + savedAsset.getId().getId().toString()) - .andExpect(status().isForbidden()); - - loginSysAdmin(); - - doDelete("/api/tenant/"+savedTenant2.getId().getId().toString()) - .andExpect(status().isOk()); - } - - @Test - public void testFindTenantAssets() throws Exception { - List assets = new ArrayList<>(); - for (int i=0;i<178;i++) { - Asset asset = new Asset(); - asset.setName("Asset"+i); - asset.setType("default"); - assets.add(doPost("/api/asset", asset, Asset.class)); - } - List loadedAssets = new ArrayList<>(); - TextPageLink pageLink = new TextPageLink(23); - TextPageData pageData = null; - do { - pageData = doGetTypedWithPageLink("/api/tenant/assets?", - new TypeReference>(){}, pageLink); - loadedAssets.addAll(pageData.getData()); - if (pageData.hasNext()) { - pageLink = pageData.getNextPageLink(); - } - } while (pageData.hasNext()); - - Collections.sort(assets, idComparator); - Collections.sort(loadedAssets, idComparator); - - Assert.assertEquals(assets, loadedAssets); - } - - @Test - public void testFindTenantAssetsByName() throws Exception { - String title1 = "Asset title 1"; - List assetsTitle1 = new ArrayList<>(); - for (int i=0;i<143;i++) { - Asset asset = new Asset(); - String suffix = RandomStringUtils.randomAlphanumeric(15); - String name = title1+suffix; - name = i % 2 == 0 ? name.toLowerCase() : name.toUpperCase(); - asset.setName(name); - asset.setType("default"); - assetsTitle1.add(doPost("/api/asset", asset, Asset.class)); - } - String title2 = "Asset title 2"; - List assetsTitle2 = new ArrayList<>(); - for (int i=0;i<75;i++) { - Asset asset = new Asset(); - String suffix = RandomStringUtils.randomAlphanumeric(15); - String name = title2+suffix; - name = i % 2 == 0 ? name.toLowerCase() : name.toUpperCase(); - asset.setName(name); - asset.setType("default"); - assetsTitle2.add(doPost("/api/asset", asset, Asset.class)); - } - - List loadedAssetsTitle1 = new ArrayList<>(); - TextPageLink pageLink = new TextPageLink(15, title1); - TextPageData pageData = null; - do { - pageData = doGetTypedWithPageLink("/api/tenant/assets?", - new TypeReference>(){}, pageLink); - loadedAssetsTitle1.addAll(pageData.getData()); - if (pageData.hasNext()) { - pageLink = pageData.getNextPageLink(); - } - } while (pageData.hasNext()); - - Collections.sort(assetsTitle1, idComparator); - Collections.sort(loadedAssetsTitle1, idComparator); - - Assert.assertEquals(assetsTitle1, loadedAssetsTitle1); - - List loadedAssetsTitle2 = new ArrayList<>(); - pageLink = new TextPageLink(4, title2); - do { - pageData = doGetTypedWithPageLink("/api/tenant/assets?", - new TypeReference>(){}, pageLink); - loadedAssetsTitle2.addAll(pageData.getData()); - if (pageData.hasNext()) { - pageLink = pageData.getNextPageLink(); - } - } while (pageData.hasNext()); - - Collections.sort(assetsTitle2, idComparator); - Collections.sort(loadedAssetsTitle2, idComparator); - - Assert.assertEquals(assetsTitle2, loadedAssetsTitle2); - - for (Asset asset : loadedAssetsTitle1) { - doDelete("/api/asset/"+asset.getId().getId().toString()) - .andExpect(status().isOk()); - } - - pageLink = new TextPageLink(4, title1); - pageData = doGetTypedWithPageLink("/api/tenant/assets?", - new TypeReference>(){}, pageLink); - Assert.assertFalse(pageData.hasNext()); - Assert.assertEquals(0, pageData.getData().size()); - - for (Asset asset : loadedAssetsTitle2) { - doDelete("/api/asset/"+asset.getId().getId().toString()) - .andExpect(status().isOk()); - } - - pageLink = new TextPageLink(4, title2); - pageData = doGetTypedWithPageLink("/api/tenant/assets?", - new TypeReference>(){}, pageLink); - Assert.assertFalse(pageData.hasNext()); - Assert.assertEquals(0, pageData.getData().size()); - } - - @Test - public void testFindTenantAssetsByType() throws Exception { - String title1 = "Asset title 1"; - String type1 = "typeA"; - List assetsType1 = new ArrayList<>(); - for (int i=0;i<143;i++) { - Asset asset = new Asset(); - String suffix = RandomStringUtils.randomAlphanumeric(15); - String name = title1+suffix; - name = i % 2 == 0 ? name.toLowerCase() : name.toUpperCase(); - asset.setName(name); - asset.setType(type1); - assetsType1.add(doPost("/api/asset", asset, Asset.class)); - } - String title2 = "Asset title 2"; - String type2 = "typeB"; - List assetsType2 = new ArrayList<>(); - for (int i=0;i<75;i++) { - Asset asset = new Asset(); - String suffix = RandomStringUtils.randomAlphanumeric(15); - String name = title2+suffix; - name = i % 2 == 0 ? name.toLowerCase() : name.toUpperCase(); - asset.setName(name); - asset.setType(type2); - assetsType2.add(doPost("/api/asset", asset, Asset.class)); - } - - List loadedAssetsType1 = new ArrayList<>(); - TextPageLink pageLink = new TextPageLink(15); - TextPageData pageData = null; - do { - pageData = doGetTypedWithPageLink("/api/tenant/assets?type={type}&", - new TypeReference>(){}, pageLink, type1); - loadedAssetsType1.addAll(pageData.getData()); - if (pageData.hasNext()) { - pageLink = pageData.getNextPageLink(); - } - } while (pageData.hasNext()); - - Collections.sort(assetsType1, idComparator); - Collections.sort(loadedAssetsType1, idComparator); - - Assert.assertEquals(assetsType1, loadedAssetsType1); - - List loadedAssetsType2 = new ArrayList<>(); - pageLink = new TextPageLink(4); - do { - pageData = doGetTypedWithPageLink("/api/tenant/assets?type={type}&", - new TypeReference>(){}, pageLink, type2); - loadedAssetsType2.addAll(pageData.getData()); - if (pageData.hasNext()) { - pageLink = pageData.getNextPageLink(); - } - } while (pageData.hasNext()); - - Collections.sort(assetsType2, idComparator); - Collections.sort(loadedAssetsType2, idComparator); - - Assert.assertEquals(assetsType2, loadedAssetsType2); - - for (Asset asset : loadedAssetsType1) { - doDelete("/api/asset/"+asset.getId().getId().toString()) - .andExpect(status().isOk()); - } - - pageLink = new TextPageLink(4); - pageData = doGetTypedWithPageLink("/api/tenant/assets?type={type}&", - new TypeReference>(){}, pageLink, type1); - Assert.assertFalse(pageData.hasNext()); - Assert.assertEquals(0, pageData.getData().size()); - - for (Asset asset : loadedAssetsType2) { - doDelete("/api/asset/"+asset.getId().getId().toString()) - .andExpect(status().isOk()); - } - - pageLink = new TextPageLink(4); - pageData = doGetTypedWithPageLink("/api/tenant/assets?type={type}&", - new TypeReference>(){}, pageLink, type2); - Assert.assertFalse(pageData.hasNext()); - Assert.assertEquals(0, pageData.getData().size()); - } - - @Test - public void testFindCustomerAssets() throws Exception { - Customer customer = new Customer(); - customer.setTitle("Test customer"); - customer = doPost("/api/customer", customer, Customer.class); - CustomerId customerId = customer.getId(); - - List assets = new ArrayList<>(); - for (int i=0;i<128;i++) { - Asset asset = new Asset(); - asset.setName("Asset"+i); - asset.setType("default"); - asset = doPost("/api/asset", asset, Asset.class); - assets.add(doPost("/api/customer/" + customerId.getId().toString() - + "/asset/" + asset.getId().getId().toString(), Asset.class)); - } - - List loadedAssets = new ArrayList<>(); - TextPageLink pageLink = new TextPageLink(23); - TextPageData pageData = null; - do { - pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/assets?", - new TypeReference>(){}, pageLink); - loadedAssets.addAll(pageData.getData()); - if (pageData.hasNext()) { - pageLink = pageData.getNextPageLink(); - } - } while (pageData.hasNext()); - - Collections.sort(assets, idComparator); - Collections.sort(loadedAssets, idComparator); - - Assert.assertEquals(assets, loadedAssets); - } - - @Test - public void testFindCustomerAssetsByName() throws Exception { - Customer customer = new Customer(); - customer.setTitle("Test customer"); - customer = doPost("/api/customer", customer, Customer.class); - CustomerId customerId = customer.getId(); - - String title1 = "Asset title 1"; - List assetsTitle1 = new ArrayList<>(); - for (int i=0;i<125;i++) { - Asset asset = new Asset(); - String suffix = RandomStringUtils.randomAlphanumeric(15); - String name = title1+suffix; - name = i % 2 == 0 ? name.toLowerCase() : name.toUpperCase(); - asset.setName(name); - asset.setType("default"); - asset = doPost("/api/asset", asset, Asset.class); - assetsTitle1.add(doPost("/api/customer/" + customerId.getId().toString() - + "/asset/" + asset.getId().getId().toString(), Asset.class)); - } - String title2 = "Asset title 2"; - List assetsTitle2 = new ArrayList<>(); - for (int i=0;i<143;i++) { - Asset asset = new Asset(); - String suffix = RandomStringUtils.randomAlphanumeric(15); - String name = title2+suffix; - name = i % 2 == 0 ? name.toLowerCase() : name.toUpperCase(); - asset.setName(name); - asset.setType("default"); - asset = doPost("/api/asset", asset, Asset.class); - assetsTitle2.add(doPost("/api/customer/" + customerId.getId().toString() - + "/asset/" + asset.getId().getId().toString(), Asset.class)); - } - - List loadedAssetsTitle1 = new ArrayList<>(); - TextPageLink pageLink = new TextPageLink(15, title1); - TextPageData pageData = null; - do { - pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/assets?", - new TypeReference>(){}, pageLink); - loadedAssetsTitle1.addAll(pageData.getData()); - if (pageData.hasNext()) { - pageLink = pageData.getNextPageLink(); - } - } while (pageData.hasNext()); - - Collections.sort(assetsTitle1, idComparator); - Collections.sort(loadedAssetsTitle1, idComparator); - - Assert.assertEquals(assetsTitle1, loadedAssetsTitle1); - - List loadedAssetsTitle2 = new ArrayList<>(); - pageLink = new TextPageLink(4, title2); - do { - pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/assets?", - new TypeReference>(){}, pageLink); - loadedAssetsTitle2.addAll(pageData.getData()); - if (pageData.hasNext()) { - pageLink = pageData.getNextPageLink(); - } - } while (pageData.hasNext()); - - Collections.sort(assetsTitle2, idComparator); - Collections.sort(loadedAssetsTitle2, idComparator); - - Assert.assertEquals(assetsTitle2, loadedAssetsTitle2); - - for (Asset asset : loadedAssetsTitle1) { - doDelete("/api/customer/asset/" + asset.getId().getId().toString()) - .andExpect(status().isOk()); - } - - pageLink = new TextPageLink(4, title1); - pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/assets?", - new TypeReference>(){}, pageLink); - Assert.assertFalse(pageData.hasNext()); - Assert.assertEquals(0, pageData.getData().size()); - - for (Asset asset : loadedAssetsTitle2) { - doDelete("/api/customer/asset/" + asset.getId().getId().toString()) - .andExpect(status().isOk()); - } - - pageLink = new TextPageLink(4, title2); - pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/assets?", - new TypeReference>(){}, pageLink); - Assert.assertFalse(pageData.hasNext()); - Assert.assertEquals(0, pageData.getData().size()); - } - - @Test - public void testFindCustomerAssetsByType() throws Exception { - Customer customer = new Customer(); - customer.setTitle("Test customer"); - customer = doPost("/api/customer", customer, Customer.class); - CustomerId customerId = customer.getId(); - - String title1 = "Asset title 1"; - String type1 = "typeC"; - List assetsType1 = new ArrayList<>(); - for (int i=0;i<125;i++) { - Asset asset = new Asset(); - String suffix = RandomStringUtils.randomAlphanumeric(15); - String name = title1+suffix; - name = i % 2 == 0 ? name.toLowerCase() : name.toUpperCase(); - asset.setName(name); - asset.setType(type1); - asset = doPost("/api/asset", asset, Asset.class); - assetsType1.add(doPost("/api/customer/" + customerId.getId().toString() - + "/asset/" + asset.getId().getId().toString(), Asset.class)); - } - String title2 = "Asset title 2"; - String type2 = "typeD"; - List assetsType2 = new ArrayList<>(); - for (int i=0;i<143;i++) { - Asset asset = new Asset(); - String suffix = RandomStringUtils.randomAlphanumeric(15); - String name = title2+suffix; - name = i % 2 == 0 ? name.toLowerCase() : name.toUpperCase(); - asset.setName(name); - asset.setType(type2); - asset = doPost("/api/asset", asset, Asset.class); - assetsType2.add(doPost("/api/customer/" + customerId.getId().toString() - + "/asset/" + asset.getId().getId().toString(), Asset.class)); - } - - List loadedAssetsType1 = new ArrayList<>(); - TextPageLink pageLink = new TextPageLink(15); - TextPageData pageData = null; - do { - pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/assets?type={type}&", - new TypeReference>(){}, pageLink, type1); - loadedAssetsType1.addAll(pageData.getData()); - if (pageData.hasNext()) { - pageLink = pageData.getNextPageLink(); - } - } while (pageData.hasNext()); - - Collections.sort(assetsType1, idComparator); - Collections.sort(loadedAssetsType1, idComparator); - - Assert.assertEquals(assetsType1, loadedAssetsType1); - - List loadedAssetsType2 = new ArrayList<>(); - pageLink = new TextPageLink(4); - do { - pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/assets?type={type}&", - new TypeReference>(){}, pageLink, type2); - loadedAssetsType2.addAll(pageData.getData()); - if (pageData.hasNext()) { - pageLink = pageData.getNextPageLink(); - } - } while (pageData.hasNext()); - - Collections.sort(assetsType2, idComparator); - Collections.sort(loadedAssetsType2, idComparator); - - Assert.assertEquals(assetsType2, loadedAssetsType2); - - for (Asset asset : loadedAssetsType1) { - doDelete("/api/customer/asset/" + asset.getId().getId().toString()) - .andExpect(status().isOk()); - } - - pageLink = new TextPageLink(4); - pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/assets?type={type}&", - new TypeReference>(){}, pageLink, type1); - Assert.assertFalse(pageData.hasNext()); - Assert.assertEquals(0, pageData.getData().size()); - - for (Asset asset : loadedAssetsType2) { - doDelete("/api/customer/asset/" + asset.getId().getId().toString()) - .andExpect(status().isOk()); - } - - pageLink = new TextPageLink(4); - pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/assets?type={type}&", - new TypeReference>(){}, pageLink, type2); - Assert.assertFalse(pageData.hasNext()); - Assert.assertEquals(0, pageData.getData().size()); - } - -} diff --git a/application/src/test/java/org/thingsboard/server/controller/BaseAdminControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseAdminControllerTest.java index cda5f3ad9f..5047c36189 100644 --- a/application/src/test/java/org/thingsboard/server/controller/BaseAdminControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseAdminControllerTest.java @@ -78,19 +78,6 @@ public abstract class BaseAdminControllerTest extends AbstractControllerTest { .andExpect(status().isOk()); } - @Test - public void testCreateAdminSettings() throws Exception { - loginSysAdmin(); - - AdminSettings adminSettings = new AdminSettings(); - adminSettings.setKey("someKey"); - adminSettings.setJsonValue(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); - - doPost("/api/admin/settings", adminSettings) - .andExpect(status().isBadRequest()) - .andExpect(statusReason(containsString("is prohibited"))); - } - @Test public void testSaveAdminSettingsWithEmptyKey() throws Exception { loginSysAdmin(); diff --git a/application/src/test/java/org/thingsboard/server/controller/BaseTenantControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseTenantControllerTest.java index 35ed1de643..770e02f9b1 100644 --- a/application/src/test/java/org/thingsboard/server/controller/BaseTenantControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseTenantControllerTest.java @@ -31,7 +31,7 @@ import org.junit.Test; import com.fasterxml.jackson.core.type.TypeReference; -public class BaseTenantControllerTest extends AbstractControllerTest { +public abstract class BaseTenantControllerTest extends AbstractControllerTest { private IdComparator idComparator = new IdComparator<>(); diff --git a/application/src/test/java/org/thingsboard/server/controller/ControllerSqlTestSuite.java b/application/src/test/java/org/thingsboard/server/controller/ControllerSqlTestSuite.java index b49a0df04a..b9692272aa 100644 --- a/application/src/test/java/org/thingsboard/server/controller/ControllerSqlTestSuite.java +++ b/application/src/test/java/org/thingsboard/server/controller/ControllerSqlTestSuite.java @@ -15,12 +15,10 @@ */ package org.thingsboard.server.controller; -import org.cassandraunit.dataset.cql.ClassPathCQLDataSet; import org.junit.ClassRule; import org.junit.extensions.cpsuite.ClasspathSuite; import org.junit.runner.RunWith; -import org.thingsboard.server.dao.CustomCassandraCQLUnit; -import org.thingsboard.server.dao.CustomPostgresUnit; +import org.thingsboard.server.dao.CustomSqlUnit; import java.util.Arrays; @@ -31,7 +29,8 @@ import java.util.Arrays; public class ControllerSqlTestSuite { @ClassRule - public static CustomPostgresUnit postgresUnit = new CustomPostgresUnit( - Arrays.asList("postgres/schema.sql", "postgres/system-data.sql"), - "postgres-embedded-test.properties"); + public static CustomSqlUnit sqlUnit = new CustomSqlUnit( + Arrays.asList("sql/schema.sql", "sql/system-data.sql"), + "sql/drop-all-tables.sql", + "sql-test.properties"); } diff --git a/application/src/test/java/org/thingsboard/server/system/SystemSqlTestSuite.java b/application/src/test/java/org/thingsboard/server/system/SystemSqlTestSuite.java index 1f62027046..21667a77ec 100644 --- a/application/src/test/java/org/thingsboard/server/system/SystemSqlTestSuite.java +++ b/application/src/test/java/org/thingsboard/server/system/SystemSqlTestSuite.java @@ -33,8 +33,7 @@ public class SystemSqlTestSuite { public static CustomSqlUnit sqlUnit = new CustomSqlUnit( Arrays.asList("sql/schema.sql", "sql/system-data.sql"), "sql/drop-all-tables.sql", - "sql-test.properties" - ); + "sql-test.properties"); } From b7a9f82a0c89e9bdbd98074639fc14d31c66a14e Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Mon, 3 Jul 2017 19:34:55 +0300 Subject: [PATCH 6/8] Increased memory for maven builds --- .mvn/jvm.config | 1 + 1 file changed, 1 insertion(+) create mode 100644 .mvn/jvm.config diff --git a/.mvn/jvm.config b/.mvn/jvm.config new file mode 100644 index 0000000000..3801c956c7 --- /dev/null +++ b/.mvn/jvm.config @@ -0,0 +1 @@ +Xmx8G -Xms1024m From 086cd13cd9fdc3c5fac516db9b6dbe962ce6442a Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Mon, 3 Jul 2017 19:35:21 +0300 Subject: [PATCH 7/8] Increased memory for maven builds --- .mvn/jvm.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.mvn/jvm.config b/.mvn/jvm.config index 3801c956c7..6d111992cb 100644 --- a/.mvn/jvm.config +++ b/.mvn/jvm.config @@ -1 +1 @@ -Xmx8G -Xms1024m +-Xmx8G -Xms1024m From 51620220d326d71368ebe8586d0df6c77dc934fc Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Tue, 4 Jul 2017 09:46:10 +0300 Subject: [PATCH 8/8] Fixed hsqldb tests --- .mvn/jvm.config | 1 - .../test/java/org/thingsboard/server/dao/CustomSqlUnit.java | 6 ++++++ dao/src/test/resources/sql-test.properties | 4 ++-- 3 files changed, 8 insertions(+), 3 deletions(-) delete mode 100644 .mvn/jvm.config diff --git a/.mvn/jvm.config b/.mvn/jvm.config deleted file mode 100644 index 6d111992cb..0000000000 --- a/.mvn/jvm.config +++ /dev/null @@ -1 +0,0 @@ --Xmx8G -Xms1024m diff --git a/dao/src/test/java/org/thingsboard/server/dao/CustomSqlUnit.java b/dao/src/test/java/org/thingsboard/server/dao/CustomSqlUnit.java index 491e642bdd..9649ad8f8d 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/CustomSqlUnit.java +++ b/dao/src/test/java/org/thingsboard/server/dao/CustomSqlUnit.java @@ -58,6 +58,8 @@ public class CustomSqlUnit extends ExternalResource { @Override public void before() { + cleanUpDb(); + Connection conn = null; try { conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword); @@ -81,6 +83,10 @@ public class CustomSqlUnit extends ExternalResource { @Override public void after() { + cleanUpDb(); + } + + private void cleanUpDb() { Connection conn = null; try { conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword); diff --git a/dao/src/test/resources/sql-test.properties b/dao/src/test/resources/sql-test.properties index be6d35329d..0bcc789c91 100644 --- a/dao/src/test/resources/sql-test.properties +++ b/dao/src/test/resources/sql-test.properties @@ -1,4 +1,4 @@ -database.type=sql + database.type=sql spring.jpa.show-sql=false spring.jpa.hibernate.ddl-auto=validate @@ -6,5 +6,5 @@ spring.jpa.database-platform=org.hibernate.dialect.HSQLDialect spring.datasource.username=sa spring.datasource.password= -spring.datasource.url=jdbc:hsqldb:mem:testDb;sql.enforce_size=false +spring.datasource.url=jdbc:hsqldb:file:/tmp/testDb;sql.enforce_size=false spring.datasource.driverClassName=org.hsqldb.jdbc.JDBCDriver \ No newline at end of file