Browse Source

Merge branch 'develop/3.5' into feature/notification-system

pull/7911/head
ViacheslavKlimov 4 years ago
parent
commit
1e7c1a8a5a
  1. 5
      application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java
  2. 3
      application/src/test/java/org/thingsboard/server/edge/BaseDeviceEdgeTest.java
  3. 13
      application/src/test/java/org/thingsboard/server/service/resource/sql/BaseTbResourceServiceTest.java
  4. 6
      application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv3/attributes/AbstractMqttAttributesIntegrationTest.java
  5. 1
      application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv3/rpc/AbstractMqttServerSideRpcIntegrationTest.java
  6. 2
      application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv5/attributes/AbstractAttributesMqttV5Test.java
  7. 2
      application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv5/client/connection/AbstractMqttV5ClientConnectionTest.java
  8. 3
      application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv5/client/subscribe/AbstractMqttV5ClientSubscriptionTest.java
  9. 2
      application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv5/client/unsubscribe/AbstractMqttV5ClientUnsubscribeTest.java
  10. 3
      application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv5/rpc/AbstractMqttV5RpcTest.java
  11. 7
      application/src/test/java/org/thingsboard/server/transport/mqtt/sparkplug/attributes/AbstractMqttV5ClientSparkplugAttributesTest.java
  12. 4
      application/src/test/java/org/thingsboard/server/transport/mqtt/sparkplug/rpc/AbstractMqttV5RpcSparkplugTest.java
  13. 5
      common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/MqttTransportHandler.java
  14. 21
      dao/src/main/java/org/thingsboard/server/dao/entity/DefaultEntityServiceRegistry.java
  15. 122
      dao/src/test/java/org/thingsboard/server/dao/service/AbstractServiceTest.java
  16. 5
      dao/src/test/java/org/thingsboard/server/dao/service/BaseAdminSettingsServiceTest.java
  17. 22
      dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmCommentServiceTest.java
  18. 44
      dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmServiceTest.java
  19. 23
      dao/src/test/java/org/thingsboard/server/dao/service/BaseApiUsageStateServiceTest.java
  20. 26
      dao/src/test/java/org/thingsboard/server/dao/service/BaseAssetProfileServiceTest.java
  21. 42
      dao/src/test/java/org/thingsboard/server/dao/service/BaseAssetServiceTest.java
  22. 25
      dao/src/test/java/org/thingsboard/server/dao/service/BaseCustomerServiceTest.java
  23. 53
      dao/src/test/java/org/thingsboard/server/dao/service/BaseDashboardServiceTest.java
  24. 26
      dao/src/test/java/org/thingsboard/server/dao/service/BaseDeviceCredentialsServiceTest.java
  25. 32
      dao/src/test/java/org/thingsboard/server/dao/service/BaseDeviceProfileServiceTest.java
  26. 52
      dao/src/test/java/org/thingsboard/server/dao/service/BaseDeviceServiceTest.java
  27. 9
      dao/src/test/java/org/thingsboard/server/dao/service/BaseEdgeEventServiceTest.java
  28. 45
      dao/src/test/java/org/thingsboard/server/dao/service/BaseEdgeServiceTest.java
  29. 2
      dao/src/test/java/org/thingsboard/server/dao/service/BaseEntityServiceRegistryTest.java
  30. 43
      dao/src/test/java/org/thingsboard/server/dao/service/BaseEntityServiceTest.java
  31. 157
      dao/src/test/java/org/thingsboard/server/dao/service/BaseOtaPackageServiceTest.java
  32. 10
      dao/src/test/java/org/thingsboard/server/dao/service/BaseQueueServiceTest.java
  33. 5
      dao/src/test/java/org/thingsboard/server/dao/service/BaseRelationServiceTest.java
  34. 34
      dao/src/test/java/org/thingsboard/server/dao/service/BaseRuleChainServiceTest.java
  35. 14
      dao/src/test/java/org/thingsboard/server/dao/service/BaseTenantProfileServiceTest.java
  36. 78
      dao/src/test/java/org/thingsboard/server/dao/service/BaseTenantServiceTest.java
  37. 57
      dao/src/test/java/org/thingsboard/server/dao/service/BaseUserServiceTest.java
  38. 27
      dao/src/test/java/org/thingsboard/server/dao/service/BaseWidgetTypeServiceTest.java
  39. 44
      dao/src/test/java/org/thingsboard/server/dao/service/BaseWidgetsBundleServiceTest.java
  40. 6
      dao/src/test/java/org/thingsboard/server/dao/service/event/BaseEventServiceTest.java
  41. 10
      dao/src/test/java/org/thingsboard/server/dao/service/timeseries/BaseTimeseriesServiceTest.java
  42. 27
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/base/AbstractBasePage.java
  43. 16
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/base/AbstractDriverBaseTest.java
  44. 20
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/CustomerPageElements.java
  45. 12
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/CustomerPageHelper.java
  46. 6
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/DashboardPageHelper.java
  47. 7
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/OpenRuleChainPageElements.java
  48. 5
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/OpenRuleChainPageHelper.java
  49. 17
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/OtherPageElements.java
  50. 52
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/OtherPageElementsHelper.java
  51. 4
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/RuleChainsPageElements.java
  52. 2
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assetProfileSmoke/CreateAssetProfileTest.java
  53. 32
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/CustomerEditMenuTest.java
  54. 4
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/DeleteCustomerTest.java
  55. 10
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/DeleteSeveralCustomerTest.java
  56. 2
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/ManageCustomersAssetsTest.java
  57. 2
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/ManageCustomersDashboardsTest.java
  58. 2
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/ManageCustomersDevicesTest.java
  59. 2
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/ManageCustomersEdgesTest.java
  60. 4
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/ManageCustomersUsersTest.java
  61. 2
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/deviceProfileSmoke/CreateDeviceProfileTest.java
  62. 11
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/CreateRuleChainImportTest.java
  63. 4
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/DeleteRuleChainTest.java
  64. 10
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/DeleteSeveralRuleChainsTest.java
  65. 2
      msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/MakeRuleChainRootTest.java
  66. 22
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbLogNode.java
  67. 62
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbLogNodeTest.java

5
application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java

@ -884,7 +884,10 @@ public abstract class AbstractWebTest extends AbstractInMemoryStorageTest {
protected void awaitForDeviceActorToReceiveSubscription(DeviceId deviceId, FeatureType featureType, int subscriptionCount) { protected void awaitForDeviceActorToReceiveSubscription(DeviceId deviceId, FeatureType featureType, int subscriptionCount) {
DeviceActorMessageProcessor processor = getDeviceActorProcessor(deviceId); DeviceActorMessageProcessor processor = getDeviceActorProcessor(deviceId);
Map<UUID, SessionInfo> subscriptions = (Map<UUID, SessionInfo>) ReflectionTestUtils.getField(processor, getMapName(featureType)); Map<UUID, SessionInfo> subscriptions = (Map<UUID, SessionInfo>) ReflectionTestUtils.getField(processor, getMapName(featureType));
Awaitility.await("Device actor received subscription command from the transport").atMost(TIMEOUT, TimeUnit.SECONDS).until(() -> subscriptions.size() == subscriptionCount); Awaitility.await("Device actor received subscription command from the transport").atMost(5, TimeUnit.SECONDS).until(() -> {
log.warn("device {}, subscriptions.size() == {}", deviceId, subscriptions.size());
return subscriptions.size() == subscriptionCount;
});
} }
protected static String getMapName(FeatureType featureType) { protected static String getMapName(FeatureType featureType) {

3
application/src/test/java/org/thingsboard/server/edge/BaseDeviceEdgeTest.java

@ -671,6 +671,7 @@ abstract public class BaseDeviceEdgeTest extends AbstractEdgeTest {
client.setCallback(onUpdateCallback); client.setCallback(onUpdateCallback);
client.subscribeAndWait("v1/devices/me/attributes", MqttQoS.AT_MOST_ONCE); client.subscribeAndWait("v1/devices/me/attributes", MqttQoS.AT_MOST_ONCE);
awaitForDeviceActorToReceiveSubscription(device.getId(), FeatureType.ATTRIBUTES, 1);
edgeImitator.expectResponsesAmount(1); edgeImitator.expectResponsesAmount(1);
@ -690,7 +691,7 @@ abstract public class BaseDeviceEdgeTest extends AbstractEdgeTest {
edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build());
Assert.assertTrue(edgeImitator.waitForResponses()); Assert.assertTrue(edgeImitator.waitForResponses());
Assert.assertTrue(onUpdateCallback.getSubscribeLatch().await(5, TimeUnit.SECONDS)); Assert.assertTrue(onUpdateCallback.getSubscribeLatch().await(30, TimeUnit.SECONDS));
Assert.assertEquals(JacksonUtil.OBJECT_MAPPER.createObjectNode().put(attrKey, attrValue), Assert.assertEquals(JacksonUtil.OBJECT_MAPPER.createObjectNode().put(attrKey, attrValue),
JacksonUtil.fromBytes(onUpdateCallback.getPayloadBytes())); JacksonUtil.fromBytes(onUpdateCallback.getPayloadBytes()));

13
application/src/test/java/org/thingsboard/server/service/resource/sql/BaseTbResourceServiceTest.java

@ -19,10 +19,8 @@ import com.datastax.oss.driver.api.core.uuid.Uuids;
import org.junit.After; import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.junit.rules.ExpectedException;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.server.common.data.EntityInfo; import org.thingsboard.server.common.data.EntityInfo;
import org.thingsboard.server.common.data.ResourceType; import org.thingsboard.server.common.data.ResourceType;
@ -46,6 +44,7 @@ import java.util.Base64;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@DaoSqlTest @DaoSqlTest
@ -116,10 +115,6 @@ public class BaseTbResourceServiceTest extends AbstractControllerTest {
.andExpect(status().isOk()); .andExpect(status().isOk());
} }
@SuppressWarnings("deprecation")
@Rule
public ExpectedException thrown = ExpectedException.none();
@Test @Test
public void testSaveResourceWithMaxSumDataSizeOutOfLimit() throws Exception { public void testSaveResourceWithMaxSumDataSizeOutOfLimit() throws Exception {
loginSysAdmin(); loginSysAdmin();
@ -138,9 +133,9 @@ public class BaseTbResourceServiceTest extends AbstractControllerTest {
Assert.assertEquals(1, resourceService.sumDataSizeByTenantId(tenantId)); Assert.assertEquals(1, resourceService.sumDataSizeByTenantId(tenantId));
try { try {
thrown.expect(DataValidationException.class); assertThatThrownBy(() -> createResource("test1", 1 + DEFAULT_FILE_NAME))
thrown.expectMessage(String.format("Failed to create the tb resource, files size limit is exhausted %d bytes!", limit)); .isInstanceOf(DataValidationException.class)
createResource("test1", 1 + DEFAULT_FILE_NAME); .hasMessageContaining("Failed to create the tb resource, files size limit is exhausted %d bytes!", limit);
} finally { } finally {
defaultTenantProfile.getProfileData().setConfiguration(DefaultTenantProfileConfiguration.builder().maxResourcesInBytes(0).build()); defaultTenantProfile.getProfileData().setConfiguration(DefaultTenantProfileConfiguration.builder().maxResourcesInBytes(0).build());
loginSysAdmin(); loginSysAdmin();

6
application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv3/attributes/AbstractMqttAttributesIntegrationTest.java

@ -354,6 +354,8 @@ public abstract class AbstractMqttAttributesIntegrationTest extends AbstractMqtt
SHARED_ATTRIBUTES_PAYLOAD, String.class, status().isOk()); SHARED_ATTRIBUTES_PAYLOAD, String.class, status().isOk());
client.publishAndWait(attrPubTopic, CLIENT_ATTRIBUTES_PAYLOAD.getBytes()); client.publishAndWait(attrPubTopic, CLIENT_ATTRIBUTES_PAYLOAD.getBytes());
client.subscribeAndWait(attrSubTopic, MqttQoS.AT_MOST_ONCE); client.subscribeAndWait(attrSubTopic, MqttQoS.AT_MOST_ONCE);
//RequestAttributes does not make any subscriptions in device actor
String update = getWsClient().waitForUpdate(); String update = getWsClient().waitForUpdate();
assertThat(update).as("ws update received").isNotBlank(); assertThat(update).as("ws update received").isNotBlank();
MqttTestCallback callback = new MqttTestCallback(attrSubTopic.replace("+", "1")); MqttTestCallback callback = new MqttTestCallback(attrSubTopic.replace("+", "1"));
@ -383,6 +385,8 @@ public abstract class AbstractMqttAttributesIntegrationTest extends AbstractMqtt
doPostAsync("/api/plugins/telemetry/DEVICE/" + savedDevice.getId().getId() + "/attributes/SHARED_SCOPE", SHARED_ATTRIBUTES_PAYLOAD, String.class, status().isOk()); doPostAsync("/api/plugins/telemetry/DEVICE/" + savedDevice.getId().getId() + "/attributes/SHARED_SCOPE", SHARED_ATTRIBUTES_PAYLOAD, String.class, status().isOk());
client.publishAndWait(attrPubTopic, getAttributesProtoPayloadBytes()); client.publishAndWait(attrPubTopic, getAttributesProtoPayloadBytes());
client.subscribeAndWait(attrSubTopic, MqttQoS.AT_MOST_ONCE); client.subscribeAndWait(attrSubTopic, MqttQoS.AT_MOST_ONCE);
//RequestAttributes does not make any subscriptions in device actor
String update = getWsClient().waitForUpdate(); String update = getWsClient().waitForUpdate();
assertThat(update).as("ws update received").isNotBlank(); assertThat(update).as("ws update received").isNotBlank();
MqttTestCallback callback = new MqttTestCallback(attrSubTopic.replace("+", "1")); MqttTestCallback callback = new MqttTestCallback(attrSubTopic.replace("+", "1"));
@ -442,6 +446,7 @@ public abstract class AbstractMqttAttributesIntegrationTest extends AbstractMqtt
assertThat(update).as("ws update received").isNotBlank(); assertThat(update).as("ws update received").isNotBlank();
client.subscribeAndWait(GATEWAY_ATTRIBUTES_RESPONSE_TOPIC, MqttQoS.AT_LEAST_ONCE); client.subscribeAndWait(GATEWAY_ATTRIBUTES_RESPONSE_TOPIC, MqttQoS.AT_LEAST_ONCE);
//RequestAttributes does not make any subscriptions in device actor
MqttTestCallback clientAttributesCallback = new MqttTestCallback(GATEWAY_ATTRIBUTES_RESPONSE_TOPIC); MqttTestCallback clientAttributesCallback = new MqttTestCallback(GATEWAY_ATTRIBUTES_RESPONSE_TOPIC);
client.setCallback(clientAttributesCallback); client.setCallback(clientAttributesCallback);
@ -495,6 +500,7 @@ public abstract class AbstractMqttAttributesIntegrationTest extends AbstractMqtt
assertThat(update).as("ws update received").isNotBlank(); assertThat(update).as("ws update received").isNotBlank();
client.subscribeAndWait(GATEWAY_ATTRIBUTES_RESPONSE_TOPIC, MqttQoS.AT_LEAST_ONCE); client.subscribeAndWait(GATEWAY_ATTRIBUTES_RESPONSE_TOPIC, MqttQoS.AT_LEAST_ONCE);
awaitForDeviceActorToReceiveSubscription(device.getId(), FeatureType.ATTRIBUTES, 1);
MqttTestCallback clientAttributesCallback = new MqttTestCallback(GATEWAY_ATTRIBUTES_RESPONSE_TOPIC); MqttTestCallback clientAttributesCallback = new MqttTestCallback(GATEWAY_ATTRIBUTES_RESPONSE_TOPIC);
client.setCallback(clientAttributesCallback); client.setCallback(clientAttributesCallback);

1
application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv3/rpc/AbstractMqttServerSideRpcIntegrationTest.java

@ -223,7 +223,6 @@ public abstract class AbstractMqttServerSideRpcIntegrationTest extends AbstractM
MqttTestCallback callback = new MqttTestCallback(GATEWAY_RPC_TOPIC); MqttTestCallback callback = new MqttTestCallback(GATEWAY_RPC_TOPIC);
client.setCallback(callback); client.setCallback(callback);
client.subscribeAndWait(GATEWAY_RPC_TOPIC, MqttQoS.AT_MOST_ONCE);
subscribeAndCheckSubscription(client, GATEWAY_RPC_TOPIC, savedDevice.getId(), FeatureType.RPC); subscribeAndCheckSubscription(client, GATEWAY_RPC_TOPIC, savedDevice.getId(), FeatureType.RPC);
String setGpioRequest = "{\"method\": \"toggle_gpio\", \"params\": {\"pin\":1}}"; String setGpioRequest = "{\"method\": \"toggle_gpio\", \"params\": {\"pin\":1}}";

2
application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv5/attributes/AbstractAttributesMqttV5Test.java

@ -21,6 +21,7 @@ import org.junit.Before;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.device.profile.MqttTopics; import org.thingsboard.server.common.data.device.profile.MqttTopics;
import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.msg.session.FeatureType;
import org.thingsboard.server.transport.mqtt.MqttTestConfigProperties; import org.thingsboard.server.transport.mqtt.MqttTestConfigProperties;
import org.thingsboard.server.transport.mqtt.mqttv5.AbstractMqttV5Test; import org.thingsboard.server.transport.mqtt.mqttv5.AbstractMqttV5Test;
import org.thingsboard.server.transport.mqtt.mqttv5.MqttV5TestCallback; import org.thingsboard.server.transport.mqtt.mqttv5.MqttV5TestCallback;
@ -104,6 +105,7 @@ public abstract class AbstractAttributesMqttV5Test extends AbstractMqttV5Test {
MqttV5TestCallback onUpdateCallback = new MqttV5TestCallback(); MqttV5TestCallback onUpdateCallback = new MqttV5TestCallback();
client.setCallback(onUpdateCallback); client.setCallback(onUpdateCallback);
client.subscribeAndWait(MqttTopics.DEVICE_ATTRIBUTES_TOPIC, MqttQoS.AT_MOST_ONCE); client.subscribeAndWait(MqttTopics.DEVICE_ATTRIBUTES_TOPIC, MqttQoS.AT_MOST_ONCE);
awaitForDeviceActorToReceiveSubscription(savedDevice.getId(), FeatureType.ATTRIBUTES, 1);
doPostAsync("/api/plugins/telemetry/DEVICE/" + savedDevice.getId().getId() + "/attributes/SHARED_SCOPE", SHARED_ATTRIBUTES_PAYLOAD, String.class, status().isOk()); doPostAsync("/api/plugins/telemetry/DEVICE/" + savedDevice.getId().getId() + "/attributes/SHARED_SCOPE", SHARED_ATTRIBUTES_PAYLOAD, String.class, status().isOk());
onUpdateCallback.getSubscribeLatch().await(3, TimeUnit.SECONDS); onUpdateCallback.getSubscribeLatch().await(3, TimeUnit.SECONDS);

2
application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv5/client/connection/AbstractMqttV5ClientConnectionTest.java

@ -25,6 +25,7 @@ import org.eclipse.paho.mqttv5.common.packet.MqttReturnCode;
import org.eclipse.paho.mqttv5.common.packet.MqttWireMessage; import org.eclipse.paho.mqttv5.common.packet.MqttWireMessage;
import org.junit.Assert; import org.junit.Assert;
import org.thingsboard.server.common.data.device.profile.MqttTopics; import org.thingsboard.server.common.data.device.profile.MqttTopics;
import org.thingsboard.server.common.msg.session.FeatureType;
import org.thingsboard.server.transport.mqtt.AbstractMqttIntegrationTest; import org.thingsboard.server.transport.mqtt.AbstractMqttIntegrationTest;
import org.thingsboard.server.transport.mqtt.mqttv5.MqttV5TestCallback; import org.thingsboard.server.transport.mqtt.mqttv5.MqttV5TestCallback;
import org.thingsboard.server.transport.mqtt.mqttv5.MqttV5TestClient; import org.thingsboard.server.transport.mqtt.mqttv5.MqttV5TestClient;
@ -101,6 +102,7 @@ public abstract class AbstractMqttV5ClientConnectionTest extends AbstractMqttInt
MqttV5TestCallback onUpdateCallback = new MqttV5TestCallback(); MqttV5TestCallback onUpdateCallback = new MqttV5TestCallback();
client.setCallback(onUpdateCallback); client.setCallback(onUpdateCallback);
client.subscribeAndWait(MqttTopics.DEVICE_ATTRIBUTES_TOPIC, MqttQoS.AT_MOST_ONCE); client.subscribeAndWait(MqttTopics.DEVICE_ATTRIBUTES_TOPIC, MqttQoS.AT_MOST_ONCE);
awaitForDeviceActorToReceiveSubscription(savedDevice.getId(), FeatureType.ATTRIBUTES, 1);
String payload = "{\"sharedStr\":\"" + StringUtils.repeat("*", valueLen) + "\"}"; String payload = "{\"sharedStr\":\"" + StringUtils.repeat("*", valueLen) + "\"}";

3
application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv5/client/subscribe/AbstractMqttV5ClientSubscriptionTest.java

@ -22,6 +22,7 @@ import org.eclipse.paho.mqttv5.common.packet.MqttSubAck;
import org.eclipse.paho.mqttv5.common.packet.MqttWireMessage; import org.eclipse.paho.mqttv5.common.packet.MqttWireMessage;
import org.junit.Assert; import org.junit.Assert;
import org.thingsboard.server.common.data.device.profile.MqttTopics; import org.thingsboard.server.common.data.device.profile.MqttTopics;
import org.thingsboard.server.common.msg.session.FeatureType;
import org.thingsboard.server.transport.mqtt.AbstractMqttIntegrationTest; import org.thingsboard.server.transport.mqtt.AbstractMqttIntegrationTest;
import org.thingsboard.server.transport.mqtt.mqttv5.MqttV5TestClient; import org.thingsboard.server.transport.mqtt.mqttv5.MqttV5TestClient;
@ -34,6 +35,7 @@ public abstract class AbstractMqttV5ClientSubscriptionTest extends AbstractMqttI
client.connectAndWait(accessToken); client.connectAndWait(accessToken);
IMqttToken subscriptionResult = client.subscribeAndWait(MqttTopics.DEVICE_ATTRIBUTES_TOPIC, MqttQoS.AT_MOST_ONCE); IMqttToken subscriptionResult = client.subscribeAndWait(MqttTopics.DEVICE_ATTRIBUTES_TOPIC, MqttQoS.AT_MOST_ONCE);
awaitForDeviceActorToReceiveSubscription(savedDevice.getId(), FeatureType.ATTRIBUTES, 1);
MqttWireMessage response = subscriptionResult.getResponse(); MqttWireMessage response = subscriptionResult.getResponse();
@ -52,6 +54,7 @@ public abstract class AbstractMqttV5ClientSubscriptionTest extends AbstractMqttI
client.connectAndWait(accessToken); client.connectAndWait(accessToken);
IMqttToken iMqttToken = client.subscribeAndWait("wrong/topic/+", MqttQoS.AT_MOST_ONCE); IMqttToken iMqttToken = client.subscribeAndWait("wrong/topic/+", MqttQoS.AT_MOST_ONCE);
awaitForDeviceActorToReceiveSubscription(savedDevice.getId(), FeatureType.ATTRIBUTES, 0);
Assert.assertEquals(MESSAGE_TYPE_SUBACK,iMqttToken.getResponse().getType()); Assert.assertEquals(MESSAGE_TYPE_SUBACK,iMqttToken.getResponse().getType());
MqttSubAck subAck = (MqttSubAck) iMqttToken.getResponse(); MqttSubAck subAck = (MqttSubAck) iMqttToken.getResponse();
Assert.assertEquals(1, subAck.getReturnCodes().length); Assert.assertEquals(1, subAck.getReturnCodes().length);

2
application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv5/client/unsubscribe/AbstractMqttV5ClientUnsubscribeTest.java

@ -22,6 +22,7 @@ import org.eclipse.paho.mqttv5.common.packet.MqttUnsubAck;
import org.eclipse.paho.mqttv5.common.packet.MqttWireMessage; import org.eclipse.paho.mqttv5.common.packet.MqttWireMessage;
import org.junit.Assert; import org.junit.Assert;
import org.thingsboard.server.common.data.device.profile.MqttTopics; import org.thingsboard.server.common.data.device.profile.MqttTopics;
import org.thingsboard.server.common.msg.session.FeatureType;
import org.thingsboard.server.transport.mqtt.AbstractMqttIntegrationTest; import org.thingsboard.server.transport.mqtt.AbstractMqttIntegrationTest;
import org.thingsboard.server.transport.mqtt.mqttv5.MqttV5TestClient; import org.thingsboard.server.transport.mqtt.mqttv5.MqttV5TestClient;
@ -34,6 +35,7 @@ public abstract class AbstractMqttV5ClientUnsubscribeTest extends AbstractMqttIn
client.connectAndWait(accessToken); client.connectAndWait(accessToken);
client.subscribeAndWait(MqttTopics.DEVICE_ATTRIBUTES_TOPIC, MqttQoS.AT_MOST_ONCE); client.subscribeAndWait(MqttTopics.DEVICE_ATTRIBUTES_TOPIC, MqttQoS.AT_MOST_ONCE);
awaitForDeviceActorToReceiveSubscription(savedDevice.getId(), FeatureType.ATTRIBUTES, 1);
IMqttToken unsubscribeResult = client.unsubscribeAndWait(MqttTopics.DEVICE_ATTRIBUTES_TOPIC); IMqttToken unsubscribeResult = client.unsubscribeAndWait(MqttTopics.DEVICE_ATTRIBUTES_TOPIC);
MqttWireMessage response = unsubscribeResult.getResponse(); MqttWireMessage response = unsubscribeResult.getResponse();
Assert.assertEquals(MESSAGE_TYPE_UNSUBACK, response.getType()); Assert.assertEquals(MESSAGE_TYPE_UNSUBACK, response.getType());

3
application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv5/rpc/AbstractMqttV5RpcTest.java

@ -22,6 +22,7 @@ import org.eclipse.paho.mqttv5.common.MqttException;
import org.eclipse.paho.mqttv5.common.MqttMessage; import org.eclipse.paho.mqttv5.common.MqttMessage;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.msg.session.FeatureType;
import org.thingsboard.server.transport.mqtt.mqttv5.AbstractMqttV5Test; import org.thingsboard.server.transport.mqtt.mqttv5.AbstractMqttV5Test;
import org.thingsboard.server.transport.mqtt.mqttv5.MqttV5TestCallback; import org.thingsboard.server.transport.mqtt.mqttv5.MqttV5TestCallback;
import org.thingsboard.server.transport.mqtt.mqttv5.MqttV5TestClient; import org.thingsboard.server.transport.mqtt.mqttv5.MqttV5TestClient;
@ -45,6 +46,7 @@ public abstract class AbstractMqttV5RpcTest extends AbstractMqttV5Test {
MqttV5TestCallback callback = new MqttV5TestCallback(DEVICE_RPC_REQUESTS_SUB_TOPIC.replace("+", "0")); MqttV5TestCallback callback = new MqttV5TestCallback(DEVICE_RPC_REQUESTS_SUB_TOPIC.replace("+", "0"));
client.setCallback(callback); client.setCallback(callback);
client.subscribeAndWait(DEVICE_RPC_REQUESTS_SUB_TOPIC, MqttQoS.AT_MOST_ONCE); client.subscribeAndWait(DEVICE_RPC_REQUESTS_SUB_TOPIC, MqttQoS.AT_MOST_ONCE);
awaitForDeviceActorToReceiveSubscription(savedDevice.getId(), FeatureType.RPC, 1);
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"23\",\"value\": 1}}"; String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"23\",\"value\": 1}}";
String result = doPostAsync("/api/rpc/oneway/" + savedDevice.getId(), setGpioRequest, String.class, status().isOk()); String result = doPostAsync("/api/rpc/oneway/" + savedDevice.getId(), setGpioRequest, String.class, status().isOk());
@ -59,6 +61,7 @@ public abstract class AbstractMqttV5RpcTest extends AbstractMqttV5Test {
MqttV5TestClient client = new MqttV5TestClient(); MqttV5TestClient client = new MqttV5TestClient();
client.connectAndWait(accessToken); client.connectAndWait(accessToken);
client.subscribeAndWait(DEVICE_RPC_REQUESTS_SUB_TOPIC, MqttQoS.AT_LEAST_ONCE); client.subscribeAndWait(DEVICE_RPC_REQUESTS_SUB_TOPIC, MqttQoS.AT_LEAST_ONCE);
awaitForDeviceActorToReceiveSubscription(savedDevice.getId(), FeatureType.RPC, 1);
MqttV5TestRpcCallback callback = new MqttV5TestRpcCallback(client, DEVICE_RPC_REQUESTS_SUB_TOPIC.replace("+", "0")); MqttV5TestRpcCallback callback = new MqttV5TestRpcCallback(client, DEVICE_RPC_REQUESTS_SUB_TOPIC.replace("+", "0"));
client.setCallback(callback); client.setCallback(callback);
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"26\",\"value\": 1}}"; String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"26\",\"value\": 1}}";

7
application/src/test/java/org/thingsboard/server/transport/mqtt/sparkplug/attributes/AbstractMqttV5ClientSparkplugAttributesTest.java

@ -20,6 +20,7 @@ import io.netty.handler.codec.mqtt.MqttQoS;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.junit.Assert; import org.junit.Assert;
import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.msg.session.FeatureType;
import org.thingsboard.server.transport.mqtt.sparkplug.AbstractMqttV5ClientSparkplugTest; import org.thingsboard.server.transport.mqtt.sparkplug.AbstractMqttV5ClientSparkplugTest;
import org.thingsboard.server.transport.mqtt.util.sparkplug.MetricDataType; import org.thingsboard.server.transport.mqtt.util.sparkplug.MetricDataType;
import org.thingsboard.server.transport.mqtt.util.sparkplug.SparkplugMessageType; import org.thingsboard.server.transport.mqtt.util.sparkplug.SparkplugMessageType;
@ -50,6 +51,7 @@ public abstract class AbstractMqttV5ClientSparkplugAttributesTest extends Abstra
String SHARED_ATTRIBUTES_PAYLOAD = "{\"" + keyNodeRebirth + "\":" + value + "}"; String SHARED_ATTRIBUTES_PAYLOAD = "{\"" + keyNodeRebirth + "\":" + value + "}";
Assert.assertTrue("Connection node is failed", client.isConnected()); Assert.assertTrue("Connection node is failed", client.isConnected());
client.subscribeAndWait(NAMESPACE + "/" + groupId + "/" + NCMD.name() + "/" + edgeNode + "/#", MqttQoS.AT_MOST_ONCE); client.subscribeAndWait(NAMESPACE + "/" + groupId + "/" + NCMD.name() + "/" + edgeNode + "/#", MqttQoS.AT_MOST_ONCE);
awaitForDeviceActorToReceiveSubscription(savedGateway.getId(), FeatureType.ATTRIBUTES, 1);
doPostAsync("/api/plugins/telemetry/DEVICE/" + savedGateway.getId().getId() + "/attributes/SHARED_SCOPE", SHARED_ATTRIBUTES_PAYLOAD, String.class, status().isOk()); doPostAsync("/api/plugins/telemetry/DEVICE/" + savedGateway.getId().getId() + "/attributes/SHARED_SCOPE", SHARED_ATTRIBUTES_PAYLOAD, String.class, status().isOk());
await(alias + SparkplugMessageType.NBIRTH.name()) await(alias + SparkplugMessageType.NBIRTH.name())
.atMost(40, TimeUnit.SECONDS) .atMost(40, TimeUnit.SECONDS)
@ -75,6 +77,7 @@ public abstract class AbstractMqttV5ClientSparkplugAttributesTest extends Abstra
connectionWithNBirth(metricDataType, metricKey, metricValue); connectionWithNBirth(metricDataType, metricKey, metricValue);
Assert.assertTrue("Connection node is failed", client.isConnected()); Assert.assertTrue("Connection node is failed", client.isConnected());
client.subscribeAndWait(NAMESPACE + "/" + groupId + "/" + NCMD.name() + "/" + edgeNode + "/#", MqttQoS.AT_MOST_ONCE); client.subscribeAndWait(NAMESPACE + "/" + groupId + "/" + NCMD.name() + "/" + edgeNode + "/#", MqttQoS.AT_MOST_ONCE);
awaitForDeviceActorToReceiveSubscription(savedGateway.getId(), FeatureType.ATTRIBUTES, 1);
// Boolean <-> String // Boolean <-> String
boolean expectedValue = true; boolean expectedValue = true;
@ -138,6 +141,7 @@ public abstract class AbstractMqttV5ClientSparkplugAttributesTest extends Abstra
connectionWithNBirth(metricDataType, metricKey, metricValue); connectionWithNBirth(metricDataType, metricKey, metricValue);
Assert.assertTrue("Connection node is failed", client.isConnected()); Assert.assertTrue("Connection node is failed", client.isConnected());
client.subscribeAndWait(NAMESPACE + "/" + groupId + "/" + NCMD.name() + "/" + edgeNode + "/#", MqttQoS.AT_MOST_ONCE); client.subscribeAndWait(NAMESPACE + "/" + groupId + "/" + NCMD.name() + "/" + edgeNode + "/#", MqttQoS.AT_MOST_ONCE);
awaitForDeviceActorToReceiveSubscription(savedGateway.getId(), FeatureType.ATTRIBUTES, 1);
// Long <-> String // Long <-> String
String valueStr = "123"; String valueStr = "123";
@ -189,6 +193,7 @@ public abstract class AbstractMqttV5ClientSparkplugAttributesTest extends Abstra
connectionWithNBirth(metricDataType, metricKey, metricValue); connectionWithNBirth(metricDataType, metricKey, metricValue);
Assert.assertTrue("Connection node is failed", client.isConnected()); Assert.assertTrue("Connection node is failed", client.isConnected());
client.subscribeAndWait(NAMESPACE + "/" + groupId + "/" + NCMD.name() + "/" + edgeNode + "/#", MqttQoS.AT_MOST_ONCE); client.subscribeAndWait(NAMESPACE + "/" + groupId + "/" + NCMD.name() + "/" + edgeNode + "/#", MqttQoS.AT_MOST_ONCE);
awaitForDeviceActorToReceiveSubscription(savedGateway.getId(), FeatureType.ATTRIBUTES, 1);
// Float <-> String // Float <-> String
String valueStr = "123.345"; String valueStr = "123.345";
@ -240,6 +245,7 @@ public abstract class AbstractMqttV5ClientSparkplugAttributesTest extends Abstra
connectionWithNBirth(metricDataType, metricKey, metricValue); connectionWithNBirth(metricDataType, metricKey, metricValue);
Assert.assertTrue("Connection node is failed", client.isConnected()); Assert.assertTrue("Connection node is failed", client.isConnected());
client.subscribeAndWait(NAMESPACE + "/" + groupId + "/" + NCMD.name() + "/" + edgeNode + "/#", MqttQoS.AT_MOST_ONCE); client.subscribeAndWait(NAMESPACE + "/" + groupId + "/" + NCMD.name() + "/" + edgeNode + "/#", MqttQoS.AT_MOST_ONCE);
awaitForDeviceActorToReceiveSubscription(savedGateway.getId(), FeatureType.ATTRIBUTES, 1);
// Double <-> String // Double <-> String
String valueStr = "123345456"; String valueStr = "123345456";
@ -291,6 +297,7 @@ public abstract class AbstractMqttV5ClientSparkplugAttributesTest extends Abstra
connectionWithNBirth(metricDataType, metricKey, metricValue); connectionWithNBirth(metricDataType, metricKey, metricValue);
Assert.assertTrue("Connection node is failed", client.isConnected()); Assert.assertTrue("Connection node is failed", client.isConnected());
client.subscribeAndWait(NAMESPACE + "/" + groupId + "/" + NCMD.name() + "/" + edgeNode + "/#", MqttQoS.AT_MOST_ONCE); client.subscribeAndWait(NAMESPACE + "/" + groupId + "/" + NCMD.name() + "/" + edgeNode + "/#", MqttQoS.AT_MOST_ONCE);
awaitForDeviceActorToReceiveSubscription(savedGateway.getId(), FeatureType.ATTRIBUTES, 1);
// String <-> Long // String <-> Long
long valueLong = 123345456L; long valueLong = 123345456L;

4
application/src/test/java/org/thingsboard/server/transport/mqtt/sparkplug/rpc/AbstractMqttV5RpcSparkplugTest.java

@ -20,6 +20,7 @@ import lombok.extern.slf4j.Slf4j;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.msg.session.FeatureType;
import org.thingsboard.server.transport.mqtt.sparkplug.AbstractMqttV5ClientSparkplugTest; import org.thingsboard.server.transport.mqtt.sparkplug.AbstractMqttV5ClientSparkplugTest;
import org.thingsboard.server.transport.mqtt.util.sparkplug.SparkplugMessageType; import org.thingsboard.server.transport.mqtt.util.sparkplug.SparkplugMessageType;
@ -45,6 +46,7 @@ public abstract class AbstractMqttV5RpcSparkplugTest extends AbstractMqttV5Clie
connectionWithNBirth(metricBirthDataType_Int32, metricBirthName_Int32, nextInt32()); connectionWithNBirth(metricBirthDataType_Int32, metricBirthName_Int32, nextInt32());
Assert.assertTrue("Connection node is failed", client.isConnected()); Assert.assertTrue("Connection node is failed", client.isConnected());
client.subscribeAndWait(NAMESPACE + "/" + groupId + "/" + NCMD.name() + "/" + edgeNode + "/#", MqttQoS.AT_MOST_ONCE); client.subscribeAndWait(NAMESPACE + "/" + groupId + "/" + NCMD.name() + "/" + edgeNode + "/#", MqttQoS.AT_MOST_ONCE);
awaitForDeviceActorToReceiveSubscription(savedGateway.getId(), FeatureType.RPC, 1);
String expected = "{\"result\":\"Success: " + SparkplugMessageType.NCMD.name() + "\"}"; String expected = "{\"result\":\"Success: " + SparkplugMessageType.NCMD.name() + "\"}";
String actual = sendRPCSparkplug(NCMD.name(), sparkplugRpcRequest, savedGateway); String actual = sendRPCSparkplug(NCMD.name(), sparkplugRpcRequest, savedGateway);
await(alias + SparkplugMessageType.NCMD.name()) await(alias + SparkplugMessageType.NCMD.name())
@ -79,6 +81,7 @@ public abstract class AbstractMqttV5RpcSparkplugTest extends AbstractMqttV5Clie
connectionWithNBirth(metricBirthDataType_Int32, metricBirthName_Int32, nextInt32()); connectionWithNBirth(metricBirthDataType_Int32, metricBirthName_Int32, nextInt32());
Assert.assertTrue("Connection node is failed", client.isConnected()); Assert.assertTrue("Connection node is failed", client.isConnected());
client.subscribeAndWait(NAMESPACE + "/" + groupId + "/" + NCMD.name() + "/" + edgeNode + "/#", MqttQoS.AT_MOST_ONCE); client.subscribeAndWait(NAMESPACE + "/" + groupId + "/" + NCMD.name() + "/" + edgeNode + "/#", MqttQoS.AT_MOST_ONCE);
awaitForDeviceActorToReceiveSubscription(savedGateway.getId(), FeatureType.RPC, 1);
String invalidateTypeMessageName = "RCMD"; String invalidateTypeMessageName = "RCMD";
String expected = "{\"result\":\"" + INVALID_ARGUMENTS + "\",\"error\":\"Failed to convert device RPC command to MQTT msg: " + String expected = "{\"result\":\"" + INVALID_ARGUMENTS + "\",\"error\":\"Failed to convert device RPC command to MQTT msg: " +
invalidateTypeMessageName + "{\\\"metricName\\\":\\\"" + metricBirthName_Int32 + "\\\",\\\"value\\\":" + metricBirthValue_Int32 + "}\"}"; invalidateTypeMessageName + "{\\\"metricName\\\":\\\"" + metricBirthName_Int32 + "\\\",\\\"value\\\":" + metricBirthValue_Int32 + "}\"}";
@ -92,6 +95,7 @@ public abstract class AbstractMqttV5RpcSparkplugTest extends AbstractMqttV5Clie
connectionWithNBirth(metricBirthDataType_Int32, metricBirthName_Int32, nextInt32()); connectionWithNBirth(metricBirthDataType_Int32, metricBirthName_Int32, nextInt32());
Assert.assertTrue("Connection node is failed", client.isConnected()); Assert.assertTrue("Connection node is failed", client.isConnected());
client.subscribeAndWait(NAMESPACE + "/" + groupId + "/" + NCMD.name() + "/" + edgeNode + "/#", MqttQoS.AT_MOST_ONCE); client.subscribeAndWait(NAMESPACE + "/" + groupId + "/" + NCMD.name() + "/" + edgeNode + "/#", MqttQoS.AT_MOST_ONCE);
awaitForDeviceActorToReceiveSubscription(savedGateway.getId(), FeatureType.RPC, 1);
String metricNameBad = metricBirthName_Int32 + "_Bad"; String metricNameBad = metricBirthName_Int32 + "_Bad";
String sparkplugRpcRequestBad = "{\"metricName\":\"" + metricNameBad + "\",\"value\":" + metricBirthValue_Int32 + "}"; String sparkplugRpcRequestBad = "{\"metricName\":\"" + metricNameBad + "\",\"value\":" + metricBirthValue_Int32 + "}";
String expected = "{\"result\":\"BAD_REQUEST_PARAMS\",\"error\":\"Failed send To Node Rpc Request: " + String expected = "{\"result\":\"BAD_REQUEST_PARAMS\",\"error\":\"Failed send To Node Rpc Request: " +

5
common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/MqttTransportHandler.java

@ -1060,7 +1060,7 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
} }
} }
private void checkSparkplugNodeSession(MqttConnectMessage connectMessage, ChannelHandlerContext ctx) { private void checkSparkplugNodeSession(MqttConnectMessage connectMessage, ChannelHandlerContext ctx, SessionMetaData sessionMetaData) {
try { try {
if (sparkplugSessionHandler == null) { if (sparkplugSessionHandler == null) {
SparkplugTopic sparkplugTopicNode = validatedSparkplugTopicConnectedNode(connectMessage); SparkplugTopic sparkplugTopicNode = validatedSparkplugTopicConnectedNode(connectMessage);
@ -1069,6 +1069,7 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
sparkplugSessionHandler = new SparkplugNodeSessionHandler(this, deviceSessionCtx, sessionId, sparkplugTopicNode); sparkplugSessionHandler = new SparkplugNodeSessionHandler(this, deviceSessionCtx, sessionId, sparkplugTopicNode);
sparkplugSessionHandler.onAttributesTelemetryProto(0, sparkplugBProtoNode, sparkplugSessionHandler.onAttributesTelemetryProto(0, sparkplugBProtoNode,
deviceSessionCtx.getDeviceInfo().getDeviceName(), sparkplugTopicNode); deviceSessionCtx.getDeviceInfo().getDeviceName(), sparkplugTopicNode);
sessionMetaData.setOverwriteActivityTime(true);
} else { } else {
log.trace("[{}][{}] Failed to fetch sparkplugDevice connect: sparkplugTopicName without SparkplugMessageType.NDEATH.", sessionId, deviceSessionCtx.getDeviceInfo().getDeviceName()); log.trace("[{}][{}] Failed to fetch sparkplugDevice connect: sparkplugTopicName without SparkplugMessageType.NDEATH.", sessionId, deviceSessionCtx.getDeviceInfo().getDeviceName());
throw new ThingsboardException("Invalid request body", ThingsboardErrorCode.BAD_REQUEST_PARAMS); throw new ThingsboardException("Invalid request body", ThingsboardErrorCode.BAD_REQUEST_PARAMS);
@ -1145,7 +1146,7 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
public void onSuccess(Void msg) { public void onSuccess(Void msg) {
SessionMetaData sessionMetaData = transportService.registerAsyncSession(deviceSessionCtx.getSessionInfo(), MqttTransportHandler.this); SessionMetaData sessionMetaData = transportService.registerAsyncSession(deviceSessionCtx.getSessionInfo(), MqttTransportHandler.this);
if (deviceSessionCtx.isSparkplug()) { if (deviceSessionCtx.isSparkplug()) {
checkSparkplugNodeSession(connectMessage, ctx); checkSparkplugNodeSession(connectMessage, ctx, sessionMetaData);
} else { } else {
checkGatewaySession(sessionMetaData); checkGatewaySession(sessionMetaData);
} }

21
dao/src/main/java/org/thingsboard/server/dao/entity/DefaultEntityServiceRegistry.java

@ -15,27 +15,31 @@
*/ */
package org.thingsboard.server.dao.entity; package org.thingsboard.server.dao.entity;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.EntityType;
import javax.annotation.PostConstruct;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@Service @Service
@RequiredArgsConstructor
@Slf4j
public class DefaultEntityServiceRegistry implements EntityServiceRegistry { public class DefaultEntityServiceRegistry implements EntityServiceRegistry {
private final ApplicationContext applicationContext; private final ApplicationContext applicationContext;
private final Map<EntityType, EntityDaoService> entityDaoServicesMap; private final Map<EntityType, EntityDaoService> entityDaoServicesMap = new HashMap<>();
public DefaultEntityServiceRegistry(ApplicationContext applicationContext) { @EventListener(ContextRefreshedEvent.class)
this.applicationContext = applicationContext; @Order(Ordered.HIGHEST_PRECEDENCE)
this.entityDaoServicesMap = new HashMap<>();
}
@PostConstruct
public void init() { public void init() {
log.debug("Initializing EntityServiceRegistry on ContextRefreshedEvent");
applicationContext.getBeansOfType(EntityDaoService.class).values().forEach(entityDaoService -> { applicationContext.getBeansOfType(EntityDaoService.class).values().forEach(entityDaoService -> {
EntityType entityType = entityDaoService.getEntityType(); EntityType entityType = entityDaoService.getEntityType();
entityDaoServicesMap.put(entityType, entityDaoService); entityDaoServicesMap.put(entityType, entityDaoService);
@ -43,6 +47,7 @@ public class DefaultEntityServiceRegistry implements EntityServiceRegistry {
entityDaoServicesMap.put(EntityType.RULE_NODE, entityDaoService); entityDaoServicesMap.put(EntityType.RULE_NODE, entityDaoService);
} }
}); });
log.debug("Initialized EntityServiceRegistry total [{}] entries", entityDaoServicesMap.size());
} }
@Override @Override

122
dao/src/test/java/org/thingsboard/server/dao/service/AbstractServiceTest.java

@ -18,6 +18,8 @@ package org.thingsboard.server.dao.service;
import com.datastax.oss.driver.api.core.uuid.Uuids; import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.After;
import org.junit.Before;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
@ -47,44 +49,17 @@ import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.ota.ChecksumAlgorithm; import org.thingsboard.server.common.data.ota.ChecksumAlgorithm;
import org.thingsboard.server.common.data.ota.OtaPackageType; import org.thingsboard.server.common.data.ota.OtaPackageType;
import org.thingsboard.server.dao.alarm.AlarmCommentService;
import org.thingsboard.server.dao.alarm.AlarmService;
import org.thingsboard.server.dao.asset.AssetProfileService;
import org.thingsboard.server.dao.asset.AssetService;
import org.thingsboard.server.dao.audit.AuditLogLevelFilter; import org.thingsboard.server.dao.audit.AuditLogLevelFilter;
import org.thingsboard.server.dao.audit.AuditLogLevelMask; import org.thingsboard.server.dao.audit.AuditLogLevelMask;
import org.thingsboard.server.dao.audit.AuditLogLevelProperties; import org.thingsboard.server.dao.audit.AuditLogLevelProperties;
import org.thingsboard.server.dao.component.ComponentDescriptorService;
import org.thingsboard.server.dao.customer.CustomerService;
import org.thingsboard.server.dao.dashboard.DashboardService;
import org.thingsboard.server.dao.device.DeviceCredentialsService;
import org.thingsboard.server.dao.device.DeviceProfileService;
import org.thingsboard.server.dao.device.DeviceService;
import org.thingsboard.server.dao.edge.EdgeEventService;
import org.thingsboard.server.dao.edge.EdgeService;
import org.thingsboard.server.dao.entity.EntityService;
import org.thingsboard.server.dao.entityview.EntityViewService;
import org.thingsboard.server.dao.event.EventService;
import org.thingsboard.server.dao.ota.OtaPackageService;
import org.thingsboard.server.dao.queue.QueueService;
import org.thingsboard.server.dao.relation.RelationService;
import org.thingsboard.server.dao.resource.ResourceService;
import org.thingsboard.server.dao.rpc.RpcService;
import org.thingsboard.server.dao.rule.RuleChainService;
import org.thingsboard.server.dao.settings.AdminSettingsService;
import org.thingsboard.server.dao.tenant.TenantProfileService;
import org.thingsboard.server.dao.tenant.TenantService; import org.thingsboard.server.dao.tenant.TenantService;
import org.thingsboard.server.dao.timeseries.TimeseriesService;
import org.thingsboard.server.dao.usagerecord.ApiUsageStateService;
import org.thingsboard.server.dao.user.UserService;
import org.thingsboard.server.dao.widget.WidgetTypeService;
import org.thingsboard.server.dao.widget.WidgetsBundleService;
import java.io.IOException; import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.UUID;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
@ -100,91 +75,20 @@ public abstract class AbstractServiceTest {
public static final TenantId SYSTEM_TENANT_ID = TenantId.SYS_TENANT_ID; public static final TenantId SYSTEM_TENANT_ID = TenantId.SYS_TENANT_ID;
@Autowired
protected UserService userService;
@Autowired
protected ApiUsageStateService apiUsageStateService;
@Autowired
protected AdminSettingsService adminSettingsService;
@Autowired @Autowired
protected TenantService tenantService; protected TenantService tenantService;
@Autowired protected TenantId tenantId;
protected CustomerService customerService;
@Autowired
protected DeviceService deviceService;
@Autowired
protected AssetService assetService;
@Autowired
protected EntityViewService entityViewService;
@Autowired
protected EntityService entityService;
@Autowired
protected DeviceCredentialsService deviceCredentialsService;
@Autowired
protected WidgetsBundleService widgetsBundleService;
@Autowired
protected WidgetTypeService widgetTypeService;
@Autowired
protected DashboardService dashboardService;
@Autowired
protected TimeseriesService tsService;
@Autowired
protected EventService eventService;
@Autowired
protected RelationService relationService;
@Autowired
protected AlarmService alarmService;
@Autowired
protected AlarmCommentService alarmCommentService;
@Autowired
protected RuleChainService ruleChainService;
@Autowired
protected EdgeService edgeService;
@Autowired
protected EdgeEventService edgeEventService;
@Autowired @Before
private ComponentDescriptorService componentDescriptorService; public void beforeAbstractService() {
tenantId = createTenant();
@Autowired }
protected TenantProfileService tenantProfileService;
@Autowired
protected DeviceProfileService deviceProfileService;
@Autowired
protected AssetProfileService assetProfileService;
@Autowired
protected ResourceService resourceService;
@Autowired
protected OtaPackageService otaPackageService;
@Autowired
protected RpcService rpcService;
@Autowired @After
protected QueueService queueService; public void afterAbstractService() {
tenantService.deleteTenants();
}
public class IdComparator<D extends HasId> implements Comparator<D> { public class IdComparator<D extends HasId> implements Comparator<D> {
@Override @Override
@ -270,7 +174,7 @@ public abstract class AbstractServiceTest {
public TenantId createTenant() { public TenantId createTenant() {
Tenant tenant = new Tenant(); Tenant tenant = new Tenant();
tenant.setTitle("My tenant " + Uuids.timeBased()); tenant.setTitle("My tenant " + UUID.randomUUID());
Tenant savedTenant = tenantService.saveTenant(tenant); Tenant savedTenant = tenantService.saveTenant(tenant);
assertNotNull(savedTenant); assertNotNull(savedTenant);
return savedTenant.getId(); return savedTenant.getId();

5
dao/src/test/java/org/thingsboard/server/dao/service/BaseAdminSettingsServiceTest.java

@ -20,11 +20,16 @@ import com.fasterxml.jackson.databind.node.ObjectNode;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.server.common.data.AdminSettings; import org.thingsboard.server.common.data.AdminSettings;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.settings.AdminSettingsService;
public abstract class BaseAdminSettingsServiceTest extends AbstractServiceTest { public abstract class BaseAdminSettingsServiceTest extends AbstractServiceTest {
@Autowired
AdminSettingsService adminSettingsService;
@Test @Test
public void testFindAdminSettingsByKey() { public void testFindAdminSettingsByKey() {
AdminSettings adminSettings = adminSettingsService.findAdminSettingsByKey(SYSTEM_TENANT_ID, "general"); AdminSettings adminSettings = adminSettingsService.findAdminSettingsByKey(SYSTEM_TENANT_ID, "general");

22
dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmCommentServiceTest.java

@ -20,21 +20,22 @@ import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils; import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.alarm.Alarm;
import org.thingsboard.server.common.data.alarm.AlarmComment; import org.thingsboard.server.common.data.alarm.AlarmComment;
import org.thingsboard.server.common.data.alarm.AlarmCommentInfo; import org.thingsboard.server.common.data.alarm.AlarmCommentInfo;
import org.thingsboard.server.common.data.alarm.AlarmSeverity; import org.thingsboard.server.common.data.alarm.AlarmSeverity;
import org.thingsboard.server.common.data.alarm.AlarmStatus;
import org.thingsboard.server.common.data.id.AssetId; import org.thingsboard.server.common.data.id.AssetId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.common.data.id.UserId;
import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.common.data.security.Authority;
import org.thingsboard.server.dao.alarm.AlarmCommentService;
import org.thingsboard.server.dao.alarm.AlarmService;
import org.thingsboard.server.dao.user.UserService;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
@ -43,19 +44,19 @@ import static org.thingsboard.server.common.data.alarm.AlarmCommentType.OTHER;
public abstract class BaseAlarmCommentServiceTest extends AbstractServiceTest { public abstract class BaseAlarmCommentServiceTest extends AbstractServiceTest {
@Autowired
AlarmService alarmService;
@Autowired
AlarmCommentService alarmCommentService;
@Autowired
UserService userService;
public static final String TEST_ALARM = "TEST_ALARM"; public static final String TEST_ALARM = "TEST_ALARM";
private TenantId tenantId;
private Alarm alarm; private Alarm alarm;
private User user; private User user;
@Before @Before
public void before() { public void before() {
Tenant tenant = new Tenant();
tenant.setTitle("My tenant");
Tenant savedTenant = tenantService.saveTenant(tenant);
Assert.assertNotNull(savedTenant);
tenantId = savedTenant.getId();
alarm = Alarm.builder().tenantId(tenantId).originator(new AssetId(Uuids.timeBased())) alarm = Alarm.builder().tenantId(tenantId).originator(new AssetId(Uuids.timeBased()))
.type(TEST_ALARM) .type(TEST_ALARM)
.severity(AlarmSeverity.CRITICAL) .severity(AlarmSeverity.CRITICAL)
@ -74,7 +75,6 @@ public abstract class BaseAlarmCommentServiceTest extends AbstractServiceTest {
@After @After
public void after() { public void after() {
alarmService.deleteAlarm(tenantId, alarm.getId()); alarmService.deleteAlarm(tenantId, alarm.getId());
tenantService.deleteTenant(tenantId);
} }

44
dao/src/test/java/org/thingsboard/server/dao/service/BaseAlarmServiceTest.java

@ -16,14 +16,12 @@
package org.thingsboard.server.dao.service; package org.thingsboard.server.dao.service;
import com.datastax.oss.driver.api.core.uuid.Uuids; import com.datastax.oss.driver.api.core.uuid.Uuids;
import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.alarm.Alarm;
import org.thingsboard.server.common.data.alarm.AlarmCreateOrUpdateActiveRequest; import org.thingsboard.server.common.data.alarm.AlarmCreateOrUpdateActiveRequest;
@ -36,9 +34,7 @@ import org.thingsboard.server.common.data.alarm.AlarmStatus;
import org.thingsboard.server.common.data.alarm.AlarmUpdateRequest; import org.thingsboard.server.common.data.alarm.AlarmUpdateRequest;
import org.thingsboard.server.common.data.asset.Asset; import org.thingsboard.server.common.data.asset.Asset;
import org.thingsboard.server.common.data.id.AssetId; import org.thingsboard.server.common.data.id.AssetId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.page.SortOrder; import org.thingsboard.server.common.data.page.SortOrder;
import org.thingsboard.server.common.data.page.TimePageLink; import org.thingsboard.server.common.data.page.TimePageLink;
import org.thingsboard.server.common.data.query.AlarmData; import org.thingsboard.server.common.data.query.AlarmData;
@ -52,7 +48,12 @@ import org.thingsboard.server.common.data.relation.EntityRelation;
import org.thingsboard.server.common.data.relation.RelationTypeGroup; import org.thingsboard.server.common.data.relation.RelationTypeGroup;
import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.common.data.security.Authority;
import org.thingsboard.server.dao.alarm.AlarmApiCallResult; import org.thingsboard.server.dao.alarm.AlarmApiCallResult;
import org.thingsboard.server.dao.alarm.AlarmOperationResult; import org.thingsboard.server.dao.alarm.AlarmService;
import org.thingsboard.server.dao.asset.AssetService;
import org.thingsboard.server.dao.customer.CustomerService;
import org.thingsboard.server.dao.device.DeviceService;
import org.thingsboard.server.dao.relation.RelationService;
import org.thingsboard.server.dao.user.UserService;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
@ -61,29 +62,24 @@ import java.util.concurrent.ExecutionException;
public abstract class BaseAlarmServiceTest extends AbstractServiceTest { public abstract class BaseAlarmServiceTest extends AbstractServiceTest {
public static final String TEST_ALARM = "TEST_ALARM"; @Autowired
AlarmService alarmService;
@Autowired
AssetService assetService;
@Autowired
CustomerService customerService;
@Autowired
DeviceService deviceService;
@Autowired
RelationService relationService;
@Autowired
UserService userService;
public static final String TEST_ALARM = "TEST_ALARM";
private static final String TEST_TENANT_EMAIL = "testtenant@thingsboard.org"; private static final String TEST_TENANT_EMAIL = "testtenant@thingsboard.org";
private static final String TEST_TENANT_FIRST_NAME = "testtenantfirstname"; private static final String TEST_TENANT_FIRST_NAME = "testtenantfirstname";
private static final String TEST_TENANT_LAST_NAME = "testtenantlastname"; private static final String TEST_TENANT_LAST_NAME = "testtenantlastname";
private TenantId tenantId;
@Before
public void before() {
Tenant tenant = new Tenant();
tenant.setTitle("My tenant");
Tenant savedTenant = tenantService.saveTenant(tenant);
Assert.assertNotNull(savedTenant);
tenantId = savedTenant.getId();
}
@After
public void after() {
tenantService.deleteTenant(tenantId);
}
@Test @Test
public void testSaveAndFetchAlarm() throws ExecutionException, InterruptedException { public void testSaveAndFetchAlarm() throws ExecutionException, InterruptedException {
AssetId parentId = new AssetId(Uuids.timeBased()); AssetId parentId = new AssetId(Uuids.timeBased());

23
dao/src/test/java/org/thingsboard/server/dao/service/BaseApiUsageStateServiceTest.java

@ -15,33 +15,18 @@
*/ */
package org.thingsboard.server.dao.service; package org.thingsboard.server.dao.service;
import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.server.common.data.ApiUsageStateValue; import org.thingsboard.server.common.data.ApiUsageStateValue;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.ApiUsageState; import org.thingsboard.server.common.data.ApiUsageState;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.dao.usagerecord.ApiUsageStateService;
public abstract class BaseApiUsageStateServiceTest extends AbstractServiceTest { public abstract class BaseApiUsageStateServiceTest extends AbstractServiceTest {
private TenantId tenantId; @Autowired
ApiUsageStateService apiUsageStateService;
@Before
public void before() {
Tenant tenant = new Tenant();
tenant.setTitle("My tenant");
Tenant savedTenant = tenantService.saveTenant(tenant);
Assert.assertNotNull(savedTenant);
tenantId = savedTenant.getId();
}
@After
public void after() {
tenantService.deleteTenant(tenantId);
}
@Test @Test
public void testFindApiUsageStateByTenantId() { public void testFindApiUsageStateByTenantId() {

26
dao/src/test/java/org/thingsboard/server/dao/service/BaseAssetProfileServiceTest.java

@ -19,19 +19,18 @@ import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.MoreExecutors;
import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.common.util.ThingsBoardThreadFactory; import org.thingsboard.common.util.ThingsBoardThreadFactory;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.asset.Asset; import org.thingsboard.server.common.data.asset.Asset;
import org.thingsboard.server.common.data.asset.AssetProfile; import org.thingsboard.server.common.data.asset.AssetProfile;
import org.thingsboard.server.common.data.asset.AssetProfileInfo; import org.thingsboard.server.common.data.asset.AssetProfileInfo;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.dao.asset.AssetProfileService;
import org.thingsboard.server.dao.asset.AssetService;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
import java.util.ArrayList; import java.util.ArrayList;
@ -46,21 +45,10 @@ public abstract class BaseAssetProfileServiceTest extends AbstractServiceTest {
private IdComparator<AssetProfile> idComparator = new IdComparator<>(); private IdComparator<AssetProfile> idComparator = new IdComparator<>();
private IdComparator<AssetProfileInfo> assetProfileInfoIdComparator = new IdComparator<>(); private IdComparator<AssetProfileInfo> assetProfileInfoIdComparator = new IdComparator<>();
private TenantId tenantId; @Autowired
AssetProfileService assetProfileService;
@Before @Autowired
public void before() { AssetService assetService;
Tenant tenant = new Tenant();
tenant.setTitle("My tenant");
Tenant savedTenant = tenantService.saveTenant(tenant);
Assert.assertNotNull(savedTenant);
tenantId = savedTenant.getId();
}
@After
public void after() {
tenantService.deleteTenant(tenantId);
}
@Test @Test
public void testSaveAssetProfile() { public void testSaveAssetProfile() {

42
dao/src/test/java/org/thingsboard/server/dao/service/BaseAssetServiceTest.java

@ -16,11 +16,10 @@
package org.thingsboard.server.dao.service; package org.thingsboard.server.dao.service;
import com.datastax.oss.driver.api.core.uuid.Uuids; import com.datastax.oss.driver.api.core.uuid.Uuids;
import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.EntitySubtype; import org.thingsboard.server.common.data.EntitySubtype;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
@ -31,6 +30,8 @@ import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.dao.asset.AssetService;
import org.thingsboard.server.dao.customer.CustomerService;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
import java.util.ArrayList; import java.util.ArrayList;
@ -41,23 +42,12 @@ import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
public abstract class BaseAssetServiceTest extends AbstractServiceTest { public abstract class BaseAssetServiceTest extends AbstractServiceTest {
private IdComparator<Asset> idComparator = new IdComparator<>(); @Autowired
AssetService assetService;
private TenantId tenantId; @Autowired
CustomerService customerService;
@Before
public void before() {
Tenant tenant = new Tenant();
tenant.setTitle("My tenant");
Tenant savedTenant = tenantService.saveTenant(tenant);
Assert.assertNotNull(savedTenant);
tenantId = savedTenant.getId();
}
@After private IdComparator<Asset> idComparator = new IdComparator<>();
public void after() {
tenantService.deleteTenant(tenantId);
}
@Test @Test
public void testSaveAsset() { public void testSaveAsset() {
@ -220,12 +210,6 @@ public abstract class BaseAssetServiceTest extends AbstractServiceTest {
@Test @Test
public void testFindAssetsByTenantId() { public void testFindAssetsByTenantId() {
Tenant tenant = new Tenant();
tenant.setTitle("Test tenant");
tenant = tenantService.saveTenant(tenant);
TenantId tenantId = tenant.getId();
List<Asset> assets = new ArrayList<>(); List<Asset> assets = new ArrayList<>();
for (int i=0;i<178;i++) { for (int i=0;i<178;i++) {
Asset asset = new Asset(); Asset asset = new Asset();
@ -257,8 +241,6 @@ public abstract class BaseAssetServiceTest extends AbstractServiceTest {
pageData = assetService.findAssetsByTenantId(tenantId, pageLink); pageData = assetService.findAssetsByTenantId(tenantId, pageLink);
Assert.assertFalse(pageData.hasNext()); Assert.assertFalse(pageData.hasNext());
Assert.assertTrue(pageData.getData().isEmpty()); Assert.assertTrue(pageData.getData().isEmpty());
tenantService.deleteTenant(tenantId);
} }
@Test @Test
@ -419,12 +401,6 @@ public abstract class BaseAssetServiceTest extends AbstractServiceTest {
@Test @Test
public void testFindAssetsByTenantIdAndCustomerId() { public void testFindAssetsByTenantIdAndCustomerId() {
Tenant tenant = new Tenant();
tenant.setTitle("Test tenant");
tenant = tenantService.saveTenant(tenant);
TenantId tenantId = tenant.getId();
Customer customer = new Customer(); Customer customer = new Customer();
customer.setTitle("Test customer"); customer.setTitle("Test customer");
customer.setTenantId(tenantId); customer.setTenantId(tenantId);
@ -463,8 +439,6 @@ public abstract class BaseAssetServiceTest extends AbstractServiceTest {
pageData = assetService.findAssetInfosByTenantIdAndCustomerId(tenantId, customerId, pageLink); pageData = assetService.findAssetInfosByTenantIdAndCustomerId(tenantId, customerId, pageLink);
Assert.assertFalse(pageData.hasNext()); Assert.assertFalse(pageData.hasNext());
Assert.assertTrue(pageData.getData().isEmpty()); Assert.assertTrue(pageData.getData().isEmpty());
tenantService.deleteTenant(tenantId);
} }
@Test @Test

25
dao/src/test/java/org/thingsboard/server/dao/service/BaseCustomerServiceTest.java

@ -25,6 +25,7 @@ import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.common.util.ThingsBoardExecutors; import org.thingsboard.common.util.ThingsBoardExecutors;
import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
@ -32,6 +33,7 @@ import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.dao.customer.CustomerService;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
import java.util.ArrayList; import java.util.ArrayList;
@ -41,28 +43,22 @@ import java.util.concurrent.TimeUnit;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
public abstract class BaseCustomerServiceTest extends AbstractServiceTest { public abstract class BaseCustomerServiceTest extends AbstractServiceTest {
@Autowired
CustomerService customerService;
static final int TIMEOUT = 30; static final int TIMEOUT = 30;
ListeningExecutorService executor; ListeningExecutorService executor;
private TenantId tenantId;
@Before @Before
public void before() { public void before() {
executor = MoreExecutors.listeningDecorator(ThingsBoardExecutors.newWorkStealingPool(8, getClass())); executor = MoreExecutors.listeningDecorator(ThingsBoardExecutors.newWorkStealingPool(8, getClass()));
}
Tenant tenant = new Tenant();
tenant.setTitle("My tenant");
Tenant savedTenant = tenantService.saveTenant(tenant);
Assert.assertNotNull(savedTenant);
tenantId = savedTenant.getId();
}
@After @After
public void after() { public void after() {
executor.shutdownNow(); executor.shutdownNow();
tenantService.deleteTenant(tenantId);
} }
@Test @Test
@ -152,11 +148,6 @@ public abstract class BaseCustomerServiceTest extends AbstractServiceTest {
@Test @Test
public void testFindCustomersByTenantId() throws Exception { public void testFindCustomersByTenantId() throws Exception {
Tenant tenant = new Tenant();
tenant.setTitle("Test tenant");
tenant = tenantService.saveTenant(tenant);
TenantId tenantId = tenant.getId();
List<ListenableFuture<Customer>> futures = new ArrayList<>(135); List<ListenableFuture<Customer>> futures = new ArrayList<>(135);
for (int i = 0; i < 135; i++) { for (int i = 0; i < 135; i++) {
@ -187,8 +178,6 @@ public abstract class BaseCustomerServiceTest extends AbstractServiceTest {
pageData = customerService.findCustomersByTenantId(tenantId, pageLink); pageData = customerService.findCustomersByTenantId(tenantId, pageLink);
Assert.assertFalse(pageData.hasNext()); Assert.assertFalse(pageData.hasNext());
Assert.assertTrue(pageData.getData().isEmpty()); Assert.assertTrue(pageData.getData().isEmpty());
tenantService.deleteTenant(tenantId);
} }
@Test @Test

53
dao/src/test/java/org/thingsboard/server/dao/service/BaseDashboardServiceTest.java

@ -16,11 +16,10 @@
package org.thingsboard.server.dao.service; package org.thingsboard.server.dao.service;
import com.datastax.oss.driver.api.core.uuid.Uuids; import com.datastax.oss.driver.api.core.uuid.Uuids;
import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.Dashboard; import org.thingsboard.server.common.data.Dashboard;
import org.thingsboard.server.common.data.DashboardInfo; import org.thingsboard.server.common.data.DashboardInfo;
@ -33,6 +32,9 @@ import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.page.SortOrder; import org.thingsboard.server.common.data.page.SortOrder;
import org.thingsboard.server.dao.customer.CustomerService;
import org.thingsboard.server.dao.dashboard.DashboardService;
import org.thingsboard.server.dao.edge.EdgeService;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
import java.io.IOException; import java.io.IOException;
@ -42,24 +44,15 @@ import java.util.List;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
public abstract class BaseDashboardServiceTest extends AbstractServiceTest { public abstract class BaseDashboardServiceTest extends AbstractServiceTest {
private IdComparator<DashboardInfo> idComparator = new IdComparator<>();
private TenantId tenantId;
@Before @Autowired
public void before() { CustomerService customerService;
Tenant tenant = new Tenant(); @Autowired
tenant.setTitle("My tenant"); DashboardService dashboardService;
Tenant savedTenant = tenantService.saveTenant(tenant); @Autowired
Assert.assertNotNull(savedTenant); EdgeService edgeService;
tenantId = savedTenant.getId();
}
@After private IdComparator<DashboardInfo> idComparator = new IdComparator<>();
public void after() {
tenantService.deleteTenant(tenantId);
}
@Test @Test
public void testSaveDashboard() throws IOException { public void testSaveDashboard() throws IOException {
@ -176,12 +169,6 @@ public abstract class BaseDashboardServiceTest extends AbstractServiceTest {
@Test @Test
public void testFindDashboardsByTenantId() { public void testFindDashboardsByTenantId() {
Tenant tenant = new Tenant();
tenant.setTitle("Test tenant");
tenant = tenantService.saveTenant(tenant);
TenantId tenantId = tenant.getId();
List<DashboardInfo> dashboards = new ArrayList<>(); List<DashboardInfo> dashboards = new ArrayList<>();
for (int i=0;i<165;i++) { for (int i=0;i<165;i++) {
Dashboard dashboard = new Dashboard(); Dashboard dashboard = new Dashboard();
@ -212,18 +199,10 @@ public abstract class BaseDashboardServiceTest extends AbstractServiceTest {
pageData = dashboardService.findDashboardsByTenantId(tenantId, pageLink); pageData = dashboardService.findDashboardsByTenantId(tenantId, pageLink);
Assert.assertFalse(pageData.hasNext()); Assert.assertFalse(pageData.hasNext());
Assert.assertTrue(pageData.getData().isEmpty()); Assert.assertTrue(pageData.getData().isEmpty());
tenantService.deleteTenant(tenantId);
} }
@Test @Test
public void testFindMobileDashboardsByTenantId() { public void testFindMobileDashboardsByTenantId() {
Tenant tenant = new Tenant();
tenant.setTitle("Test tenant");
tenant = tenantService.saveTenant(tenant);
TenantId tenantId = tenant.getId();
List<DashboardInfo> mobileDashboards = new ArrayList<>(); List<DashboardInfo> mobileDashboards = new ArrayList<>();
for (int i=0;i<165;i++) { for (int i=0;i<165;i++) {
Dashboard dashboard = new Dashboard(); Dashboard dashboard = new Dashboard();
@ -272,8 +251,6 @@ public abstract class BaseDashboardServiceTest extends AbstractServiceTest {
pageData = dashboardService.findMobileDashboardsByTenantId(tenantId, pageLink); pageData = dashboardService.findMobileDashboardsByTenantId(tenantId, pageLink);
Assert.assertFalse(pageData.hasNext()); Assert.assertFalse(pageData.hasNext());
Assert.assertTrue(pageData.getData().isEmpty()); Assert.assertTrue(pageData.getData().isEmpty());
tenantService.deleteTenant(tenantId);
} }
@Test @Test
@ -353,12 +330,6 @@ public abstract class BaseDashboardServiceTest extends AbstractServiceTest {
@Test @Test
public void testFindDashboardsByTenantIdAndCustomerId() throws ExecutionException, InterruptedException { public void testFindDashboardsByTenantIdAndCustomerId() throws ExecutionException, InterruptedException {
Tenant tenant = new Tenant();
tenant.setTitle("Test tenant");
tenant = tenantService.saveTenant(tenant);
TenantId tenantId = tenant.getId();
Customer customer = new Customer(); Customer customer = new Customer();
customer.setTitle("Test customer"); customer.setTitle("Test customer");
customer.setTenantId(tenantId); customer.setTenantId(tenantId);
@ -396,8 +367,6 @@ public abstract class BaseDashboardServiceTest extends AbstractServiceTest {
pageData = dashboardService.findDashboardsByTenantIdAndCustomerId(tenantId, customerId, pageLink); pageData = dashboardService.findDashboardsByTenantIdAndCustomerId(tenantId, customerId, pageLink);
Assert.assertFalse(pageData.hasNext()); Assert.assertFalse(pageData.hasNext());
Assert.assertTrue(pageData.getData().isEmpty()); Assert.assertTrue(pageData.getData().isEmpty());
tenantService.deleteTenant(tenantId);
} }
@Test @Test

26
dao/src/test/java/org/thingsboard/server/dao/service/BaseDeviceCredentialsServiceTest.java

@ -16,37 +16,25 @@
package org.thingsboard.server.dao.service; package org.thingsboard.server.dao.service;
import com.datastax.oss.driver.api.core.uuid.Uuids; import com.datastax.oss.driver.api.core.uuid.Uuids;
import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.id.DeviceCredentialsId; import org.thingsboard.server.common.data.id.DeviceCredentialsId;
import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.security.DeviceCredentials; import org.thingsboard.server.common.data.security.DeviceCredentials;
import org.thingsboard.server.common.data.security.DeviceCredentialsType; import org.thingsboard.server.common.data.security.DeviceCredentialsType;
import org.thingsboard.server.dao.device.DeviceCredentialsService;
import org.thingsboard.server.dao.device.DeviceService;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
public abstract class BaseDeviceCredentialsServiceTest extends AbstractServiceTest { public abstract class BaseDeviceCredentialsServiceTest extends AbstractServiceTest {
private TenantId tenantId; @Autowired
DeviceCredentialsService deviceCredentialsService;
@Before @Autowired
public void before() { DeviceService deviceService;
Tenant tenant = new Tenant();
tenant.setTitle("My tenant");
Tenant savedTenant = tenantService.saveTenant(tenant);
Assert.assertNotNull(savedTenant);
tenantId = savedTenant.getId();
}
@After
public void after() {
tenantService.deleteTenant(tenantId);
}
@Test @Test
public void testCreateDeviceCredentials() { public void testCreateDeviceCredentials() {

32
dao/src/test/java/org/thingsboard/server/dao/service/BaseDeviceProfileServiceTest.java

@ -19,24 +19,24 @@ import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.MoreExecutors;
import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore; import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.common.util.ThingsBoardThreadFactory; import org.thingsboard.common.util.ThingsBoardThreadFactory;
import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.DeviceProfile;
import org.thingsboard.server.common.data.DeviceProfileInfo; import org.thingsboard.server.common.data.DeviceProfileInfo;
import org.thingsboard.server.common.data.DeviceTransportType; import org.thingsboard.server.common.data.DeviceTransportType;
import org.thingsboard.server.common.data.OtaPackage; import org.thingsboard.server.common.data.OtaPackage;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.ota.ChecksumAlgorithm; import org.thingsboard.server.common.data.ota.ChecksumAlgorithm;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.dao.device.DeviceProfileService;
import org.thingsboard.server.dao.device.DeviceService;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.ota.OtaPackageService;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.ArrayList; import java.util.ArrayList;
@ -44,7 +44,6 @@ import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
@ -52,25 +51,16 @@ import static org.thingsboard.server.common.data.ota.OtaPackageType.FIRMWARE;
public abstract class BaseDeviceProfileServiceTest extends AbstractServiceTest { public abstract class BaseDeviceProfileServiceTest extends AbstractServiceTest {
@Autowired
DeviceProfileService deviceProfileService;
@Autowired
DeviceService deviceService;
@Autowired
OtaPackageService otaPackageService;
private IdComparator<DeviceProfile> idComparator = new IdComparator<>(); private IdComparator<DeviceProfile> idComparator = new IdComparator<>();
private IdComparator<DeviceProfileInfo> deviceProfileInfoIdComparator = new IdComparator<>(); private IdComparator<DeviceProfileInfo> deviceProfileInfoIdComparator = new IdComparator<>();
private TenantId tenantId;
@Before
public void before() {
Tenant tenant = new Tenant();
tenant.setTitle("My tenant");
Tenant savedTenant = tenantService.saveTenant(tenant);
Assert.assertNotNull(savedTenant);
tenantId = savedTenant.getId();
}
@After
public void after() {
tenantService.deleteTenant(tenantId);
}
@Test @Test
public void testSaveDeviceProfile() { public void testSaveDeviceProfile() {
DeviceProfile deviceProfile = this.createDeviceProfile(tenantId, "Device Profile"); DeviceProfile deviceProfile = this.createDeviceProfile(tenantId, "Device Profile");

52
dao/src/test/java/org/thingsboard/server/dao/service/BaseDeviceServiceTest.java

@ -19,10 +19,9 @@ import com.datastax.oss.driver.api.core.uuid.Uuids;
import org.junit.After; import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.junit.rules.ExpectedException; import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.DeviceInfo; import org.thingsboard.server.common.data.DeviceInfo;
@ -40,26 +39,43 @@ import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.security.DeviceCredentials; import org.thingsboard.server.common.data.security.DeviceCredentials;
import org.thingsboard.server.common.data.security.DeviceCredentialsType; import org.thingsboard.server.common.data.security.DeviceCredentialsType;
import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration; import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration;
import org.thingsboard.server.dao.customer.CustomerService;
import org.thingsboard.server.dao.device.DeviceCredentialsService;
import org.thingsboard.server.dao.device.DeviceProfileService;
import org.thingsboard.server.dao.device.DeviceService;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.ota.OtaPackageService;
import org.thingsboard.server.dao.tenant.TenantProfileService;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.thingsboard.server.common.data.ota.OtaPackageType.FIRMWARE; import static org.thingsboard.server.common.data.ota.OtaPackageType.FIRMWARE;
import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
public abstract class BaseDeviceServiceTest extends AbstractServiceTest { public abstract class BaseDeviceServiceTest extends AbstractServiceTest {
private IdComparator<Device> idComparator = new IdComparator<>(); @Autowired
CustomerService customerService;
@Autowired
DeviceCredentialsService deviceCredentialsService;
@Autowired
DeviceProfileService deviceProfileService;
@Autowired
DeviceService deviceService;
@Autowired
OtaPackageService otaPackageService;
@Autowired
TenantProfileService tenantProfileService;
private TenantId tenantId; private IdComparator<Device> idComparator = new IdComparator<>();
private TenantId anotherTenantId; private TenantId anotherTenantId;
@Before @Before
public void before() { public void before() {
tenantId = createTenant();
anotherTenantId = createTenant(); anotherTenantId = createTenant();
} }
@ -72,10 +88,6 @@ public abstract class BaseDeviceServiceTest extends AbstractServiceTest {
tenantProfileService.deleteTenantProfiles(anotherTenantId); tenantProfileService.deleteTenantProfiles(anotherTenantId);
} }
@SuppressWarnings("deprecation")
@Rule
public ExpectedException thrown = ExpectedException.none();
@Test @Test
public void testSaveDevicesWithoutMaxDeviceLimit() { public void testSaveDevicesWithoutMaxDeviceLimit() {
Device device = this.saveDevice(tenantId, "My device"); Device device = this.saveDevice(tenantId, "My device");
@ -244,9 +256,9 @@ public abstract class BaseDeviceServiceTest extends AbstractServiceTest {
savedDevice.setFirmwareId(savedFirmware.getId()); savedDevice.setFirmwareId(savedFirmware.getId());
thrown.expect(DataValidationException.class); assertThatThrownBy(() -> deviceService.saveDevice(savedDevice))
thrown.expectMessage("Can't assign firmware with different deviceProfile!"); .isInstanceOf(DataValidationException.class)
deviceService.saveDevice(savedDevice); .hasMessageContaining("Can't assign firmware with different deviceProfile!");
} }
@Test @Test
@ -389,12 +401,6 @@ public abstract class BaseDeviceServiceTest extends AbstractServiceTest {
@Test @Test
public void testFindDevicesByTenantId() { public void testFindDevicesByTenantId() {
Tenant tenant = new Tenant();
tenant.setTitle("Test tenant");
tenant = tenantService.saveTenant(tenant);
TenantId tenantId = tenant.getId();
List<Device> devices = new ArrayList<>(); List<Device> devices = new ArrayList<>();
for (int i = 0; i < 178; i++) { for (int i = 0; i < 178; i++) {
Device device = new Device(); Device device = new Device();
@ -426,8 +432,6 @@ public abstract class BaseDeviceServiceTest extends AbstractServiceTest {
pageData = deviceService.findDevicesByTenantId(tenantId, pageLink); pageData = deviceService.findDevicesByTenantId(tenantId, pageLink);
Assert.assertFalse(pageData.hasNext()); Assert.assertFalse(pageData.hasNext());
Assert.assertTrue(pageData.getData().isEmpty()); Assert.assertTrue(pageData.getData().isEmpty());
tenantService.deleteTenant(tenantId);
} }
@Test @Test
@ -588,12 +592,6 @@ public abstract class BaseDeviceServiceTest extends AbstractServiceTest {
@Test @Test
public void testFindDevicesByTenantIdAndCustomerId() { public void testFindDevicesByTenantIdAndCustomerId() {
Tenant tenant = new Tenant();
tenant.setTitle("Test tenant");
tenant = tenantService.saveTenant(tenant);
TenantId tenantId = tenant.getId();
Customer customer = new Customer(); Customer customer = new Customer();
customer.setTitle("Test customer"); customer.setTitle("Test customer");
customer.setTenantId(tenantId); customer.setTenantId(tenantId);
@ -632,8 +630,6 @@ public abstract class BaseDeviceServiceTest extends AbstractServiceTest {
pageData = deviceService.findDeviceInfosByTenantIdAndCustomerId(tenantId, customerId, pageLink); pageData = deviceService.findDeviceInfosByTenantIdAndCustomerId(tenantId, customerId, pageLink);
Assert.assertFalse(pageData.hasNext()); Assert.assertFalse(pageData.hasNext());
Assert.assertTrue(pageData.getData().isEmpty()); Assert.assertTrue(pageData.getData().isEmpty());
tenantService.deleteTenant(tenantId);
} }
@Test @Test

9
dao/src/test/java/org/thingsboard/server/dao/service/BaseEdgeEventServiceTest.java

@ -21,6 +21,7 @@ import com.google.common.util.concurrent.ListenableFuture;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.server.common.data.edge.EdgeEvent; import org.thingsboard.server.common.data.edge.EdgeEvent;
import org.thingsboard.server.common.data.edge.EdgeEventActionType; import org.thingsboard.server.common.data.edge.EdgeEventActionType;
import org.thingsboard.server.common.data.edge.EdgeEventType; import org.thingsboard.server.common.data.edge.EdgeEventType;
@ -32,20 +33,20 @@ import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.SortOrder; import org.thingsboard.server.common.data.page.SortOrder;
import org.thingsboard.server.common.data.page.TimePageLink; import org.thingsboard.server.common.data.page.TimePageLink;
import org.thingsboard.server.dao.edge.EdgeEventService;
import java.io.IOException; import java.io.IOException;
import java.text.ParseException; import java.text.ParseException;
import java.time.LocalDateTime;
import java.time.Month;
import java.time.ZoneOffset;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit;
import static org.apache.commons.lang3.time.DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT; import static org.apache.commons.lang3.time.DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT;
public abstract class BaseEdgeEventServiceTest extends AbstractServiceTest { public abstract class BaseEdgeEventServiceTest extends AbstractServiceTest {
@Autowired
EdgeEventService edgeEventService;
long timeBeforeStartTime; long timeBeforeStartTime;
long startTime; long startTime;
long eventTime; long eventTime;

45
dao/src/test/java/org/thingsboard/server/dao/service/BaseEdgeServiceTest.java

@ -17,11 +17,10 @@ package org.thingsboard.server.dao.service;
import com.datastax.oss.driver.api.core.uuid.Uuids; import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.EntitySubtype; import org.thingsboard.server.common.data.EntitySubtype;
@ -36,7 +35,10 @@ import org.thingsboard.server.common.data.rule.RuleChain;
import org.thingsboard.server.common.data.rule.RuleChainMetaData; import org.thingsboard.server.common.data.rule.RuleChainMetaData;
import org.thingsboard.server.common.data.rule.RuleChainType; import org.thingsboard.server.common.data.rule.RuleChainType;
import org.thingsboard.server.common.data.rule.RuleNode; import org.thingsboard.server.common.data.rule.RuleNode;
import org.thingsboard.server.dao.customer.CustomerService;
import org.thingsboard.server.dao.edge.EdgeService;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.rule.RuleChainService;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@ -47,23 +49,14 @@ import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
public abstract class BaseEdgeServiceTest extends AbstractServiceTest { public abstract class BaseEdgeServiceTest extends AbstractServiceTest {
private IdComparator<Edge> idComparator = new IdComparator<>(); @Autowired
CustomerService customerService;
private TenantId tenantId; @Autowired
EdgeService edgeService;
@Before @Autowired
public void before() { RuleChainService ruleChainService;
Tenant tenant = new Tenant();
tenant.setTitle("My tenant");
Tenant savedTenant = tenantService.saveTenant(tenant);
Assert.assertNotNull(savedTenant);
tenantId = savedTenant.getId();
}
@After private IdComparator<Edge> idComparator = new IdComparator<>();
public void after() {
tenantService.deleteTenant(tenantId);
}
@Test @Test
public void testSaveEdge() { public void testSaveEdge() {
@ -204,12 +197,6 @@ public abstract class BaseEdgeServiceTest extends AbstractServiceTest {
@Test @Test
public void testFindEdgesByTenantId() { public void testFindEdgesByTenantId() {
Tenant tenant = new Tenant();
tenant.setTitle("Test tenant");
tenant = tenantService.saveTenant(tenant);
TenantId tenantId = tenant.getId();
List<Edge> edges = new ArrayList<>(); List<Edge> edges = new ArrayList<>();
for (int i = 0; i < 178; i++) { for (int i = 0; i < 178; i++) {
Edge edge = constructEdge(tenantId, "Edge " + i, "default"); Edge edge = constructEdge(tenantId, "Edge " + i, "default");
@ -238,8 +225,6 @@ public abstract class BaseEdgeServiceTest extends AbstractServiceTest {
pageData = edgeService.findEdgesByTenantId(tenantId, pageLink); pageData = edgeService.findEdgesByTenantId(tenantId, pageLink);
Assert.assertFalse(pageData.hasNext()); Assert.assertFalse(pageData.hasNext());
Assert.assertTrue(pageData.getData().isEmpty()); Assert.assertTrue(pageData.getData().isEmpty());
tenantService.deleteTenant(tenantId);
} }
@Test @Test
@ -388,12 +373,6 @@ public abstract class BaseEdgeServiceTest extends AbstractServiceTest {
@Test @Test
public void testFindEdgesByTenantIdAndCustomerId() { public void testFindEdgesByTenantIdAndCustomerId() {
Tenant tenant = new Tenant();
tenant.setTitle("Test tenant");
tenant = tenantService.saveTenant(tenant);
TenantId tenantId = tenant.getId();
Customer customer = new Customer(); Customer customer = new Customer();
customer.setTitle("Test customer"); customer.setTitle("Test customer");
customer.setTenantId(tenantId); customer.setTenantId(tenantId);
@ -429,8 +408,6 @@ public abstract class BaseEdgeServiceTest extends AbstractServiceTest {
pageData = edgeService.findEdgesByTenantIdAndCustomerId(tenantId, customerId, pageLink); pageData = edgeService.findEdgesByTenantIdAndCustomerId(tenantId, customerId, pageLink);
Assert.assertFalse(pageData.hasNext()); Assert.assertFalse(pageData.hasNext());
Assert.assertTrue(pageData.getData().isEmpty()); Assert.assertTrue(pageData.getData().isEmpty());
tenantService.deleteTenant(tenantId);
} }
@Test @Test

2
dao/src/test/java/org/thingsboard/server/dao/service/BaseEntityServiceRegistryTest.java

@ -28,7 +28,7 @@ import org.thingsboard.server.dao.rule.RuleChainService;
public abstract class BaseEntityServiceRegistryTest extends AbstractServiceTest { public abstract class BaseEntityServiceRegistryTest extends AbstractServiceTest {
@Autowired @Autowired
private EntityServiceRegistry entityServiceRegistry; EntityServiceRegistry entityServiceRegistry;
@Test @Test
public void givenAllEntityTypes_whenGetServiceByEntityTypeCalled_thenAllBeansExists() { public void givenAllEntityTypes_whenGetServiceByEntityTypeCalled_thenAllBeansExists() {

43
dao/src/test/java/org/thingsboard/server/dao/service/BaseEntityServiceTest.java

@ -21,9 +21,7 @@ import com.google.common.util.concurrent.ListenableFuture;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomUtils; import org.apache.commons.lang3.RandomUtils;
import org.hamcrest.Matchers; import org.hamcrest.Matchers;
import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.ResultSetExtractor; import org.springframework.jdbc.core.ResultSetExtractor;
@ -31,7 +29,6 @@ import org.thingsboard.server.common.data.DataConstants;
import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.asset.Asset; import org.thingsboard.server.common.data.asset.Asset;
import org.thingsboard.server.common.data.edge.Edge; import org.thingsboard.server.common.data.edge.Edge;
import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.CustomerId;
@ -73,8 +70,13 @@ import org.thingsboard.server.common.data.relation.EntityRelation;
import org.thingsboard.server.common.data.relation.EntitySearchDirection; import org.thingsboard.server.common.data.relation.EntitySearchDirection;
import org.thingsboard.server.common.data.relation.RelationEntityTypeFilter; import org.thingsboard.server.common.data.relation.RelationEntityTypeFilter;
import org.thingsboard.server.common.data.relation.RelationTypeGroup; import org.thingsboard.server.common.data.relation.RelationTypeGroup;
import org.thingsboard.server.dao.asset.AssetService;
import org.thingsboard.server.dao.attributes.AttributesService; import org.thingsboard.server.dao.attributes.AttributesService;
import org.thingsboard.server.dao.device.DeviceService;
import org.thingsboard.server.dao.edge.EdgeService;
import org.thingsboard.server.dao.entity.EntityService;
import org.thingsboard.server.dao.model.sqlts.ts.TsKvEntity; import org.thingsboard.server.dao.model.sqlts.ts.TsKvEntity;
import org.thingsboard.server.dao.relation.RelationService;
import org.thingsboard.server.dao.sql.relation.RelationRepository; import org.thingsboard.server.dao.sql.relation.RelationRepository;
import org.thingsboard.server.dao.timeseries.TimeseriesService; import org.thingsboard.server.dao.timeseries.TimeseriesService;
@ -100,30 +102,21 @@ public abstract class BaseEntityServiceTest extends AbstractServiceTest {
static final int ENTITY_COUNT = 5; static final int ENTITY_COUNT = 5;
@Autowired @Autowired
private AttributesService attributesService; AssetService assetService;
@Autowired @Autowired
private TimeseriesService timeseriesService; AttributesService attributesService;
private TenantId tenantId;
@Autowired @Autowired
private RelationRepository relationRepository; DeviceService deviceService;
@Autowired
@Before EdgeService edgeService;
public void before() { @Autowired
Tenant tenant = new Tenant(); EntityService entityService;
tenant.setTitle("My tenant"); @Autowired
Tenant savedTenant = tenantService.saveTenant(tenant); RelationRepository relationRepository;
Assert.assertNotNull(savedTenant); @Autowired
tenantId = savedTenant.getId(); RelationService relationService;
} @Autowired
TimeseriesService timeseriesService;
@After
public void after() {
tenantService.deleteTenant(tenantId);
}
@Test @Test
public void testCountEntitiesByQuery() throws InterruptedException { public void testCountEntitiesByQuery() throws InterruptedException {

157
dao/src/test/java/org/thingsboard/server/dao/service/BaseOtaPackageServiceTest.java

@ -19,16 +19,14 @@ import com.datastax.oss.driver.api.core.uuid.Uuids;
import org.junit.After; import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.rules.ExpectedException; import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.DeviceProfile;
import org.thingsboard.server.common.data.OtaPackage; import org.thingsboard.server.common.data.OtaPackage;
import org.thingsboard.server.common.data.OtaPackageInfo; import org.thingsboard.server.common.data.OtaPackageInfo;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.TenantProfile; import org.thingsboard.server.common.data.TenantProfile;
import org.thingsboard.server.common.data.id.DeviceProfileId; import org.thingsboard.server.common.data.id.DeviceProfileId;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
@ -36,7 +34,11 @@ import org.thingsboard.server.common.data.ota.ChecksumAlgorithm;
import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration; import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration;
import org.thingsboard.server.dao.device.DeviceProfileService;
import org.thingsboard.server.dao.device.DeviceService;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.ota.OtaPackageService;
import org.thingsboard.server.dao.tenant.TenantProfileService;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.ArrayList; import java.util.ArrayList;
@ -44,6 +46,7 @@ import java.util.Collections;
import java.util.List; import java.util.List;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.thingsboard.server.common.data.ota.OtaPackageType.FIRMWARE; import static org.thingsboard.server.common.data.ota.OtaPackageType.FIRMWARE;
public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest { public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
@ -60,28 +63,25 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
private final IdComparator<OtaPackageInfo> idComparator = new IdComparator<>(); private final IdComparator<OtaPackageInfo> idComparator = new IdComparator<>();
private TenantId tenantId;
private DeviceProfileId deviceProfileId; private DeviceProfileId deviceProfileId;
@Autowired
DeviceProfileService deviceProfileService;
@Autowired
DeviceService deviceService;
@Autowired
OtaPackageService otaPackageService;
@Autowired
TenantProfileService tenantProfileService;
@Before @Before
public void before() { public void before() {
Tenant tenant = new Tenant();
tenant.setTitle("My tenant");
Tenant savedTenant = tenantService.saveTenant(tenant);
Assert.assertNotNull(savedTenant);
tenantId = savedTenant.getId();
DeviceProfile deviceProfile = this.createDeviceProfile(tenantId, "Device Profile"); DeviceProfile deviceProfile = this.createDeviceProfile(tenantId, "Device Profile");
DeviceProfile savedDeviceProfile = deviceProfileService.saveDeviceProfile(deviceProfile); DeviceProfile savedDeviceProfile = deviceProfileService.saveDeviceProfile(deviceProfile);
Assert.assertNotNull(savedDeviceProfile); Assert.assertNotNull(savedDeviceProfile);
deviceProfileId = savedDeviceProfile.getId(); deviceProfileId = savedDeviceProfile.getId();
} }
@SuppressWarnings("deprecation")
@Rule
public ExpectedException thrown = ExpectedException.none();
@After @After
public void after() { public void after() {
tenantService.deleteTenant(tenantId); tenantService.deleteTenant(tenantId);
@ -99,9 +99,9 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
createAndSaveFirmware(tenantId, "1"); createAndSaveFirmware(tenantId, "1");
Assert.assertEquals(1, otaPackageService.sumDataSizeByTenantId(tenantId)); Assert.assertEquals(1, otaPackageService.sumDataSizeByTenantId(tenantId));
thrown.expect(DataValidationException.class); assertThatThrownBy(() -> createAndSaveFirmware(tenantId, "2"))
thrown.expectMessage(String.format("Failed to create the ota package, files size limit is exhausted %d bytes!", DATA_SIZE)); .isInstanceOf(DataValidationException.class)
createAndSaveFirmware(tenantId, "2"); .hasMessageContaining("Failed to create the ota package, files size limit is exhausted %d bytes!", DATA_SIZE);
} }
@Test @Test
@ -243,9 +243,9 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
firmware.setChecksum(CHECKSUM); firmware.setChecksum(CHECKSUM);
firmware.setData(DATA); firmware.setData(DATA);
thrown.expect(DataValidationException.class); assertThatThrownBy(() -> otaPackageService.saveOtaPackage(firmware))
thrown.expectMessage("OtaPackage should be assigned to tenant!"); .isInstanceOf(DataValidationException.class)
otaPackageService.saveOtaPackage(firmware); .hasMessageContaining("OtaPackage should be assigned to tenant!");
} }
@Test @Test
@ -261,9 +261,9 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
firmware.setChecksum(CHECKSUM); firmware.setChecksum(CHECKSUM);
firmware.setData(DATA); firmware.setData(DATA);
thrown.expect(DataValidationException.class); assertThatThrownBy(() -> otaPackageService.saveOtaPackage(firmware))
thrown.expectMessage("Type should be specified!"); .isInstanceOf(DataValidationException.class)
otaPackageService.saveOtaPackage(firmware); .hasMessageContaining("Type should be specified!");
} }
@Test @Test
@ -279,9 +279,9 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
firmware.setChecksum(CHECKSUM); firmware.setChecksum(CHECKSUM);
firmware.setData(DATA); firmware.setData(DATA);
thrown.expect(DataValidationException.class); assertThatThrownBy(() -> otaPackageService.saveOtaPackage(firmware))
thrown.expectMessage("OtaPackage title should be specified!"); .isInstanceOf(DataValidationException.class)
otaPackageService.saveOtaPackage(firmware); .hasMessageContaining("OtaPackage title should be specified!");
} }
@Test @Test
@ -297,9 +297,9 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
firmware.setChecksum(CHECKSUM); firmware.setChecksum(CHECKSUM);
firmware.setData(DATA); firmware.setData(DATA);
thrown.expect(DataValidationException.class); assertThatThrownBy(() -> otaPackageService.saveOtaPackage(firmware))
thrown.expectMessage("OtaPackage file name should be specified!"); .isInstanceOf(DataValidationException.class)
otaPackageService.saveOtaPackage(firmware); .hasMessageContaining("OtaPackage file name should be specified!");
} }
@Test @Test
@ -315,9 +315,9 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
firmware.setChecksum(CHECKSUM); firmware.setChecksum(CHECKSUM);
firmware.setData(DATA); firmware.setData(DATA);
thrown.expect(DataValidationException.class); assertThatThrownBy(() -> otaPackageService.saveOtaPackage(firmware))
thrown.expectMessage("OtaPackage content type should be specified!"); .isInstanceOf(DataValidationException.class)
otaPackageService.saveOtaPackage(firmware); .hasMessageContaining("OtaPackage content type should be specified!");
} }
@Test @Test
@ -333,9 +333,9 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
firmware.setChecksumAlgorithm(CHECKSUM_ALGORITHM); firmware.setChecksumAlgorithm(CHECKSUM_ALGORITHM);
firmware.setChecksum(CHECKSUM); firmware.setChecksum(CHECKSUM);
thrown.expect(DataValidationException.class); assertThatThrownBy(() -> otaPackageService.saveOtaPackage(firmware))
thrown.expectMessage("OtaPackage data should be specified!"); .isInstanceOf(DataValidationException.class)
otaPackageService.saveOtaPackage(firmware); .hasMessageContaining("OtaPackage data should be specified!");
} }
@Test @Test
@ -352,9 +352,9 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
firmware.setChecksum(CHECKSUM); firmware.setChecksum(CHECKSUM);
firmware.setData(DATA); firmware.setData(DATA);
thrown.expect(DataValidationException.class); assertThatThrownBy(() -> otaPackageService.saveOtaPackage(firmware))
thrown.expectMessage("OtaPackage is referencing to non-existent tenant!"); .isInstanceOf(DataValidationException.class)
otaPackageService.saveOtaPackage(firmware); .hasMessageContaining("OtaPackage is referencing to non-existent tenant!");
} }
@Test @Test
@ -371,9 +371,9 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
firmware.setChecksum(CHECKSUM); firmware.setChecksum(CHECKSUM);
firmware.setData(DATA); firmware.setData(DATA);
thrown.expect(DataValidationException.class); assertThatThrownBy(() -> otaPackageService.saveOtaPackage(firmware))
thrown.expectMessage("OtaPackage is referencing to non-existent device profile!"); .isInstanceOf(DataValidationException.class)
otaPackageService.saveOtaPackage(firmware); .hasMessageContaining("OtaPackage is referencing to non-existent device profile!");
} }
@Test @Test
@ -389,9 +389,9 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
firmware.setChecksumAlgorithm(CHECKSUM_ALGORITHM); firmware.setChecksumAlgorithm(CHECKSUM_ALGORITHM);
firmware.setData(DATA); firmware.setData(DATA);
thrown.expect(DataValidationException.class); assertThatThrownBy(() -> otaPackageService.saveOtaPackage(firmware))
thrown.expectMessage("OtaPackage checksum should be specified!"); .isInstanceOf(DataValidationException.class)
otaPackageService.saveOtaPackage(firmware); .hasMessageContaining("OtaPackage checksum should be specified!");
} }
@Test @Test
@ -411,17 +411,17 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
newFirmwareInfo.setTitle(TITLE); newFirmwareInfo.setTitle(TITLE);
newFirmwareInfo.setVersion(VERSION); newFirmwareInfo.setVersion(VERSION);
thrown.expect(DataValidationException.class); assertThatThrownBy(() -> otaPackageService.saveOtaPackageInfo(newFirmwareInfo, false))
thrown.expectMessage("OtaPackage with such title and version already exists!"); .isInstanceOf(DataValidationException.class)
otaPackageService.saveOtaPackageInfo(newFirmwareInfo, false); .hasMessageContaining("OtaPackage with such title and version already exists!");
} }
@Test @Test
public void testSaveFirmwareWithExistingTitleAndVersion() { public void testSaveFirmwareWithExistingTitleAndVersion() {
createAndSaveFirmware(tenantId, VERSION); createAndSaveFirmware(tenantId, VERSION);
thrown.expect(DataValidationException.class); assertThatThrownBy(() -> createAndSaveFirmware(tenantId, VERSION))
thrown.expectMessage("OtaPackage with such title and version already exists!"); .isInstanceOf(DataValidationException.class)
createAndSaveFirmware(tenantId, VERSION); .hasMessageContaining("OtaPackage with such title and version already exists!");
} }
@Test @Test
@ -436,9 +436,9 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
Device savedDevice = deviceService.saveDevice(device); Device savedDevice = deviceService.saveDevice(device);
try { try {
thrown.expect(DataValidationException.class); assertThatThrownBy(() -> otaPackageService.deleteOtaPackage(tenantId, savedFirmware.getId()))
thrown.expectMessage("The otaPackage referenced by the devices cannot be deleted!"); .isInstanceOf(DataValidationException.class)
otaPackageService.deleteOtaPackage(tenantId, savedFirmware.getId()); .hasMessageContaining("The otaPackage referenced by the devices cannot be deleted!");
} finally { } finally {
deviceService.deleteDevice(tenantId, savedDevice.getId()); deviceService.deleteDevice(tenantId, savedDevice.getId());
otaPackageService.deleteOtaPackage(tenantId, savedFirmware.getId()); otaPackageService.deleteOtaPackage(tenantId, savedFirmware.getId());
@ -448,12 +448,12 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
@Test @Test
public void testUpdateDeviceProfileId() { public void testUpdateDeviceProfileId() {
OtaPackage savedFirmware = createAndSaveFirmware(tenantId, VERSION); OtaPackage savedFirmware = createAndSaveFirmware(tenantId, VERSION);
savedFirmware.setDeviceProfileId(null);
try { try {
thrown.expect(DataValidationException.class); assertThatThrownBy(() -> otaPackageService.saveOtaPackage(savedFirmware))
thrown.expectMessage("Updating otaPackage deviceProfile is prohibited!"); .isInstanceOf(DataValidationException.class)
savedFirmware.setDeviceProfileId(null); .hasMessageContaining("Updating otaPackage deviceProfile is prohibited!");
otaPackageService.saveOtaPackage(savedFirmware);
} finally { } finally {
otaPackageService.deleteOtaPackage(tenantId, savedFirmware.getId()); otaPackageService.deleteOtaPackage(tenantId, savedFirmware.getId());
} }
@ -482,9 +482,9 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
deviceProfileService.saveDeviceProfile(savedDeviceProfile); deviceProfileService.saveDeviceProfile(savedDeviceProfile);
try { try {
thrown.expect(DataValidationException.class); assertThatThrownBy(() -> otaPackageService.deleteOtaPackage(tenantId, savedFirmware.getId()))
thrown.expectMessage("The otaPackage referenced by the device profile cannot be deleted!"); .isInstanceOf(DataValidationException.class)
otaPackageService.deleteOtaPackage(tenantId, savedFirmware.getId()); .hasMessageContaining("The otaPackage referenced by the device profile cannot be deleted!");
} finally { } finally {
deviceProfileService.deleteDeviceProfile(tenantId, savedDeviceProfile.getId()); deviceProfileService.deleteDeviceProfile(tenantId, savedDeviceProfile.getId());
} }
@ -636,12 +636,18 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
firmwareInfo.setType(FIRMWARE); firmwareInfo.setType(FIRMWARE);
firmwareInfo.setTitle(TITLE); firmwareInfo.setTitle(TITLE);
firmwareInfo.setVersion(VERSION); firmwareInfo.setVersion(VERSION);
firmwareInfo.setUrl(" "); firmwareInfo.setUrl(" ");
thrown.expect(DataValidationException.class); assertThatThrownBy(() -> otaPackageService.saveOtaPackageInfo(firmwareInfo, true))
thrown.expectMessage("Ota package URL should be specified!"); .as("firmwareInfo url set whitespaces")
otaPackageService.saveOtaPackageInfo(firmwareInfo, true); .isInstanceOf(DataValidationException.class)
.hasMessageContaining("Ota package URL should be specified!");
firmwareInfo.setUrl(""); firmwareInfo.setUrl("");
otaPackageService.saveOtaPackageInfo(firmwareInfo, true); assertThatThrownBy(() -> otaPackageService.saveOtaPackageInfo(firmwareInfo, true))
.as("firmwareInfo url is empty")
.isInstanceOf(DataValidationException.class)
.hasMessageContaining("Ota package URL should be specified!");
} }
@Test @Test
@ -655,12 +661,10 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
firmwareInfo.setTenantId(tenantId); firmwareInfo.setTenantId(tenantId);
OtaPackageInfo savedFirmwareInfo = otaPackageService.saveOtaPackageInfo(firmwareInfo, true); OtaPackageInfo savedFirmwareInfo = otaPackageService.saveOtaPackageInfo(firmwareInfo, true);
thrown.expect(DataValidationException.class);
thrown.expectMessage("Updating otaPackage URL is prohibited!");
savedFirmwareInfo.setUrl("https://newurl.com"); savedFirmwareInfo.setUrl("https://newurl.com");
otaPackageService.saveOtaPackageInfo(savedFirmwareInfo, true); assertThatThrownBy(() -> otaPackageService.saveOtaPackageInfo(savedFirmwareInfo, true))
.isInstanceOf(DataValidationException.class)
.hasMessageContaining("Updating otaPackage URL is prohibited!");
} }
@Test @Test
@ -673,10 +677,9 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
firmwareInfo.setUrl(URL); firmwareInfo.setUrl(URL);
firmwareInfo.setTenantId(tenantId); firmwareInfo.setTenantId(tenantId);
thrown.expect(DataValidationException.class); assertThatThrownBy(() -> otaPackageService.saveOtaPackageInfo(firmwareInfo, true))
thrown.expectMessage("title length must be equal or less than 255"); .isInstanceOf(DataValidationException.class)
.hasMessageContaining("title length must be equal or less than 255");
otaPackageService.saveOtaPackageInfo(firmwareInfo, true);
} }
@Test @Test
@ -687,11 +690,11 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest {
firmwareInfo.setUrl(URL); firmwareInfo.setUrl(URL);
firmwareInfo.setTenantId(tenantId); firmwareInfo.setTenantId(tenantId);
firmwareInfo.setTitle(TITLE); firmwareInfo.setTitle(TITLE);
firmwareInfo.setVersion(StringUtils.random(257)); firmwareInfo.setVersion(StringUtils.random(257));
thrown.expectMessage("version length must be equal or less than 255");
otaPackageService.saveOtaPackageInfo(firmwareInfo, true); assertThatThrownBy(() -> otaPackageService.saveOtaPackageInfo(firmwareInfo, true))
.isInstanceOf(DataValidationException.class)
.hasMessageContaining("version length must be equal or less than 255");
} }
private OtaPackage createAndSaveFirmware(TenantId tenantId, String version) { private OtaPackage createAndSaveFirmware(TenantId tenantId, String version) {

10
dao/src/test/java/org/thingsboard/server/dao/service/BaseQueueServiceTest.java

@ -20,6 +20,7 @@ import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.server.common.data.DataConstants; import org.thingsboard.server.common.data.DataConstants;
import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.TenantProfile; import org.thingsboard.server.common.data.TenantProfile;
@ -35,6 +36,8 @@ import org.thingsboard.server.common.data.queue.SubmitStrategyType;
import org.thingsboard.server.common.data.tenant.profile.TenantProfileData; import org.thingsboard.server.common.data.tenant.profile.TenantProfileData;
import org.thingsboard.server.common.data.tenant.profile.TenantProfileQueueConfiguration; import org.thingsboard.server.common.data.tenant.profile.TenantProfileQueueConfiguration;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.queue.QueueService;
import org.thingsboard.server.dao.tenant.TenantProfileService;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@ -42,6 +45,11 @@ import java.util.List;
public abstract class BaseQueueServiceTest extends AbstractServiceTest { public abstract class BaseQueueServiceTest extends AbstractServiceTest {
@Autowired
TenantProfileService tenantProfileService;
@Autowired
QueueService queueService;
private IdComparator<Queue> idComparator = new IdComparator<>(); private IdComparator<Queue> idComparator = new IdComparator<>();
private TenantId tenantId; private TenantId tenantId;
@ -83,7 +91,7 @@ public abstract class BaseQueueServiceTest extends AbstractServiceTest {
Tenant tenant = new Tenant(); Tenant tenant = new Tenant();
tenant.setTitle("My tenant"); tenant.setTitle("My tenant");
tenant.setTenantProfileId(tenantProfileId); tenant.setTenantProfileId(tenantProfileId); //custom profile
Tenant savedTenant = tenantService.saveTenant(tenant); Tenant savedTenant = tenantService.saveTenant(tenant);
Assert.assertNotNull(savedTenant); Assert.assertNotNull(savedTenant);
tenantId = savedTenant.getId(); tenantId = savedTenant.getId();

5
dao/src/test/java/org/thingsboard/server/dao/service/BaseRelationServiceTest.java

@ -23,6 +23,7 @@ import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.id.AssetId; import org.thingsboard.server.common.data.id.AssetId;
import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.DeviceId;
@ -33,6 +34,7 @@ import org.thingsboard.server.common.data.relation.RelationEntityTypeFilter;
import org.thingsboard.server.common.data.relation.RelationTypeGroup; import org.thingsboard.server.common.data.relation.RelationTypeGroup;
import org.thingsboard.server.common.data.relation.RelationsSearchParameters; import org.thingsboard.server.common.data.relation.RelationsSearchParameters;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.relation.RelationService;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@ -42,6 +44,9 @@ import java.util.concurrent.ExecutionException;
public abstract class BaseRelationServiceTest extends AbstractServiceTest { public abstract class BaseRelationServiceTest extends AbstractServiceTest {
@Autowired
RelationService relationService;
@Before @Before
public void before() { public void before() {
} }

34
dao/src/test/java/org/thingsboard/server/dao/service/BaseRuleChainServiceTest.java

@ -17,11 +17,10 @@ package org.thingsboard.server.dao.service;
import com.datastax.oss.driver.api.core.uuid.Uuids; import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.edge.Edge; import org.thingsboard.server.common.data.edge.Edge;
@ -34,7 +33,9 @@ import org.thingsboard.server.common.data.rule.RuleChain;
import org.thingsboard.server.common.data.rule.RuleChainMetaData; import org.thingsboard.server.common.data.rule.RuleChainMetaData;
import org.thingsboard.server.common.data.rule.RuleChainType; import org.thingsboard.server.common.data.rule.RuleChainType;
import org.thingsboard.server.common.data.rule.RuleNode; import org.thingsboard.server.common.data.rule.RuleNode;
import org.thingsboard.server.dao.edge.EdgeService;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.rule.RuleChainService;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@ -46,25 +47,14 @@ import java.util.List;
*/ */
public abstract class BaseRuleChainServiceTest extends AbstractServiceTest { public abstract class BaseRuleChainServiceTest extends AbstractServiceTest {
@Autowired
EdgeService edgeService;
@Autowired
RuleChainService ruleChainService;
private IdComparator<RuleChain> idComparator = new IdComparator<>(); private IdComparator<RuleChain> idComparator = new IdComparator<>();
private IdComparator<RuleNode> ruleNodeIdComparator = new IdComparator<>(); private IdComparator<RuleNode> ruleNodeIdComparator = new IdComparator<>();
private TenantId tenantId;
@Before
public void before() {
Tenant tenant = new Tenant();
tenant.setTitle("My tenant");
Tenant savedTenant = tenantService.saveTenant(tenant);
Assert.assertNotNull(savedTenant);
tenantId = savedTenant.getId();
}
@After
public void after() {
tenantService.deleteTenant(tenantId);
}
@Test @Test
public void testSaveRuleChain() throws IOException { public void testSaveRuleChain() throws IOException {
RuleChain ruleChain = new RuleChain(); RuleChain ruleChain = new RuleChain();
@ -133,12 +123,6 @@ public abstract class BaseRuleChainServiceTest extends AbstractServiceTest {
@Test @Test
public void testFindRuleChainsByTenantId() { public void testFindRuleChainsByTenantId() {
Tenant tenant = new Tenant();
tenant.setTitle("Test tenant");
tenant = tenantService.saveTenant(tenant);
TenantId tenantId = tenant.getId();
List<RuleChain> ruleChains = new ArrayList<>(); List<RuleChain> ruleChains = new ArrayList<>();
for (int i = 0; i < 165; i++) { for (int i = 0; i < 165; i++) {
RuleChain ruleChain = new RuleChain(); RuleChain ruleChain = new RuleChain();
@ -169,8 +153,6 @@ public abstract class BaseRuleChainServiceTest extends AbstractServiceTest {
pageData = ruleChainService.findTenantRuleChainsByType(tenantId, RuleChainType.CORE, pageLink); pageData = ruleChainService.findTenantRuleChainsByType(tenantId, RuleChainType.CORE, pageLink);
Assert.assertFalse(pageData.hasNext()); Assert.assertFalse(pageData.hasNext());
Assert.assertTrue(pageData.getData().isEmpty()); Assert.assertTrue(pageData.getData().isEmpty());
tenantService.deleteTenant(tenantId);
} }
@Test @Test

14
dao/src/test/java/org/thingsboard/server/dao/service/BaseTenantProfileServiceTest.java

@ -18,8 +18,10 @@ package org.thingsboard.server.dao.service;
import com.fasterxml.jackson.databind.node.NullNode; import com.fasterxml.jackson.databind.node.NullNode;
import org.junit.After; import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.server.common.data.DataConstants; import org.thingsboard.server.common.data.DataConstants;
import org.thingsboard.server.common.data.EntityInfo; import org.thingsboard.server.common.data.EntityInfo;
import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.Tenant;
@ -36,6 +38,7 @@ import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileCon
import org.thingsboard.server.common.data.tenant.profile.TenantProfileData; import org.thingsboard.server.common.data.tenant.profile.TenantProfileData;
import org.thingsboard.server.common.data.tenant.profile.TenantProfileQueueConfiguration; import org.thingsboard.server.common.data.tenant.profile.TenantProfileQueueConfiguration;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.tenant.TenantProfileService;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@ -44,9 +47,20 @@ import java.util.stream.Collectors;
public abstract class BaseTenantProfileServiceTest extends AbstractServiceTest { public abstract class BaseTenantProfileServiceTest extends AbstractServiceTest {
@Autowired
TenantProfileService tenantProfileService;
private IdComparator<TenantProfile> idComparator = new IdComparator<>(); private IdComparator<TenantProfile> idComparator = new IdComparator<>();
private IdComparator<EntityInfo> tenantProfileInfoIdComparator = new IdComparator<>(); private IdComparator<EntityInfo> tenantProfileInfoIdComparator = new IdComparator<>();
@Before
public void before() {
//this test requires no Tenants in the database
tenantId = null;
tenantService.deleteTenants();
tenantProfileService.deleteTenantProfiles(TenantId.SYS_TENANT_ID);
}
@After @After
public void after() { public void after() {
tenantProfileService.deleteTenantProfiles(TenantId.SYS_TENANT_ID); tenantProfileService.deleteTenantProfiles(TenantId.SYS_TENANT_ID);

78
dao/src/test/java/org/thingsboard/server/dao/service/BaseTenantServiceTest.java

@ -23,24 +23,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.boot.test.mock.mockito.SpyBean;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.cache.TbTransactionalCache; import org.thingsboard.server.cache.TbTransactionalCache;
import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.*;
import org.thingsboard.server.common.data.Dashboard;
import org.thingsboard.server.common.data.DashboardInfo;
import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.DeviceProfile;
import org.thingsboard.server.common.data.DeviceProfileType;
import org.thingsboard.server.common.data.DeviceTransportType;
import org.thingsboard.server.common.data.EntityView;
import org.thingsboard.server.common.data.OtaPackage;
import org.thingsboard.server.common.data.OtaPackageInfo;
import org.thingsboard.server.common.data.ResourceType;
import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.TbResource;
import org.thingsboard.server.common.data.TbResourceInfo;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.TenantInfo;
import org.thingsboard.server.common.data.TenantProfile;
import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.asset.Asset; import org.thingsboard.server.common.data.asset.Asset;
import org.thingsboard.server.common.data.device.profile.DeviceProfileData; import org.thingsboard.server.common.data.device.profile.DeviceProfileData;
import org.thingsboard.server.common.data.device.profile.MqttDeviceProfileTransportConfiguration; import org.thingsboard.server.common.data.device.profile.MqttDeviceProfileTransportConfiguration;
@ -54,8 +37,23 @@ import org.thingsboard.server.common.data.rule.RuleChain;
import org.thingsboard.server.common.data.rule.RuleChainType; import org.thingsboard.server.common.data.rule.RuleChainType;
import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.common.data.security.Authority;
import org.thingsboard.server.common.data.widget.WidgetsBundle; import org.thingsboard.server.common.data.widget.WidgetsBundle;
import org.thingsboard.server.dao.asset.AssetService;
import org.thingsboard.server.dao.customer.CustomerService;
import org.thingsboard.server.dao.dashboard.DashboardService;
import org.thingsboard.server.dao.device.DeviceProfileService;
import org.thingsboard.server.dao.device.DeviceService;
import org.thingsboard.server.dao.edge.EdgeService;
import org.thingsboard.server.dao.entityview.EntityViewService;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.ota.OtaPackageService;
import org.thingsboard.server.dao.resource.ResourceService;
import org.thingsboard.server.dao.rpc.RpcService;
import org.thingsboard.server.dao.rule.RuleChainService;
import org.thingsboard.server.dao.tenant.TenantDao; import org.thingsboard.server.dao.tenant.TenantDao;
import org.thingsboard.server.dao.tenant.TenantProfileService;
import org.thingsboard.server.dao.usagerecord.ApiUsageStateService;
import org.thingsboard.server.dao.user.UserService;
import org.thingsboard.server.dao.widget.WidgetsBundleService;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@ -69,16 +67,45 @@ import static org.mockito.Mockito.verify;
public abstract class BaseTenantServiceTest extends AbstractServiceTest { public abstract class BaseTenantServiceTest extends AbstractServiceTest {
private IdComparator<Tenant> idComparator = new IdComparator<>();
@SpyBean @SpyBean
protected TenantDao tenantDao; TenantDao tenantDao;
@Autowired @Autowired
protected TbTransactionalCache<TenantId, Tenant> cache; ApiUsageStateService apiUsageStateService;
@Autowired
AssetService assetService;
@Autowired
CustomerService customerService;
@Autowired
DashboardService dashboardService;
@Autowired
DeviceProfileService deviceProfileService;
@Autowired
DeviceService deviceService;
@Autowired
EdgeService edgeService;
@Autowired
EntityViewService entityViewService;
@Autowired
OtaPackageService otaPackageService;
@Autowired @Autowired
protected TbTransactionalCache<TenantId, Boolean> existsTenantCache; ResourceService resourceService;
@Autowired
RpcService rpcService;
@Autowired
RuleChainService ruleChainService;
@Autowired
TbTransactionalCache<TenantId, Boolean> existsTenantCache;
@Autowired
TbTransactionalCache<TenantId, Tenant> cache;
@Autowired
TenantProfileService tenantProfileService;
@Autowired
UserService userService;
@Autowired
WidgetsBundleService widgetsBundleService;
private final IdComparator<Tenant> idComparator = new IdComparator<>();
@Test @Test
public void testSaveTenant() { public void testSaveTenant() {
@ -150,6 +177,7 @@ public abstract class BaseTenantServiceTest extends AbstractServiceTest {
@Test @Test
public void testFindTenants() { public void testFindTenants() {
tenantService.deleteTenants();
List<Tenant> tenants = new ArrayList<>(); List<Tenant> tenants = new ArrayList<>();
PageLink pageLink = new PageLink(17); PageLink pageLink = new PageLink(17);
PageData<Tenant> pageData = tenantService.findTenants(pageLink); PageData<Tenant> pageData = tenantService.findTenants(pageLink);
@ -264,7 +292,7 @@ public abstract class BaseTenantServiceTest extends AbstractServiceTest {
@Test @Test
public void testFindTenantInfos() { public void testFindTenantInfos() {
tenantService.deleteTenants();
List<TenantInfo> tenants = new ArrayList<>(); List<TenantInfo> tenants = new ArrayList<>();
PageLink pageLink = new PageLink(17); PageLink pageLink = new PageLink(17);
PageData<TenantInfo> pageData = tenantService.findTenantInfos(pageLink); PageData<TenantInfo> pageData = tenantService.findTenantInfos(pageLink);

57
dao/src/test/java/org/thingsboard/server/dao/service/BaseUserServiceTest.java

@ -15,11 +15,11 @@
*/ */
package org.thingsboard.server.dao.service; package org.thingsboard.server.dao.service;
import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
@ -33,7 +33,9 @@ import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.common.data.security.Authority;
import org.thingsboard.server.common.data.security.UserCredentials; import org.thingsboard.server.common.data.security.UserCredentials;
import org.thingsboard.server.common.data.security.UserSettings; import org.thingsboard.server.common.data.security.UserSettings;
import org.thingsboard.server.dao.customer.CustomerService;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.user.UserService;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@ -41,19 +43,17 @@ import java.util.List;
public abstract class BaseUserServiceTest extends AbstractServiceTest { public abstract class BaseUserServiceTest extends AbstractServiceTest {
@Autowired
CustomerService customerService;
@Autowired
UserService userService;
private IdComparator<User> idComparator = new IdComparator<>(); private IdComparator<User> idComparator = new IdComparator<>();
private TenantId tenantId;
private UserSettings userSettings; private UserSettings userSettings;
@Before @Before
public void before() { public void before() {
Tenant tenant = new Tenant();
tenant.setTitle("My tenant");
Tenant savedTenant = tenantService.saveTenant(tenant);
Assert.assertNotNull(savedTenant);
tenantId = savedTenant.getId();
User tenantAdmin = new User(); User tenantAdmin = new User();
tenantAdmin.setAuthority(Authority.TENANT_ADMIN); tenantAdmin.setAuthority(Authority.TENANT_ADMIN);
tenantAdmin.setTenantId(tenantId); tenantAdmin.setTenantId(tenantId);
@ -75,11 +75,6 @@ public abstract class BaseUserServiceTest extends AbstractServiceTest {
userSettings = createUserSettings(customerUser.getId()); userSettings = createUserSettings(customerUser.getId());
} }
@After
public void after() {
tenantService.deleteTenant(tenantId);
}
@Test @Test
public void testFindUserByEmail() { public void testFindUserByEmail() {
User user = userService.findUserByEmail(SYSTEM_TENANT_ID, "sysadmin@thingsboard.org"); User user = userService.findUserByEmail(SYSTEM_TENANT_ID, "sysadmin@thingsboard.org");
@ -209,17 +204,13 @@ public abstract class BaseUserServiceTest extends AbstractServiceTest {
Assert.assertEquals(1, users.size()); Assert.assertEquals(1, users.size());
Assert.assertEquals(tenantAdminUser, users.get(0)); Assert.assertEquals(tenantAdminUser, users.get(0));
Tenant tenant = new Tenant(); TenantId secondTenantId = createTenant();
tenant.setTitle("Test tenant");
tenant = tenantService.saveTenant(tenant);
TenantId tenantId = tenant.getId();
List<User> tenantAdmins = new ArrayList<>(); List<User> tenantAdmins = new ArrayList<>();
for (int i = 0; i < 124; i++) { for (int i = 0; i < 124; i++) {
User user = new User(); User user = new User();
user.setAuthority(Authority.TENANT_ADMIN); user.setAuthority(Authority.TENANT_ADMIN);
user.setTenantId(tenantId); user.setTenantId(secondTenantId);
user.setEmail("testTenant" + i + "@thingsboard.org"); user.setEmail("testTenant" + i + "@thingsboard.org");
tenantAdmins.add(userService.saveUser(user)); tenantAdmins.add(userService.saveUser(user));
} }
@ -227,7 +218,7 @@ public abstract class BaseUserServiceTest extends AbstractServiceTest {
List<User> loadedTenantAdmins = new ArrayList<>(); List<User> loadedTenantAdmins = new ArrayList<>();
PageLink pageLink = new PageLink(33); PageLink pageLink = new PageLink(33);
do { do {
pageData = userService.findTenantAdmins(tenantId, pageLink); pageData = userService.findTenantAdmins(secondTenantId, pageLink);
loadedTenantAdmins.addAll(pageData.getData()); loadedTenantAdmins.addAll(pageData.getData());
if (pageData.hasNext()) { if (pageData.hasNext()) {
pageLink = pageLink.nextPageLink(); pageLink = pageLink.nextPageLink();
@ -239,10 +230,10 @@ public abstract class BaseUserServiceTest extends AbstractServiceTest {
Assert.assertEquals(tenantAdmins, loadedTenantAdmins); Assert.assertEquals(tenantAdmins, loadedTenantAdmins);
tenantService.deleteTenant(tenantId); tenantService.deleteTenant(secondTenantId);
pageLink = new PageLink(33); pageLink = new PageLink(33);
pageData = userService.findTenantAdmins(tenantId, pageLink); pageData = userService.findTenantAdmins(secondTenantId, pageLink);
Assert.assertFalse(pageData.hasNext()); Assert.assertFalse(pageData.hasNext());
Assert.assertTrue(pageData.getData().isEmpty()); Assert.assertTrue(pageData.getData().isEmpty());
@ -250,12 +241,6 @@ public abstract class BaseUserServiceTest extends AbstractServiceTest {
@Test @Test
public void testFindTenantAdminsByEmail() { public void testFindTenantAdminsByEmail() {
Tenant tenant = new Tenant();
tenant.setTitle("Test tenant");
tenant = tenantService.saveTenant(tenant);
TenantId tenantId = tenant.getId();
String email1 = "testEmail1"; String email1 = "testEmail1";
List<User> tenantAdminsEmail1 = new ArrayList<>(); List<User> tenantAdminsEmail1 = new ArrayList<>();
@ -332,8 +317,6 @@ public abstract class BaseUserServiceTest extends AbstractServiceTest {
pageData = userService.findTenantAdmins(tenantId, pageLink); pageData = userService.findTenantAdmins(tenantId, pageLink);
Assert.assertFalse(pageData.hasNext()); Assert.assertFalse(pageData.hasNext());
Assert.assertEquals(0, pageData.getData().size()); Assert.assertEquals(0, pageData.getData().size());
tenantService.deleteTenant(tenantId);
} }
@Test @Test
@ -346,12 +329,6 @@ public abstract class BaseUserServiceTest extends AbstractServiceTest {
Assert.assertEquals(1, users.size()); Assert.assertEquals(1, users.size());
Assert.assertEquals(customerUser, users.get(0)); Assert.assertEquals(customerUser, users.get(0));
Tenant tenant = new Tenant();
tenant.setTitle("Test tenant");
tenant = tenantService.saveTenant(tenant);
TenantId tenantId = tenant.getId();
Customer customer = new Customer(); Customer customer = new Customer();
customer.setTitle("Test customer"); customer.setTitle("Test customer");
customer.setTenantId(tenantId); customer.setTenantId(tenantId);
@ -394,12 +371,6 @@ public abstract class BaseUserServiceTest extends AbstractServiceTest {
@Test @Test
public void testFindCustomerUsersByEmail() { public void testFindCustomerUsersByEmail() {
Tenant tenant = new Tenant();
tenant.setTitle("Test tenant");
tenant = tenantService.saveTenant(tenant);
TenantId tenantId = tenant.getId();
Customer customer = new Customer(); Customer customer = new Customer();
customer.setTitle("Test customer"); customer.setTitle("Test customer");
customer.setTenantId(tenantId); customer.setTenantId(tenantId);
@ -485,8 +456,6 @@ public abstract class BaseUserServiceTest extends AbstractServiceTest {
pageData = userService.findCustomerUsers(tenantId, customerId, pageLink); pageData = userService.findCustomerUsers(tenantId, customerId, pageLink);
Assert.assertFalse(pageData.hasNext()); Assert.assertFalse(pageData.hasNext());
Assert.assertEquals(0, pageData.getData().size()); Assert.assertEquals(0, pageData.getData().size());
tenantService.deleteTenant(tenantId);
} }
private UserSettings createUserSettings(UserId userId) { private UserSettings createUserSettings(UserId userId) {

27
dao/src/test/java/org/thingsboard/server/dao/service/BaseWidgetTypeServiceTest.java

@ -18,18 +18,18 @@ package org.thingsboard.server.dao.service;
import com.datastax.oss.driver.api.core.uuid.Uuids; import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.thingsboard.server.common.data.Tenant; import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.widget.WidgetType; import org.thingsboard.server.common.data.widget.WidgetType;
import org.thingsboard.server.common.data.widget.WidgetTypeDetails; import org.thingsboard.server.common.data.widget.WidgetTypeDetails;
import org.thingsboard.server.common.data.widget.WidgetsBundle; import org.thingsboard.server.common.data.widget.WidgetsBundle;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.widget.WidgetTypeService;
import org.thingsboard.server.dao.widget.WidgetsBundleService;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@ -38,23 +38,12 @@ import java.util.List;
public abstract class BaseWidgetTypeServiceTest extends AbstractServiceTest { public abstract class BaseWidgetTypeServiceTest extends AbstractServiceTest {
private IdComparator<WidgetType> idComparator = new IdComparator<>(); @Autowired
WidgetsBundleService widgetsBundleService;
private TenantId tenantId; @Autowired
WidgetTypeService widgetTypeService;
@Before
public void before() {
Tenant tenant = new Tenant();
tenant.setTitle("My tenant");
Tenant savedTenant = tenantService.saveTenant(tenant);
Assert.assertNotNull(savedTenant);
tenantId = savedTenant.getId();
}
@After private IdComparator<WidgetType> idComparator = new IdComparator<>();
public void after() {
tenantService.deleteTenant(tenantId);
}
@Test @Test
public void testSaveWidgetType() throws IOException { public void testSaveWidgetType() throws IOException {

44
dao/src/test/java/org/thingsboard/server/dao/service/BaseWidgetsBundleServiceTest.java

@ -16,18 +16,17 @@
package org.thingsboard.server.dao.service; package org.thingsboard.server.dao.service;
import com.datastax.oss.driver.api.core.uuid.Uuids; import com.datastax.oss.driver.api.core.uuid.Uuids;
import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.thingsboard.server.common.data.Tenant; import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.widget.WidgetsBundle; import org.thingsboard.server.common.data.widget.WidgetsBundle;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.widget.WidgetsBundleService;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@ -36,23 +35,10 @@ import java.util.List;
public abstract class BaseWidgetsBundleServiceTest extends AbstractServiceTest { public abstract class BaseWidgetsBundleServiceTest extends AbstractServiceTest {
private IdComparator<WidgetsBundle> idComparator = new IdComparator<>(); @Autowired
WidgetsBundleService widgetsBundleService;
private TenantId tenantId;
@Before
public void before() {
Tenant tenant = new Tenant();
tenant.setTitle("My tenant");
Tenant savedTenant = tenantService.saveTenant(tenant);
Assert.assertNotNull(savedTenant);
tenantId = savedTenant.getId();
}
@After private IdComparator<WidgetsBundle> idComparator = new IdComparator<>();
public void after() {
tenantService.deleteTenant(tenantId);
}
@Test @Test
public void testSaveWidgetsBundle() throws IOException { public void testSaveWidgetsBundle() throws IOException {
@ -249,11 +235,6 @@ public abstract class BaseWidgetsBundleServiceTest extends AbstractServiceTest {
@Test @Test
public void testFindTenantWidgetsBundlesByTenantId() { public void testFindTenantWidgetsBundlesByTenantId() {
Tenant tenant = new Tenant();
tenant.setTitle("Test tenant");
tenant = tenantService.saveTenant(tenant);
TenantId tenantId = tenant.getId();
List<WidgetsBundle> widgetsBundles = new ArrayList<>(); List<WidgetsBundle> widgetsBundles = new ArrayList<>();
for (int i=0;i<127;i++) { for (int i=0;i<127;i++) {
@ -286,7 +267,6 @@ public abstract class BaseWidgetsBundleServiceTest extends AbstractServiceTest {
Assert.assertFalse(pageData.hasNext()); Assert.assertFalse(pageData.hasNext());
Assert.assertTrue(pageData.getData().isEmpty()); Assert.assertTrue(pageData.getData().isEmpty());
tenantService.deleteTenant(tenantId);
} }
@Test @Test
@ -294,11 +274,6 @@ public abstract class BaseWidgetsBundleServiceTest extends AbstractServiceTest {
List<WidgetsBundle> systemWidgetsBundles = widgetsBundleService.findSystemWidgetsBundles(tenantId); List<WidgetsBundle> systemWidgetsBundles = widgetsBundleService.findSystemWidgetsBundles(tenantId);
Tenant tenant = new Tenant();
tenant.setTitle("Test tenant");
tenant = tenantService.saveTenant(tenant);
TenantId tenantId = tenant.getId();
TenantId systemTenantId = TenantId.fromUUID(ModelConstants.NULL_UUID); TenantId systemTenantId = TenantId.fromUUID(ModelConstants.NULL_UUID);
List<WidgetsBundle> createdWidgetsBundles = new ArrayList<>(); List<WidgetsBundle> createdWidgetsBundles = new ArrayList<>();
@ -371,8 +346,6 @@ public abstract class BaseWidgetsBundleServiceTest extends AbstractServiceTest {
Collections.sort(loadedWidgetsBundles, idComparator); Collections.sort(loadedWidgetsBundles, idComparator);
Assert.assertEquals(systemWidgetsBundles, loadedWidgetsBundles); Assert.assertEquals(systemWidgetsBundles, loadedWidgetsBundles);
tenantService.deleteTenant(tenantId);
} }
@Test @Test
@ -380,11 +353,6 @@ public abstract class BaseWidgetsBundleServiceTest extends AbstractServiceTest {
List<WidgetsBundle> systemWidgetsBundles = widgetsBundleService.findSystemWidgetsBundles(tenantId); List<WidgetsBundle> systemWidgetsBundles = widgetsBundleService.findSystemWidgetsBundles(tenantId);
Tenant tenant = new Tenant();
tenant.setTitle("Test tenant");
tenant = tenantService.saveTenant(tenant);
TenantId tenantId = tenant.getId();
TenantId systemTenantId = TenantId.fromUUID(ModelConstants.NULL_UUID); TenantId systemTenantId = TenantId.fromUUID(ModelConstants.NULL_UUID);
List<WidgetsBundle> createdWidgetsBundles = new ArrayList<>(); List<WidgetsBundle> createdWidgetsBundles = new ArrayList<>();
@ -432,8 +400,6 @@ public abstract class BaseWidgetsBundleServiceTest extends AbstractServiceTest {
Collections.sort(loadedWidgetsBundles, idComparator); Collections.sort(loadedWidgetsBundles, idComparator);
Assert.assertEquals(systemWidgetsBundles, loadedWidgetsBundles); Assert.assertEquals(systemWidgetsBundles, loadedWidgetsBundles);
tenantService.deleteTenant(tenantId);
} }
} }

6
dao/src/test/java/org/thingsboard/server/dao/service/event/BaseEventServiceTest.java

@ -19,6 +19,7 @@ import com.datastax.oss.driver.api.core.uuid.Uuids;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.server.common.data.EventInfo; import org.thingsboard.server.common.data.EventInfo;
import org.thingsboard.server.common.data.event.Event; import org.thingsboard.server.common.data.event.Event;
import org.thingsboard.server.common.data.event.EventType; import org.thingsboard.server.common.data.event.EventType;
@ -31,6 +32,7 @@ import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.SortOrder; import org.thingsboard.server.common.data.page.SortOrder;
import org.thingsboard.server.common.data.page.TimePageLink; import org.thingsboard.server.common.data.page.TimePageLink;
import org.thingsboard.server.dao.event.EventService;
import org.thingsboard.server.dao.service.AbstractServiceTest; import org.thingsboard.server.dao.service.AbstractServiceTest;
import java.text.ParseException; import java.text.ParseException;
@ -39,6 +41,10 @@ import java.util.List;
import static org.apache.commons.lang3.time.DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT; import static org.apache.commons.lang3.time.DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT;
public abstract class BaseEventServiceTest extends AbstractServiceTest { public abstract class BaseEventServiceTest extends AbstractServiceTest {
@Autowired
EventService eventService;
long timeBeforeStartTime; long timeBeforeStartTime;
long startTime; long startTime;
long eventTime; long eventTime;

10
dao/src/test/java/org/thingsboard/server/dao/service/timeseries/BaseTimeseriesServiceTest.java

@ -21,6 +21,7 @@ import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.server.common.data.EntityView; import org.thingsboard.server.common.data.EntityView;
import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.DeviceId;
@ -39,7 +40,9 @@ import org.thingsboard.server.common.data.kv.ReadTsKvQueryResult;
import org.thingsboard.server.common.data.kv.StringDataEntry; import org.thingsboard.server.common.data.kv.StringDataEntry;
import org.thingsboard.server.common.data.kv.TsKvEntry; import org.thingsboard.server.common.data.kv.TsKvEntry;
import org.thingsboard.server.common.data.objects.TelemetryEntityView; import org.thingsboard.server.common.data.objects.TelemetryEntityView;
import org.thingsboard.server.dao.entityview.EntityViewService;
import org.thingsboard.server.dao.service.AbstractServiceTest; import org.thingsboard.server.dao.service.AbstractServiceTest;
import org.thingsboard.server.dao.timeseries.TimeseriesService;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@ -59,6 +62,13 @@ import static org.junit.Assert.assertNotNull;
@Slf4j @Slf4j
public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest { public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest {
@Autowired
TimeseriesService tsService;
@Autowired
EntityViewService entityViewService;
static final int MAX_TIMEOUT = 30; static final int MAX_TIMEOUT = 30;
private static final String STRING_KEY = "stringKey"; private static final String STRING_KEY = "stringKey";

27
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/base/AbstractBasePage.java

@ -16,7 +16,6 @@
package org.thingsboard.server.msa.ui.base; package org.thingsboard.server.msa.ui.base;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.openqa.selenium.By; import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebDriver;
@ -34,7 +33,8 @@ import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@Slf4j import static org.assertj.core.api.Assertions.fail;
abstract public class AbstractBasePage { abstract public class AbstractBasePage {
public static final long WAIT_TIMEOUT = TimeUnit.SECONDS.toMillis(30); public static final long WAIT_TIMEOUT = TimeUnit.SECONDS.toMillis(30);
protected WebDriver driver; protected WebDriver driver;
@ -59,8 +59,7 @@ abstract public class AbstractBasePage {
try { try {
return wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(locator))); return wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(locator)));
} catch (WebDriverException e) { } catch (WebDriverException e) {
log.error("No visibility element: " + locator); return fail("No visibility element: " + locator);
return null;
} }
} }
@ -68,8 +67,7 @@ abstract public class AbstractBasePage {
try { try {
return wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath(locator))); return wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath(locator)));
} catch (WebDriverException e) { } catch (WebDriverException e) {
log.error("No presence element: " + locator); return fail("No presence element: " + locator);
return null;
} }
} }
@ -77,8 +75,7 @@ abstract public class AbstractBasePage {
try { try {
return wait.until(ExpectedConditions.elementToBeClickable(By.xpath(locator))); return wait.until(ExpectedConditions.elementToBeClickable(By.xpath(locator)));
} catch (WebDriverException e) { } catch (WebDriverException e) {
log.error("No clickable element: " + locator); return fail("No clickable element: " + locator);
return null;
} }
} }
@ -87,8 +84,7 @@ abstract public class AbstractBasePage {
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(locator))); wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(locator)));
return driver.findElements(By.xpath(locator)); return driver.findElements(By.xpath(locator));
} catch (WebDriverException e) { } catch (WebDriverException e) {
log.error("No visibility elements: " + locator); return fail("No visibility elements: " + locator);
return null;
} }
} }
@ -97,8 +93,7 @@ abstract public class AbstractBasePage {
wait.until(ExpectedConditions.elementToBeClickable(By.xpath(locator))); wait.until(ExpectedConditions.elementToBeClickable(By.xpath(locator)));
return driver.findElements(By.xpath(locator)); return driver.findElements(By.xpath(locator));
} catch (WebDriverException e) { } catch (WebDriverException e) {
log.error("No clickable elements: " + locator); return fail("No clickable elements: " + locator);
return null;
} }
} }
@ -106,7 +101,7 @@ abstract public class AbstractBasePage {
try { try {
wait.until(ExpectedConditions.urlContains(urlPath)); wait.until(ExpectedConditions.urlContains(urlPath));
} catch (WebDriverException e) { } catch (WebDriverException e) {
log.error("This URL path is missing"); fail("This URL path is missing");
} }
} }
@ -122,7 +117,7 @@ abstract public class AbstractBasePage {
try { try {
return wait.until(ExpectedConditions.not(ExpectedConditions.visibilityOfElementLocated(By.xpath(locator)))); return wait.until(ExpectedConditions.not(ExpectedConditions.visibilityOfElementLocated(By.xpath(locator))));
} catch (WebDriverException e) { } catch (WebDriverException e) {
throw new AssertionError("Element is present"); return fail("Element is present");
} }
} }
@ -130,7 +125,7 @@ abstract public class AbstractBasePage {
try { try {
return wait.until(ExpectedConditions.not(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath(locator)))); return wait.until(ExpectedConditions.not(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath(locator))));
} catch (WebDriverException e) { } catch (WebDriverException e) {
throw new AssertionError("Elements is present"); return fail("Elements is present");
} }
} }
@ -138,7 +133,7 @@ abstract public class AbstractBasePage {
try { try {
wait.until(ExpectedConditions.numberOfWindowsToBe(tabNumber)); wait.until(ExpectedConditions.numberOfWindowsToBe(tabNumber));
} catch (WebDriverException e) { } catch (WebDriverException e) {
log.error("No tabs with this number"); fail("No tabs with this number: " + tabNumber);
} }
} }

16
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/base/AbstractDriverBaseTest.java

@ -18,7 +18,6 @@ package org.thingsboard.server.msa.ui.base;
import io.github.bonigarcia.wdm.WebDriverManager; import io.github.bonigarcia.wdm.WebDriverManager;
import io.qameta.allure.Allure; import io.qameta.allure.Allure;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension; import org.openqa.selenium.Dimension;
import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.OutputType; import org.openqa.selenium.OutputType;
@ -48,7 +47,6 @@ import java.io.ByteArrayInputStream;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.time.Duration; import java.time.Duration;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static org.thingsboard.server.msa.TestProperties.getBaseUiUrl; import static org.thingsboard.server.msa.TestProperties.getBaseUiUrl;
@ -73,6 +71,7 @@ abstract public class AbstractDriverBaseTest extends AbstractContainerTest {
testRestClient.login(TENANT_EMAIL, TENANT_PASSWORD); testRestClient.login(TENANT_EMAIL, TENANT_PASSWORD);
ChromeOptions options = new ChromeOptions(); ChromeOptions options = new ChromeOptions();
options.setAcceptInsecureCerts(true); options.setAcceptInsecureCerts(true);
options.addArguments("-remote-allow-origins=*"); //temporary fix after updating google chrome
if (instance.isActive()) { if (instance.isActive()) {
RemoteWebDriver remoteWebDriver = new RemoteWebDriver(new URL(REMOTE_WEBDRIVER_HOST), options); RemoteWebDriver remoteWebDriver = new RemoteWebDriver(new URL(REMOTE_WEBDRIVER_HOST), options);
remoteWebDriver.setFileDetector(new LocalFileDetector()); remoteWebDriver.setFileDetector(new LocalFileDetector());
@ -82,12 +81,12 @@ abstract public class AbstractDriverBaseTest extends AbstractContainerTest {
driver = new ChromeDriver(options); driver = new ChromeDriver(options);
} }
driver.manage().window().setSize(dimension); driver.manage().window().setSize(dimension);
openLocalhost(); openBaseUiUrl();
} }
@BeforeMethod @BeforeMethod
public void open() { public void open() {
openHomePage(); openBaseUiUrl();
} }
@AfterMethod @AfterMethod
@ -101,12 +100,13 @@ abstract public class AbstractDriverBaseTest extends AbstractContainerTest {
driver.quit(); driver.quit();
} }
public void openLocalhost() { public String getJwtTokenFromLocalStorage() {
driver.get(getBaseUiUrl()); js = (JavascriptExecutor) driver;
return (String) js.executeScript("return window.localStorage.getItem('jwt_token');");
} }
public void openHomePage() { public void openBaseUiUrl() {
driver.get(getBaseUiUrl() + "/home"); driver.get(getBaseUiUrl());
} }
public String getUrl() { public String getUrl() {

20
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/CustomerPageElements.java

@ -31,18 +31,18 @@ public class CustomerPageElements extends OtherPageElementsHelper {
private static final String CITY = ENTITY + "/../..//mat-cell[contains(@class,'city')]/span"; private static final String CITY = ENTITY + "/../..//mat-cell[contains(@class,'city')]/span";
private static final String TITLES = "//mat-cell[contains(@class,'cdk-column-title')]/span"; private static final String TITLES = "//mat-cell[contains(@class,'cdk-column-title')]/span";
protected static final String EDIT_MENU_DASHBOARD_FIELD = "//input[@formcontrolname='dashboard']"; protected static final String EDIT_MENU_DASHBOARD_FIELD = "//input[@formcontrolname='dashboard']";
private static final String EDIT_MENU_DASHBOARD = "//div[@class='cdk-overlay-pane']//span/span"; private static final String EDIT_MENU_DASHBOARD = "//div[@class='cdk-overlay-pane']//span/span[contains(text(),'%s')]";
private static final String MANAGE_CUSTOMERS_USERS_BTN = ENTITY + "/../..//mat-icon[contains(text(),' account_circle')]/../.."; private static final String MANAGE_CUSTOMERS_USERS_BTN = ENTITY + "/ancestor::mat-row//mat-icon[contains(text(),' account_circle')]";
private static final String MANAGE_CUSTOMERS_ASSETS_BTN = ENTITY + "/../..//mat-icon[contains(text(),' domain')]/../.."; private static final String MANAGE_CUSTOMERS_ASSETS_BTN = ENTITY + "/ancestor::mat-row//mat-icon[contains(text(),' domain')]/parent::button";
private static final String MANAGE_CUSTOMERS_DEVICES_BTN = ENTITY + "/../..//mat-icon[contains(text(),' devices_other')]/../.."; private static final String MANAGE_CUSTOMERS_DEVICES_BTN = ENTITY + "/ancestor::mat-row//mat-icon[contains(text(),'devices_other')]/parent::button";
private static final String MANAGE_CUSTOMERS_DASHBOARDS_BTN = ENTITY + "/../..//mat-icon[contains(text(),' dashboard')]/../.."; private static final String MANAGE_CUSTOMERS_DASHBOARDS_BTN = ENTITY + "/ancestor::mat-row//mat-icon[contains(text(),'dashboard')]/parent::button";
private static final String MANAGE_CUSTOMERS_EDGE_BTN = ENTITY + "/../..//mat-icon[contains(text(),' router')]/../.."; private static final String MANAGE_CUSTOMERS_EDGE_BTN = ENTITY + "/ancestor::mat-row//mat-icon[contains(text(),'router')]/parent::button";
private static final String ADD_USER_EMAIL = "//tb-add-user-dialog//input[@formcontrolname='email']"; private static final String ADD_USER_EMAIL = "//tb-add-user-dialog//input[@formcontrolname='email']";
private static final String ACTIVATE_WINDOW_OK_BTN = "//span[contains(text(),'OK')]"; private static final String ACTIVATE_WINDOW_OK_BTN = "//span[contains(text(),'OK')]";
private static final String USER_LOGIN_BTN = "//mat-icon[@data-mat-icon-name='login']"; private static final String USER_LOGIN_BTN = "//mat-icon[@data-mat-icon-name='login']";
private static final String USERS_WIDGET = "//tb-widget"; private static final String USERS_WIDGET = "//tb-widget";
private static final String SELECT_COUNTRY_MENU = "//mat-form-field//mat-select[@formcontrolname='country']"; private static final String SELECT_COUNTRY_MENU = "//mat-form-field//mat-select[@formcontrolname='country']";
private static final String COUNTRIES = "//span[@class='mat-option-text']"; private static final String COUNTRIES = "//span[@class='mdc-list-item__primary-text']";
protected static final String INPUT_FIELD = "//input[@formcontrolname='%s']"; protected static final String INPUT_FIELD = "//input[@formcontrolname='%s']";
protected static final String INPUT_FIELD_NAME_TITLE = "title"; protected static final String INPUT_FIELD_NAME_TITLE = "title";
private static final String INPUT_FIELD_NAME_CITY = "city"; private static final String INPUT_FIELD_NAME_CITY = "city";
@ -54,7 +54,7 @@ public class CustomerPageElements extends OtherPageElementsHelper {
private static final String INPUT_FIELD_NAME_NUMBER = "phoneNumber"; private static final String INPUT_FIELD_NAME_NUMBER = "phoneNumber";
private static final String INPUT_FIELD_NAME_ASSIGNED_LIST = "entity"; private static final String INPUT_FIELD_NAME_ASSIGNED_LIST = "entity";
private static final String ASSIGNED_BTN = "//button[@type='submit']"; private static final String ASSIGNED_BTN = "//button[@type='submit']";
private static final String HIDE_HOME_DASHBOARD_TOOLBAR = "//mat-checkbox[@formcontrolname='homeDashboardHideToolbar']/label"; private static final String HIDE_HOME_DASHBOARD_TOOLBAR = "//mat-checkbox[@formcontrolname='homeDashboardHideToolbar']//label";
private static final String FILTER_BTN = "//tb-filters-edit"; private static final String FILTER_BTN = "//tb-filters-edit";
private static final String TIME_BTN = "//tb-timewindow"; private static final String TIME_BTN = "//tb-timewindow";
private static final String CUSTOMER_ICON_HEADER = "//tb-breadcrumb//span[contains(text(),'Customer %s')]"; private static final String CUSTOMER_ICON_HEADER = "//tb-breadcrumb//span[contains(text(),'Customer %s')]";
@ -104,8 +104,8 @@ public class CustomerPageElements extends OtherPageElementsHelper {
return waitUntilVisibilityOfElementLocated(EDIT_MENU_DASHBOARD_FIELD); return waitUntilVisibilityOfElementLocated(EDIT_MENU_DASHBOARD_FIELD);
} }
public WebElement editMenuDashboard() { public WebElement editMenuDashboard(String dashboardName) {
return waitUntilElementToBeClickable(EDIT_MENU_DASHBOARD); return waitUntilElementToBeClickable(String.format(EDIT_MENU_DASHBOARD, dashboardName));
} }
public WebElement phoneNumberEntityView() { public WebElement phoneNumberEntityView() {

12
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/CustomerPageHelper.java

@ -17,6 +17,7 @@ package org.thingsboard.server.msa.ui.pages;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.openqa.selenium.By; import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.ExpectedConditions;
@ -111,11 +112,9 @@ public class CustomerPageHelper extends CustomerPageElements {
titleFieldEntityView().sendKeys(newTitle); titleFieldEntityView().sendKeys(newTitle);
} }
public void chooseDashboard() { public void chooseDashboard(String dashboardName) {
editMenuDashboardField().click(); editMenuDashboardField().click();
sleep(0.5); editMenuDashboard(dashboardName).click();
editMenuDashboard().click();
sleep(0.5);
} }
public void createCustomersUser() { public void createCustomersUser() {
@ -156,4 +155,9 @@ public class CustomerPageHelper extends CustomerPageElements {
public void addCustomerViewEnterName(CharSequence keysToEnter) { public void addCustomerViewEnterName(CharSequence keysToEnter) {
enterText(titleFieldAddEntityView(), keysToEnter); enterText(titleFieldAddEntityView(), keysToEnter);
} }
public void enterPhoneNumber(String number) {
phoneNumberEntityView().sendKeys(number);
phoneNumberEntityView().sendKeys(Keys.TAB);
}
} }

6
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/DashboardPageHelper.java

@ -33,8 +33,8 @@ public class DashboardPageHelper extends DashboardPageElements {
} }
public void assignedCustomer(String title) { public void assignedCustomer(String title) {
manageAssignedEntityListField().click(); jsClick(manageAssignedEntityListField());
manageAssignedEntity(title).click(); jsClick(manageAssignedEntity(title));
manageAssignedUpdateBtn().click(); jsClick(manageAssignedUpdateBtn());
} }
} }

7
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/OpenRuleChainPageElements.java

@ -24,8 +24,7 @@ public class OpenRuleChainPageElements extends AbstractBasePage {
super(driver); super(driver);
} }
private static final String DONE_BTN = "//mat-icon[contains(text(),'done')]/../.."; private static final String DONE_BTN = "//mat-icon[contains(text(),'done')]/parent::button";
private static final String DONE_BTN_DISABLE = "//mat-icon[contains(text(),'done')]/../parent::button[@disabled='true']";
private static final String INPUT_NODE = "//div[@class='tb-rule-node tb-input-type']"; private static final String INPUT_NODE = "//div[@class='tb-rule-node tb-input-type']";
private static final String HEAD_RULE_CHAIN_NAME = "//div[@class='tb-breadcrumb']/span[2]"; private static final String HEAD_RULE_CHAIN_NAME = "//div[@class='tb-breadcrumb']/span[2]";
@ -37,10 +36,6 @@ public class OpenRuleChainPageElements extends AbstractBasePage {
return waitUntilVisibilityOfElementLocated(HEAD_RULE_CHAIN_NAME); return waitUntilVisibilityOfElementLocated(HEAD_RULE_CHAIN_NAME);
} }
public String getDoneBtnDisable() {
return DONE_BTN_DISABLE;
}
public WebElement doneBtn() { public WebElement doneBtn() {
return waitUntilElementToBeClickable(DONE_BTN); return waitUntilElementToBeClickable(DONE_BTN);
} }

5
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/OpenRuleChainPageHelper.java

@ -16,6 +16,7 @@
package org.thingsboard.server.msa.ui.pages; package org.thingsboard.server.msa.ui.pages;
import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
public class OpenRuleChainPageHelper extends OpenRuleChainPageElements { public class OpenRuleChainPageHelper extends OpenRuleChainPageElements {
public OpenRuleChainPageHelper(WebDriver driver) { public OpenRuleChainPageHelper(WebDriver driver) {
@ -32,7 +33,7 @@ public class OpenRuleChainPageHelper extends OpenRuleChainPageElements {
return headName; return headName;
} }
public void waitUntilDoneBtnDisable() { public void waitUntilBtnDisable(WebElement element) {
waitUntilVisibilityOfElementLocated(getDoneBtnDisable()); waitUntilAttributeContains(element, "disabled", "true");
} }
} }

17
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/OtherPageElements.java

@ -28,7 +28,7 @@ public class OtherPageElements extends AbstractBasePage {
} }
protected static final String ENTITY = "//mat-row//span[contains(text(),'%s')]"; protected static final String ENTITY = "//mat-row//span[contains(text(),'%s')]";
protected static final String DELETE_BTN = ENTITY + "/../..//mat-icon[contains(text(),' delete')]/../.."; protected static final String DELETE_BTN = ENTITY + "/ancestor::mat-row//mat-icon[contains(text(),'delete')]/ancestor::button";
protected static final String DETAILS_BTN = ENTITY + "/../..//mat-icon[contains(text(),'edit')]/../.."; protected static final String DETAILS_BTN = ENTITY + "/../..//mat-icon[contains(text(),'edit')]/../..";
private static final String ENTITY_COUNT = "//div[@class='mat-paginator-range-label']"; private static final String ENTITY_COUNT = "//div[@class='mat-paginator-range-label']";
private static final String WARNING_DELETE_POPUP_YES = "//tb-confirm-dialog//button[2]"; private static final String WARNING_DELETE_POPUP_YES = "//tb-confirm-dialog//button[2]";
@ -37,11 +37,11 @@ public class OtherPageElements extends AbstractBasePage {
private static final String HELP_BTN = "//mat-icon[contains(text(),'help')]/ancestor::button"; private static final String HELP_BTN = "//mat-icon[contains(text(),'help')]/ancestor::button";
private static final String CHECKBOX = "//mat-row//span[contains(text(),'%s')]/../..//mat-checkbox"; private static final String CHECKBOX = "//mat-row//span[contains(text(),'%s')]/../..//mat-checkbox";
private static final String CHECKBOXES = "//tbody//mat-checkbox"; private static final String CHECKBOXES = "//tbody//mat-checkbox";
private static final String DELETE_SELECTED_BTN = "//span[contains(text(),'selected')]//..//mat-icon/../.."; private static final String DELETE_SELECTED_BTN = "//div[@class='mat-toolbar-tools']//mat-icon[contains(text(),'delete')]/parent::button";
private static final String DELETE_BTNS = "//mat-icon[contains(text(),' delete')]/../.."; private static final String DELETE_BTNS = "//mat-icon[contains(text(),' delete')]/../..";
private static final String MARKS_CHECKBOX = "//mat-row[contains (@class,'mat-selected')]//mat-checkbox[contains(@class, 'checked')]"; private static final String MARKS_CHECKBOX = "//mat-row[contains (@class,'mat-selected')]//mat-checkbox[contains(@class, 'checked')]";
private static final String SELECT_ALL_CHECKBOX = "//thead//mat-checkbox"; private static final String SELECT_ALL_CHECKBOX = "//thead//mat-checkbox";
private static final String ALL_ENTITY = "//mat-row[@class='mat-row cdk-row mat-row-select ng-star-inserted']"; private static final String ALL_ENTITY = "//mat-row[@class='mat-mdc-row mdc-data-table__row cdk-row mat-row-select ng-star-inserted']";
private static final String EDIT_PENCIL_BTN = "//tb-details-panel//mat-icon[contains(text(),'edit')]/ancestor::button"; private static final String EDIT_PENCIL_BTN = "//tb-details-panel//mat-icon[contains(text(),'edit')]/ancestor::button";
private static final String NAME_FIELD_EDIT_VIEW = "//input[@formcontrolname='name']"; private static final String NAME_FIELD_EDIT_VIEW = "//input[@formcontrolname='name']";
private static final String HEADER_NAME_VIEW = "//header//div[@class='tb-details-title']/span"; private static final String HEADER_NAME_VIEW = "//header//div[@class='tb-details-title']/span";
@ -50,14 +50,13 @@ public class OtherPageElements extends AbstractBasePage {
private static final String DESCRIPTION_ADD_ENTITY_VIEW = "//tb-add-entity-dialog//textarea"; private static final String DESCRIPTION_ADD_ENTITY_VIEW = "//tb-add-entity-dialog//textarea";
private static final String DEBUG_CHECKBOX_EDIT = "//mat-checkbox[@formcontrolname='debugMode']"; private static final String DEBUG_CHECKBOX_EDIT = "//mat-checkbox[@formcontrolname='debugMode']";
private static final String DEBUG_CHECKBOX_VIEW = "//mat-checkbox[@formcontrolname='debugMode']//input"; private static final String DEBUG_CHECKBOX_VIEW = "//mat-checkbox[@formcontrolname='debugMode']//input";
private static final String CLOSE_ENTITY_VIEW_BTN = "//header//mat-icon[contains(text(),'close')]/../.."; private static final String CLOSE_ENTITY_VIEW_BTN = "//header//mat-icon[contains(text(),'close')]/parent::button";
private static final String SEARCH_BTN = "//mat-toolbar//mat-icon[contains(text(),'search')]/.." + private static final String SEARCH_BTN = "//mat-toolbar//mat-icon[contains(text(),'search')]/ancestor::button[contains(@class,'ng-star')]";
"/parent::button[@class='mat-focus-indicator mat-tooltip-trigger mat-icon-button mat-button-base ng-star-inserted']";
private static final String SORT_BY_NAME_BTN = "//div[contains(text(),'Name')]"; private static final String SORT_BY_NAME_BTN = "//div[contains(text(),'Name')]";
private static final String SORT_BY_TITLE_BTN = "//div[contains(text(),'Title')]"; private static final String SORT_BY_TITLE_BTN = "//div[contains(text(),'Title')]";
private static final String SORT_BY_TIME_BTN = "//div[contains(text(),'Created time')]/.."; private static final String SORT_BY_TIME_BTN = "//div[contains(text(),'Created time')]/..";
private static final String CREATED_TIME = "//tbody[@role='rowgroup']//mat-cell[2]/span"; private static final String CREATED_TIME = "//tbody[@role='rowgroup']//mat-cell[2]/span";
private static final String PLUS_BTN = "//mat-icon[contains(text(),'add')]/../parent::button"; private static final String PLUS_BTN = "//mat-icon[contains(text(),'add')]/ancestor::button";
private static final String CREATE_VIEW_ADD_BTN = "//span[contains(text(),'Add')]/.."; private static final String CREATE_VIEW_ADD_BTN = "//span[contains(text(),'Add')]/..";
private static final String WARNING_MESSAGE = "//tb-snack-bar-component/div/div"; private static final String WARNING_MESSAGE = "//tb-snack-bar-component/div/div";
private static final String ERROR_MESSAGE = "//mat-error"; private static final String ERROR_MESSAGE = "//mat-error";
@ -66,7 +65,7 @@ public class OtherPageElements extends AbstractBasePage {
private static final String ENTITY_FROM_LIST = "//div[@role='listbox']/mat-option//span[contains(text(),'%s')]"; private static final String ENTITY_FROM_LIST = "//div[@role='listbox']/mat-option//span[contains(text(),'%s')]";
protected static final String ADD_ENTITY_VIEW = "//tb-add-entity-dialog"; protected static final String ADD_ENTITY_VIEW = "//tb-add-entity-dialog";
protected static final String STATE_CONTROLLER = "//tb-entity-state-controller"; protected static final String STATE_CONTROLLER = "//tb-entity-state-controller";
private static final String SEARCH_FIELD = "//input[contains (@data-placeholder,'Search')]"; private static final String SEARCH_FIELD = "//input[contains (@placeholder,'Search')]";
private static final String BROWSE_FILE = "//input[@class='file-input']"; private static final String BROWSE_FILE = "//input[@class='file-input']";
private static final String IMPORT_BROWSE_FILE = "//mat-dialog-container//span[contains(text(),'Import')]/.."; private static final String IMPORT_BROWSE_FILE = "//mat-dialog-container//span[contains(text(),'Import')]/..";
private static final String IMPORTING_FILE = "//div[contains(text(),'%s')]"; private static final String IMPORTING_FILE = "//div[contains(text(),'%s')]";
@ -158,7 +157,7 @@ public class OtherPageElements extends AbstractBasePage {
} }
public WebElement debugCheckboxView() { public WebElement debugCheckboxView() {
return waitUntilVisibilityOfElementLocated(DEBUG_CHECKBOX_VIEW); return waitUntilPresenceOfElementLocated(DEBUG_CHECKBOX_VIEW);
} }
public WebElement closeEntityViewBtn() { public WebElement closeEntityViewBtn() {

52
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/OtherPageElementsHelper.java

@ -62,48 +62,22 @@ public class OtherPageElementsHelper extends OtherPageElements {
} }
public String deleteRuleChainTrash(String entityName) { public String deleteRuleChainTrash(String entityName) {
String s = ""; deleteBtn(entityName).click();
if (deleteBtn(entityName) != null) { warningPopUpYesBtn().click();
deleteBtn(entityName).click(); return entityName;
warningPopUpYesBtn().click();
return entityName;
} else {
for (int i = 0; i < deleteBtns().size(); i++) {
if (deleteBtns().get(i).isEnabled()) {
deleteBtns().get(i).click();
warningPopUpYesBtn().click();
if (elementIsNotPresent(getWarningMessage())) {
s = driver.findElements(By.xpath(getDeleteBtns()
+ "/../../../mat-cell/following-sibling::mat-cell/following-sibling::mat-cell[contains(@class,'cdk-column-name')]/span")).get(i).getText();
break;
}
}
}
return s;
}
} }
public String deleteSelected(String entityName) { public String deleteSelected(String entityName) {
String s = ""; checkBox(entityName).click();
if (deleteBtn(entityName) != null) { jsClick(deleteSelectedBtn());
checkBox(entityName).click(); warningPopUpYesBtn().click();
deleteSelectedBtn().click(); return entityName;
warningPopUpYesBtn().click(); }
return entityName;
} else { public void deleteSelected(int countOfCheckBoxes) {
for (int i = 0; i < checkBoxes().size(); i++) { clickOnCheckBoxes(countOfCheckBoxes);
if (checkBoxes().get(i).isDisplayed()) { jsClick(deleteSelectedBtn());
s = driver.findElements(By.xpath(getCheckboxes() + "/../../mat-cell/following-sibling::mat-cell/following-sibling::mat-cell[contains(@class,'cdk-column-name')]/span")).get(i).getText(); warningPopUpYesBtn().click();
checkBox(s).click();
deleteSelectedBtn().click();
warningPopUpYesBtn().click();
if (elementIsNotPresent(getWarningMessage())) {
break;
}
}
}
return s;
}
} }
public void searchEntity(String namePath) { public void searchEntity(String namePath) {

4
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/pages/RuleChainsPageElements.java

@ -25,7 +25,7 @@ public class RuleChainsPageElements extends OtherPageElementsHelper {
super(driver); super(driver);
} }
private static final String MAKE_ROOT_BTN = ENTITY + "/../..//mat-icon[contains(text(),' flag')]/../.."; private static final String MAKE_ROOT_BTN = ENTITY + "/ancestor::mat-row//mat-icon[contains(text(),'flag')]/ancestor::button";
private static final String ROOT = ENTITY + "/../..//mat-icon[text() = 'check_box']"; private static final String ROOT = ENTITY + "/../..//mat-icon[text() = 'check_box']";
private static final String ROOT_DISABLE = ENTITY + "/../..//mat-icon[text() = 'check_box_outline_blank']"; private static final String ROOT_DISABLE = ENTITY + "/../..//mat-icon[text() = 'check_box_outline_blank']";
private static final String CREATED_TIME = ENTITY + "/../..//mat-cell/span[contains(text(),'%s')]"; private static final String CREATED_TIME = ENTITY + "/../..//mat-cell/span[contains(text(),'%s')]";
@ -35,7 +35,7 @@ public class RuleChainsPageElements extends OtherPageElementsHelper {
private static final String DELETE_RULE_CHAIN_FROM_VIEW_BTN = "//span[contains(text(),' Delete')]"; private static final String DELETE_RULE_CHAIN_FROM_VIEW_BTN = "//span[contains(text(),' Delete')]";
private static final String IMPORT_RULE_CHAIN_BTN = "//span[contains(text(),'Import rule chain')]"; private static final String IMPORT_RULE_CHAIN_BTN = "//span[contains(text(),'Import rule chain')]";
private static final String OPEN_RULE_CHAIN_FROM_VIEW = "//span[contains(text(),'Open rule chain')]"; private static final String OPEN_RULE_CHAIN_FROM_VIEW = "//span[contains(text(),'Open rule chain')]";
private static final String MAKE_ROOT_FROM_VIEW = "(//span[contains(text(),' Make rule chain root ')]/..)[1]"; private static final String MAKE_ROOT_FROM_VIEW = "//span[contains(text(),' Make rule chain root ')]/parent::button";
private static final String ROOT_ACTIVE_CHECKBOXES = "//mat-icon[text() = 'check_box']"; private static final String ROOT_ACTIVE_CHECKBOXES = "//mat-icon[text() = 'check_box']";
private static final String ALL_NAMES = "//mat-icon[contains(text(),'check')]/../../../mat-cell[contains(@class,'name')]/span"; private static final String ALL_NAMES = "//mat-icon[contains(text(),'check')]/../../../mat-cell[contains(@class,'name')]/span";

2
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/assetProfileSmoke/CreateAssetProfileTest.java

@ -167,7 +167,7 @@ public class CreateAssetProfileTest extends AbstractDriverBaseTest {
String urlPath = "docs/user-guide/asset-profiles/"; String urlPath = "docs/user-guide/asset-profiles/";
sideBarMenuView.openAssetProfiles(); sideBarMenuView.openAssetProfiles();
profilesPage.allEntity().get(0).click(); profilesPage.profileNames().get(0).click();
profilesPage.goToProfileHelpPage(); profilesPage.goToProfileHelpPage();
Assert.assertTrue(urlContains(urlPath)); Assert.assertTrue(urlContains(urlPath));

32
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/CustomerEditMenuTest.java

@ -63,7 +63,7 @@ public class CustomerEditMenuTest extends AbstractDriverBaseTest {
@BeforeMethod @BeforeMethod
public void reLogin() { public void reLogin() {
if (getUrl().contains("/login")) { if (getJwtTokenFromLocalStorage() == null) {
loginPage.authorizationTenant(); loginPage.authorizationTenant();
} }
} }
@ -147,14 +147,14 @@ public class CustomerEditMenuTest extends AbstractDriverBaseTest {
dashboardPage.assignedCustomer(customerName); dashboardPage.assignedCustomer(customerName);
sideBarMenuView.customerBtn().click(); sideBarMenuView.customerBtn().click();
customerPage.entity(customerName).click(); customerPage.entity(customerName).click();
customerPage.editPencilBtn().click(); jsClick(customerPage.editPencilBtn());
customerPage.chooseDashboard(); customerPage.chooseDashboard(dashboardPage.getDashboardTitle());
customerPage.doneBtnEditView().click(); customerPage.doneBtnEditView().click();
customerPage.setDashboardFromView(); customerPage.setDashboardFromView();
customerPage.closeEntityViewBtn().click(); customerPage.closeEntityViewBtn().click();
customerPage.manageCustomersUserBtn(customerName).click(); jsClick(customerPage.manageCustomersUserBtn(customerName));
customerPage.createCustomersUser(); customerPage.createCustomersUser();
customerPage.userLoginBtn().click(); jsClick(customerPage.userLoginBtn());
Assert.assertNotNull(customerPage.usersWidget()); Assert.assertNotNull(customerPage.usersWidget());
Assert.assertTrue(customerPage.usersWidget().isDisplayed()); Assert.assertTrue(customerPage.usersWidget().isDisplayed());
@ -173,14 +173,14 @@ public class CustomerEditMenuTest extends AbstractDriverBaseTest {
customerPage.assignedDashboard(); customerPage.assignedDashboard();
sideBarMenuView.customerBtn().click(); sideBarMenuView.customerBtn().click();
customerPage.entity(customerName).click(); customerPage.entity(customerName).click();
customerPage.editPencilBtn().click(); jsClick(customerPage.editPencilBtn());
customerPage.chooseDashboard(); customerPage.chooseDashboard(customerPage.getDashboard());
customerPage.doneBtnEditView().click(); customerPage.doneBtnEditView().click();
customerPage.setDashboardFromView(); customerPage.setDashboardFromView();
customerPage.closeEntityViewBtn().click(); customerPage.closeEntityViewBtn().click();
customerPage.manageCustomersUserBtn(customerName).click(); jsClick(customerPage.manageCustomersUserBtn(customerName));
customerPage.createCustomersUser(); customerPage.createCustomersUser();
customerPage.userLoginBtn().click(); jsClick(customerPage.userLoginBtn());
Assert.assertNotNull(customerPage.usersWidget()); Assert.assertNotNull(customerPage.usersWidget());
Assert.assertTrue(customerPage.usersWidget().isDisplayed()); Assert.assertTrue(customerPage.usersWidget().isDisplayed());
@ -199,15 +199,15 @@ public class CustomerEditMenuTest extends AbstractDriverBaseTest {
customerPage.assignedDashboard(); customerPage.assignedDashboard();
sideBarMenuView.customerBtn().click(); sideBarMenuView.customerBtn().click();
customerPage.entity(customerName).click(); customerPage.entity(customerName).click();
customerPage.editPencilBtn().click(); jsClick(customerPage.editPencilBtn());
customerPage.chooseDashboard(); customerPage.chooseDashboard(customerPage.getDashboard());
customerPage.hideHomeDashboardToolbarCheckbox().click(); customerPage.hideHomeDashboardToolbarCheckbox().click();
customerPage.doneBtnEditView().click(); customerPage.doneBtnEditView().click();
customerPage.setDashboardFromView(); customerPage.setDashboardFromView();
customerPage.closeEntityViewBtn().click(); customerPage.closeEntityViewBtn().click();
customerPage.manageCustomersUserBtn(customerName).click(); jsClick(customerPage.manageCustomersUserBtn(customerName));
customerPage.createCustomersUser(); customerPage.createCustomersUser();
customerPage.userLoginBtn().click(); jsClick(customerPage.userLoginBtn());
Assert.assertNotNull(customerPage.usersWidget()); Assert.assertNotNull(customerPage.usersWidget());
Assert.assertTrue(customerPage.usersWidget().isDisplayed()); Assert.assertTrue(customerPage.usersWidget().isDisplayed());
@ -243,11 +243,9 @@ public class CustomerEditMenuTest extends AbstractDriverBaseTest {
sideBarMenuView.customerBtn().click(); sideBarMenuView.customerBtn().click();
customerPage.entityTitles().get(0).click(); customerPage.entityTitles().get(0).click();
customerPage.editPencilBtn().click(); customerPage.editPencilBtn().click();
customerPage.phoneNumberEntityView().sendKeys(number); customerPage.enterPhoneNumber(number);
boolean doneBtnIsEnable = customerPage.doneBtnEditViewVisible().isEnabled();
customerPage.doneBtnEditViewVisible().click();
Assert.assertFalse(doneBtnIsEnable); Assert.assertFalse(customerPage.doneBtnEditViewVisible().isEnabled());
Assert.assertNotNull(customerPage.errorMessage()); Assert.assertNotNull(customerPage.errorMessage());
Assert.assertTrue(customerPage.errorMessage().isDisplayed()); Assert.assertTrue(customerPage.errorMessage().isDisplayed());
Assert.assertEquals(customerPage.errorMessage().getText(), PHONE_NUMBER_ERROR_MESSAGE); Assert.assertEquals(customerPage.errorMessage().getText(), PHONE_NUMBER_ERROR_MESSAGE);

4
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/DeleteCustomerTest.java

@ -77,9 +77,9 @@ public class DeleteCustomerTest extends AbstractDriverBaseTest {
sideBarMenuView.customerBtn().click(); sideBarMenuView.customerBtn().click();
customerPage.entity(customerName).click(); customerPage.entity(customerName).click();
customerPage.customerViewDeleteBtn().click(); jsClick(customerPage.customerViewDeleteBtn());
customerPage.warningPopUpYesBtn().click(); customerPage.warningPopUpYesBtn().click();
customerPage.refreshBtn().click(); jsClick(customerPage.refreshBtn());
Assert.assertTrue(customerPage.entityIsNotPresent(customerName)); Assert.assertTrue(customerPage.entityIsNotPresent(customerName));
} }

10
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/DeleteSeveralCustomerTest.java

@ -49,9 +49,7 @@ public class DeleteSeveralCustomerTest extends AbstractDriverBaseTest {
testRestClient.postCustomer(defaultCustomerPrototype(title2)); testRestClient.postCustomer(defaultCustomerPrototype(title2));
sideBarMenuView.customerBtn().click(); sideBarMenuView.customerBtn().click();
customerPage.clickOnCheckBoxes(2); customerPage.deleteSelected(2);
customerPage.deleteSelectedBtn().click();
customerPage.warningPopUpYesBtn().click();
customerPage.refreshBtn().click(); customerPage.refreshBtn().click();
Assert.assertTrue(customerPage.customerIsNotPresent(title1)); Assert.assertTrue(customerPage.customerIsNotPresent(title1));
@ -63,7 +61,7 @@ public class DeleteSeveralCustomerTest extends AbstractDriverBaseTest {
public void selectAllCustomers() { public void selectAllCustomers() {
sideBarMenuView.customerBtn().click(); sideBarMenuView.customerBtn().click();
customerPage.selectAllCheckBox().click(); customerPage.selectAllCheckBox().click();
customerPage.deleteSelectedBtn().click(); jsClick(customerPage.deleteSelectedBtn());
Assert.assertNotNull(customerPage.warningPopUpTitle()); Assert.assertNotNull(customerPage.warningPopUpTitle());
Assert.assertTrue(customerPage.warningPopUpTitle().isDisplayed()); Assert.assertTrue(customerPage.warningPopUpTitle().isDisplayed());
@ -79,9 +77,7 @@ public class DeleteSeveralCustomerTest extends AbstractDriverBaseTest {
testRestClient.postCustomer(defaultCustomerPrototype(title2)); testRestClient.postCustomer(defaultCustomerPrototype(title2));
sideBarMenuView.customerBtn().click(); sideBarMenuView.customerBtn().click();
customerPage.clickOnCheckBoxes(2); customerPage.deleteSelected(2);
customerPage.deleteSelectedBtn().click();
customerPage.warningPopUpYesBtn().click();
Assert.assertTrue(customerPage.customerIsNotPresent(title1)); Assert.assertTrue(customerPage.customerIsNotPresent(title1));
Assert.assertTrue(customerPage.customerIsNotPresent(title2)); Assert.assertTrue(customerPage.customerIsNotPresent(title2));

2
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/ManageCustomersAssetsTest.java

@ -56,7 +56,7 @@ public class ManageCustomersAssetsTest extends AbstractDriverBaseTest {
sideBarMenuView.customerBtn().click(); sideBarMenuView.customerBtn().click();
customerPage.setCustomerName(); customerPage.setCustomerName();
customerPage.entity(customerPage.getCustomerName()).click(); customerPage.entity(customerPage.getCustomerName()).click();
customerPage.manageCustomersAssetsBtnView().click(); jsClick(customerPage.manageCustomersAssetsBtnView());
Assert.assertTrue(urlContains(manage.toLowerCase())); Assert.assertTrue(urlContains(manage.toLowerCase()));
Assert.assertNotNull(customerPage.customerAssetsIconHeader()); Assert.assertNotNull(customerPage.customerAssetsIconHeader());

2
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/ManageCustomersDashboardsTest.java

@ -55,7 +55,7 @@ public class ManageCustomersDashboardsTest extends AbstractDriverBaseTest {
sideBarMenuView.customerBtn().click(); sideBarMenuView.customerBtn().click();
customerPage.setCustomerName(); customerPage.setCustomerName();
customerPage.entity(customerPage.getCustomerName()).click(); customerPage.entity(customerPage.getCustomerName()).click();
customerPage.manageCustomersDashboardsBtnView().click(); jsClick(customerPage.manageCustomersDashboardsBtnView());
Assert.assertTrue(urlContains(manage.toLowerCase())); Assert.assertTrue(urlContains(manage.toLowerCase()));
Assert.assertNotNull(customerPage.customerDashboardIconHeader()); Assert.assertNotNull(customerPage.customerDashboardIconHeader());

2
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/ManageCustomersDevicesTest.java

@ -55,7 +55,7 @@ public class ManageCustomersDevicesTest extends AbstractDriverBaseTest {
sideBarMenuView.customerBtn().click(); sideBarMenuView.customerBtn().click();
customerPage.setCustomerName(); customerPage.setCustomerName();
customerPage.entity(customerPage.getCustomerName()).click(); customerPage.entity(customerPage.getCustomerName()).click();
customerPage.manageCustomersDeviceBtnView().click(); jsClick(customerPage.manageCustomersDeviceBtnView());
Assert.assertTrue(urlContains(manage.toLowerCase())); Assert.assertTrue(urlContains(manage.toLowerCase()));
Assert.assertNotNull(customerPage.customerDevicesIconHeader()); Assert.assertNotNull(customerPage.customerDevicesIconHeader());

2
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/ManageCustomersEdgesTest.java

@ -56,7 +56,7 @@ public class ManageCustomersEdgesTest extends AbstractDriverBaseTest {
sideBarMenuView.customerBtn().click(); sideBarMenuView.customerBtn().click();
customerPage.setCustomerName(); customerPage.setCustomerName();
customerPage.entity(customerPage.getCustomerName()).click(); customerPage.entity(customerPage.getCustomerName()).click();
customerPage.manageCustomersEdgeBtnView().click(); jsClick(customerPage.manageCustomersEdgeBtnView());
Assert.assertTrue(urlContains("edgeInstances")); Assert.assertTrue(urlContains("edgeInstances"));
Assert.assertNotNull(customerPage.customerEdgeIconHeader()); Assert.assertNotNull(customerPage.customerEdgeIconHeader());

4
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/customerSmoke/ManageCustomersUsersTest.java

@ -42,7 +42,7 @@ public class ManageCustomersUsersTest extends AbstractDriverBaseTest {
public void openWindowByRightCornerBtn() { public void openWindowByRightCornerBtn() {
sideBarMenuView.customerBtn().click(); sideBarMenuView.customerBtn().click();
customerPage.setCustomerName(); customerPage.setCustomerName();
customerPage.manageCustomersUserBtn(customerPage.getCustomerName()).click(); jsClick(customerPage.manageCustomersUserBtn(customerPage.getCustomerName()));
Assert.assertTrue(urlContains("user")); Assert.assertTrue(urlContains("user"));
Assert.assertNotNull(customerPage.customerUserIconHeader()); Assert.assertNotNull(customerPage.customerUserIconHeader());
@ -56,7 +56,7 @@ public class ManageCustomersUsersTest extends AbstractDriverBaseTest {
sideBarMenuView.customerBtn().click(); sideBarMenuView.customerBtn().click();
customerPage.setCustomerName(); customerPage.setCustomerName();
customerPage.entity(customerPage.getCustomerName()).click(); customerPage.entity(customerPage.getCustomerName()).click();
customerPage.manageCustomersUserBtnView().click(); jsClick(customerPage.manageCustomersUserBtnView());
Assert.assertTrue(urlContains("user")); Assert.assertTrue(urlContains("user"));
Assert.assertNotNull(customerPage.customerUserIconHeader()); Assert.assertNotNull(customerPage.customerUserIconHeader());

2
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/deviceProfileSmoke/CreateDeviceProfileTest.java

@ -173,7 +173,7 @@ public class CreateDeviceProfileTest extends AbstractDriverBaseTest {
String urlPath = "docs/user-guide/device-profiles/"; String urlPath = "docs/user-guide/device-profiles/";
sideBarMenuView.openDeviceProfiles(); sideBarMenuView.openDeviceProfiles();
profilesPage.allEntity().get(0).click(); profilesPage.profileNames().get(0).click();
profilesPage.goToProfileHelpPage(); profilesPage.goToProfileHelpPage();
Assert.assertTrue(urlContains(urlPath)); Assert.assertTrue(urlContains(urlPath));

11
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/CreateRuleChainImportTest.java

@ -16,6 +16,7 @@
package org.thingsboard.server.msa.ui.tests.ruleChainsSmoke; package org.thingsboard.server.msa.ui.tests.ruleChainsSmoke;
import io.qameta.allure.Description; import io.qameta.allure.Description;
import org.openqa.selenium.WebElement;
import org.testng.Assert; import org.testng.Assert;
import org.testng.annotations.AfterMethod; import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeClass;
@ -100,8 +101,9 @@ public class CreateRuleChainImportTest extends AbstractDriverBaseTest {
ruleChainsPage.openImportRuleChainView(); ruleChainsPage.openImportRuleChainView();
ruleChainsPage.browseFile().sendKeys(absolutePathToFileImportRuleChain); ruleChainsPage.browseFile().sendKeys(absolutePathToFileImportRuleChain);
ruleChainsPage.importBrowseFileBtn().click(); ruleChainsPage.importBrowseFileBtn().click();
openRuleChainPage.doneBtn().click(); WebElement doneBtn = openRuleChainPage.doneBtn();
openRuleChainPage.waitUntilDoneBtnDisable(); doneBtn.click();
//openRuleChainPage.waitUntilBtnDisable(doneBtn);
ruleChainName = IMPORT_RULE_CHAIN_NAME; ruleChainName = IMPORT_RULE_CHAIN_NAME;
sideBarMenuView.ruleChainsBtn().click(); sideBarMenuView.ruleChainsBtn().click();
@ -120,8 +122,9 @@ public class CreateRuleChainImportTest extends AbstractDriverBaseTest {
ruleChainsPage.openImportRuleChainView(); ruleChainsPage.openImportRuleChainView();
ruleChainsPage.browseFile().sendKeys(absolutePathToFileImportRuleChain); ruleChainsPage.browseFile().sendKeys(absolutePathToFileImportRuleChain);
ruleChainsPage.importBrowseFileBtn().click(); ruleChainsPage.importBrowseFileBtn().click();
openRuleChainPage.doneBtn().click(); WebElement doneBtn = openRuleChainPage.doneBtn();
openRuleChainPage.waitUntilDoneBtnDisable(); doneBtn.click();
//openRuleChainPage.waitUntilBtnDisable(doneBtn);
sideBarMenuView.ruleChainsBtn().click(); sideBarMenuView.ruleChainsBtn().click();
boolean entityNotNull = ruleChainsPage.entity(ruleChainName) != null; boolean entityNotNull = ruleChainsPage.entity(ruleChainName) != null;

4
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/DeleteRuleChainTest.java

@ -76,7 +76,7 @@ public class DeleteRuleChainTest extends AbstractDriverBaseTest {
sideBarMenuView.ruleChainsBtn().click(); sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.detailsBtn(ENTITY_NAME).click(); ruleChainsPage.detailsBtn(ENTITY_NAME).click();
String deletedRuleChain = ruleChainsPage.deleteRuleChainFromView(ruleChainName); String deletedRuleChain = ruleChainsPage.deleteRuleChainFromView(ruleChainName);
ruleChainsPage.refreshBtn().click(); jsClick(ruleChainsPage.refreshBtn());
Assert.assertTrue(ruleChainsPage.entityIsNotPresent(deletedRuleChain)); Assert.assertTrue(ruleChainsPage.entityIsNotPresent(deletedRuleChain));
} }
@ -145,7 +145,7 @@ public class DeleteRuleChainTest extends AbstractDriverBaseTest {
sideBarMenuView.ruleChainsBtn().click(); sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.detailsBtn(deletedRuleChain).click(); ruleChainsPage.detailsBtn(deletedRuleChain).click();
ruleChainsPage.deleteBtnFromView().click(); jsClick(ruleChainsPage.deleteBtnFromView());
ruleChainsPage.warningPopUpYesBtn().click(); ruleChainsPage.warningPopUpYesBtn().click();
Assert.assertNotNull(ruleChainsPage.entity(deletedRuleChain)); Assert.assertNotNull(ruleChainsPage.entity(deletedRuleChain));

10
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/DeleteSeveralRuleChainsTest.java

@ -49,9 +49,7 @@ public class DeleteSeveralRuleChainsTest extends AbstractDriverBaseTest {
testRestClient.postRuleChain(defaultRuleChainPrototype(ruleChainName)); testRestClient.postRuleChain(defaultRuleChainPrototype(ruleChainName));
sideBarMenuView.ruleChainsBtn().click(); sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.clickOnCheckBoxes(2); ruleChainsPage.deleteSelected(2);
ruleChainsPage.deleteSelectedBtn().click();
ruleChainsPage.warningPopUpYesBtn().click();
ruleChainsPage.refreshBtn().click(); ruleChainsPage.refreshBtn().click();
Assert.assertTrue(ruleChainsPage.ruleChainsIsNotPresent(ruleChainName)); Assert.assertTrue(ruleChainsPage.ruleChainsIsNotPresent(ruleChainName));
@ -66,7 +64,7 @@ public class DeleteSeveralRuleChainsTest extends AbstractDriverBaseTest {
sideBarMenuView.ruleChainsBtn().click(); sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.selectAllCheckBox().click(); ruleChainsPage.selectAllCheckBox().click();
ruleChainsPage.deleteSelectedBtn().click(); jsClick(ruleChainsPage.deleteSelectedBtn());
ruleChainsPage.warningPopUpYesBtn().click(); ruleChainsPage.warningPopUpYesBtn().click();
ruleChainsPage.refreshBtn().click(); ruleChainsPage.refreshBtn().click();
@ -99,9 +97,7 @@ public class DeleteSeveralRuleChainsTest extends AbstractDriverBaseTest {
testRestClient.postRuleChain(defaultRuleChainPrototype(ruleChainName)); testRestClient.postRuleChain(defaultRuleChainPrototype(ruleChainName));
sideBarMenuView.ruleChainsBtn().click(); sideBarMenuView.ruleChainsBtn().click();
ruleChainsPage.clickOnCheckBoxes(2); ruleChainsPage.deleteSelected(2);
ruleChainsPage.deleteSelectedBtn().click();
ruleChainsPage.warningPopUpYesBtn().click();
Assert.assertTrue(ruleChainsPage.ruleChainsIsNotPresent(ruleChainName)); Assert.assertTrue(ruleChainsPage.ruleChainsIsNotPresent(ruleChainName));
} }

2
msa/black-box-tests/src/test/java/org/thingsboard/server/msa/ui/tests/ruleChainsSmoke/MakeRuleChainRootTest.java

@ -75,7 +75,7 @@ public class MakeRuleChainRootTest extends AbstractDriverBaseTest {
ruleChainsPage.setRuleChainNameWithoutRoot(0); ruleChainsPage.setRuleChainNameWithoutRoot(0);
String ruleChain = ruleChainsPage.getRuleChainName(); String ruleChain = ruleChainsPage.getRuleChainName();
ruleChainsPage.detailsBtn(ruleChain).click(); ruleChainsPage.detailsBtn(ruleChain).click();
ruleChainsPage.makeRootFromViewBtn().click(); jsClick(ruleChainsPage.makeRootFromViewBtn());
ruleChainsPage.warningPopUpYesBtn().click(); ruleChainsPage.warningPopUpYesBtn().click();
ruleChainsPage.closeEntityViewBtn().click(); ruleChainsPage.closeEntityViewBtn().click();

22
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbLogNode.java

@ -32,6 +32,8 @@ import org.thingsboard.server.common.data.plugin.ComponentType;
import org.thingsboard.server.common.data.script.ScriptLanguage; import org.thingsboard.server.common.data.script.ScriptLanguage;
import org.thingsboard.server.common.msg.TbMsg; import org.thingsboard.server.common.msg.TbMsg;
import java.util.Objects;
@Slf4j @Slf4j
@RuleNode( @RuleNode(
type = ComponentType.ACTION, type = ComponentType.ACTION,
@ -54,8 +56,12 @@ public class TbLogNode implements TbNode {
@Override @Override
public void init(TbContext ctx, TbNodeConfiguration configuration) throws TbNodeException { public void init(TbContext ctx, TbNodeConfiguration configuration) throws TbNodeException {
this.config = TbNodeUtils.convert(configuration, TbLogNodeConfiguration.class); this.config = TbNodeUtils.convert(configuration, TbLogNodeConfiguration.class);
this.standard = new TbLogNodeConfiguration().defaultConfiguration().getJsScript().equals(config.getJsScript()); this.standard = isStandard(config);
this.scriptEngine = this.standard ? null : ctx.createScriptEngine(config.getScriptLang(), this.scriptEngine = this.standard ? null : createScriptEngine(ctx, config);
}
ScriptEngine createScriptEngine(TbContext ctx, TbLogNodeConfiguration config) {
return ctx.createScriptEngine(config.getScriptLang(),
ScriptLanguage.TBEL.equals(config.getScriptLang()) ? config.getTbelScript() : config.getJsScript()); ScriptLanguage.TBEL.equals(config.getScriptLang()) ? config.getTbelScript() : config.getJsScript());
} }
@ -83,6 +89,18 @@ public class TbLogNode implements TbNode {
}, MoreExecutors.directExecutor()); //usually js responses runs on js callback executor }, MoreExecutors.directExecutor()); //usually js responses runs on js callback executor
} }
boolean isStandard(TbLogNodeConfiguration conf) {
Objects.requireNonNull(conf, "node config is null");
final TbLogNodeConfiguration defaultConfig = new TbLogNodeConfiguration().defaultConfiguration();
switch (conf.getScriptLang()) {
case JS: return defaultConfig.getJsScript().equals(conf.getJsScript());
case TBEL: return defaultConfig.getTbelScript().equals(conf.getTbelScript());
default:
log.warn("No rule to define isStandard script for script language [{}], assuming that is non-standard", conf.getScriptLang());
return false;
}
}
void logStandard(TbContext ctx, TbMsg msg) { void logStandard(TbContext ctx, TbMsg msg) {
log.info(toLogMessage(msg)); log.info(toLogMessage(msg));
ctx.tellSuccess(msg); ctx.tellSuccess(msg);

62
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbLogNodeTest.java

@ -17,14 +17,29 @@ package org.thingsboard.rule.engine.action;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.EnumSource;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rule.engine.api.TbContext;
import org.thingsboard.rule.engine.api.TbNodeConfiguration;
import org.thingsboard.rule.engine.api.TbNodeException;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.script.ScriptLanguage;
import org.thingsboard.server.common.msg.TbMsg; import org.thingsboard.server.common.msg.TbMsg;
import org.thingsboard.server.common.msg.TbMsgMetaData; import org.thingsboard.server.common.msg.TbMsgMetaData;
import java.util.Collections; import java.util.Collections;
import java.util.Map; import java.util.Map;
import java.util.UUID;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
@Slf4j @Slf4j
public class TbLogNodeTest { public class TbLogNodeTest {
@ -61,6 +76,7 @@ public class TbLogNodeTest {
"Incoming metadata:\n" + "Incoming metadata:\n" +
"{}"); "{}");
} }
@Test @Test
void givenNullDataMsg_whenToLog_thenReturnString() { void givenNullDataMsg_whenToLog_thenReturnString() {
TbLogNode node = new TbLogNode(); TbLogNode node = new TbLogNode();
@ -77,4 +93,50 @@ public class TbLogNodeTest {
"{}"); "{}");
} }
@ParameterizedTest
@EnumSource(ScriptLanguage.class)
void givenDefaultConfig_whenIsStandardForEachScriptLanguage_thenTrue(ScriptLanguage scriptLanguage) throws TbNodeException {
TbLogNodeConfiguration config = new TbLogNodeConfiguration().defaultConfiguration();
config.setScriptLang(scriptLanguage);
TbLogNode node = spy(new TbLogNode());
TbNodeConfiguration tbNodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
TbContext ctx = mock(TbContext.class);
node.init(ctx, tbNodeConfiguration);
assertThat(node.isStandard(config)).as("Script is standard for language " + scriptLanguage).isTrue();
verify(node, never()).createScriptEngine(any(), any());
verify(ctx, never()).createScriptEngine(any(), anyString());
}
@Test
void givenScriptEngineEnum_whenNewAdded_thenFailed() {
assertThat(ScriptLanguage.values().length).as("only two ScriptLanguage supported").isEqualTo(2);
}
@Test
void givenScriptEngineLangJs_whenCreateScriptEngine_thenSupplyJsScript(){
TbLogNodeConfiguration configJs = new TbLogNodeConfiguration().defaultConfiguration();
configJs.setScriptLang(ScriptLanguage.JS);
configJs.setJsScript(configJs.getJsScript() + " // This is JS script " + UUID.randomUUID());
TbLogNode node = new TbLogNode();
TbContext ctx = mock(TbContext.class);
node.createScriptEngine(ctx, configJs);
verify(ctx).createScriptEngine(ScriptLanguage.JS, configJs.getJsScript());
verifyNoMoreInteractions(ctx);
}
@Test
void givenScriptEngineLangTbel_whenCreateScriptEngine_thenSupplyTbelScript(){
TbLogNodeConfiguration configTbel = new TbLogNodeConfiguration().defaultConfiguration();
configTbel.setScriptLang(ScriptLanguage.TBEL);
configTbel.setTbelScript(configTbel.getTbelScript() + " // This is TBEL script " + UUID.randomUUID());
TbLogNode node = new TbLogNode();
TbContext ctx = mock(TbContext.class);
node.createScriptEngine(ctx, configTbel);
verify(ctx).createScriptEngine(ScriptLanguage.TBEL, configTbel.getTbelScript());
verifyNoMoreInteractions(ctx);
}
} }

Loading…
Cancel
Save