Browse Source

Merge branch 'lts-4.3' into release-4.3

# Conflicts:
#	application/pom.xml
#	common/actor/pom.xml
#	common/cache/pom.xml
#	common/cluster-api/pom.xml
#	common/coap-server/pom.xml
#	common/dao-api/pom.xml
#	common/data/pom.xml
#	common/discovery-api/pom.xml
#	common/edge-api/pom.xml
#	common/edqs/pom.xml
#	common/message/pom.xml
#	common/pom.xml
#	common/proto/pom.xml
#	common/queue/pom.xml
#	common/script/pom.xml
#	common/script/remote-js-client/pom.xml
#	common/script/script-api/pom.xml
#	common/stats/pom.xml
#	common/transport/coap/pom.xml
#	common/transport/http/pom.xml
#	common/transport/lwm2m/pom.xml
#	common/transport/mqtt/pom.xml
#	common/transport/pom.xml
#	common/transport/snmp/pom.xml
#	common/transport/transport-api/pom.xml
#	common/util/pom.xml
#	common/version-control/pom.xml
#	dao/pom.xml
#	edqs/pom.xml
#	monitoring/pom.xml
#	msa/black-box-tests/pom.xml
#	msa/edqs/pom.xml
#	msa/js-executor/pom.xml
#	msa/monitoring/pom.xml
#	msa/pom.xml
#	msa/tb-node/pom.xml
#	msa/tb/pom.xml
#	msa/transport/coap/pom.xml
#	msa/transport/http/pom.xml
#	msa/transport/lwm2m/pom.xml
#	msa/transport/mqtt/pom.xml
#	msa/transport/pom.xml
#	msa/transport/snmp/pom.xml
#	msa/vc-executor-docker/pom.xml
#	msa/vc-executor/pom.xml
#	msa/web-ui/pom.xml
#	netty-mqtt/pom.xml
#	pom.xml
#	rest-client/pom.xml
#	rule-engine/pom.xml
#	rule-engine/rule-engine-api/pom.xml
#	rule-engine/rule-engine-components/pom.xml
#	tools/pom.xml
#	transport/coap/pom.xml
#	transport/http/pom.xml
#	transport/lwm2m/pom.xml
#	transport/mqtt/pom.xml
#	transport/pom.xml
#	transport/snmp/pom.xml
#	ui-ngx/pom.xml
release-4.3
Viacheslav Klimov 1 month ago
parent
commit
6005d9311f
Failed to extract signature
  1. 26
      application/pom.xml
  2. 2
      application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java
  3. 7
      application/src/main/java/org/thingsboard/server/service/edge/rpc/KafkaEdgeGrpcSession.java
  4. 2
      application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java
  5. 4
      application/src/main/java/org/thingsboard/server/service/install/lts/LtsMigrationService.java
  6. 8
      application/src/main/java/org/thingsboard/server/service/install/lts/LtsVersion.java
  7. 4
      application/src/main/java/org/thingsboard/server/service/notification/channels/MicrosoftTeamsNotificationChannel.java
  8. 2
      application/src/main/java/org/thingsboard/server/service/security/auth/mfa/provider/impl/TotpTwoFaProvider.java
  9. 2
      application/src/main/java/org/thingsboard/server/service/security/model/token/JwtTokenFactory.java
  10. 4
      application/src/main/java/org/thingsboard/server/service/ws/WebSocketSessionType.java
  11. 60
      application/src/main/resources/thingsboard.yml
  12. 10
      application/src/test/java/org/thingsboard/server/controller/AbstractNotifyEntityTest.java
  13. 2
      application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java
  14. 2
      application/src/test/java/org/thingsboard/server/controller/AdminControllerTest.java
  15. 54
      application/src/test/java/org/thingsboard/server/controller/AlarmCommentControllerTest.java
  16. 6
      application/src/test/java/org/thingsboard/server/controller/AuditLogControllerTest.java
  17. 4
      application/src/test/java/org/thingsboard/server/controller/AuditLogControllerTest_DedicatedEventsDataSource.java
  18. 12
      application/src/test/java/org/thingsboard/server/controller/AuthControllerTest.java
  19. 2
      application/src/test/java/org/thingsboard/server/controller/BaseQueueControllerTest.java
  20. 6
      application/src/test/java/org/thingsboard/server/controller/DeviceControllerTest.java
  21. 4
      application/src/test/java/org/thingsboard/server/controller/EdgeEventControllerTest.java
  22. 4
      application/src/test/java/org/thingsboard/server/controller/EntityQueryControllerTest.java
  23. 6
      application/src/test/java/org/thingsboard/server/controller/HomePageApiTest.java
  24. 4
      application/src/test/java/org/thingsboard/server/controller/RepositorySettingsTest.java
  25. 4
      application/src/test/java/org/thingsboard/server/controller/RuleEngineControllerTest.java
  26. 10
      application/src/test/java/org/thingsboard/server/controller/TwoFactorAuthConfigTest.java
  27. 8
      application/src/test/java/org/thingsboard/server/controller/TwoFactorAuthTest.java
  28. 4
      application/src/test/java/org/thingsboard/server/controller/UserControllerTest.java
  29. 8
      application/src/test/java/org/thingsboard/server/controller/WebsocketApiTest.java
  30. 8
      application/src/test/java/org/thingsboard/server/queue/discovery/HashPartitionServiceTest.java
  31. 52
      application/src/test/java/org/thingsboard/server/service/cf/DefaultCalculatedFieldCacheTest.java
  32. 45
      application/src/test/java/org/thingsboard/server/service/device/provision/DeviceProvisionServiceTest.java
  33. 221
      application/src/test/java/org/thingsboard/server/service/edge/rpc/processor/BaseEdgeProcessorTest.java
  34. 6
      application/src/test/java/org/thingsboard/server/service/entitiy/EntityServiceTest.java
  35. 32
      application/src/test/java/org/thingsboard/server/service/entitiy/alarm/DefaultTbAlarmServiceTest.java
  36. 34
      application/src/test/java/org/thingsboard/server/service/entitiy/alarmComment/DefaultTbAlarmCommentServiceTest.java
  37. 4
      application/src/test/java/org/thingsboard/server/service/housekeeper/HousekeeperServiceTest.java
  38. 28
      application/src/test/java/org/thingsboard/server/service/install/InstallScriptsTest.java
  39. 6
      application/src/test/java/org/thingsboard/server/service/job/JobManagerTest.java
  40. 2
      application/src/test/java/org/thingsboard/server/service/notification/AbstractNotificationApiTest.java
  41. 2
      application/src/test/java/org/thingsboard/server/service/notification/NotificationApiTest.java
  42. 2
      application/src/test/java/org/thingsboard/server/service/notification/NotificationApiWsClient.java
  43. 2
      application/src/test/java/org/thingsboard/server/service/notification/NotificationTargetApiTest.java
  44. 14
      application/src/test/java/org/thingsboard/server/service/profile/DefaultTbAssetProfileCacheTest.java
  45. 14
      application/src/test/java/org/thingsboard/server/service/profile/DefaultTbDeviceProfileCacheTest.java
  46. 48
      application/src/test/java/org/thingsboard/server/service/queue/DefaultTbClusterServiceTest.java
  47. 14
      application/src/test/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManagerTest.java
  48. 14
      application/src/test/java/org/thingsboard/server/service/sms/DefaultSmsServiceTest.java
  49. 6
      application/src/test/java/org/thingsboard/server/service/subscription/DefaultTbLocalSubscriptionServiceTest.java
  50. 10
      application/src/test/java/org/thingsboard/server/service/subscription/TbEntityDataSubCtxTest.java
  51. 2
      application/src/test/java/org/thingsboard/server/service/subscription/TbEntityLocalSubsInfoTest.java
  52. 6
      application/src/test/java/org/thingsboard/server/service/sync/ie/ExportImportServiceSqlTest.java
  53. 2
      application/src/test/java/org/thingsboard/server/service/sync/vc/VersionControlTest.java
  54. 60
      application/src/test/java/org/thingsboard/server/service/transport/DefaultTransportApiServiceTest.java
  55. 6
      application/src/test/java/org/thingsboard/server/service/ttl/AlarmsCleanUpServiceTest.java
  56. 2
      application/src/test/java/org/thingsboard/server/service/ws/DefaultWebSocketServiceTest.java
  57. 8
      application/src/test/java/org/thingsboard/server/transport/lwm2m/AbstractLwM2MIntegrationTest.java
  58. 14
      application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/AbstractRpcLwM2MIntegrationTest.java
  59. 4
      application/src/test/java/org/thingsboard/server/transport/lwm2m/security/diffPort/AbstractLwM2MIntegrationDiffPortTest.java
  60. 4
      application/src/test/java/org/thingsboard/server/transport/mqtt/MqttGatewayRateLimitsTest.java
  61. 4
      application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv3/telemetry/timeseries/AbstractMqttTimeseriesIntegrationTest.java
  62. 2
      common/actor/pom.xml
  63. 2
      common/cache/pom.xml
  64. 8
      common/cache/src/main/java/org/thingsboard/server/cache/ota/RedisOtaPackageDataCache.java
  65. 2
      common/cluster-api/pom.xml
  66. 2
      common/coap-server/pom.xml
  67. 2
      common/dao-api/pom.xml
  68. 2
      common/data/pom.xml
  69. 2
      common/data/src/main/java/org/thingsboard/server/common/data/Dashboard.java
  70. 4
      common/data/src/main/java/org/thingsboard/server/common/data/EntityType.java
  71. 2
      common/data/src/main/java/org/thingsboard/server/common/data/EventInfo.java
  72. 2
      common/data/src/main/java/org/thingsboard/server/common/data/HomeDashboard.java
  73. 2
      common/data/src/main/java/org/thingsboard/server/common/data/StringUtils.java
  74. 2
      common/data/src/main/java/org/thingsboard/server/common/data/TenantInfo.java
  75. 1
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmComment.java
  76. 11
      common/data/src/main/java/org/thingsboard/server/common/data/device/credentials/lwm2m/LwM2MBootstrapClientCredential.java
  77. 11
      common/data/src/main/java/org/thingsboard/server/common/data/device/credentials/lwm2m/LwM2MClientCredential.java
  78. 2
      common/data/src/main/java/org/thingsboard/server/common/data/device/data/CoapDeviceTransportConfiguration.java
  79. 2
      common/data/src/main/java/org/thingsboard/server/common/data/device/data/Lwm2mDeviceTransportConfiguration.java
  80. 9
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/lwm2m/TelemetryObserveStrategy.java
  81. 11
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/lwm2m/bootstrap/LwM2MBootstrapServerCredential.java
  82. 2
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/lwm2m/bootstrap/LwM2MServerSecurityConfigDefault.java
  83. 4
      common/data/src/main/java/org/thingsboard/server/common/data/edge/EdgeInfo.java
  84. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/AssetFields.java
  85. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/AssetProfileFields.java
  86. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/CustomerFields.java
  87. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/DashboardFields.java
  88. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/DeviceFields.java
  89. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/DeviceProfileFields.java
  90. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/EdgeFields.java
  91. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/EntityViewFields.java
  92. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/QueueStatsFields.java
  93. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/RuleChainFields.java
  94. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/TenantFields.java
  95. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/TenantProfileFields.java
  96. 2
      common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/UserFields.java
  97. 10
      common/data/src/main/java/org/thingsboard/server/common/data/job/task/Task.java
  98. 8
      common/data/src/main/java/org/thingsboard/server/common/data/job/task/TaskResult.java
  99. 2
      common/data/src/main/java/org/thingsboard/server/common/data/kv/BaseDeleteTsKvQuery.java
  100. 1
      common/data/src/main/java/org/thingsboard/server/common/data/mobile/layout/MobileLayoutConfig.java

26
application/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>4.3.1.3</version> <version>4.3.1.4-SNAPSHOT</version>
<artifactId>thingsboard</artifactId> <artifactId>thingsboard</artifactId>
</parent> </parent>
<artifactId>application</artifactId> <artifactId>application</artifactId>
@ -507,12 +507,31 @@
</properties> </properties>
<build> <build>
<plugins> <plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
<!-- Reserve free ephemeral ports so concurrent openapi-spec builds (and orphaned
forks from prior failed builds) on the same CI agent don't collide on fixed ports. -->
<execution>
<id>reserve-openapi-ports</id>
<phase>initialize</phase>
<goals><goal>reserve-network-port</goal></goals>
<configuration>
<portNames>
<portName>jmx.port</portName>
<portName>http.port</portName>
</portNames>
</configuration>
</execution>
</executions>
</plugin>
<plugin> <plugin>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>
<configuration> <configuration>
<mainClass>org.thingsboard.server.ThingsboardServerApplication</mainClass> <mainClass>org.thingsboard.server.ThingsboardServerApplication</mainClass>
<jmxPort>9001</jmxPort> <jmxPort>${jmx.port}</jmxPort>
</configuration> </configuration>
<executions> <executions>
<execution> <execution>
@ -532,6 +551,7 @@
<arguments> <arguments>
<argument>--spring.config.name=thingsboard</argument> <argument>--spring.config.name=thingsboard</argument>
<argument>--spring.profiles.active=openapi</argument> <argument>--spring.profiles.active=openapi</argument>
<argument>--server.port=${http.port}</argument>
</arguments> </arguments>
<maxAttempts>180</maxAttempts> <maxAttempts>180</maxAttempts>
<wait>2000</wait> <wait>2000</wait>
@ -557,7 +577,7 @@
</execution> </execution>
</executions> </executions>
<configuration> <configuration>
<apiDocsUrl>http://localhost:8080/v3/api-docs/thingsboard</apiDocsUrl> <apiDocsUrl>http://localhost:${http.port}/v3/api-docs/thingsboard</apiDocsUrl>
<outputFileName>openapi.json</outputFileName> <outputFileName>openapi.json</outputFileName>
<outputDir>${project.build.directory}</outputDir> <outputDir>${project.build.directory}</outputDir>
</configuration> </configuration>

2
application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java

@ -790,7 +790,7 @@ public abstract class EdgeGrpcSession implements Closeable {
ctx.getClusterService().onEdgeEventUpdate(new EdgeEventUpdateMsg(edge.getTenantId(), edge.getId())); ctx.getClusterService().onEdgeEventUpdate(new EdgeEventUpdateMsg(edge.getTenantId(), edge.getId()));
} }
private void stopCurrentSendDownlinkMsgsTask(Boolean isInterrupted) { protected void stopCurrentSendDownlinkMsgsTask(Boolean isInterrupted) {
if (sessionState.getSendDownlinkMsgsFuture() != null && !sessionState.getSendDownlinkMsgsFuture().isDone()) { if (sessionState.getSendDownlinkMsgsFuture() != null && !sessionState.getSendDownlinkMsgsFuture().isDone()) {
sessionState.getSendDownlinkMsgsFuture().set(isInterrupted); sessionState.getSendDownlinkMsgsFuture().set(isInterrupted);
} }

7
application/src/main/java/org/thingsboard/server/service/edge/rpc/KafkaEdgeGrpcSession.java

@ -156,6 +156,7 @@ public class KafkaEdgeGrpcSession extends EdgeGrpcSession {
@Override @Override
public boolean destroy() { public boolean destroy() {
stopCurrentSendDownlinkMsgsTask(true);
try { try {
if (consumer != null) { if (consumer != null) {
log.info("[{}][{}] Stopping edge event consumer...", tenantId, edge != null ? edge.getId() : null); log.info("[{}][{}] Stopping edge event consumer...", tenantId, edge != null ? edge.getId() : null);
@ -180,9 +181,13 @@ public class KafkaEdgeGrpcSession extends EdgeGrpcSession {
private void awaitConsumerTermination() { private void awaitConsumerTermination() {
try { try {
consumerExecutor.awaitTermination(5, java.util.concurrent.TimeUnit.SECONDS); if (!consumerExecutor.awaitTermination(5, java.util.concurrent.TimeUnit.SECONDS)) {
// without this the thread is leaked for the whole remaining delivery-retry window (or forever, if the future is never completed).
consumerExecutor.shutdownNow();
}
} catch (InterruptedException ie) { } catch (InterruptedException ie) {
log.warn("[{}][{}] Interrupted while awaiting consumer executor termination", tenantId, edge.getId()); log.warn("[{}][{}] Interrupted while awaiting consumer executor termination", tenantId, edge.getId());
Thread.currentThread().interrupt();
} }
} }

2
application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java

@ -335,7 +335,7 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService {
private String generateRandomKey() { private String generateRandomKey() {
return Base64.getEncoder().encodeToString( return Base64.getEncoder().encodeToString(
RandomStringUtils.randomAlphanumeric(64).getBytes(StandardCharsets.UTF_8)); RandomStringUtils.secure().nextAlphanumeric(64).getBytes(StandardCharsets.UTF_8));
} }
@Override @Override

4
application/src/main/java/org/thingsboard/server/service/install/lts/LtsMigrationService.java

@ -126,9 +126,7 @@ public class LtsMigrationService {
// so a cross-family upgrade is fully handled by the target-family migrations. // so a cross-family upgrade is fully handled by the target-family migrations.
// Excluding the dormant older-family beans avoids double-processing. // Excluding the dormant older-family beans avoids double-processing.
static boolean isInRangeForTargetFamily(LtsVersion version, LtsVersion from, LtsVersion to) { static boolean isInRangeForTargetFamily(LtsVersion version, LtsVersion from, LtsVersion to) {
return version.sameFamily(to) return version.sameFamily(to) && version.isInRange(from, to);
&& version.compareTo(from) > 0
&& version.compareTo(to) <= 0;
} }
private void runSchemaUpdate(String version) { private void runSchemaUpdate(String version) {

8
application/src/main/java/org/thingsboard/server/service/install/lts/LtsVersion.java

@ -37,6 +37,14 @@ public record LtsVersion(int major, int minor, int maintenance, int patch) imple
return major == other.major && minor == other.minor; return major == other.major && minor == other.minor;
} }
/**
* Half-open range check: {@code from < this <= to}. The lower bound is exclusive (a source already at
* {@code from} has applied that version) and the upper bound inclusive (the target version's own migration runs).
*/
public boolean isInRange(LtsVersion from, LtsVersion to) {
return compareTo(from) > 0 && compareTo(to) <= 0;
}
@Override @Override
public int compareTo(LtsVersion o) { public int compareTo(LtsVersion o) {
int c = Integer.compare(major, o.major); int c = Integer.compare(major, o.major);

4
application/src/main/java/org/thingsboard/server/service/notification/channels/MicrosoftTeamsNotificationChannel.java

@ -54,8 +54,8 @@ public class MicrosoftTeamsNotificationChannel implements NotificationChannel<Mi
@Setter @Setter
private RestTemplate restTemplate = new RestTemplateBuilder() private RestTemplate restTemplate = new RestTemplateBuilder()
.setConnectTimeout(Duration.of(15, ChronoUnit.SECONDS)) .connectTimeout(Duration.of(15, ChronoUnit.SECONDS))
.setReadTimeout(Duration.of(15, ChronoUnit.SECONDS)) .readTimeout(Duration.of(15, ChronoUnit.SECONDS))
.build(); .build();
@Override @Override

2
application/src/main/java/org/thingsboard/server/service/security/auth/mfa/provider/impl/TotpTwoFaProvider.java

@ -62,7 +62,7 @@ public class TotpTwoFaProvider implements TwoFaProvider<TotpTwoFaProviderConfig,
} }
private String generateSecretKey() { private String generateSecretKey() {
return Base32.encode(RandomUtils.nextBytes(20)); return Base32.encode(RandomUtils.secure().randomBytes(20));
} }

2
application/src/main/java/org/thingsboard/server/service/security/model/token/JwtTokenFactory.java

@ -23,9 +23,9 @@ import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.JwtParser; import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.Jwts; import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.MalformedJwtException; import io.jsonwebtoken.MalformedJwtException;
import io.jsonwebtoken.SignatureException;
import io.jsonwebtoken.UnsupportedJwtException; import io.jsonwebtoken.UnsupportedJwtException;
import io.jsonwebtoken.security.Keys; import io.jsonwebtoken.security.Keys;
import io.jsonwebtoken.security.SignatureException;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;

4
application/src/main/java/org/thingsboard/server/service/ws/WebSocketSessionType.java

@ -17,9 +17,9 @@ package org.thingsboard.server.service.ws;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import java.util.Arrays; import java.util.Arrays;
import java.util.Objects;
import java.util.Optional; import java.util.Optional;
@NoArgsConstructor @NoArgsConstructor
@ -33,7 +33,7 @@ public enum WebSocketSessionType {
public static Optional<WebSocketSessionType> forName(String name) { public static Optional<WebSocketSessionType> forName(String name) {
return Arrays.stream(values()) return Arrays.stream(values())
.filter(sessionType -> StringUtils.equals(sessionType.name, name)) .filter(sessionType -> Objects.equals(sessionType.name, name))
.findFirst(); .findFirst();
} }

60
application/src/main/resources/thingsboard.yml

@ -15,6 +15,7 @@
# #
# Server common parameters # Server common parameters
# Configures HTTP/HTTPS bind address, port, SSL, WebSocket, and REST API settings.
server: server:
# Server bind-address # Server bind-address
address: "${HTTP_BIND_ADDRESS:0.0.0.0}" address: "${HTTP_BIND_ADDRESS:0.0.0.0}"
@ -117,23 +118,25 @@ server:
response_timeout: "${DEFAULT_RULE_ENGINE_RESPONSE_TIMEOUT:10000}" response_timeout: "${DEFAULT_RULE_ENGINE_RESPONSE_TIMEOUT:10000}"
# Application info parameters # Application info parameters
# Exposes application metadata such as version string injected at build time.
app: app:
# Application version # Application version
version: "@project.version@" version: "@project.version@"
# Zookeeper connection parameters # ZooKeeper connection parameters
# Controls ZooKeeper-based service discovery and cluster coordination for microservice deployments.
zk: zk:
# Enable/disable zookeeper discovery service. # Enable/disable ZooKeeper discovery service.
enabled: "${ZOOKEEPER_ENABLED:false}" enabled: "${ZOOKEEPER_ENABLED:false}"
# Zookeeper connect string # ZooKeeper connect string
url: "${ZOOKEEPER_URL:localhost:2181}" url: "${ZOOKEEPER_URL:localhost:2181}"
# Zookeeper retry interval in milliseconds # ZooKeeper retry interval in milliseconds
retry_interval_ms: "${ZOOKEEPER_RETRY_INTERVAL_MS:3000}" retry_interval_ms: "${ZOOKEEPER_RETRY_INTERVAL_MS:3000}"
# Zookeeper connection timeout in milliseconds # ZooKeeper connection timeout in milliseconds
connection_timeout_ms: "${ZOOKEEPER_CONNECTION_TIMEOUT_MS:3000}" connection_timeout_ms: "${ZOOKEEPER_CONNECTION_TIMEOUT_MS:3000}"
# Zookeeper session timeout in milliseconds # ZooKeeper session timeout in milliseconds
session_timeout_ms: "${ZOOKEEPER_SESSION_TIMEOUT_MS:3000}" session_timeout_ms: "${ZOOKEEPER_SESSION_TIMEOUT_MS:3000}"
# Name of the directory in zookeeper 'filesystem' # Name of the directory in ZooKeeper 'filesystem'
zk_dir: "${ZOOKEEPER_NODES_DIR:/thingsboard}" zk_dir: "${ZOOKEEPER_NODES_DIR:/thingsboard}"
# The recalculate_delay property is recommended in a microservices architecture setup for rule-engine services. # The recalculate_delay property is recommended in a microservices architecture setup for rule-engine services.
# This property provides a pause to ensure that when a rule-engine service is restarted, other nodes don't immediately attempt to recalculate their partitions. # This property provides a pause to ensure that when a rule-engine service is restarted, other nodes don't immediately attempt to recalculate their partitions.
@ -141,6 +144,7 @@ zk:
recalculate_delay: "${ZOOKEEPER_RECALCULATE_DELAY_MS:0}" recalculate_delay: "${ZOOKEEPER_RECALCULATE_DELAY_MS:0}"
# Cluster parameters # Cluster parameters
# Controls cluster statistics — tracks the number of messages exchanged between cluster nodes.
cluster: cluster:
stats: stats:
# Enable/Disable the cluster statistics. Calculates the number of messages sent between cluster nodes based on each type # Enable/Disable the cluster statistics. Calculates the number of messages sent between cluster nodes based on each type
@ -149,11 +153,13 @@ cluster:
print_interval_ms: "${TB_CLUSTER_STATS_PRINT_INTERVAL_MS:10000}" print_interval_ms: "${TB_CLUSTER_STATS_PRINT_INTERVAL_MS:10000}"
# Plugins configuration parameters # Plugins configuration parameters
# Defines classpath scan packages used to discover and register ThingsBoard extension plugins.
plugins: plugins:
# Comma-separated package list used during classpath scanning for plugins # Comma-separated package list used during classpath scanning for plugins
scan_packages: "${PLUGINS_SCAN_PACKAGES:org.thingsboard.server.extensions,org.thingsboard.rule.engine}" scan_packages: "${PLUGINS_SCAN_PACKAGES:org.thingsboard.server.extensions,org.thingsboard.rule.engine}"
# Security parameters # Security parameters
# Configures JWT tokens, user login, device claiming, OAuth2, and CA certificate trust store.
security: security:
# JWT Token parameters # JWT Token parameters
jwt: # Since 3.4.2 values are persisted in the database during installation or upgrade. On Install, the key will be generated randomly if no custom value set. You can change it later from Web UI under SYS_ADMIN jwt: # Since 3.4.2 values are persisted in the database during installation or upgrade. On Install, the key will be generated randomly if no custom value set. You can change it later from Web UI under SYS_ADMIN
@ -246,6 +252,7 @@ security:
report-only: "${SECURITY_HEADERS_CONTENT_SECURITY_POLICY_REPORT_ONLY:false}" report-only: "${SECURITY_HEADERS_CONTENT_SECURITY_POLICY_REPORT_ONLY:false}"
# Mail settings parameters # Mail settings parameters
# Configures mail service OAuth2 token refresh and per-tenant sending rate limits.
mail: mail:
oauth2: oauth2:
# Interval for checking refresh token expiration in seconds(by default, 1 day). # Interval for checking refresh token expiration in seconds(by default, 1 day).
@ -254,6 +261,7 @@ mail:
per_tenant_rate_limits: "${MAIL_PER_TENANT_RATE_LIMITS:}" per_tenant_rate_limits: "${MAIL_PER_TENANT_RATE_LIMITS:}"
# Usage statistics parameters # Usage statistics parameters
# Controls collection and reporting intervals for API usage stats at system, tenant, and customer levels.
usage: usage:
stats: stats:
report: report:
@ -277,6 +285,7 @@ usage:
report_interval: "${DEVICES_STATS_REPORT_INTERVAL:60}" report_interval: "${DEVICES_STATS_REPORT_INTERVAL:60}"
# UI settings parameters # UI settings parameters
# Configures dashboard data limits and base URL for UI help assets.
ui: ui:
# Dashboard parameters # Dashboard parameters
dashboard: dashboard:
@ -288,6 +297,7 @@ ui:
base-url: "${UI_HELP_BASE_URL:https://raw.githubusercontent.com/thingsboard/thingsboard-ui-help/release-4.3}" base-url: "${UI_HELP_BASE_URL:https://raw.githubusercontent.com/thingsboard/thingsboard-ui-help/release-4.3}"
# Database telemetry parameters # Database telemetry parameters
# Selects the storage backend (SQL, Cassandra, or TimescaleDB) for time-series and latest telemetry data.
database: database:
ts_max_intervals: "${DATABASE_TS_MAX_INTERVALS:700}" # Max number of DB queries generated by a single API call to fetch telemetry records ts_max_intervals: "${DATABASE_TS_MAX_INTERVALS:700}" # Max number of DB queries generated by a single API call to fetch telemetry records
ts: ts:
@ -296,6 +306,7 @@ database:
type: "${DATABASE_TS_LATEST_TYPE:sql}" # cassandra, sql, or timescale (for hybrid mode, DATABASE_TS_TYPE value should be cassandra, or timescale) type: "${DATABASE_TS_LATEST_TYPE:sql}" # cassandra, sql, or timescale (for hybrid mode, DATABASE_TS_TYPE value should be cassandra, or timescale)
# Cassandra driver configuration parameters # Cassandra driver configuration parameters
# Configures cluster name, keyspace, SSL, credentials, socket, and query settings for the Cassandra driver.
cassandra: cassandra:
# Thingsboard cluster name # Thingsboard cluster name
cluster_name: "${CASSANDRA_CLUSTER_NAME:Thingsboard Cluster}" cluster_name: "${CASSANDRA_CLUSTER_NAME:Thingsboard Cluster}"
@ -414,6 +425,7 @@ cassandra:
print_tenant_names: "${CASSANDRA_QUERY_TENANT_RATE_LIMITS_PRINT_TENANT_NAMES:false}" print_tenant_names: "${CASSANDRA_QUERY_TENANT_RATE_LIMITS_PRINT_TENANT_NAMES:false}"
# SQL configuration parameters # SQL configuration parameters
# Tunes batch sizes, delays, thread counts, TTL, and partitioning for SQL-backed persistence of telemetry, events, and audit logs.
sql: sql:
# Specify batch size for persisting attribute updates # Specify batch size for persisting attribute updates
attributes: attributes:
@ -518,6 +530,7 @@ sql:
query_timeout: "${SQL_RELATIONS_QUERY_TIMEOUT_SEC:20}" # This value has to be reasonably small to prevent the relation query from blocking all other DB calls query_timeout: "${SQL_RELATIONS_QUERY_TIMEOUT_SEC:20}" # This value has to be reasonably small to prevent the relation query from blocking all other DB calls
# Actor system parameters # Actor system parameters
# Configures thread pools, timeouts, and behavior for the internal actor system processing devices, rules, and RPCs.
actors: actors:
system: system:
throughput: "${ACTORS_SYSTEM_THROUGHPUT:5}" # Number of messages the actor system will process per actor before switching to processing of messages for the next actor throughput: "${ACTORS_SYSTEM_THROUGHPUT:5}" # Number of messages the actor system will process per actor before switching to processing of messages for the next actor
@ -634,6 +647,8 @@ actors:
# Time in seconds to receive calculation result. # Time in seconds to receive calculation result.
calculation_timeout: "${ACTORS_CALCULATION_TIMEOUT_SEC:5}" calculation_timeout: "${ACTORS_CALCULATION_TIMEOUT_SEC:5}"
# Debug settings parameters
# Configures the global default duration for debug mode used by rule chains and calculated fields.
debug: debug:
settings: settings:
# Default duration (in minutes) for debug mode. Min value is 1 minute. Tenant profile settings override this one. # Default duration (in minutes) for debug mode. Min value is 1 minute. Tenant profile settings override this one.
@ -641,6 +656,7 @@ debug:
default_duration: "${DEBUG_SETTINGS_DEFAULT_DURATION_MINUTES:15}" default_duration: "${DEBUG_SETTINGS_DEFAULT_DURATION_MINUTES:15}"
# Cache settings parameters # Cache settings parameters
# Configures cache type (Caffeine or Redis), pool size, and per-entity TTL and max-size limits for all caches.
cache: cache:
# caffeine or redis(7.2 - latest compatible version) # caffeine or redis(7.2 - latest compatible version)
type: "${CACHE_TYPE:caffeine}" type: "${CACHE_TYPE:caffeine}"
@ -800,6 +816,7 @@ cache:
spring.data.redis.repositories.enabled: false # Disable this because it is not required. spring.data.redis.repositories.enabled: false # Disable this because it is not required.
# Redis/Valkey configuration parameters # Redis/Valkey configuration parameters
# Configures standalone, cluster, or sentinel Redis connection, SSL, and connection pool settings used for caching.
redis: redis:
# standalone or cluster or sentinel # standalone or cluster or sentinel
connection: connection:
@ -836,9 +853,9 @@ redis:
password: "${REDIS_SENTINEL_PASSWORD:}" password: "${REDIS_SENTINEL_PASSWORD:}"
# If set false will be used pool config build from values of the pool config section # If set false will be used pool config build from values of the pool config section
useDefaultPoolConfig: "${REDIS_USE_DEFAULT_POOL_CONFIG:true}" useDefaultPoolConfig: "${REDIS_USE_DEFAULT_POOL_CONFIG:true}"
# db index # Redis logical database index to select after connecting.
db: "${REDIS_DB:0}" db: "${REDIS_DB:0}"
# db password # Password for Redis authentication (leave empty if not required).
password: "${REDIS_PASSWORD:}" password: "${REDIS_PASSWORD:}"
# Redis username for ACL authentication (Redis 6.0+). Leave empty for legacy password-only auth # Redis username for ACL authentication (Redis 6.0+). Leave empty for legacy password-only auth
username: "${REDIS_USERNAME:}" username: "${REDIS_USERNAME:}"
@ -883,6 +900,7 @@ redis:
# Update version parameters # Update version parameters
# Controls whether the platform periodically checks for new ThingsBoard releases.
updates: updates:
# Enable/disable checks for the new version # Enable/disable checks for the new version
enabled: "${UPDATES_ENABLED:true}" enabled: "${UPDATES_ENABLED:true}"
@ -911,6 +929,7 @@ spring.mvc.cors:
allow-credentials: "${TB_CORS_ALLOW_CREDENTIALS:true}" allow-credentials: "${TB_CORS_ALLOW_CREDENTIALS:true}"
# General spring parameters # General spring parameters
# Miscellaneous Spring Boot settings for circular references, Freemarker, MVC, multipart, and JPA dialect.
spring.main.allow-circular-references: "true" # Spring Boot configuration property that controls whether circular dependencies between beans are allowed. spring.main.allow-circular-references: "true" # Spring Boot configuration property that controls whether circular dependencies between beans are allowed.
spring.freemarker.checkTemplateLocation: "false" # spring freemarker configuration spring.freemarker.checkTemplateLocation: "false" # spring freemarker configuration
spring.mvc.async.request-timeout: "${SPRING_MVC_ASYNC_REQUEST_TIMEOUT:30000}" # The default timeout for asynchronous requests in milliseconds spring.mvc.async.request-timeout: "${SPRING_MVC_ASYNC_REQUEST_TIMEOUT:30000}" # The default timeout for asynchronous requests in milliseconds
@ -929,6 +948,7 @@ spring.jpa.properties.hibernate.order_by.default_null_ordering: "${SPRING_JPA_PR
spring.jpa.properties.hibernate.dialect: "${SPRING_JPA_DIALECT:org.thingsboard.server.dao.ThingsboardPostgreSQLDialect}" # we use custom dialect that contains ilike(arg1, arg2) function (is interpreted to postgres ILIKE operator) spring.jpa.properties.hibernate.dialect: "${SPRING_JPA_DIALECT:org.thingsboard.server.dao.ThingsboardPostgreSQLDialect}" # we use custom dialect that contains ilike(arg1, arg2) function (is interpreted to postgres ILIKE operator)
# SQL DAO Configuration parameters # SQL DAO Configuration parameters
# Configures Spring JPA, Hibernate DDL, and HikariCP datasource connections for the primary and events databases.
spring: spring:
data: data:
jpa: jpa:
@ -979,6 +999,7 @@ spring:
registerMbeans: "${SPRING_EVENTS_DATASOURCE_HIKARI_REGISTER_MBEANS:false}" registerMbeans: "${SPRING_EVENTS_DATASOURCE_HIKARI_REGISTER_MBEANS:false}"
# Audit log parameters # Audit log parameters
# Configures audit logging levels per entity type and optional forwarding to an external sink such as Elasticsearch.
audit-log: audit-log:
# Enable/disable audit log functionality. # Enable/disable audit log functionality.
enabled: "${AUDIT_LOG_ENABLED:true}" enabled: "${AUDIT_LOG_ENABLED:true}"
@ -1021,6 +1042,7 @@ audit-log:
password: "${AUDIT_LOG_SINK_PASSWORD:}" # Password used to access external sink system password: "${AUDIT_LOG_SINK_PASSWORD:}" # Password used to access external sink system
# Device state parameters # Device state parameters
# Configures device inactivity detection, state persistence strategy, and rate limits for state rule nodes.
state: state:
# Device inactivity timeout is a global configuration parameter that defines when the device will be marked as "inactive" by the server. # Device inactivity timeout is a global configuration parameter that defines when the device will be marked as "inactive" by the server.
# The parameter value is in seconds. A user can overwrite this parameter for an individual device by setting the “inactivityTimeout” server-side attribute (NOTE: expects value in milliseconds). # The parameter value is in seconds. A user can overwrite this parameter for an individual device by setting the “inactivityTimeout” server-side attribute (NOTE: expects value in milliseconds).
@ -1051,7 +1073,8 @@ state:
# Refill is set to be greedy. Please refer to Bucket4j library documentation for more details. # Refill is set to be greedy. Please refer to Bucket4j library documentation for more details.
rateLimit: "${DEVICE_STATE_NODE_RATE_LIMIT_CONFIGURATION:1:1,30:60,60:3600}" rateLimit: "${DEVICE_STATE_NODE_RATE_LIMIT_CONFIGURATION:1:1,30:60,60:3600}"
# Tbel parameters # TBEL parameters
# Configures the ThingsBoard Expression Language (TBEL) engine: limits, timeouts, thread pool, and blacklisting.
tbel: tbel:
# Enable/Disable TBEL feature. # Enable/Disable TBEL feature.
enabled: "${TBEL_ENABLED:true}" enabled: "${TBEL_ENABLED:true}"
@ -1080,6 +1103,7 @@ tbel:
print_interval_ms: "${TB_TBEL_STATS_PRINT_INTERVAL_MS:10000}" print_interval_ms: "${TB_TBEL_STATS_PRINT_INTERVAL_MS:10000}"
# JS parameters # JS parameters
# Configures the JavaScript execution engine (local Nashorn or remote Node.js): limits, sandboxing, and thread pools.
js: js:
# local (Nashorn Engine, deprecated) OR remote JS-Executors (NodeJS) # local (Nashorn Engine, deprecated) OR remote JS-Executors (NodeJS)
evaluator: "${JS_EVALUATOR:local}" evaluator: "${JS_EVALUATOR:local}"
@ -1127,6 +1151,7 @@ js:
print_interval_ms: "${TB_JS_REMOTE_STATS_PRINT_INTERVAL_MS:10000}" print_interval_ms: "${TB_JS_REMOTE_STATS_PRINT_INTERVAL_MS:10000}"
# Transport configuration parameters # Transport configuration parameters
# Configures session management, rate limits, and protocol-specific settings for HTTP, MQTT, CoAP, LwM2M, and SNMP transports.
transport: transport:
sessions: sessions:
# Session inactivity timeout is a global configuration parameter that defines how long the device transport session will be opened after the last message arrives from the device. # Session inactivity timeout is a global configuration parameter that defines how long the device transport session will be opened after the last message arrives from the device.
@ -1448,6 +1473,7 @@ transport:
check_interval_seconds: "${TB_TRANSPORT_SSL_CERTIFICATE_RELOAD_CHECK_INTERVAL_SECONDS:60}" check_interval_seconds: "${TB_TRANSPORT_SSL_CERTIFICATE_RELOAD_CHECK_INTERVAL_SECONDS:60}"
# CoAP server parameters # CoAP server parameters
# Configures the standalone CoAP server bind address, port, DTLS encryption, and credential settings.
coap: coap:
server: server:
# Enable/disable coap server. # Enable/disable coap server.
@ -1532,6 +1558,7 @@ coap:
dtls_session_report_timeout: "${TB_COAP_X509_DTLS_SESSION_REPORT_TIMEOUT:1800000}" dtls_session_report_timeout: "${TB_COAP_X509_DTLS_SESSION_REPORT_TIMEOUT:1800000}"
# Device connectivity parameters # Device connectivity parameters
# Specifies the hosts, ports, and credentials exposed to the UI for generating device connection check commands.
device: device:
connectivity: connectivity:
http: http:
@ -1585,6 +1612,7 @@ device:
image_version: "${DEVICE_CONNECTIVITY_GATEWAY_IMAGE_VERSION:3.8-stable}" image_version: "${DEVICE_CONNECTIVITY_GATEWAY_IMAGE_VERSION:3.8-stable}"
# Edges parameters # Edges parameters
# Controls Edge instance gRPC communication, event storage, state persistence, and statistics reporting.
edges: edges:
# Enable/disable Edge instance # Enable/disable Edge instance
enabled: "${EDGES_ENABLED:true}" enabled: "${EDGES_ENABLED:true}"
@ -1653,6 +1681,7 @@ edges:
report-interval-millis: "${EDGES_STATS_REPORT_INTERVAL_MS:600000}" report-interval-millis: "${EDGES_STATS_REPORT_INTERVAL_MS:600000}"
# Spring doc common parameters # Spring doc common parameters
# Enables or disables the OpenAPI/Swagger documentation endpoint and sets the default media type.
springdoc: springdoc:
# If false swagger API docs will be unavailable # If false swagger API docs will be unavailable
api-docs.enabled: "${SWAGGER_ENABLED:true}" api-docs.enabled: "${SWAGGER_ENABLED:true}"
@ -1660,6 +1689,7 @@ springdoc:
default-produces-media-type: "${SWAGGER_DEFAULT_PRODUCES_MEDIA_TYPE:application/json}" default-produces-media-type: "${SWAGGER_DEFAULT_PRODUCES_MEDIA_TYPE:application/json}"
# Swagger common parameters # Swagger common parameters
# Configures Swagger UI metadata: title, description, contact, license, version, and API path patterns.
swagger: swagger:
# General swagger match pattern of swagger UI links # General swagger match pattern of swagger UI links
api_path: "${SWAGGER_API_PATH:/api/**}" api_path: "${SWAGGER_API_PATH:/api/**}"
@ -1691,6 +1721,7 @@ swagger:
doc_expansion: "${SWAGGER_DOC_EXPANSION:list}" doc_expansion: "${SWAGGER_DOC_EXPANSION:list}"
# Queue configuration parameters # Queue configuration parameters
# Configures the message queue backend (in-memory or Kafka) and all topic/partition/consumer settings for each service.
queue: queue:
type: "${TB_QUEUE_TYPE:in-memory}" # in-memory or kafka (Apache Kafka) type: "${TB_QUEUE_TYPE:in-memory}" # in-memory or kafka (Apache Kafka)
prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. If specified, prefix is added before default topic name: 'prefix.default_topic_name'. Prefix is applied to all topics (and consumer groups for kafka). prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. If specified, prefix is added before default topic name: 'prefix.default_topic_name'. Prefix is applied to all topics (and consumer groups for kafka).
@ -2101,12 +2132,14 @@ queue:
processing_interval: "${TB_QUEUE_TASKS_STATS_PROCESSING_INTERVAL_MS:1000}" processing_interval: "${TB_QUEUE_TASKS_STATS_PROCESSING_INTERVAL_MS:1000}"
# Event configuration parameters # Event configuration parameters
# Controls limits on debug event content size stored for rule chain and rule node execution.
event: event:
debug: debug:
# Maximum number of symbols per debug event. The event content will be truncated if needed # Maximum number of symbols per debug event. The event content will be truncated if needed
max-symbols: "${TB_MAX_DEBUG_EVENT_SYMBOLS:4096}" max-symbols: "${TB_MAX_DEBUG_EVENT_SYMBOLS:4096}"
# General service parameters # General service parameters
# Sets the deployment type (monolith or microservice) and assigns tenant profiles to specific Rule Engine instances.
service: service:
type: "${TB_SERVICE_TYPE:monolith}" # monolith or tb-core or tb-rule-engine type: "${TB_SERVICE_TYPE:monolith}" # monolith or tb-core or tb-rule-engine
# Unique id for this service (autogenerated if empty) # Unique id for this service (autogenerated if empty)
@ -2120,6 +2153,7 @@ service:
executor_thread_pool_size: "${TB_RULE_ENGINE_PUBSUB_EXECUTOR_THREAD_POOL_SIZE:0}" executor_thread_pool_size: "${TB_RULE_ENGINE_PUBSUB_EXECUTOR_THREAD_POOL_SIZE:0}"
# Metrics parameters # Metrics parameters
# Enables actuator metrics endpoint and configures system info (CPU, memory) persistence frequency and TTL.
metrics: metrics:
# Enable/disable actuator metrics. # Enable/disable actuator metrics.
enabled: "${METRICS_ENABLED:false}" enabled: "${METRICS_ENABLED:false}"
@ -2133,6 +2167,7 @@ metrics:
ttl: "${METRICS_SYSTEM_INFO_TTL_DAYS:7}" ttl: "${METRICS_SYSTEM_INFO_TTL_DAYS:7}"
# Version control parameters # Version control parameters
# Configures thread pools and Git repository folder for entity version control (export/import) operations.
vc: vc:
# Pool size for handling export tasks # Pool size for handling export tasks
thread_pool_size: "${TB_VC_POOL_SIZE:6}" thread_pool_size: "${TB_VC_POOL_SIZE:6}"
@ -2143,6 +2178,7 @@ vc:
repositories-folder: "${TB_VC_GIT_REPOSITORIES_FOLDER:${java.io.tmpdir}/repositories}" repositories-folder: "${TB_VC_GIT_REPOSITORIES_FOLDER:${java.io.tmpdir}/repositories}"
# Notification system parameters # Notification system parameters
# Configures thread pool size and deduplication intervals for the notification rule processing engine.
notification_system: notification_system:
# Specify thread pool size for Notification System processing notification rules and notification sending. Recommend value <= 10 # Specify thread pool size for Notification System processing notification rules and notification sending. Recommend value <= 10
thread_pool_size: "${TB_NOTIFICATION_SYSTEM_THREAD_POOL_SIZE:10}" thread_pool_size: "${TB_NOTIFICATION_SYSTEM_THREAD_POOL_SIZE:10}"
@ -2151,6 +2187,7 @@ notification_system:
deduplication_durations: "${TB_NOTIFICATION_RULES_DEDUPLICATION_DURATIONS:NEW_PLATFORM_VERSION:0;RATE_LIMITS:14400000;}" deduplication_durations: "${TB_NOTIFICATION_RULES_DEDUPLICATION_DURATIONS:NEW_PLATFORM_VERSION:0;RATE_LIMITS:14400000;}"
# General management parameters # General management parameters
# Configures Spring Boot Actuator endpoint exposure and health indicator settings.
management: management:
endpoints: endpoints:
web: web:
@ -2163,6 +2200,7 @@ management:
enabled: "false" enabled: "false"
# Mobile application settings for Thingsboard mobile application # Mobile application settings for Thingsboard mobile application
# Specifies domain name and store links used for the ThingsBoard Live mobile application QR code and deep links.
mobileApp: mobileApp:
# Server domain name for Thingsboard Live mobile application # Server domain name for Thingsboard Live mobile application
domain: "${TB_MOBILE_APP_DOMAIN:demo.thingsboard.io}" domain: "${TB_MOBILE_APP_DOMAIN:demo.thingsboard.io}"
@ -2171,6 +2209,8 @@ mobileApp:
# Link to App Store for Thingsboard Live mobile application # Link to App Store for Thingsboard Live mobile application
appStoreLink: "${TB_MOBILE_APP_APP_STORE_LINK:https://apps.apple.com/us/app/thingsboard-live/id1594355695}" appStoreLink: "${TB_MOBILE_APP_APP_STORE_LINK:https://apps.apple.com/us/app/thingsboard-live/id1594355695}"
# MQTT client parameters
# Configures MQTT client retransmission behavior including max attempts, initial delay, and jitter factor.
mqtt: mqtt:
# MQTT client configuration parameters # MQTT client configuration parameters
client: client:

10
application/src/test/java/org/thingsboard/server/controller/AbstractNotifyEntityTest.java

@ -19,8 +19,8 @@ import lombok.extern.slf4j.Slf4j;
import org.mockito.ArgumentMatcher; import org.mockito.ArgumentMatcher;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.springframework.boot.info.BuildProperties; import org.springframework.boot.info.BuildProperties;
import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.thingsboard.server.cluster.TbClusterService; import org.thingsboard.server.cluster.TbClusterService;
import org.thingsboard.server.common.data.EdgeUtils; import org.thingsboard.server.common.data.EdgeUtils;
import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.EntityType;
@ -55,13 +55,13 @@ import static org.mockito.Mockito.times;
@Slf4j @Slf4j
public abstract class AbstractNotifyEntityTest extends AbstractWebTest { public abstract class AbstractNotifyEntityTest extends AbstractWebTest {
@SpyBean @MockitoSpyBean
protected TbClusterService tbClusterService; protected TbClusterService tbClusterService;
@SpyBean @MockitoSpyBean
protected AuditLogService auditLogService; protected AuditLogService auditLogService;
@MockBean @MockitoBean
BuildProperties buildProperties; BuildProperties buildProperties;
protected final String msgErrorPermission = "You don't have permission to perform this operation!"; protected final String msgErrorPermission = "You don't have permission to perform this operation!";

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

@ -1379,7 +1379,7 @@ public abstract class AbstractWebTest extends AbstractInMemoryStorageTest {
protected NotificationTarget createNotificationTarget(UsersFilter usersFilter) { protected NotificationTarget createNotificationTarget(UsersFilter usersFilter) {
NotificationTarget notificationTarget = new NotificationTarget(); NotificationTarget notificationTarget = new NotificationTarget();
notificationTarget.setName(usersFilter.toString() + RandomStringUtils.randomNumeric(5)); notificationTarget.setName(usersFilter.toString() + RandomStringUtils.secure().nextNumeric(5));
PlatformUsersNotificationTargetConfig targetConfig = new PlatformUsersNotificationTargetConfig(); PlatformUsersNotificationTargetConfig targetConfig = new PlatformUsersNotificationTargetConfig();
targetConfig.setUsersFilter(usersFilter); targetConfig.setUsersFilter(usersFilter);
notificationTarget.setConfiguration(targetConfig); notificationTarget.setConfiguration(targetConfig);

2
application/src/test/java/org/thingsboard/server/controller/AdminControllerTest.java

@ -168,7 +168,7 @@ public class AdminControllerTest extends AbstractControllerTest {
assertThat(jwtSettings).isEqualTo(defaultJwtSettings); assertThat(jwtSettings).isEqualTo(defaultJwtSettings);
jwtSettings.setTokenSigningKey(Base64.getEncoder().encodeToString( jwtSettings.setTokenSigningKey(Base64.getEncoder().encodeToString(
RandomStringUtils.randomAlphanumeric(512 / Byte.SIZE).getBytes(StandardCharsets.UTF_8))); RandomStringUtils.secure().nextAlphanumeric(512 / Byte.SIZE).getBytes(StandardCharsets.UTF_8)));
doPost("/api/admin/jwtSettings", jwtSettings).andExpect(status().isOk()); doPost("/api/admin/jwtSettings", jwtSettings).andExpect(status().isOk());

54
application/src/test/java/org/thingsboard/server/controller/AlarmCommentControllerTest.java

@ -28,7 +28,7 @@ import org.mockito.Mockito;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Primary;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.RandomStringUtils;
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.alarm.Alarm; import org.thingsboard.server.common.data.alarm.Alarm;
@ -226,15 +226,13 @@ public class AlarmCommentControllerTest extends AbstractControllerTest {
doDelete("/api/alarm/" + alarm.getId() + "/comment/" + alarmComment.getId()) doDelete("/api/alarm/" + alarm.getId() + "/comment/" + alarmComment.getId())
.andExpect(status().isOk()); .andExpect(status().isOk());
AlarmComment expectedAlarmComment = AlarmComment.builder() alarmComment.setType(AlarmCommentType.SYSTEM);
.alarmId(alarm.getId()) alarmComment.setUserId(null);
.type(AlarmCommentType.SYSTEM) alarmComment.setComment(JacksonUtil.newObjectNode()
.comment(JacksonUtil.newObjectNode() .put("text", String.format(COMMENT_DELETED.getText(), CUSTOMER_USER_EMAIL))
.put("text", String.format(COMMENT_DELETED.getText(), CUSTOMER_USER_EMAIL)) .put("subtype", COMMENT_DELETED.name())
.put("subtype", COMMENT_DELETED.name()) .put("userName", CUSTOMER_USER_EMAIL));
.put("userName", CUSTOMER_USER_EMAIL)) testLogEntityActionEntityEqClass(alarm, alarm.getId(), tenantId, customerId, customerUserId, CUSTOMER_USER_EMAIL, ActionType.DELETED_COMMENT, 1, alarmComment);
.build();
testLogEntityActionEntityEqClass(alarm, alarm.getId(), tenantId, customerId, customerUserId, CUSTOMER_USER_EMAIL, ActionType.DELETED_COMMENT, 1, expectedAlarmComment);
} }
@Test @Test
@ -252,15 +250,13 @@ public class AlarmCommentControllerTest extends AbstractControllerTest {
loginTenantAdmin(); loginTenantAdmin();
doDelete("/api/alarm/" + alarm.getId() + "/comment/" + alarmComment.getId()) doDelete("/api/alarm/" + alarm.getId() + "/comment/" + alarmComment.getId())
.andExpect(status().isOk()); .andExpect(status().isOk());
AlarmComment expectedAlarmComment = AlarmComment.builder() alarmComment.setType(AlarmCommentType.SYSTEM);
.alarmId(alarm.getId()) alarmComment.setUserId(null);
.type(AlarmCommentType.SYSTEM) alarmComment.setComment(JacksonUtil.newObjectNode()
.comment(JacksonUtil.newObjectNode() .put("text", String.format(COMMENT_DELETED.getText(), TENANT_ADMIN_EMAIL))
.put("text", String.format(COMMENT_DELETED.getText(), TENANT_ADMIN_EMAIL)) .put("subtype", COMMENT_DELETED.name())
.put("subtype", COMMENT_DELETED.name()) .put("userName", TENANT_ADMIN_EMAIL));
.put("userName", TENANT_ADMIN_EMAIL)) testLogEntityActionEntityEqClass(alarm, alarm.getId(), tenantId, customerId, tenantAdminUserId, TENANT_ADMIN_EMAIL, ActionType.DELETED_COMMENT, 1, alarmComment);
.build();
testLogEntityActionEntityEqClass(alarm, alarm.getId(), tenantId, customerId, tenantAdminUserId, TENANT_ADMIN_EMAIL, ActionType.DELETED_COMMENT, 1, expectedAlarmComment);
} }
@Test @Test
@ -285,15 +281,13 @@ public class AlarmCommentControllerTest extends AbstractControllerTest {
assertThat(systemComment.getComment().get("text").asText()).isEqualTo(String.format("Comment was deleted by user %s", assertThat(systemComment.getComment().get("text").asText()).isEqualTo(String.format("Comment was deleted by user %s",
TENANT_ADMIN_EMAIL)); TENANT_ADMIN_EMAIL));
AlarmComment expectedAlarmComment = AlarmComment.builder() alarmComment.setType(AlarmCommentType.SYSTEM);
.alarmId(alarm.getId()) alarmComment.setUserId(null);
.type(AlarmCommentType.SYSTEM) alarmComment.setComment(JacksonUtil.newObjectNode()
.comment(JacksonUtil.newObjectNode() .put("text", String.format(COMMENT_DELETED.getText(), TENANT_ADMIN_EMAIL))
.put("text", String.format(COMMENT_DELETED.getText(), TENANT_ADMIN_EMAIL)) .put("subtype", COMMENT_DELETED.name())
.put("subtype", COMMENT_DELETED.name()) .put("userName", TENANT_ADMIN_EMAIL));
.put("userName", TENANT_ADMIN_EMAIL)) testLogEntityActionEntityEqClass(alarm, alarm.getId(), tenantId, customerId, tenantAdminUserId, TENANT_ADMIN_EMAIL, ActionType.DELETED_COMMENT, 1, alarmComment);
.build();
testLogEntityActionEntityEqClass(alarm, alarm.getId(), tenantId, customerId, tenantAdminUserId, TENANT_ADMIN_EMAIL, ActionType.DELETED_COMMENT, 1, expectedAlarmComment);
} }
@Test @Test
@ -337,7 +331,7 @@ public class AlarmCommentControllerTest extends AbstractControllerTest {
final int size = 10; final int size = 10;
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
createdAlarmComments.add( createdAlarmComments.add(
createAlarmComment(alarm.getId(), RandomStringUtils.randomAlphanumeric(10)) createAlarmComment(alarm.getId(), RandomStringUtils.secure().nextAlphanumeric(10))
); );
} }
@ -368,7 +362,7 @@ public class AlarmCommentControllerTest extends AbstractControllerTest {
List<AlarmComment> createdAlarmComments = new LinkedList<>(); List<AlarmComment> createdAlarmComments = new LinkedList<>();
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
createdAlarmComments.add( createdAlarmComments.add(
createAlarmComment(alarm.getId(), RandomStringUtils.randomAlphanumeric(10)) createAlarmComment(alarm.getId(), RandomStringUtils.secure().nextAlphanumeric(10))
); );
} }

6
application/src/test/java/org/thingsboard/server/controller/AuditLogControllerTest.java

@ -26,7 +26,7 @@ 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.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
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.Tenant;
import org.thingsboard.server.common.data.TenantProfile; import org.thingsboard.server.common.data.TenantProfile;
@ -71,9 +71,9 @@ public class AuditLogControllerTest extends AbstractControllerTest {
@Autowired @Autowired
private AuditLogDao auditLogDao; private AuditLogDao auditLogDao;
@Getter @Getter
@SpyBean @MockitoSpyBean
private SqlPartitioningRepository partitioningRepository; private SqlPartitioningRepository partitioningRepository;
@SpyBean @MockitoSpyBean
private AuditLogsCleanUpService auditLogsCleanUpService; private AuditLogsCleanUpService auditLogsCleanUpService;
@Value("#{${sql.audit_logs.partition_size} * 60 * 60 * 1000}") @Value("#{${sql.audit_logs.partition_size} * 60 * 60 * 1000}")

4
application/src/test/java/org/thingsboard/server/controller/AuditLogControllerTest_DedicatedEventsDataSource.java

@ -16,7 +16,7 @@
package org.thingsboard.server.controller; package org.thingsboard.server.controller;
import lombok.Getter; import lombok.Getter;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.TestPropertySource;
import org.thingsboard.server.dao.service.DaoSqlTest; import org.thingsboard.server.dao.service.DaoSqlTest;
import org.thingsboard.server.dao.sqlts.insert.sql.DedicatedEventsSqlPartitioningRepository; import org.thingsboard.server.dao.sqlts.insert.sql.DedicatedEventsSqlPartitioningRepository;
@ -30,7 +30,7 @@ import org.thingsboard.server.dao.sqlts.insert.sql.DedicatedEventsSqlPartitionin
public class AuditLogControllerTest_DedicatedEventsDataSource extends AuditLogControllerTest { public class AuditLogControllerTest_DedicatedEventsDataSource extends AuditLogControllerTest {
@Getter @Getter
@SpyBean @MockitoSpyBean
private DedicatedEventsSqlPartitioningRepository partitioningRepository; private DedicatedEventsSqlPartitioningRepository partitioningRepository;
} }

12
application/src/test/java/org/thingsboard/server/controller/AuthControllerTest.java

@ -20,9 +20,9 @@ import org.assertj.core.data.Offset;
import org.junit.After; import org.junit.After;
import org.junit.Test; import org.junit.Test;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.RandomStringUtils;
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.data.User; import org.thingsboard.server.common.data.User;
@ -50,7 +50,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
@DaoSqlTest @DaoSqlTest
public class AuthControllerTest extends AbstractControllerTest { public class AuthControllerTest extends AbstractControllerTest {
@SpyBean @MockitoSpyBean
private UserCredentialsDao userCredentialsDao; private UserCredentialsDao userCredentialsDao;
@After @After
@ -149,7 +149,7 @@ public class AuthControllerTest extends AbstractControllerTest {
loginTenantAdmin(); loginTenantAdmin();
ChangePasswordRequest changePasswordRequest = new ChangePasswordRequest(); ChangePasswordRequest changePasswordRequest = new ChangePasswordRequest();
changePasswordRequest.setCurrentPassword("tenant"); changePasswordRequest.setCurrentPassword("tenant");
changePasswordRequest.setNewPassword(RandomStringUtils.randomAlphanumeric(73)); changePasswordRequest.setNewPassword(RandomStringUtils.secure().nextAlphanumeric(73));
doPost("/api/auth/changePassword", changePasswordRequest) doPost("/api/auth/changePassword", changePasswordRequest)
.andExpect(status().isBadRequest()) .andExpect(status().isBadRequest())
.andExpect(jsonPath("$.message", is("Password must be no more than 72 characters in length."))); .andExpect(jsonPath("$.message", is("Password must be no more than 72 characters in length.")));
@ -161,7 +161,7 @@ public class AuthControllerTest extends AbstractControllerTest {
ChangePasswordRequest changePasswordRequest = new ChangePasswordRequest(); ChangePasswordRequest changePasswordRequest = new ChangePasswordRequest();
changePasswordRequest.setCurrentPassword("tenant"); changePasswordRequest.setCurrentPassword("tenant");
String newPassword = RandomStringUtils.randomAlphanumeric(16); String newPassword = RandomStringUtils.secure().nextAlphanumeric(16);
changePasswordRequest.setNewPassword(newPassword); changePasswordRequest.setNewPassword(newPassword);
doPost("/api/auth/changePassword", changePasswordRequest) doPost("/api/auth/changePassword", changePasswordRequest)
.andExpect(status().isOk()); .andExpect(status().isOk());
@ -194,7 +194,7 @@ public class AuthControllerTest extends AbstractControllerTest {
.andExpect(status().isSeeOther()) .andExpect(status().isSeeOther())
.andExpect(header().string(HttpHeaders.LOCATION, "/login/resetPassword?resetToken=" + this.currentResetPasswordToken)); .andExpect(header().string(HttpHeaders.LOCATION, "/login/resetPassword?resetToken=" + this.currentResetPasswordToken));
String newPassword = RandomStringUtils.randomAlphanumeric(73); String newPassword = RandomStringUtils.secure().nextAlphanumeric(73);
JsonNode resetPasswordRequest = JacksonUtil.newObjectNode() JsonNode resetPasswordRequest = JacksonUtil.newObjectNode()
.put("resetToken", this.currentResetPasswordToken) .put("resetToken", this.currentResetPasswordToken)
.put("password", newPassword); .put("password", newPassword);

2
application/src/test/java/org/thingsboard/server/controller/BaseQueueControllerTest.java

@ -236,7 +236,7 @@ public class BaseQueueControllerTest extends AbstractControllerTest {
when(testProcessingResult.getFailedMap()).thenReturn(new ConcurrentHashMap<>()); when(testProcessingResult.getFailedMap()).thenReturn(new ConcurrentHashMap<>());
when(testProcessingResult.getPendingMap()).thenReturn(new ConcurrentHashMap<>()); when(testProcessingResult.getPendingMap()).thenReturn(new ConcurrentHashMap<>());
String largeExceptionMessage = RandomStringUtils.randomAlphabetic(150); String largeExceptionMessage = RandomStringUtils.secure().nextAlphabetic(150);
RuleEngineException ruleEngineException = new RuleEngineException(largeExceptionMessage); RuleEngineException ruleEngineException = new RuleEngineException(largeExceptionMessage);
when(testProcessingResult.getExceptionsMap()).thenReturn(new ConcurrentHashMap<>(Map.of( when(testProcessingResult.getExceptionsMap()).thenReturn(new ConcurrentHashMap<>(Map.of(
tenantId, ruleEngineException tenantId, ruleEngineException

6
application/src/test/java/org/thingsboard/server/controller/DeviceControllerTest.java

@ -31,7 +31,7 @@ import org.mockito.AdditionalAnswers;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Primary;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
@ -115,10 +115,10 @@ public class DeviceControllerTest extends AbstractControllerTest {
private Tenant savedTenant; private Tenant savedTenant;
private User tenantAdmin; private User tenantAdmin;
@SpyBean @MockitoSpyBean
private GatewayNotificationsService gatewayNotificationsService; private GatewayNotificationsService gatewayNotificationsService;
@SpyBean @MockitoSpyBean
private DeviceStateService deviceStateService; private DeviceStateService deviceStateService;
@Autowired @Autowired

4
application/src/test/java/org/thingsboard/server/controller/EdgeEventControllerTest.java

@ -25,7 +25,7 @@ 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.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.TestPropertySource;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.AttributeScope; import org.thingsboard.server.common.data.AttributeScope;
@ -66,7 +66,7 @@ public class EdgeEventControllerTest extends AbstractControllerTest {
@Autowired @Autowired
private EdgeEventDao edgeEventDao; private EdgeEventDao edgeEventDao;
@SpyBean @MockitoSpyBean
private SqlPartitioningRepository partitioningRepository; private SqlPartitioningRepository partitioningRepository;
@Autowired @Autowired
private EdgeEventsCleanUpService edgeEventsCleanUpService; private EdgeEventsCleanUpService edgeEventsCleanUpService;

4
application/src/test/java/org/thingsboard/server/controller/EntityQueryControllerTest.java

@ -30,7 +30,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.ResultActions;
import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.RandomStringUtils;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.AttributeScope; import org.thingsboard.server.common.data.AttributeScope;
import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.Customer;
@ -201,7 +201,7 @@ public class EntityQueryControllerTest extends AbstractControllerTest {
loginTenantAdmin(); loginTenantAdmin();
List<Device> devices = new ArrayList<>(); List<Device> devices = new ArrayList<>();
String devicePrefix = "Device" + RandomStringUtils.randomAlphabetic(5); String devicePrefix = "Device" + RandomStringUtils.secure().nextAlphabetic(5);
for (int i = 0; i < 97; i++) { for (int i = 0; i < 97; i++) {
Device device = new Device(); Device device = new Device();
device.setName(devicePrefix + i); device.setName(devicePrefix + i);

6
application/src/test/java/org/thingsboard/server/controller/HomePageApiTest.java

@ -22,7 +22,7 @@ import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rule.engine.api.MailService; import org.thingsboard.rule.engine.api.MailService;
import org.thingsboard.rule.engine.api.SmsService; import org.thingsboard.rule.engine.api.SmsService;
@ -85,10 +85,10 @@ public class HomePageApiTest extends AbstractControllerTest {
@Autowired @Autowired
private OAuth2ClientService oAuth2ClientService; private OAuth2ClientService oAuth2ClientService;
@MockBean @MockitoBean
private MailService mailService; private MailService mailService;
@MockBean @MockitoBean
private SmsService smsService; private SmsService smsService;
private static final int DEFAULT_DASHBOARDS_COUNT = 0; private static final int DEFAULT_DASHBOARDS_COUNT = 0;

4
application/src/test/java/org/thingsboard/server/controller/RepositorySettingsTest.java

@ -18,7 +18,7 @@ package org.thingsboard.server.controller;
import com.google.common.util.concurrent.SettableFuture; import com.google.common.util.concurrent.SettableFuture;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.junit.Test; import org.junit.Test;
import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.thingsboard.server.common.data.sync.vc.RepositoryAuthMethod; import org.thingsboard.server.common.data.sync.vc.RepositoryAuthMethod;
import org.thingsboard.server.common.data.sync.vc.RepositorySettings; import org.thingsboard.server.common.data.sync.vc.RepositorySettings;
import org.thingsboard.server.dao.service.DaoSqlTest; import org.thingsboard.server.dao.service.DaoSqlTest;
@ -35,7 +35,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
@DaoSqlTest @DaoSqlTest
public class RepositorySettingsTest extends AbstractControllerTest { public class RepositorySettingsTest extends AbstractControllerTest {
@MockBean @MockitoBean
private GitVersionControlQueueService gitVersionControlQueueService; private GitVersionControlQueueService gitVersionControlQueueService;
@Test @Test

4
application/src/test/java/org/thingsboard/server/controller/RuleEngineControllerTest.java

@ -19,7 +19,7 @@ import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import org.junit.Test; import org.junit.Test;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.DataConstants; import org.thingsboard.server.common.data.DataConstants;
import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.Device;
@ -56,7 +56,7 @@ public class RuleEngineControllerTest extends AbstractControllerTest {
private final String REQUEST_BODY = "{\"request\":\"download\"}"; private final String REQUEST_BODY = "{\"request\":\"download\"}";
private final String RESPONSE_BODY = "{\"response\":\"downloadOk\"}"; private final String RESPONSE_BODY = "{\"response\":\"downloadOk\"}";
@SpyBean @MockitoSpyBean
private RuleEngineCallService ruleEngineCallService; private RuleEngineCallService ruleEngineCallService;
@Test @Test

10
application/src/test/java/org/thingsboard/server/controller/TwoFactorAuthConfigTest.java

@ -22,8 +22,8 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.cache.CacheManager; import org.springframework.cache.CacheManager;
import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder; import org.springframework.web.util.UriComponentsBuilder;
@ -65,15 +65,15 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
@DaoSqlTest @DaoSqlTest
public class TwoFactorAuthConfigTest extends AbstractControllerTest { public class TwoFactorAuthConfigTest extends AbstractControllerTest {
@SpyBean @MockitoSpyBean
private TotpTwoFaProvider totpTwoFactorAuthProvider; private TotpTwoFaProvider totpTwoFactorAuthProvider;
@MockBean @MockitoBean
private SmsService smsService; private SmsService smsService;
@Autowired @Autowired
private CacheManager cacheManager; private CacheManager cacheManager;
@Autowired @Autowired
private TwoFaConfigManager twoFaConfigManager; private TwoFaConfigManager twoFaConfigManager;
@SpyBean @MockitoSpyBean
private TwoFactorAuthService twoFactorAuthService; private TwoFactorAuthService twoFactorAuthService;
@Before @Before

8
application/src/test/java/org/thingsboard/server/controller/TwoFactorAuthTest.java

@ -23,8 +23,8 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.web.util.UriComponentsBuilder; import org.springframework.web.util.UriComponentsBuilder;
import org.thingsboard.rule.engine.api.SmsService; import org.thingsboard.rule.engine.api.SmsService;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
@ -82,9 +82,9 @@ public class TwoFactorAuthTest extends AbstractControllerTest {
@Autowired @Autowired
private TwoFaConfigManager twoFaConfigManager; private TwoFaConfigManager twoFaConfigManager;
@SpyBean @MockitoSpyBean
private TwoFactorAuthService twoFactorAuthService; private TwoFactorAuthService twoFactorAuthService;
@MockBean @MockitoBean
private SmsService smsService; private SmsService smsService;
@Autowired @Autowired
private AuditLogService auditLogService; private AuditLogService auditLogService;

4
application/src/test/java/org/thingsboard/server/controller/UserControllerTest.java

@ -1297,9 +1297,9 @@ public class UserControllerTest extends AbstractControllerTest {
Assert.assertEquals(savedDashboard2.getTitle(), starred.getTitle()); Assert.assertEquals(savedDashboard2.getTitle(), starred.getTitle());
//TEST renaming in the cache. //TEST renaming in the cache.
savedDashboard1.setTitle(RandomStringUtils.randomAlphanumeric(10)); savedDashboard1.setTitle(RandomStringUtils.secure().nextAlphanumeric(10));
savedDashboard1 = doPost("/api/dashboard", savedDashboard1, Dashboard.class); savedDashboard1 = doPost("/api/dashboard", savedDashboard1, Dashboard.class);
savedDashboard2.setTitle(RandomStringUtils.randomAlphanumeric(10)); savedDashboard2.setTitle(RandomStringUtils.secure().nextAlphanumeric(10));
savedDashboard2 = doPost("/api/dashboard", savedDashboard2, Dashboard.class); savedDashboard2 = doPost("/api/dashboard", savedDashboard2, Dashboard.class);
newSettings = doGet("/api/user/dashboards/" + savedDashboard1.getId().getId() + "/unstar", UserDashboardsInfo.class); newSettings = doGet("/api/user/dashboards/" + savedDashboard1.getId().getId() + "/unstar", UserDashboardsInfo.class);

8
application/src/test/java/org/thingsboard/server/controller/WebsocketApiTest.java

@ -28,9 +28,9 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.TestPropertySource;
import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.RandomStringUtils;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rule.engine.api.AttributesSaveRequest; import org.thingsboard.rule.engine.api.AttributesSaveRequest;
import org.thingsboard.rule.engine.api.TimeseriesSaveRequest; import org.thingsboard.rule.engine.api.TimeseriesSaveRequest;
@ -100,7 +100,7 @@ public class WebsocketApiTest extends AbstractControllerTest {
@Autowired @Autowired
private TelemetrySubscriptionService tsService; private TelemetrySubscriptionService tsService;
@SpyBean @MockitoSpyBean
private TimeseriesService timeseriesService; private TimeseriesService timeseriesService;
Device device; Device device;
@ -556,7 +556,7 @@ public class WebsocketApiTest extends AbstractControllerTest {
for (int i = 0; i < 6; i++) { for (int i = 0; i < 6; i++) {
Alarm alarm = new Alarm(); Alarm alarm = new Alarm();
alarm.setOriginator(device.getId()); alarm.setOriginator(device.getId());
alarm.setType(RandomStringUtils.randomAlphabetic(10)); alarm.setType(RandomStringUtils.secure().nextAlphabetic(10));
alarm.setSeverity(AlarmSeverity.CRITICAL); alarm.setSeverity(AlarmSeverity.CRITICAL);
alarm = doPost("/api/alarm", alarm, Alarm.class); alarm = doPost("/api/alarm", alarm, Alarm.class);
alarms.add(alarm); alarms.add(alarm);

8
application/src/test/java/org/thingsboard/server/queue/discovery/HashPartitionServiceTest.java

@ -149,7 +149,7 @@ public class HashPartitionServiceTest {
Random random = new Random(); Random random = new Random();
long ts = new SimpleDateFormat("dd-MM-yyyy").parse("06-12-2016").getTime() - TimeUnit.DAYS.toMillis(tenantCount); long ts = new SimpleDateFormat("dd-MM-yyyy").parse("06-12-2016").getTime() - TimeUnit.DAYS.toMillis(tenantCount);
for (int tenantIndex = 0; tenantIndex < tenantCount; tenantIndex++) { for (int tenantIndex = 0; tenantIndex < tenantCount; tenantIndex++) {
TenantId tenantId = new TenantId(Uuids.startOf(ts)); TenantId tenantId = TenantId.fromUUID(Uuids.startOf(ts));
ts += TimeUnit.DAYS.toMillis(1) + random.nextInt(1000); ts += TimeUnit.DAYS.toMillis(1) + random.nextInt(1000);
for (int queueIndex = 0; queueIndex < queueCount; queueIndex++) { for (int queueIndex = 0; queueIndex < queueCount; queueIndex++) {
QueueKey queueKey = new QueueKey(ServiceType.TB_RULE_ENGINE, "queue" + queueIndex, tenantId); QueueKey queueKey = new QueueKey(ServiceType.TB_RULE_ENGINE, "queue" + queueIndex, tenantId);
@ -190,7 +190,7 @@ public class HashPartitionServiceTest {
Map<TenantId, TenantProfileId> tenants = new HashMap<>(); Map<TenantId, TenantProfileId> tenants = new HashMap<>();
for (TenantProfileId tenantProfileId : isolatedTenantProfiles) { for (TenantProfileId tenantProfileId : isolatedTenantProfiles) {
for (int i = 0; i < tenantsCountPerProfile; i++) { for (int i = 0; i < tenantsCountPerProfile; i++) {
tenants.put(new TenantId(UUID.randomUUID()), tenantProfileId); tenants.put(TenantId.fromUUID(UUID.randomUUID()), tenantProfileId);
} }
} }
@ -299,7 +299,7 @@ public class HashPartitionServiceTest {
Queue systemQueue = createQueue(TenantId.SYS_TENANT_ID, 10); Queue systemQueue = createQueue(TenantId.SYS_TENANT_ID, 10);
queues.add(systemQueue); queues.add(systemQueue);
TenantId tenantId = new TenantId(UUID.randomUUID()); TenantId tenantId = TenantId.fromUUID(UUID.randomUUID());
mockRoutingInfo(tenantId, tenantProfileId, false); // not isolated yet mockRoutingInfo(tenantId, tenantProfileId, false); // not isolated yet
mockQueues(queues); mockQueues(queues);
@ -380,7 +380,7 @@ public class HashPartitionServiceTest {
} }
Stream.concat(Stream.of(TenantId.SYS_TENANT_ID), Stream.generate(UUID::randomUUID).map(TenantId::new).limit(10)).forEach(tenantId -> { Stream.concat(Stream.of(TenantId.SYS_TENANT_ID), Stream.generate(UUID::randomUUID).map(TenantId::new).limit(10)).forEach(tenantId -> {
List<QueueKey> queues = Stream.generate(() -> RandomStringUtils.randomAlphabetic(10)) List<QueueKey> queues = Stream.generate(() -> RandomStringUtils.secure().nextAlphabetic(10))
.map(queueName -> new QueueKey(ServiceType.TB_RULE_ENGINE, queueName, tenantId)) .map(queueName -> new QueueKey(ServiceType.TB_RULE_ENGINE, queueName, tenantId))
.limit(100).toList(); .limit(100).toList();

52
application/src/test/java/org/thingsboard/server/service/cf/DefaultCalculatedFieldCacheTest.java

@ -92,8 +92,8 @@ public class DefaultCalculatedFieldCacheTest {
@Test @Test
public void onComponentLifecycleEvent_tenantDeleted_evictsAllTenantCfsFromAllMaps() { public void onComponentLifecycleEvent_tenantDeleted_evictsAllTenantCfsFromAllMaps() {
TenantId tenant1 = new TenantId(UUID.randomUUID()); TenantId tenant1 = TenantId.fromUUID(UUID.randomUUID());
TenantId tenant2 = new TenantId(UUID.randomUUID()); TenantId tenant2 = TenantId.fromUUID(UUID.randomUUID());
DeviceId device1 = new DeviceId(UUID.randomUUID()); DeviceId device1 = new DeviceId(UUID.randomUUID());
DeviceId device2 = new DeviceId(UUID.randomUUID()); DeviceId device2 = new DeviceId(UUID.randomUUID());
@ -110,7 +110,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test @Test
public void onComponentLifecycleEvent_tenantDeleted_evictsOwnerEntities() { public void onComponentLifecycleEvent_tenantDeleted_evictsOwnerEntities() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceId device = new DeviceId(UUID.randomUUID()); DeviceId device = new DeviceId(UUID.randomUUID());
stubDeviceOwner(tenant, device, tenant); stubDeviceOwner(tenant, device, tenant);
@ -125,7 +125,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test @Test
public void onComponentLifecycleEvent_tenantDeleted_removesLinksToLinkedEntities() { public void onComponentLifecycleEvent_tenantDeleted_removesLinksToLinkedEntities() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceId cfEntity = new DeviceId(UUID.randomUUID()); DeviceId cfEntity = new DeviceId(UUID.randomUUID());
DeviceId linkedDevice = new DeviceId(UUID.randomUUID()); DeviceId linkedDevice = new DeviceId(UUID.randomUUID());
@ -139,7 +139,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test @Test
public void onComponentLifecycleEvent_tenantUpdated_doesNotEvictCfs() { public void onComponentLifecycleEvent_tenantUpdated_doesNotEvictCfs() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceId device = new DeviceId(UUID.randomUUID()); DeviceId device = new DeviceId(UUID.randomUUID());
CalculatedField cf = addCfToCache(tenant, device); CalculatedField cf = addCfToCache(tenant, device);
@ -152,7 +152,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test @Test
public void onComponentLifecycleEvent_deviceDeleted_evictsCfsForThatDevice() { public void onComponentLifecycleEvent_deviceDeleted_evictsCfsForThatDevice() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceId device = new DeviceId(UUID.randomUUID()); DeviceId device = new DeviceId(UUID.randomUUID());
CalculatedField cf = addCfToCache(tenant, device); CalculatedField cf = addCfToCache(tenant, device);
@ -164,7 +164,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test @Test
public void onComponentLifecycleEvent_deviceDeleted_removesLinksForLinkedEntities() { public void onComponentLifecycleEvent_deviceDeleted_removesLinksForLinkedEntities() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceId device = new DeviceId(UUID.randomUUID()); DeviceId device = new DeviceId(UUID.randomUUID());
DeviceId linkedDevice = new DeviceId(UUID.randomUUID()); DeviceId linkedDevice = new DeviceId(UUID.randomUUID());
addCfToCache(tenant, device, linkedDevice); addCfToCache(tenant, device, linkedDevice);
@ -176,7 +176,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test @Test
public void onComponentLifecycleEvent_deviceDeleted_evictsDeviceFromOwnerEntities() { public void onComponentLifecycleEvent_deviceDeleted_evictsDeviceFromOwnerEntities() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
CustomerId customer = new CustomerId(UUID.randomUUID()); CustomerId customer = new CustomerId(UUID.randomUUID());
DeviceId device = new DeviceId(UUID.randomUUID()); DeviceId device = new DeviceId(UUID.randomUUID());
stubDeviceOwner(tenant, device, customer); stubDeviceOwner(tenant, device, customer);
@ -191,7 +191,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test @Test
public void onComponentLifecycleEvent_assetDeleted_evictsCfsForThatAsset() { public void onComponentLifecycleEvent_assetDeleted_evictsCfsForThatAsset() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
AssetId asset = new AssetId(UUID.randomUUID()); AssetId asset = new AssetId(UUID.randomUUID());
CalculatedField cf = addCfToCache(tenant, asset); CalculatedField cf = addCfToCache(tenant, asset);
@ -203,7 +203,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test @Test
public void onComponentLifecycleEvent_deviceCreated_addsDeviceToOwnerEntities() { public void onComponentLifecycleEvent_deviceCreated_addsDeviceToOwnerEntities() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
CustomerId customer = new CustomerId(UUID.randomUUID()); CustomerId customer = new CustomerId(UUID.randomUUID());
DeviceId device = new DeviceId(UUID.randomUUID()); DeviceId device = new DeviceId(UUID.randomUUID());
stubDeviceOwner(tenant, device, customer); stubDeviceOwner(tenant, device, customer);
@ -217,7 +217,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test @Test
public void onComponentLifecycleEvent_customerDeleted_evictsCustomerOwnerEntries() { public void onComponentLifecycleEvent_customerDeleted_evictsCustomerOwnerEntries() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
CustomerId customer = new CustomerId(UUID.randomUUID()); CustomerId customer = new CustomerId(UUID.randomUUID());
DeviceId device = new DeviceId(UUID.randomUUID()); DeviceId device = new DeviceId(UUID.randomUUID());
stubDeviceOwner(tenant, device, customer); stubDeviceOwner(tenant, device, customer);
@ -235,7 +235,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test @Test
public void onComponentLifecycleEvent_deviceProfileDeleted_evictsCfsForThatProfile() { public void onComponentLifecycleEvent_deviceProfileDeleted_evictsCfsForThatProfile() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceProfileId profileId = new DeviceProfileId(UUID.randomUUID()); DeviceProfileId profileId = new DeviceProfileId(UUID.randomUUID());
CalculatedField cf = addCfToCache(tenant, profileId); CalculatedField cf = addCfToCache(tenant, profileId);
@ -247,7 +247,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test @Test
public void onComponentLifecycleEvent_deviceProfileDeleted_removesLinksForLinkedEntities() { public void onComponentLifecycleEvent_deviceProfileDeleted_removesLinksForLinkedEntities() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceProfileId profileId = new DeviceProfileId(UUID.randomUUID()); DeviceProfileId profileId = new DeviceProfileId(UUID.randomUUID());
DeviceId linkedDevice = new DeviceId(UUID.randomUUID()); DeviceId linkedDevice = new DeviceId(UUID.randomUUID());
addCfToCache(tenant, profileId, linkedDevice); addCfToCache(tenant, profileId, linkedDevice);
@ -259,7 +259,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test @Test
public void onComponentLifecycleEvent_deviceProfileDeleted_doesNotEvictOtherProfilesCfs() { public void onComponentLifecycleEvent_deviceProfileDeleted_doesNotEvictOtherProfilesCfs() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceProfileId profile1 = new DeviceProfileId(UUID.randomUUID()); DeviceProfileId profile1 = new DeviceProfileId(UUID.randomUUID());
DeviceProfileId profile2 = new DeviceProfileId(UUID.randomUUID()); DeviceProfileId profile2 = new DeviceProfileId(UUID.randomUUID());
CalculatedField cf1 = addCfToCache(tenant, profile1); CalculatedField cf1 = addCfToCache(tenant, profile1);
@ -275,7 +275,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test @Test
public void onComponentLifecycleEvent_deviceProfileUpdated_doesNotEvictCfs() { public void onComponentLifecycleEvent_deviceProfileUpdated_doesNotEvictCfs() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceProfileId profileId = new DeviceProfileId(UUID.randomUUID()); DeviceProfileId profileId = new DeviceProfileId(UUID.randomUUID());
CalculatedField cf = addCfToCache(tenant, profileId); CalculatedField cf = addCfToCache(tenant, profileId);
@ -287,7 +287,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test @Test
public void onComponentLifecycleEvent_assetProfileDeleted_evictsCfsForThatProfile() { public void onComponentLifecycleEvent_assetProfileDeleted_evictsCfsForThatProfile() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
AssetProfileId profileId = new AssetProfileId(UUID.randomUUID()); AssetProfileId profileId = new AssetProfileId(UUID.randomUUID());
CalculatedField cf = addCfToCache(tenant, profileId); CalculatedField cf = addCfToCache(tenant, profileId);
@ -299,7 +299,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test @Test
public void onComponentLifecycleEvent_assetProfileDeleted_removesLinksForLinkedEntities() { public void onComponentLifecycleEvent_assetProfileDeleted_removesLinksForLinkedEntities() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
AssetProfileId profileId = new AssetProfileId(UUID.randomUUID()); AssetProfileId profileId = new AssetProfileId(UUID.randomUUID());
AssetId linkedAsset = new AssetId(UUID.randomUUID()); AssetId linkedAsset = new AssetId(UUID.randomUUID());
addCfToCache(tenant, profileId, linkedAsset); addCfToCache(tenant, profileId, linkedAsset);
@ -311,7 +311,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test @Test
public void onComponentLifecycleEvent_assetProfileDeleted_doesNotEvictOtherProfilesCfs() { public void onComponentLifecycleEvent_assetProfileDeleted_doesNotEvictOtherProfilesCfs() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
AssetProfileId profile1 = new AssetProfileId(UUID.randomUUID()); AssetProfileId profile1 = new AssetProfileId(UUID.randomUUID());
AssetProfileId profile2 = new AssetProfileId(UUID.randomUUID()); AssetProfileId profile2 = new AssetProfileId(UUID.randomUUID());
CalculatedField cf1 = addCfToCache(tenant, profile1); CalculatedField cf1 = addCfToCache(tenant, profile1);
@ -327,7 +327,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test @Test
public void onComponentLifecycleEvent_assetProfileUpdated_doesNotEvictCfs() { public void onComponentLifecycleEvent_assetProfileUpdated_doesNotEvictCfs() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
AssetProfileId profileId = new AssetProfileId(UUID.randomUUID()); AssetProfileId profileId = new AssetProfileId(UUID.randomUUID());
CalculatedField cf = addCfToCache(tenant, profileId); CalculatedField cf = addCfToCache(tenant, profileId);
@ -341,7 +341,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test @Test
public void onComponentLifecycleEvent_calculatedFieldCreated_addsCfToCache() { public void onComponentLifecycleEvent_calculatedFieldCreated_addsCfToCache() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceId device = new DeviceId(UUID.randomUUID()); DeviceId device = new DeviceId(UUID.randomUUID());
CalculatedFieldId cfId = new CalculatedFieldId(UUID.randomUUID()); CalculatedFieldId cfId = new CalculatedFieldId(UUID.randomUUID());
CalculatedField cf = buildCalculatedField(cfId, tenant, device, simpleCfConfig()); CalculatedField cf = buildCalculatedField(cfId, tenant, device, simpleCfConfig());
@ -355,7 +355,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test @Test
public void onComponentLifecycleEvent_calculatedFieldDeleted_evictsCfFromCache() { public void onComponentLifecycleEvent_calculatedFieldDeleted_evictsCfFromCache() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceId device = new DeviceId(UUID.randomUUID()); DeviceId device = new DeviceId(UUID.randomUUID());
CalculatedField cf = addCfToCache(tenant, device); CalculatedField cf = addCfToCache(tenant, device);
@ -367,7 +367,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test @Test
public void onComponentLifecycleEvent_calculatedFieldUpdated_refreshesCfInCache() { public void onComponentLifecycleEvent_calculatedFieldUpdated_refreshesCfInCache() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceId device = new DeviceId(UUID.randomUUID()); DeviceId device = new DeviceId(UUID.randomUUID());
CalculatedField cf = addCfToCache(tenant, device); CalculatedField cf = addCfToCache(tenant, device);
@ -384,7 +384,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test @Test
public void evictOwner_customerDeleted_recursivelyEvictsDevicesOwnedByThatCustomer() { public void evictOwner_customerDeleted_recursivelyEvictsDevicesOwnedByThatCustomer() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
CustomerId customer = new CustomerId(UUID.randomUUID()); CustomerId customer = new CustomerId(UUID.randomUUID());
DeviceId device = new DeviceId(UUID.randomUUID()); DeviceId device = new DeviceId(UUID.randomUUID());
@ -406,7 +406,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test @Test
public void evictOwner_tenantDeleted_recursivelyEvictsCustomerAndItsOwnedDevices() { public void evictOwner_tenantDeleted_recursivelyEvictsCustomerAndItsOwnedDevices() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
CustomerId customer = new CustomerId(UUID.randomUUID()); CustomerId customer = new CustomerId(UUID.randomUUID());
DeviceId device = new DeviceId(UUID.randomUUID()); DeviceId device = new DeviceId(UUID.randomUUID());
@ -431,7 +431,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test @Test
public void onComponentLifecycleEvent_tenantProfileUpdated_callsHandleTenantProfileUpdate() { public void onComponentLifecycleEvent_tenantProfileUpdated_callsHandleTenantProfileUpdate() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
TenantProfileId profileId = new TenantProfileId(UUID.randomUUID()); TenantProfileId profileId = new TenantProfileId(UUID.randomUUID());
DefaultCalculatedFieldCache spyCache = spy(cache); DefaultCalculatedFieldCache spyCache = spy(cache);
@ -442,7 +442,7 @@ public class DefaultCalculatedFieldCacheTest {
@Test @Test
public void onComponentLifecycleEvent_tenantProfileDeleted_doesNotCallHandleTenantProfileUpdate() { public void onComponentLifecycleEvent_tenantProfileDeleted_doesNotCallHandleTenantProfileUpdate() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
TenantProfileId profileId = new TenantProfileId(UUID.randomUUID()); TenantProfileId profileId = new TenantProfileId(UUID.randomUUID());
DefaultCalculatedFieldCache spyCache = spy(cache); DefaultCalculatedFieldCache spyCache = spy(cache);

45
application/src/test/java/org/thingsboard/server/service/device/provision/DeviceProvisionServiceTest.java

@ -21,8 +21,10 @@ import org.assertj.core.api.Assertions;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Bean;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.junit4.SpringRunner;
import org.thingsboard.server.cluster.TbClusterService; import org.thingsboard.server.cluster.TbClusterService;
@ -73,28 +75,43 @@ import static org.mockito.Mockito.when;
@Slf4j @Slf4j
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
@ContextConfiguration(classes = DeviceProvisionServiceImpl.class) @ContextConfiguration(classes = DeviceProvisionServiceTest.TestConfig.class)
public class DeviceProvisionServiceTest { public class DeviceProvisionServiceTest {
@MockBean @Configuration
static class TestConfig {
@Bean
public DeviceProvisionServiceImpl deviceProvisionService(TbQueueProducerProvider producerProvider,
DeviceProfileService deviceProfileService,
DeviceService deviceService,
DeviceCredentialsService deviceCredentialsService,
AttributesService attributesService,
AuditLogService auditLogService,
PartitionService partitionService) {
return new DeviceProvisionServiceImpl(producerProvider, deviceProfileService, deviceService,
deviceCredentialsService, attributesService, auditLogService, partitionService);
}
}
@MockitoBean
protected TbQueueProducerProvider producerProvider; protected TbQueueProducerProvider producerProvider;
@MockBean @MockitoBean
protected TbQueueProducer<TbProtoQueueMsg<TransportProtos.ToRuleEngineMsg>> ruleEngineMsgProducer; protected TbQueueProducer<TbProtoQueueMsg<TransportProtos.ToRuleEngineMsg>> ruleEngineMsgProducer;
@MockBean @MockitoBean
protected TbClusterService clusterService; protected TbClusterService clusterService;
@MockBean @MockitoBean
protected DeviceProfileService deviceProfileService; protected DeviceProfileService deviceProfileService;
@MockBean @MockitoBean
protected DeviceService deviceService; protected DeviceService deviceService;
@MockBean @MockitoBean
protected DeviceCredentialsService deviceCredentialsService; protected DeviceCredentialsService deviceCredentialsService;
@MockBean @MockitoBean
protected AttributesService attributesService; protected AttributesService attributesService;
@MockBean @MockitoBean
protected AuditLogService auditLogService; protected AuditLogService auditLogService;
@MockBean @MockitoBean
protected PartitionService partitionService; protected PartitionService partitionService;
@SpyBean @MockitoSpyBean
DeviceProvisionServiceImpl service; DeviceProvisionServiceImpl service;
private String[] chain; private String[] chain;
@ -220,7 +237,7 @@ public class DeviceProvisionServiceTest {
private Tenant createTenant() { private Tenant createTenant() {
Tenant tenant = new Tenant(); Tenant tenant = new Tenant();
tenant.setId(new TenantId(UUID.randomUUID())); tenant.setId(TenantId.fromUUID(UUID.randomUUID()));
return tenant; return tenant;
} }

221
application/src/test/java/org/thingsboard/server/service/edge/rpc/processor/BaseEdgeProcessorTest.java

@ -0,0 +1,221 @@
/**
* Copyright © 2016-2026 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.service.edge.rpc.processor;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import org.junit.jupiter.api.Test;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Dashboard;
import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.EntityView;
import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.asset.Asset;
import org.thingsboard.server.common.data.device.data.DeviceData;
import org.thingsboard.server.common.data.device.data.DefaultDeviceConfiguration;
import org.thingsboard.server.common.data.device.data.DefaultDeviceTransportConfiguration;
import org.thingsboard.server.common.data.id.AssetId;
import org.thingsboard.server.common.data.id.DashboardId;
import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.EntityViewId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.UserId;
import org.thingsboard.server.gen.transport.TransportProtos;
import java.util.UUID;
import static org.assertj.core.api.Assertions.assertThat;
public class BaseEdgeProcessorTest {
private final BaseEdgeProcessor processor = new BaseEdgeProcessor() {
@Override
public ListenableFuture<Void> processEntityNotification(TenantId tenantId, TransportProtos.EdgeNotificationMsgProto msg) {
return Futures.immediateFuture(null);
}
};
@Test
public void dashboardSaveRequiredWhenConfigurationChanges() {
DashboardId dashboardId = new DashboardId(UUID.randomUUID());
Dashboard current = new Dashboard(dashboardId);
current.setTitle("Dashboard");
current.setConfiguration(JacksonUtil.toJsonNode("{\"widgets\":{\"w1\":{\"type\":\"timeseries\"}}}"));
Dashboard updated = new Dashboard(current);
updated.setConfiguration(JacksonUtil.toJsonNode("{\"widgets\":{\"w1\":{\"type\":\"latest\"}}}"));
assertThat(processor.isSaveRequired(current, updated)).isTrue();
}
@Test
public void dashboardSaveNotRequiredWhenOnlyVersionChanges() {
DashboardId dashboardId = new DashboardId(UUID.randomUUID());
Dashboard current = new Dashboard(dashboardId);
current.setTitle("Dashboard");
current.setConfiguration(JacksonUtil.toJsonNode("{\"widgets\":{\"w1\":{\"type\":\"timeseries\"}}}"));
current.setVersion(1L);
Dashboard updated = new Dashboard(current);
updated.setVersion(2L);
assertThat(processor.isSaveRequired(current, updated)).isFalse();
}
@Test
public void dashboardSaveNotRequiredWhenIdentical() {
DashboardId dashboardId = new DashboardId(UUID.randomUUID());
Dashboard current = new Dashboard(dashboardId);
current.setTitle("Dashboard");
current.setConfiguration(JacksonUtil.toJsonNode("{\"widgets\":{\"w1\":{\"type\":\"timeseries\"}}}"));
Dashboard updated = new Dashboard(current);
assertThat(processor.isSaveRequired(current, updated)).isFalse();
}
@Test
public void deviceSaveRequiredWhenDeviceDataChanges() {
DeviceId deviceId = new DeviceId(UUID.randomUUID());
Device current = new Device(deviceId);
current.setName("Device");
current.setDeviceData(deviceDataWithTransport());
Device updated = new Device(current);
DeviceData withoutTransport = new DeviceData();
withoutTransport.setConfiguration(new DefaultDeviceConfiguration());
updated.setDeviceData(withoutTransport);
assertThat(processor.isSaveRequired(current, updated)).isTrue();
}
@Test
public void deviceSaveRequiredWhenAdditionalInfoChanges() {
DeviceId deviceId = new DeviceId(UUID.randomUUID());
Device current = new Device(deviceId);
current.setName("Device");
current.setAdditionalInfo(JacksonUtil.toJsonNode("{\"description\":\"old\"}"));
Device updated = new Device(current);
updated.setAdditionalInfo(JacksonUtil.toJsonNode("{\"description\":\"new\"}"));
assertThat(processor.isSaveRequired(current, updated)).isTrue();
}
@Test
public void deviceSaveNotRequiredWhenOnlyVersionChanges() {
DeviceId deviceId = new DeviceId(UUID.randomUUID());
Device current = new Device(deviceId);
current.setName("Device");
current.setDeviceData(deviceDataWithTransport());
current.setAdditionalInfo(JacksonUtil.toJsonNode("{\"description\":\"same\"}"));
current.setVersion(1L);
Device updated = new Device(current);
updated.setVersion(2L);
assertThat(processor.isSaveRequired(current, updated)).isFalse();
}
@Test
public void assetSaveRequiredWhenAdditionalInfoChanges() {
AssetId assetId = new AssetId(UUID.randomUUID());
Asset current = new Asset(assetId);
current.setName("Asset");
current.setAdditionalInfo(JacksonUtil.toJsonNode("{\"description\":\"old\"}"));
Asset updated = new Asset(current);
updated.setAdditionalInfo(JacksonUtil.toJsonNode("{\"description\":\"new\"}"));
assertThat(processor.isSaveRequired(current, updated)).isTrue();
}
@Test
public void assetSaveNotRequiredWhenOnlyVersionChanges() {
AssetId assetId = new AssetId(UUID.randomUUID());
Asset current = new Asset(assetId);
current.setName("Asset");
current.setAdditionalInfo(JacksonUtil.toJsonNode("{\"description\":\"same\"}"));
current.setVersion(1L);
Asset updated = new Asset(current);
updated.setVersion(2L);
assertThat(processor.isSaveRequired(current, updated)).isFalse();
}
@Test
public void entityViewSaveRequiredWhenAdditionalInfoChanges() {
EntityViewId entityViewId = new EntityViewId(UUID.randomUUID());
EntityView current = new EntityView(entityViewId);
current.setName("EntityView");
current.setAdditionalInfo(JacksonUtil.toJsonNode("{\"description\":\"old\"}"));
EntityView updated = new EntityView(current);
updated.setAdditionalInfo(JacksonUtil.toJsonNode("{\"description\":\"new\"}"));
assertThat(processor.isSaveRequired(current, updated)).isTrue();
}
@Test
public void entityViewSaveNotRequiredWhenOnlyVersionChanges() {
EntityViewId entityViewId = new EntityViewId(UUID.randomUUID());
EntityView current = new EntityView(entityViewId);
current.setName("EntityView");
current.setAdditionalInfo(JacksonUtil.toJsonNode("{\"description\":\"same\"}"));
current.setVersion(1L);
EntityView updated = new EntityView(current);
updated.setVersion(2L);
assertThat(processor.isSaveRequired(current, updated)).isFalse();
}
@Test
public void userSaveRequiredWhenAdditionalInfoChanges() {
UserId userId = new UserId(UUID.randomUUID());
User current = new User(userId);
current.setEmail("user@thingsboard.io");
current.setAdditionalInfo(JacksonUtil.toJsonNode("{\"description\":\"old\"}"));
User updated = new User(current);
updated.setAdditionalInfo(JacksonUtil.toJsonNode("{\"description\":\"new\"}"));
assertThat(processor.isSaveRequired(current, updated)).isTrue();
}
@Test
public void userSaveNotRequiredWhenOnlyVersionChanges() {
UserId userId = new UserId(UUID.randomUUID());
User current = new User(userId);
current.setEmail("user@thingsboard.io");
current.setAdditionalInfo(JacksonUtil.toJsonNode("{\"description\":\"same\"}"));
current.setVersion(1L);
User updated = new User(current);
updated.setVersion(2L);
assertThat(processor.isSaveRequired(current, updated)).isFalse();
}
private static DeviceData deviceDataWithTransport() {
DeviceData deviceData = new DeviceData();
deviceData.setConfiguration(new DefaultDeviceConfiguration());
deviceData.setTransportConfiguration(new DefaultDeviceTransportConfiguration());
return deviceData;
}
}

6
application/src/test/java/org/thingsboard/server/service/entitiy/EntityServiceTest.java

@ -1004,7 +1004,7 @@ public class EntityServiceTest extends AbstractControllerTest {
public void testFindEntityDataByQuery_filter_entity_name_ends_with() { public void testFindEntityDataByQuery_filter_entity_name_ends_with() {
List<Device> devices = new ArrayList<>(); List<Device> devices = new ArrayList<>();
String suffixes = RandomStringUtils.randomAlphanumeric(5); String suffixes = RandomStringUtils.secure().nextAlphanumeric(5);
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
Device device = new Device(); Device device = new Device();
device.setTenantId(tenantId); device.setTenantId(tenantId);
@ -1425,7 +1425,7 @@ public class EntityServiceTest extends AbstractControllerTest {
Device device = new Device(); Device device = new Device();
device.setTenantId(tenantId); device.setTenantId(tenantId);
device.setCustomerId(customerId); device.setCustomerId(customerId);
device.setName("Device test " + RandomStringUtils.randomAlphabetic(5)); device.setName("Device test " + RandomStringUtils.secure().nextAlphabetic(5));
device.setType("default"); device.setType("default");
return device; return device;
} }
@ -1485,7 +1485,7 @@ public class EntityServiceTest extends AbstractControllerTest {
device.setTenantId(tenantId); device.setTenantId(tenantId);
device.setName("Device " + i); device.setName("Device " + i);
device.setType("default"); device.setType("default");
device.setLabel("label-" + RandomUtils.nextInt(100, 10000)); device.setLabel("label-" + RandomUtils.secure().randomInt(100, 10000));
return device; return device;
}) })
.limit(count) .limit(count)

32
application/src/test/java/org/thingsboard/server/service/entitiy/alarm/DefaultTbAlarmServiceTest.java

@ -19,7 +19,7 @@ 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.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.cluster.TbClusterService; import org.thingsboard.server.cluster.TbClusterService;
@ -69,35 +69,35 @@ import static org.thingsboard.server.common.data.alarm.AlarmCommentSubType.UNASS
@SpringJUnitConfig(DefaultTbAlarmService.class) @SpringJUnitConfig(DefaultTbAlarmService.class)
class DefaultTbAlarmServiceTest { class DefaultTbAlarmServiceTest {
@MockBean @MockitoBean
TbLogEntityActionService logEntityActionService; TbLogEntityActionService logEntityActionService;
@MockBean @MockitoBean
EdgeService edgeService; EdgeService edgeService;
@MockBean @MockitoBean
AlarmService alarmService; AlarmService alarmService;
@MockBean @MockitoBean
TbAlarmCommentService alarmCommentService; TbAlarmCommentService alarmCommentService;
@MockBean @MockitoBean
AlarmSubscriptionService alarmSubscriptionService; AlarmSubscriptionService alarmSubscriptionService;
@MockBean @MockitoBean
CustomerService customerService; CustomerService customerService;
@MockBean @MockitoBean
TbClusterService tbClusterService; TbClusterService tbClusterService;
@MockBean @MockitoBean
EntitiesVersionControlService vcService; EntitiesVersionControlService vcService;
@MockBean @MockitoBean
AccessControlService accessControlService; AccessControlService accessControlService;
@MockBean @MockitoBean
TenantService tenantService; TenantService tenantService;
@MockBean @MockitoBean
AssetService assetService; AssetService assetService;
@MockBean @MockitoBean
DeviceService deviceService; DeviceService deviceService;
@MockBean @MockitoBean
AssetProfileService assetProfileService; AssetProfileService assetProfileService;
@MockBean @MockitoBean
DeviceProfileService deviceProfileService; DeviceProfileService deviceProfileService;
@MockBean @MockitoBean
EntityService entityService; EntityService entityService;
@Autowired @Autowired

34
application/src/test/java/org/thingsboard/server/service/entitiy/alarmComment/DefaultTbAlarmCommentServiceTest.java

@ -19,8 +19,8 @@ import lombok.extern.slf4j.Slf4j;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.junit4.SpringRunner;
@ -65,35 +65,35 @@ import static org.mockito.Mockito.when;
}) })
public class DefaultTbAlarmCommentServiceTest { public class DefaultTbAlarmCommentServiceTest {
@MockBean @MockitoBean
protected DbCallbackExecutorService dbExecutor; protected DbCallbackExecutorService dbExecutor;
@MockBean @MockitoBean
protected TbLogEntityActionService logEntityActionService; protected TbLogEntityActionService logEntityActionService;
@MockBean @MockitoBean
protected AlarmService alarmService; protected AlarmService alarmService;
@MockBean @MockitoBean
protected AlarmCommentService alarmCommentService; protected AlarmCommentService alarmCommentService;
@MockBean @MockitoBean
protected AlarmSubscriptionService alarmSubscriptionService; protected AlarmSubscriptionService alarmSubscriptionService;
@MockBean @MockitoBean
protected CustomerService customerService; protected CustomerService customerService;
@MockBean @MockitoBean
protected TbClusterService tbClusterService; protected TbClusterService tbClusterService;
@MockBean @MockitoBean
private AccessControlService accessControlService; private AccessControlService accessControlService;
@MockBean @MockitoBean
private TenantService tenantService; private TenantService tenantService;
@MockBean @MockitoBean
private AssetService assetService; private AssetService assetService;
@MockBean @MockitoBean
private DeviceService deviceService; private DeviceService deviceService;
@MockBean @MockitoBean
private AssetProfileService assetProfileService; private AssetProfileService assetProfileService;
@MockBean @MockitoBean
private DeviceProfileService deviceProfileService; private DeviceProfileService deviceProfileService;
@MockBean @MockitoBean
private EntityService entityService; private EntityService entityService;
@SpyBean @MockitoSpyBean
DefaultTbAlarmCommentService service; DefaultTbAlarmCommentService service;
@Test @Test

4
application/src/test/java/org/thingsboard/server/service/housekeeper/HousekeeperServiceTest.java

@ -25,7 +25,7 @@ import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.RandomStringUtils;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rule.engine.metadata.TbGetAttributesNode; import org.thingsboard.rule.engine.metadata.TbGetAttributesNode;
import org.thingsboard.rule.engine.metadata.TbGetAttributesNodeConfiguration; import org.thingsboard.rule.engine.metadata.TbGetAttributesNodeConfiguration;
@ -570,7 +570,7 @@ public class HousekeeperServiceTest extends AbstractControllerTest {
.tenantId(tenantId) .tenantId(tenantId)
.originator(entityId) .originator(entityId)
.severity(AlarmSeverity.CRITICAL) .severity(AlarmSeverity.CRITICAL)
.type("test alarm for " + entityId + " " + RandomStringUtils.randomAlphabetic(10)) .type("test alarm for " + entityId + " " + RandomStringUtils.secure().nextAlphabetic(10))
.build(), Alarm.class); .build(), Alarm.class);
assertThat(alarmService.findAlarmIdsByOriginatorId(tenantId, entityId, 0, null, 10)).isNotEmpty(); assertThat(alarmService.findAlarmIdsByOriginatorId(tenantId, entityId, 0, null, 10)).isNotEmpty();
} }

28
application/src/test/java/org/thingsboard/server/service/install/InstallScriptsTest.java

@ -20,8 +20,8 @@ import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.id.RuleChainId; import org.thingsboard.server.common.data.id.RuleChainId;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
@ -52,30 +52,30 @@ import static org.mockito.BDDMockito.willReturn;
@SpringBootTest(classes = {InstallScripts.class, RuleChainDataValidator.class}) @SpringBootTest(classes = {InstallScripts.class, RuleChainDataValidator.class})
class InstallScriptsTest { class InstallScriptsTest {
@MockBean @MockitoBean
RuleChainService ruleChainService; RuleChainService ruleChainService;
@MockBean @MockitoBean
DashboardService dashboardService; DashboardService dashboardService;
@MockBean @MockitoBean
WidgetTypeService widgetTypeService; WidgetTypeService widgetTypeService;
@MockBean @MockitoBean
WidgetsBundleService widgetsBundleService; WidgetsBundleService widgetsBundleService;
@MockBean @MockitoBean
OAuth2ConfigTemplateService oAuth2TemplateService; OAuth2ConfigTemplateService oAuth2TemplateService;
@MockBean @MockitoBean
ResourceService resourceService; ResourceService resourceService;
@MockBean @MockitoBean
ImageService imageService; ImageService imageService;
@MockBean @MockitoBean
ResourcesUpdater resourcesUpdater; ResourcesUpdater resourcesUpdater;
@SpyBean @MockitoSpyBean
InstallScripts installScripts; InstallScripts installScripts;
@MockBean @MockitoBean
TenantService tenantService; TenantService tenantService;
@MockBean @MockitoBean
ApiLimitService apiLimitService; ApiLimitService apiLimitService;
@SpyBean @MockitoSpyBean
RuleChainDataValidator ruleChainValidator; RuleChainDataValidator ruleChainValidator;
TenantId tenantId = TenantId.fromUUID(UUID.fromString("9ef79cdf-37a8-4119-b682-2e7ed4e018da")); TenantId tenantId = TenantId.fromUUID(UUID.fromString("9ef79cdf-37a8-4119-b682-2e7ed4e018da"));

6
application/src/test/java/org/thingsboard/server/service/job/JobManagerTest.java

@ -22,7 +22,7 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.TestPropertySource;
import org.thingsboard.rule.engine.api.JobManager; import org.thingsboard.rule.engine.api.JobManager;
import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.Device;
@ -68,10 +68,10 @@ public class JobManagerTest extends AbstractControllerTest {
@Autowired @Autowired
private JobManager jobManager; private JobManager jobManager;
@SpyBean @MockitoSpyBean
private TestTaskProcessor taskProcessor; private TestTaskProcessor taskProcessor;
@SpyBean @MockitoSpyBean
private JobStatsService jobStatsService; private JobStatsService jobStatsService;
@Autowired @Autowired

2
application/src/test/java/org/thingsboard/server/service/notification/AbstractNotificationApiTest.java

@ -155,7 +155,7 @@ public abstract class AbstractNotificationApiTest extends AbstractControllerTest
User user = new User(); User user = new User();
user.setTenantId(tenantId); user.setTenantId(tenantId);
user.setAuthority(authority); user.setAuthority(authority);
user.setEmail(RandomStringUtils.randomAlphabetic(20) + "@thingsboard.com"); user.setEmail(RandomStringUtils.secure().nextAlphabetic(20) + "@thingsboard.com");
user = createUserAndLogin(user, "12345678"); user = createUserAndLogin(user, "12345678");
NotificationApiWsClient wsClient = buildAndConnectWebSocketClient(); NotificationApiWsClient wsClient = buildAndConnectWebSocketClient();
return Pair.of(user, wsClient); return Pair.of(user, wsClient);

2
application/src/test/java/org/thingsboard/server/service/notification/NotificationApiTest.java

@ -988,7 +988,7 @@ public class NotificationApiTest extends AbstractNotificationApiTest {
String expectedSubject = "Comment on 'test' alarm"; String expectedSubject = "Comment on 'test' alarm";
String expectedBody = TENANT_ADMIN_EMAIL + " added comment: text"; String expectedBody = TENANT_ADMIN_EMAIL + " added comment: text";
ArgumentCaptor<Map<String, String>> msgCaptor = ArgumentCaptor.forClass(Map.class); ArgumentCaptor<Map<String, String>> msgCaptor = ArgumentCaptor.captor();
await().atMost(TIMEOUT, TimeUnit.SECONDS).untilAsserted(() -> { await().atMost(TIMEOUT, TimeUnit.SECONDS).untilAsserted(() -> {
verify(firebaseService).sendMessage(eq(tenantId), eq("testCredentials"), verify(firebaseService).sendMessage(eq(tenantId), eq("testCredentials"),
eq(TEST_MOBILE_TOKEN), eq(expectedSubject), eq(TEST_MOBILE_TOKEN), eq(expectedSubject),

2
application/src/test/java/org/thingsboard/server/service/notification/NotificationApiWsClient.java

@ -131,7 +131,7 @@ public class NotificationApiWsClient extends TbTestWebSocketClient {
} }
private int newCmdId() { private int newCmdId() {
return RandomUtils.nextInt(1, 1000); return RandomUtils.secure().randomInt(1, 1000);
} }
} }

2
application/src/test/java/org/thingsboard/server/service/notification/NotificationTargetApiTest.java

@ -187,7 +187,7 @@ public class NotificationTargetApiTest extends AbstractNotificationApiTest {
NotificationTarget sysAdmins = createNotificationTarget(new SystemAdministratorsFilter()); NotificationTarget sysAdmins = createNotificationTarget(new SystemAdministratorsFilter());
NotificationTarget slack = new NotificationTarget(); NotificationTarget slack = new NotificationTarget();
slack.setName(RandomStringUtils.randomNumeric(5)); slack.setName(RandomStringUtils.secure().nextNumeric(5));
SlackNotificationTargetConfig slackConfig = new SlackNotificationTargetConfig(); SlackNotificationTargetConfig slackConfig = new SlackNotificationTargetConfig();
SlackConversation slackConversation = new SlackConversation(); SlackConversation slackConversation = new SlackConversation();
slackConversation.setType(SlackConversationType.DIRECT); slackConversation.setType(SlackConversationType.DIRECT);

14
application/src/test/java/org/thingsboard/server/service/profile/DefaultTbAssetProfileCacheTest.java

@ -57,8 +57,8 @@ public class DefaultTbAssetProfileCacheTest {
@Test @Test
public void onComponentLifecycleEvent_tenantDeleted_evictsAssetProfilesForThatTenant() { public void onComponentLifecycleEvent_tenantDeleted_evictsAssetProfilesForThatTenant() {
TenantId tenant1 = new TenantId(UUID.randomUUID()); TenantId tenant1 = TenantId.fromUUID(UUID.randomUUID());
TenantId tenant2 = new TenantId(UUID.randomUUID()); TenantId tenant2 = TenantId.fromUUID(UUID.randomUUID());
AssetProfileId profileId1 = new AssetProfileId(UUID.randomUUID()); AssetProfileId profileId1 = new AssetProfileId(UUID.randomUUID());
AssetProfileId profileId2 = new AssetProfileId(UUID.randomUUID()); AssetProfileId profileId2 = new AssetProfileId(UUID.randomUUID());
@ -75,7 +75,7 @@ public class DefaultTbAssetProfileCacheTest {
@Test @Test
public void onComponentLifecycleEvent_tenantDeleted_evictsAssetMappingsForThatTenant() { public void onComponentLifecycleEvent_tenantDeleted_evictsAssetMappingsForThatTenant() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
AssetProfileId profileId = new AssetProfileId(UUID.randomUUID()); AssetProfileId profileId = new AssetProfileId(UUID.randomUUID());
AssetId assetId = new AssetId(UUID.randomUUID()); AssetId assetId = new AssetId(UUID.randomUUID());
@ -92,7 +92,7 @@ public class DefaultTbAssetProfileCacheTest {
@Test @Test
public void onComponentLifecycleEvent_tenantDeleted_removesListenersForThatTenant() { public void onComponentLifecycleEvent_tenantDeleted_removesListenersForThatTenant() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
EntityId listenerId = new AssetId(UUID.randomUUID()); EntityId listenerId = new AssetId(UUID.randomUUID());
AtomicInteger callCount = new AtomicInteger(); AtomicInteger callCount = new AtomicInteger();
@ -110,7 +110,7 @@ public class DefaultTbAssetProfileCacheTest {
@Test @Test
public void onComponentLifecycleEvent_tenantUpdated_doesNotEvictProfiles() { public void onComponentLifecycleEvent_tenantUpdated_doesNotEvictProfiles() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
AssetProfileId profileId = new AssetProfileId(UUID.randomUUID()); AssetProfileId profileId = new AssetProfileId(UUID.randomUUID());
loadProfileIntoCache(tenant, profileId); loadProfileIntoCache(tenant, profileId);
@ -123,8 +123,8 @@ public class DefaultTbAssetProfileCacheTest {
@Test @Test
public void onComponentLifecycleEvent_differentTenantDeleted_keepsOtherTenantsProfiles() { public void onComponentLifecycleEvent_differentTenantDeleted_keepsOtherTenantsProfiles() {
TenantId tenant1 = new TenantId(UUID.randomUUID()); TenantId tenant1 = TenantId.fromUUID(UUID.randomUUID());
TenantId tenant2 = new TenantId(UUID.randomUUID()); TenantId tenant2 = TenantId.fromUUID(UUID.randomUUID());
AssetProfileId profileId1 = new AssetProfileId(UUID.randomUUID()); AssetProfileId profileId1 = new AssetProfileId(UUID.randomUUID());
AssetProfileId profileId2 = new AssetProfileId(UUID.randomUUID()); AssetProfileId profileId2 = new AssetProfileId(UUID.randomUUID());

14
application/src/test/java/org/thingsboard/server/service/profile/DefaultTbDeviceProfileCacheTest.java

@ -57,8 +57,8 @@ public class DefaultTbDeviceProfileCacheTest {
@Test @Test
public void onComponentLifecycleEvent_tenantDeleted_evictsDeviceProfilesForThatTenant() { public void onComponentLifecycleEvent_tenantDeleted_evictsDeviceProfilesForThatTenant() {
TenantId tenant1 = new TenantId(UUID.randomUUID()); TenantId tenant1 = TenantId.fromUUID(UUID.randomUUID());
TenantId tenant2 = new TenantId(UUID.randomUUID()); TenantId tenant2 = TenantId.fromUUID(UUID.randomUUID());
DeviceProfileId profileId1 = new DeviceProfileId(UUID.randomUUID()); DeviceProfileId profileId1 = new DeviceProfileId(UUID.randomUUID());
DeviceProfileId profileId2 = new DeviceProfileId(UUID.randomUUID()); DeviceProfileId profileId2 = new DeviceProfileId(UUID.randomUUID());
@ -76,7 +76,7 @@ public class DefaultTbDeviceProfileCacheTest {
@Test @Test
public void onComponentLifecycleEvent_tenantDeleted_evictsDeviceMappingsForThatTenant() { public void onComponentLifecycleEvent_tenantDeleted_evictsDeviceMappingsForThatTenant() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceProfileId profileId = new DeviceProfileId(UUID.randomUUID()); DeviceProfileId profileId = new DeviceProfileId(UUID.randomUUID());
DeviceId deviceId = new DeviceId(UUID.randomUUID()); DeviceId deviceId = new DeviceId(UUID.randomUUID());
@ -93,7 +93,7 @@ public class DefaultTbDeviceProfileCacheTest {
@Test @Test
public void onComponentLifecycleEvent_tenantDeleted_removesListenersForThatTenant() { public void onComponentLifecycleEvent_tenantDeleted_removesListenersForThatTenant() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
EntityId listenerId = new DeviceId(UUID.randomUUID()); EntityId listenerId = new DeviceId(UUID.randomUUID());
AtomicInteger callCount = new AtomicInteger(); AtomicInteger callCount = new AtomicInteger();
@ -111,7 +111,7 @@ public class DefaultTbDeviceProfileCacheTest {
@Test @Test
public void onComponentLifecycleEvent_tenantUpdated_doesNotEvictProfiles() { public void onComponentLifecycleEvent_tenantUpdated_doesNotEvictProfiles() {
TenantId tenant = new TenantId(UUID.randomUUID()); TenantId tenant = TenantId.fromUUID(UUID.randomUUID());
DeviceProfileId profileId = new DeviceProfileId(UUID.randomUUID()); DeviceProfileId profileId = new DeviceProfileId(UUID.randomUUID());
loadProfileIntoCache(tenant, profileId); loadProfileIntoCache(tenant, profileId);
@ -124,8 +124,8 @@ public class DefaultTbDeviceProfileCacheTest {
@Test @Test
public void onComponentLifecycleEvent_differentTenantDeleted_keepsOtherTenantsProfiles() { public void onComponentLifecycleEvent_differentTenantDeleted_keepsOtherTenantsProfiles() {
TenantId tenant1 = new TenantId(UUID.randomUUID()); TenantId tenant1 = TenantId.fromUUID(UUID.randomUUID());
TenantId tenant2 = new TenantId(UUID.randomUUID()); TenantId tenant2 = TenantId.fromUUID(UUID.randomUUID());
DeviceProfileId profileId1 = new DeviceProfileId(UUID.randomUUID()); DeviceProfileId profileId1 = new DeviceProfileId(UUID.randomUUID());
DeviceProfileId profileId2 = new DeviceProfileId(UUID.randomUUID()); DeviceProfileId profileId2 = new DeviceProfileId(UUID.randomUUID());

48
application/src/test/java/org/thingsboard/server/service/queue/DefaultTbClusterServiceTest.java

@ -17,11 +17,12 @@ package org.thingsboard.server.service.queue;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.junit4.SpringRunner;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
@ -56,6 +57,7 @@ import org.thingsboard.server.queue.discovery.PartitionService;
import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TopicService;
import org.thingsboard.server.queue.provider.TbQueueProducerProvider; import org.thingsboard.server.queue.provider.TbQueueProducerProvider;
import org.thingsboard.server.service.gateway_device.GatewayNotificationsService; import org.thingsboard.server.service.gateway_device.GatewayNotificationsService;
import org.thingsboard.server.service.ota.OtaPackageStateService;
import org.thingsboard.server.service.profile.TbAssetProfileCache; import org.thingsboard.server.service.profile.TbAssetProfileCache;
import org.thingsboard.server.service.profile.TbDeviceProfileCache; import org.thingsboard.server.service.profile.TbDeviceProfileCache;
@ -67,6 +69,7 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
@ -87,30 +90,45 @@ public class DefaultTbClusterServiceTest {
public static final String TRANSPORT = "transport"; public static final String TRANSPORT = "transport";
@MockBean @MockitoBean
protected TbDeviceProfileCache deviceProfileCache; protected TbDeviceProfileCache deviceProfileCache;
@MockBean @MockitoBean
protected TbAssetProfileCache assetProfileCache; protected TbAssetProfileCache assetProfileCache;
@MockBean @MockitoBean
protected GatewayNotificationsService gatewayNotificationsService; protected GatewayNotificationsService gatewayNotificationsService;
@MockBean @MockitoBean
protected EdgeService edgeService; protected EdgeService edgeService;
@MockBean @MockitoBean
protected PartitionService partitionService; protected PartitionService partitionService;
@MockBean @MockitoBean
protected TbQueueProducerProvider producerProvider; protected TbQueueProducerProvider producerProvider;
@MockBean @MockitoBean
protected TbRuleEngineProducerService ruleEngineProducerService; protected TbRuleEngineProducerService ruleEngineProducerService;
@MockBean @MockitoBean
protected TbTransactionalCache<EdgeId, String> edgeCache; protected TbTransactionalCache<EdgeId, String> edgeCache;
@MockBean @MockitoBean
protected CalculatedFieldService calculatedFieldService; protected CalculatedFieldService calculatedFieldService;
@SpyBean @MockitoBean
protected TopicService topicService; protected TopicService topicService;
@SpyBean @MockitoBean
protected OtaPackageStateService otaPackageStateService;
@MockitoSpyBean
protected TbClusterService clusterService; protected TbClusterService clusterService;
@Before
public void setUp() {
lenient().when(topicService.getNotificationsTopic(any(), any())).thenAnswer(invocation -> {
ServiceType serviceType = invocation.getArgument(0);
String serviceId = invocation.getArgument(1);
return new TopicPartitionInfo(serviceType.name().toLowerCase() + ".notifications." + serviceId, null, null, false);
});
lenient().when(topicService.getCalculatedFieldNotificationsTopic(any())).thenAnswer(invocation -> {
String serviceId = invocation.getArgument(0);
return new TopicPartitionInfo("calculated_field.notifications." + serviceId, null, null, false);
});
}
@Test @Test
public void testOnQueueChangeSingleMonolith() { public void testOnQueueChangeSingleMonolith() {
when(partitionService.getAllServiceIds(ServiceType.TB_RULE_ENGINE)).thenReturn(Sets.newHashSet(MONOLITH)); when(partitionService.getAllServiceIds(ServiceType.TB_RULE_ENGINE)).thenReturn(Sets.newHashSet(MONOLITH));
@ -393,7 +411,7 @@ public class DefaultTbClusterServiceTest {
@Test @Test
public void testGetRuleEngineProfileForUpdatedAndDeletedDevice() { public void testGetRuleEngineProfileForUpdatedAndDeletedDevice() {
DeviceId deviceId = new DeviceId(UUID.randomUUID()); DeviceId deviceId = new DeviceId(UUID.randomUUID());
TenantId tenantId = new TenantId(UUID.randomUUID()); TenantId tenantId = TenantId.fromUUID(UUID.randomUUID());
DeviceProfileId deviceProfileId = new DeviceProfileId(UUID.randomUUID()); DeviceProfileId deviceProfileId = new DeviceProfileId(UUID.randomUUID());
Device device = new Device(deviceId); Device device = new Device(deviceId);
@ -413,7 +431,7 @@ public class DefaultTbClusterServiceTest {
@Test @Test
public void testGetRuleEngineProfileForUpdatedAndDeletedAsset() { public void testGetRuleEngineProfileForUpdatedAndDeletedAsset() {
AssetId assetId = new AssetId(UUID.randomUUID()); AssetId assetId = new AssetId(UUID.randomUUID());
TenantId tenantId = new TenantId(UUID.randomUUID()); TenantId tenantId = TenantId.fromUUID(UUID.randomUUID());
AssetProfileId assetProfileId = new AssetProfileId(UUID.randomUUID()); AssetProfileId assetProfileId = new AssetProfileId(UUID.randomUUID());
Asset asset = new Asset(assetId); Asset asset = new Asset(assetId);

14
application/src/test/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManagerTest.java

@ -27,7 +27,7 @@ import org.mockito.Mock;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoSettings; import org.mockito.junit.jupiter.MockitoSettings;
import org.mockito.quality.Strictness; import org.mockito.quality.Strictness;
import org.testcontainers.shaded.org.apache.commons.lang3.RandomUtils; import org.apache.commons.lang3.RandomUtils;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.common.util.ThingsBoardExecutors; import org.thingsboard.common.util.ThingsBoardExecutors;
import org.thingsboard.common.util.ThingsBoardThreadFactory; import org.thingsboard.common.util.ThingsBoardThreadFactory;
@ -542,18 +542,18 @@ public class TbRuleEngineQueueConsumerManagerTest {
Queue oldConfig = consumerManager.getConfig(); Queue oldConfig = consumerManager.getConfig();
Queue newConfig = JacksonUtil.clone(oldConfig); Queue newConfig = JacksonUtil.clone(oldConfig);
newConfig.setConsumerPerPartition(RandomUtils.nextBoolean()); newConfig.setConsumerPerPartition(RandomUtils.nextBoolean());
newConfig.setPollInterval(RandomUtils.nextInt(100, 501)); newConfig.setPollInterval(RandomUtils.secure().randomInt(100, 501));
newConfig.setPartitions(RandomUtils.nextInt(1, 10)); newConfig.setPartitions(RandomUtils.secure().randomInt(1, 10));
newConfig.setPackProcessingTimeout(RandomUtils.nextLong(100, 5001)); newConfig.setPackProcessingTimeout(RandomUtils.nextLong(100, 5001));
newConfig.getSubmitStrategy().setType(SubmitStrategyType.values()[RandomUtils.nextInt(0, SubmitStrategyType.values().length)]); newConfig.getSubmitStrategy().setType(SubmitStrategyType.values()[RandomUtils.secure().randomInt(0, SubmitStrategyType.values().length)]);
newConfig.getProcessingStrategy().setType(ProcessingStrategyType.values()[RandomUtils.nextInt(0, ProcessingStrategyType.values().length)]); newConfig.getProcessingStrategy().setType(ProcessingStrategyType.values()[RandomUtils.secure().randomInt(0, ProcessingStrategyType.values().length)]);
log.info("Generated new config: consumerPerPartition={}, pollInterval={}, processingStrategy={}", log.info("Generated new config: consumerPerPartition={}, pollInterval={}, processingStrategy={}",
newConfig.isConsumerPerPartition(), newConfig.getPollInterval(), newConfig.getProcessingStrategy().getType()); newConfig.isConsumerPerPartition(), newConfig.getPollInterval(), newConfig.getProcessingStrategy().getType());
return newConfig; return newConfig;
}; };
Supplier<Set<TopicPartitionInfo>> partitionsUpdater = () -> { Supplier<Set<TopicPartitionInfo>> partitionsUpdater = () -> {
int partitionsCount = RandomUtils.nextInt(0, 20); int partitionsCount = RandomUtils.secure().randomInt(0, 20);
int[] partitions = IntStream.generate(() -> RandomUtils.nextInt(0, 20)) int[] partitions = IntStream.generate(() -> RandomUtils.secure().randomInt(0, 20))
.distinct().limit(partitionsCount) .distinct().limit(partitionsCount)
.sorted().toArray(); .sorted().toArray();
log.info("Generated new partitions: {}", Arrays.toString(partitions)); log.info("Generated new partitions: {}", Arrays.toString(partitions));

14
application/src/test/java/org/thingsboard/server/service/sms/DefaultSmsServiceTest.java

@ -22,9 +22,9 @@ 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.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.TestPropertySource;
import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.RandomStringUtils;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.AdminSettings; import org.thingsboard.server.common.data.AdminSettings;
import org.thingsboard.server.common.data.TenantProfile; import org.thingsboard.server.common.data.TenantProfile;
@ -55,7 +55,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
"usage.stats.report.urgent_interval=1" "usage.stats.report.urgent_interval=1"
}) })
public class DefaultSmsServiceTest extends AbstractControllerTest { public class DefaultSmsServiceTest extends AbstractControllerTest {
@SpyBean @MockitoSpyBean
private DefaultSmsService defaultSmsService; private DefaultSmsService defaultSmsService;
@Autowired @Autowired
private AdminSettingsService adminSettingsService; private AdminSettingsService adminSettingsService;
@ -84,13 +84,13 @@ public class DefaultSmsServiceTest extends AbstractControllerTest {
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
doReturn(1).when(defaultSmsService).sendSms(any(), any()); doReturn(1).when(defaultSmsService).sendSms(any(), any());
defaultSmsService.sendSms(tenantId, null, new String[]{RandomStringUtils.randomNumeric(10)}, "Message"); defaultSmsService.sendSms(tenantId, null, new String[]{RandomStringUtils.secure().nextNumeric(10)}, "Message");
} }
//wait 1 sec so that api usage state is updated //wait 1 sec so that api usage state is updated
TimeUnit.SECONDS.sleep(1); TimeUnit.SECONDS.sleep(1);
assertThrows(RuntimeException.class, () -> { assertThrows(RuntimeException.class, () -> {
defaultSmsService.sendSms(tenantId, null, new String[]{RandomStringUtils.randomNumeric(10)}, "Message"); defaultSmsService.sendSms(tenantId, null, new String[]{RandomStringUtils.secure().nextNumeric(10)}, "Message");
}, "SMS sending is disabled due to API limits!"); }, "SMS sending is disabled due to API limits!");
} }
@ -103,7 +103,7 @@ public class DefaultSmsServiceTest extends AbstractControllerTest {
TimeUnit.SECONDS.sleep(1); TimeUnit.SECONDS.sleep(1);
assertThrows(RuntimeException.class, () -> { assertThrows(RuntimeException.class, () -> {
defaultSmsService.sendSms(tenantId, null, new String[]{RandomStringUtils.randomNumeric(10)}, "Message"); defaultSmsService.sendSms(tenantId, null, new String[]{RandomStringUtils.secure().nextNumeric(10)}, "Message");
}, "SMS sending is disabled due to API limits!"); }, "SMS sending is disabled due to API limits!");
//enable sms messaging //enable sms messaging
@ -113,7 +113,7 @@ public class DefaultSmsServiceTest extends AbstractControllerTest {
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
doReturn(1).when(defaultSmsService).sendSms(any(), any()); doReturn(1).when(defaultSmsService).sendSms(any(), any());
defaultSmsService.sendSms(tenantId, null, new String[]{RandomStringUtils.randomNumeric(10)}, "Message"); defaultSmsService.sendSms(tenantId, null, new String[]{RandomStringUtils.secure().nextNumeric(10)}, "Message");
} }
} }

6
application/src/test/java/org/thingsboard/server/service/subscription/DefaultTbLocalSubscriptionServiceTest.java

@ -126,13 +126,13 @@ public class DefaultTbLocalSubscriptionServiceTest {
private TbSubscription<?> createSubscription(TenantId tenantId, EntityId entityId) { private TbSubscription<?> createSubscription(TenantId tenantId, EntityId entityId) {
Map<String, Long> keys = new HashMap<>(); Map<String, Long> keys = new HashMap<>();
for (int i = 0; i < 50; i++) { for (int i = 0; i < 50; i++) {
keys.put(RandomStringUtils.randomAlphanumeric(5), 1L); keys.put(RandomStringUtils.secure().nextAlphanumeric(5), 1L);
} }
return TbAttributeSubscription.builder() return TbAttributeSubscription.builder()
.tenantId(tenantId) .tenantId(tenantId)
.entityId(entityId) .entityId(entityId)
.subscriptionId(1) .subscriptionId(1)
.sessionId(RandomStringUtils.randomAlphanumeric(5)) .sessionId(RandomStringUtils.secure().nextAlphanumeric(5))
.keyStates(keys) .keyStates(keys)
.build(); .build();
} }
@ -152,7 +152,7 @@ public class DefaultTbLocalSubscriptionServiceTest {
.tenantId(tenantId) .tenantId(tenantId)
.entityId(deviceId) .entityId(deviceId)
.subscriptionId(2) .subscriptionId(2)
.sessionId(RandomStringUtils.randomAlphanumeric(5)) .sessionId(RandomStringUtils.secure().nextAlphanumeric(5))
.keyStates(keyStates) .keyStates(keyStates)
.allKeys(true) .allKeys(true)
.latestValues(true) .latestValues(true)

10
application/src/test/java/org/thingsboard/server/service/subscription/TbEntityDataSubCtxTest.java

@ -23,7 +23,7 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.util.ReflectionTestUtils;
import org.testcontainers.shaded.org.apache.commons.lang3.RandomUtils; import org.apache.commons.lang3.RandomUtils;
import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.kv.BasicTsKvEntry; import org.thingsboard.server.common.data.kv.BasicTsKvEntry;
@ -55,10 +55,10 @@ public class TbEntityDataSubCtxTest {
private final DeviceId deviceId = new DeviceId(UUID.randomUUID()); private final DeviceId deviceId = new DeviceId(UUID.randomUUID());
private final Integer cmdId = RandomUtils.nextInt(); private final Integer cmdId = RandomUtils.secure().randomInt();
private final Integer subscriptionId = RandomUtils.nextInt(); private final Integer subscriptionId = RandomUtils.secure().randomInt();
private final String serviceId = RandomStringUtils.randomAlphanumeric(10); private final String serviceId = RandomStringUtils.secure().nextAlphanumeric(10);
private final String sessionId = RandomStringUtils.randomAlphanumeric(10); private final String sessionId = RandomStringUtils.secure().nextAlphanumeric(10);
private final int maxEntitiesPerDataSubscription = 100; private final int maxEntitiesPerDataSubscription = 100;

2
application/src/test/java/org/thingsboard/server/service/subscription/TbEntityLocalSubsInfoTest.java

@ -161,7 +161,7 @@ public class TbEntityLocalSubsInfoTest {
} }
private TbEntityLocalSubsInfo createSubsInfo() { private TbEntityLocalSubsInfo createSubsInfo() {
return new TbEntityLocalSubsInfo(new TenantId(UUID.randomUUID()), new DeviceId(UUID.randomUUID())); return new TbEntityLocalSubsInfo(TenantId.fromUUID(UUID.randomUUID()), new DeviceId(UUID.randomUUID()));
} }
private void checkEvent(TbEntitySubEvent event, Set<TbAttributeSubscription> expectedSubs, ComponentLifecycleEvent expectedType) { private void checkEvent(TbEntitySubEvent event, Set<TbAttributeSubscription> expectedSubs, ComponentLifecycleEvent expectedType) {

6
application/src/test/java/org/thingsboard/server/service/sync/ie/ExportImportServiceSqlTest.java

@ -22,7 +22,7 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rule.engine.debug.TbMsgGeneratorNode; import org.thingsboard.rule.engine.debug.TbMsgGeneratorNode;
import org.thingsboard.rule.engine.debug.TbMsgGeneratorNodeConfiguration; import org.thingsboard.rule.engine.debug.TbMsgGeneratorNodeConfiguration;
@ -127,9 +127,9 @@ import static org.mockito.Mockito.verify;
@DaoSqlTest @DaoSqlTest
public class ExportImportServiceSqlTest extends AbstractControllerTest { public class ExportImportServiceSqlTest extends AbstractControllerTest {
@SpyBean @MockitoSpyBean
private EntityActionService entityActionService; private EntityActionService entityActionService;
@SpyBean @MockitoSpyBean
private OtaPackageStateService otaPackageStateService; private OtaPackageStateService otaPackageStateService;
@Autowired @Autowired

2
application/src/test/java/org/thingsboard/server/service/sync/vc/VersionControlTest.java

@ -477,7 +477,7 @@ public class VersionControlTest extends AbstractControllerTest {
Dashboard importedOtherDashboard = findDashboard(otherDashboard.getName()); Dashboard importedOtherDashboard = findDashboard(otherDashboard.getName());
Dashboard importedDashboard = findDashboard(dashboard.getName()); Dashboard importedDashboard = findDashboard(dashboard.getName());
Map.Entry<String, JsonNode> entityAlias = importedDashboard.getConfiguration().get("entityAliases").fields().next(); Map.Entry<String, JsonNode> entityAlias = importedDashboard.getConfiguration().get("entityAliases").properties().iterator().next();
assertThat(entityAlias.getKey()).isEqualTo(aliasId); assertThat(entityAlias.getKey()).isEqualTo(aliasId);
assertThat(entityAlias.getValue().get("id").asText()).isEqualTo(aliasId); assertThat(entityAlias.getValue().get("id").asText()).isEqualTo(aliasId);

60
application/src/test/java/org/thingsboard/server/service/transport/DefaultTransportApiServiceTest.java

@ -20,8 +20,10 @@ import lombok.extern.slf4j.Slf4j;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Bean;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.junit4.SpringRunner;
import org.thingsboard.server.cache.ota.OtaPackageDataCache; import org.thingsboard.server.cache.ota.OtaPackageDataCache;
@ -69,38 +71,60 @@ import static org.mockito.Mockito.when;
@Slf4j @Slf4j
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
@ContextConfiguration(classes = DefaultTransportApiService.class) @ContextConfiguration(classes = DefaultTransportApiServiceTest.TestConfig.class)
public class DefaultTransportApiServiceTest { public class DefaultTransportApiServiceTest {
@MockBean @Configuration
static class TestConfig {
@Bean
public DefaultTransportApiService defaultTransportApiService(TbDeviceProfileCache deviceProfileCache,
TbTenantProfileCache tenantProfileCache,
TbApiUsageStateService apiUsageStateService,
DeviceService deviceService,
DeviceProfileService deviceProfileService,
RelationService relationService,
DeviceCredentialsService deviceCredentialsService,
TbClusterService tbClusterService,
DeviceProvisionService deviceProvisionService,
ResourceService resourceService,
OtaPackageService otaPackageService,
OtaPackageDataCache otaPackageDataCache,
QueueService queueService) {
return new DefaultTransportApiService(deviceProfileCache, tenantProfileCache, apiUsageStateService,
deviceService, deviceProfileService, relationService, deviceCredentialsService, tbClusterService,
deviceProvisionService, resourceService, otaPackageService, otaPackageDataCache, queueService);
}
}
@MockitoBean
protected TbDeviceProfileCache deviceProfileCache; protected TbDeviceProfileCache deviceProfileCache;
@MockBean @MockitoBean
protected TbTenantProfileCache tenantProfileCache; protected TbTenantProfileCache tenantProfileCache;
@MockBean @MockitoBean
protected TbApiUsageStateService apiUsageStateService; protected TbApiUsageStateService apiUsageStateService;
@MockBean @MockitoBean
protected DeviceService deviceService; protected DeviceService deviceService;
@MockBean @MockitoBean
protected DeviceProfileService deviceProfileService; protected DeviceProfileService deviceProfileService;
@MockBean @MockitoBean
protected RelationService relationService; protected RelationService relationService;
@MockBean @MockitoBean
protected DeviceCredentialsService deviceCredentialsService; protected DeviceCredentialsService deviceCredentialsService;
@MockBean @MockitoBean
protected DbCallbackExecutorService dbCallbackExecutorService; protected DbCallbackExecutorService dbCallbackExecutorService;
@MockBean @MockitoBean
protected TbClusterService tbClusterService; protected TbClusterService tbClusterService;
@MockBean @MockitoBean
protected DeviceProvisionService deviceProvisionService; protected DeviceProvisionService deviceProvisionService;
@MockBean @MockitoBean
protected ResourceService resourceService; protected ResourceService resourceService;
@MockBean @MockitoBean
protected OtaPackageService otaPackageService; protected OtaPackageService otaPackageService;
@MockBean @MockitoBean
protected OtaPackageDataCache otaPackageDataCache; protected OtaPackageDataCache otaPackageDataCache;
@MockBean @MockitoBean
protected QueueService queueService; protected QueueService queueService;
@SpyBean @MockitoSpyBean
DefaultTransportApiService service; DefaultTransportApiService service;
private String certificateChain; private String certificateChain;

6
application/src/test/java/org/thingsboard/server/service/ttl/AlarmsCleanUpServiceTest.java

@ -21,7 +21,7 @@ import org.mockito.Mockito;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.TestPropertySource;
import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.alarm.Alarm;
@ -50,9 +50,9 @@ import static org.mockito.Mockito.verify;
}) })
public class AlarmsCleanUpServiceTest extends AbstractControllerTest { public class AlarmsCleanUpServiceTest extends AbstractControllerTest {
@SpyBean @MockitoSpyBean
private AlarmsCleanUpService alarmsCleanUpService; private AlarmsCleanUpService alarmsCleanUpService;
@SpyBean @MockitoSpyBean
private AlarmService alarmService; private AlarmService alarmService;
@Autowired @Autowired
private AlarmDao alarmDao; private AlarmDao alarmDao;

2
application/src/test/java/org/thingsboard/server/service/ws/DefaultWebSocketServiceTest.java

@ -113,7 +113,7 @@ class DefaultWebSocketServiceTest {
assertThat(publicUserSubscriptionsMap).as("map should contain tenant1").containsKey(tenant1); assertThat(publicUserSubscriptionsMap).as("map should contain tenant1").containsKey(tenant1);
assertThat(publicUserSubscriptionsMap).as("map should contain tenant2").containsKey(tenant2); assertThat(publicUserSubscriptionsMap).as("map should contain tenant2").containsKey(tenant2);
assertThat(publicUserSubscriptionsMap).as("map must not have a single NULL_UUID entry for all tenants") assertThat(publicUserSubscriptionsMap).as("map must not have a single NULL_UUID entry for all tenants")
.doesNotContainKey(new TenantId(EntityId.NULL_UUID)); .doesNotContainKey(TenantId.fromUUID(EntityId.NULL_UUID));
assertThat(publicUserSubscriptionsMap.get(tenant1)) assertThat(publicUserSubscriptionsMap.get(tenant1))
.as("tenant1 should have exactly %d subscriptions", maxPublicSubscriptions) .as("tenant1 should have exactly %d subscriptions", maxPublicSubscriptions)

8
application/src/test/java/org/thingsboard/server/transport/lwm2m/AbstractLwM2MIntegrationTest.java

@ -37,7 +37,7 @@ import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.test.context.DynamicPropertyRegistry; import org.springframework.test.context.DynamicPropertyRegistry;
import org.springframework.test.context.DynamicPropertySource; import org.springframework.test.context.DynamicPropertySource;
@ -102,10 +102,10 @@ import java.util.concurrent.atomic.AtomicLong;
import static org.awaitility.Awaitility.await; import static org.awaitility.Awaitility.await;
import static org.eclipse.leshan.client.object.Security.noSec; import static org.eclipse.leshan.client.object.Security.noSec;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.IsInstanceOf.instanceOf; import static org.hamcrest.core.IsInstanceOf.instanceOf;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.timeout;
@ -133,10 +133,10 @@ import static org.thingsboard.server.transport.lwm2m.ota.AbstractOtaLwM2MIntegra
}) })
public abstract class AbstractLwM2MIntegrationTest extends AbstractTransportIntegrationTest { public abstract class AbstractLwM2MIntegrationTest extends AbstractTransportIntegrationTest {
@SpyBean @MockitoSpyBean
protected LwM2mUplinkMsgHandler defaultLwM2mUplinkMsgHandlerTest; protected LwM2mUplinkMsgHandler defaultLwM2mUplinkMsgHandlerTest;
@SpyBean @MockitoSpyBean
protected DefaultLwM2mUplinkMsgHandler defaultUplinkMsgHandlerTest; protected DefaultLwM2mUplinkMsgHandler defaultUplinkMsgHandlerTest;
@Autowired @Autowired

14
application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/AbstractRpcLwM2MIntegrationTest.java

@ -22,7 +22,7 @@ import org.eclipse.leshan.core.link.LinkParser;
import org.eclipse.leshan.core.link.lwm2m.DefaultLwM2mLinkParser; import org.eclipse.leshan.core.link.lwm2m.DefaultLwM2mLinkParser;
import org.junit.Before; import org.junit.Before;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
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.device.credentials.lwm2m.LwM2MDeviceCredentials; import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MDeviceCredentials;
@ -77,16 +77,16 @@ public abstract class AbstractRpcLwM2MIntegrationTest extends AbstractLwM2MInteg
protected final LinkParser linkParser = new DefaultLwM2mLinkParser(); protected final LinkParser linkParser = new DefaultLwM2mLinkParser();
protected String CONFIG_PROFILE_WITH_PARAMS_RPC; protected String CONFIG_PROFILE_WITH_PARAMS_RPC;
public Set expectedObjects; public Set<String> expectedObjects;
public Set expectedObjectIdVers; public Set<String> expectedObjectIdVers;
public Set expectedInstances; public Set<String> expectedInstances;
public Set expectedObjectIdVerInstances; public Set<String> expectedObjectIdVerInstances;
protected String objectInstanceIdVer_1; protected String objectInstanceIdVer_1;
protected String objectIdVer_0; protected String objectIdVer_0;
protected String objectIdVer_1; protected String objectIdVer_1;
protected String objectIdVer_2; protected String objectIdVer_2;
private static final Predicate PREDICATE_3 = path -> (!((String) path).startsWith("/" + TEMPERATURE_SENSOR) && ((String) path).startsWith("/" + DEVICE)); private static final Predicate<String> PREDICATE_3 = path -> (!((String) path).startsWith("/" + TEMPERATURE_SENSOR) && ((String) path).startsWith("/" + DEVICE));
protected String objectIdVer_3; protected String objectIdVer_3;
protected String objectInstanceIdVer_3; protected String objectInstanceIdVer_3;
protected String objectInstanceIdVer_5; protected String objectInstanceIdVer_5;
@ -103,7 +103,7 @@ public abstract class AbstractRpcLwM2MIntegrationTest extends AbstractLwM2MInteg
protected String idVer_19_0_0; protected String idVer_19_0_0;
@SpyBean @MockitoSpyBean
protected LwM2mTransportServerHelper lwM2mTransportServerHelperTest; protected LwM2mTransportServerHelper lwM2mTransportServerHelperTest;
@Before @Before

4
application/src/test/java/org/thingsboard/server/transport/lwm2m/security/diffPort/AbstractLwM2MIntegrationDiffPortTest.java

@ -24,7 +24,7 @@ import org.eclipse.leshan.server.registration.RegistrationStore;
import org.eclipse.leshan.server.registration.RegistrationUpdate; import org.eclipse.leshan.server.registration.RegistrationUpdate;
import org.junit.Assert; import org.junit.Assert;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
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.device.profile.Lwm2mDeviceProfileTransportConfiguration; import org.thingsboard.server.common.data.device.profile.Lwm2mDeviceProfileTransportConfiguration;
@ -49,7 +49,7 @@ import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.LwM2MClient
@Slf4j @Slf4j
public abstract class AbstractLwM2MIntegrationDiffPortTest extends AbstractSecurityLwM2MIntegrationTest { public abstract class AbstractLwM2MIntegrationDiffPortTest extends AbstractSecurityLwM2MIntegrationTest {
@SpyBean @MockitoSpyBean
private RegistrationStore registrationStoreTest; private RegistrationStore registrationStoreTest;
protected void basicTestConnectionDifferentPort(Lwm2mDeviceProfileTransportConfiguration transportConfiguration, protected void basicTestConnectionDifferentPort(Lwm2mDeviceProfileTransportConfiguration transportConfiguration,

4
application/src/test/java/org/thingsboard/server/transport/mqtt/MqttGatewayRateLimitsTest.java

@ -22,7 +22,7 @@ import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.springframework.test.context.DynamicPropertyRegistry; import org.springframework.test.context.DynamicPropertyRegistry;
import org.springframework.test.context.DynamicPropertySource; import org.springframework.test.context.DynamicPropertySource;
import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.TestPropertySource;
@ -71,7 +71,7 @@ public class MqttGatewayRateLimitsTest extends AbstractControllerTest {
private Device gateway; private Device gateway;
private String gatewayAccessToken; private String gatewayAccessToken;
@SpyBean @MockitoSpyBean
private NotificationRuleProcessor notificationRuleProcessor; private NotificationRuleProcessor notificationRuleProcessor;
@Before @Before

4
application/src/test/java/org/thingsboard/server/transport/mqtt/mqttv3/telemetry/timeseries/AbstractMqttTimeseriesIntegrationTest.java

@ -21,7 +21,7 @@ import lombok.extern.slf4j.Slf4j;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
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.id.DeviceId; import org.thingsboard.server.common.data.id.DeviceId;
@ -67,7 +67,7 @@ public abstract class AbstractMqttTimeseriesIntegrationTest extends AbstractMqtt
protected static final String MALFORMED_JSON_PAYLOAD = "{\"key1\":, \"key2\":true, \"key3\": 3.0, \"key4\": 4," + protected static final String MALFORMED_JSON_PAYLOAD = "{\"key1\":, \"key2\":true, \"key3\": 3.0, \"key4\": 4," +
" \"key5\": {\"someNumber\": 42, \"someArray\": [1,2,3], \"someNestedObject\": {\"key\": \"value\"}}}"; " \"key5\": {\"someNumber\": 42, \"someArray\": [1,2,3], \"someNestedObject\": {\"key\": \"value\"}}}";
@SpyBean @MockitoSpyBean
GatewayMetricsService gatewayMetricsService; GatewayMetricsService gatewayMetricsService;
@Before @Before

2
common/actor/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>4.3.1.3</version> <version>4.3.1.4-SNAPSHOT</version>
<artifactId>common</artifactId> <artifactId>common</artifactId>
</parent> </parent>
<groupId>org.thingsboard.common</groupId> <groupId>org.thingsboard.common</groupId>

2
common/cache/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>4.3.1.3</version> <version>4.3.1.4-SNAPSHOT</version>
<artifactId>common</artifactId> <artifactId>common</artifactId>
</parent> </parent>
<groupId>org.thingsboard.common</groupId> <groupId>org.thingsboard.common</groupId>

8
common/cache/src/main/java/org/thingsboard/server/cache/ota/RedisOtaPackageDataCache.java

@ -39,26 +39,26 @@ public class RedisOtaPackageDataCache implements OtaPackageDataCache {
public byte[] get(String key, int chunkSize, int chunk) { public byte[] get(String key, int chunkSize, int chunk) {
try (RedisConnection connection = redisConnectionFactory.getConnection()) { try (RedisConnection connection = redisConnectionFactory.getConnection()) {
if (chunkSize == 0) { if (chunkSize == 0) {
return connection.get(toOtaPackageCacheKey(key)); return connection.stringCommands().get(toOtaPackageCacheKey(key));
} }
int startIndex = chunkSize * chunk; int startIndex = chunkSize * chunk;
int endIndex = startIndex + chunkSize - 1; int endIndex = startIndex + chunkSize - 1;
return connection.getRange(toOtaPackageCacheKey(key), startIndex, endIndex); return connection.stringCommands().getRange(toOtaPackageCacheKey(key), startIndex, endIndex);
} }
} }
@Override @Override
public void put(String key, byte[] value) { public void put(String key, byte[] value) {
try (RedisConnection connection = redisConnectionFactory.getConnection()) { try (RedisConnection connection = redisConnectionFactory.getConnection()) {
connection.set(toOtaPackageCacheKey(key), value); connection.stringCommands().set(toOtaPackageCacheKey(key), value);
} }
} }
@Override @Override
public void evict(String key) { public void evict(String key) {
try (RedisConnection connection = redisConnectionFactory.getConnection()) { try (RedisConnection connection = redisConnectionFactory.getConnection()) {
connection.del(toOtaPackageCacheKey(key)); connection.keyCommands().del(toOtaPackageCacheKey(key));
} }
} }

2
common/cluster-api/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>4.3.1.3</version> <version>4.3.1.4-SNAPSHOT</version>
<artifactId>common</artifactId> <artifactId>common</artifactId>
</parent> </parent>
<groupId>org.thingsboard.common</groupId> <groupId>org.thingsboard.common</groupId>

2
common/coap-server/pom.xml

@ -22,7 +22,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>4.3.1.3</version> <version>4.3.1.4-SNAPSHOT</version>
<artifactId>common</artifactId> <artifactId>common</artifactId>
</parent> </parent>
<groupId>org.thingsboard.common</groupId> <groupId>org.thingsboard.common</groupId>

2
common/dao-api/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>4.3.1.3</version> <version>4.3.1.4-SNAPSHOT</version>
<artifactId>common</artifactId> <artifactId>common</artifactId>
</parent> </parent>
<groupId>org.thingsboard.common</groupId> <groupId>org.thingsboard.common</groupId>

2
common/data/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>4.3.1.3</version> <version>4.3.1.4-SNAPSHOT</version>
<artifactId>common</artifactId> <artifactId>common</artifactId>
</parent> </parent>
<groupId>org.thingsboard.common</groupId> <groupId>org.thingsboard.common</groupId>

2
common/data/src/main/java/org/thingsboard/server/common/data/Dashboard.java

@ -38,7 +38,7 @@ public class Dashboard extends DashboardInfo implements ExportableEntity<Dashboa
private static final long serialVersionUID = 872682138346187503L; private static final long serialVersionUID = 872682138346187503L;
private transient JsonNode configuration; private JsonNode configuration;
@Getter @Getter
@Setter @Setter

4
common/data/src/main/java/org/thingsboard/server/common/data/EntityType.java

@ -23,6 +23,8 @@ import java.util.Arrays;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.List; import java.util.List;
import static org.thingsboard.server.common.data.StringUtils.removeStart;
public enum EntityType { public enum EntityType {
TENANT(1), TENANT(1),
@ -79,7 +81,7 @@ public enum EntityType {
@Getter @Getter
private final String tableName; private final String tableName;
@Getter @Getter
private final String normalName = StringUtils.capitalize(Strings.CS.removeStart(name(), "TB_") private final String normalName = StringUtils.capitalize(removeStart(name(), "TB_")
.toLowerCase().replaceAll("_", " ")); .toLowerCase().replaceAll("_", " "));
public static final List<String> NORMAL_NAMES = EnumSet.allOf(EntityType.class).stream() public static final List<String> NORMAL_NAMES = EnumSet.allOf(EntityType.class).stream()

2
common/data/src/main/java/org/thingsboard/server/common/data/EventInfo.java

@ -18,6 +18,7 @@ package org.thingsboard.server.common.data;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.EventId; import org.thingsboard.server.common.data.id.EventId;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
@ -26,6 +27,7 @@ import org.thingsboard.server.common.data.id.TenantId;
* @author Andrew Shvayka * @author Andrew Shvayka
*/ */
@Data @Data
@EqualsAndHashCode(callSuper = true)
@Schema @Schema
public class EventInfo extends BaseData<EventId> { public class EventInfo extends BaseData<EventId> {

2
common/data/src/main/java/org/thingsboard/server/common/data/HomeDashboard.java

@ -17,9 +17,11 @@ package org.thingsboard.server.common.data;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
@Schema @Schema
@Data @Data
@EqualsAndHashCode(callSuper = true)
public class HomeDashboard extends Dashboard { public class HomeDashboard extends Dashboard {
public static final String HIDE_DASHBOARD_TOOLBAR_DESCRIPTION = "Hide dashboard toolbar flag. Useful for rendering dashboards on mobile."; public static final String HIDE_DASHBOARD_TOOLBAR_DESCRIPTION = "Hide dashboard toolbar flag. Useful for rendering dashboards on mobile.";

2
common/data/src/main/java/org/thingsboard/server/common/data/StringUtils.java

@ -164,7 +164,7 @@ public class StringUtils {
} }
public static boolean equals(String str1, String str2) { public static boolean equals(String str1, String str2) {
return Strings.CS.equals(str1, str2); return Objects.equals(str1, str2);
} }
public static boolean equalsAny(String string, String... otherStrings) { public static boolean equalsAny(String string, String... otherStrings) {

2
common/data/src/main/java/org/thingsboard/server/common/data/TenantInfo.java

@ -17,10 +17,12 @@ package org.thingsboard.server.common.data;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
@Schema @Schema
@Data @Data
@EqualsAndHashCode(callSuper = true)
public class TenantInfo extends Tenant { public class TenantInfo extends Tenant {
@Schema(description = "Tenant Profile name", example = "Default") @Schema(description = "Tenant Profile name", example = "Default")
private String tenantProfileName; private String tenantProfileName;

1
common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmComment.java

@ -34,6 +34,7 @@ import java.io.Serial;
@Schema @Schema
@Data @Data
@EqualsAndHashCode(callSuper = true)
@Builder @Builder
@AllArgsConstructor @AllArgsConstructor
public class AlarmComment extends BaseData<AlarmCommentId> implements HasName { public class AlarmComment extends BaseData<AlarmCommentId> implements HasName {

11
common/data/src/main/java/org/thingsboard/server/common/data/device/credentials/lwm2m/LwM2MBootstrapClientCredential.java

@ -19,7 +19,18 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeInfo;
import io.swagger.v3.oas.annotations.media.DiscriminatorMapping;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(
discriminatorProperty = "securityMode",
discriminatorMapping = {
@DiscriminatorMapping(value = "NO_SEC", schema = NoSecBootstrapClientCredential.class),
@DiscriminatorMapping(value = "PSK", schema = PSKBootstrapClientCredential.class),
@DiscriminatorMapping(value = "RPK", schema = RPKBootstrapClientCredential.class),
@DiscriminatorMapping(value = "X509", schema = X509BootstrapClientCredential.class)
}
)
@JsonTypeInfo( @JsonTypeInfo(
use = JsonTypeInfo.Id.NAME, use = JsonTypeInfo.Id.NAME,
property = "securityMode") property = "securityMode")

11
common/data/src/main/java/org/thingsboard/server/common/data/device/credentials/lwm2m/LwM2MClientCredential.java

@ -19,7 +19,18 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeInfo;
import io.swagger.v3.oas.annotations.media.DiscriminatorMapping;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(
discriminatorProperty = "securityConfigClientMode",
discriminatorMapping = {
@DiscriminatorMapping(value = "NO_SEC", schema = NoSecClientCredential.class),
@DiscriminatorMapping(value = "PSK", schema = PSKClientCredential.class),
@DiscriminatorMapping(value = "RPK", schema = RPKClientCredential.class),
@DiscriminatorMapping(value = "X509", schema = X509ClientCredential.class)
}
)
@JsonTypeInfo( @JsonTypeInfo(
use = JsonTypeInfo.Id.NAME, use = JsonTypeInfo.Id.NAME,
property = "securityConfigClientMode") property = "securityConfigClientMode")

2
common/data/src/main/java/org/thingsboard/server/common/data/device/data/CoapDeviceTransportConfiguration.java

@ -20,6 +20,7 @@ import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.DeviceTransportType; import org.thingsboard.server.common.data.DeviceTransportType;
import java.util.HashMap; import java.util.HashMap;
@ -27,6 +28,7 @@ import java.util.Map;
@Data @Data
@Schema @Schema
@EqualsAndHashCode(callSuper = true)
public class CoapDeviceTransportConfiguration extends PowerSavingConfiguration implements DeviceTransportConfiguration { public class CoapDeviceTransportConfiguration extends PowerSavingConfiguration implements DeviceTransportConfiguration {
private static final long serialVersionUID = 6061442236008925609L; private static final long serialVersionUID = 6061442236008925609L;

2
common/data/src/main/java/org/thingsboard/server/common/data/device/data/Lwm2mDeviceTransportConfiguration.java

@ -20,6 +20,7 @@ import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.DeviceTransportType; import org.thingsboard.server.common.data.DeviceTransportType;
import java.util.HashMap; import java.util.HashMap;
@ -27,6 +28,7 @@ import java.util.Map;
@Schema @Schema
@Data @Data
@EqualsAndHashCode(callSuper = true)
public class Lwm2mDeviceTransportConfiguration extends PowerSavingConfiguration implements DeviceTransportConfiguration { public class Lwm2mDeviceTransportConfiguration extends PowerSavingConfiguration implements DeviceTransportConfiguration {
@JsonIgnore @JsonIgnore

9
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/lwm2m/TelemetryObserveStrategy.java

@ -15,8 +15,13 @@
*/ */
package org.thingsboard.server.common.data.device.profile.lwm2m; package org.thingsboard.server.common.data.device.profile.lwm2m;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter; import lombok.Getter;
@Schema(description = "Observation strategy for telemetry. " +
"SINGLE (0): one resource equals one single observe request. " +
"COMPOSITE_ALL (1): all resources in one composite observe request. " +
"COMPOSITE_BY_OBJECT (2): grouped composite observe requests by object.")
public enum TelemetryObserveStrategy { public enum TelemetryObserveStrategy {
SINGLE("One resource equals one single observe request", 0), SINGLE("One resource equals one single observe request", 0),
@ -52,8 +57,4 @@ public enum TelemetryObserveStrategy {
throw new IllegalArgumentException("Unknown TelemetryObserveStrategy id: " + id); throw new IllegalArgumentException("Unknown TelemetryObserveStrategy id: " + id);
} }
@Override
public String toString() {
return name() + " (" + id + "): " + description;
}
} }

11
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/lwm2m/bootstrap/LwM2MBootstrapServerCredential.java

@ -19,10 +19,21 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeInfo;
import io.swagger.v3.oas.annotations.media.DiscriminatorMapping;
import io.swagger.v3.oas.annotations.media.Schema;
import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MSecurityMode; import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MSecurityMode;
import java.io.Serializable; import java.io.Serializable;
@Schema(
discriminatorProperty = "securityMode",
discriminatorMapping = {
@DiscriminatorMapping(value = "NO_SEC", schema = NoSecLwM2MBootstrapServerCredential.class),
@DiscriminatorMapping(value = "PSK", schema = PSKLwM2MBootstrapServerCredential.class),
@DiscriminatorMapping(value = "RPK", schema = RPKLwM2MBootstrapServerCredential.class),
@DiscriminatorMapping(value = "X509", schema = X509LwM2MBootstrapServerCredential.class)
}
)
@JsonTypeInfo( @JsonTypeInfo(
use = JsonTypeInfo.Id.NAME, use = JsonTypeInfo.Id.NAME,
property = "securityMode") property = "securityMode")

2
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/lwm2m/bootstrap/LwM2MServerSecurityConfigDefault.java

@ -17,9 +17,11 @@ package org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
@Schema @Schema
@Data @Data
@EqualsAndHashCode(callSuper = true)
public class LwM2MServerSecurityConfigDefault extends LwM2MServerSecurityConfig { public class LwM2MServerSecurityConfigDefault extends LwM2MServerSecurityConfig {
@Schema(description = "Host for 'Security' mode (DTLS)", example = "0.0.0.0", accessMode = Schema.AccessMode.READ_ONLY) @Schema(description = "Host for 'Security' mode (DTLS)", example = "0.0.0.0", accessMode = Schema.AccessMode.READ_ONLY)
protected String securityHost; protected String securityHost;

4
common/data/src/main/java/org/thingsboard/server/common/data/edge/EdgeInfo.java

@ -16,9 +16,11 @@
package org.thingsboard.server.common.data.edge; package org.thingsboard.server.common.data.edge;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.EdgeId;
@Data @Data
@EqualsAndHashCode(callSuper = true)
public class EdgeInfo extends Edge { public class EdgeInfo extends Edge {
private String customerTitle; private String customerTitle;
@ -37,4 +39,4 @@ public class EdgeInfo extends Edge {
this.customerTitle = customerTitle; this.customerTitle = customerTitle;
this.customerIsPublic = customerIsPublic; this.customerIsPublic = customerIsPublic;
} }
} }

2
common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/AssetFields.java

@ -18,6 +18,7 @@ package org.thingsboard.server.common.data.edqs.fields;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
@ -26,6 +27,7 @@ import java.util.UUID;
import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText; import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor @NoArgsConstructor
@SuperBuilder @SuperBuilder
public class AssetFields extends AbstractEntityFields implements ProfileAwareFields { public class AssetFields extends AbstractEntityFields implements ProfileAwareFields {

2
common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/AssetProfileFields.java

@ -16,12 +16,14 @@
package org.thingsboard.server.common.data.edqs.fields; package org.thingsboard.server.common.data.edqs.fields;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
import java.util.UUID; import java.util.UUID;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor @NoArgsConstructor
@SuperBuilder @SuperBuilder
public class AssetProfileFields extends AbstractEntityFields { public class AssetProfileFields extends AbstractEntityFields {

2
common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/CustomerFields.java

@ -17,6 +17,7 @@ package org.thingsboard.server.common.data.edqs.fields;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
@ -25,6 +26,7 @@ import java.util.UUID;
import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText; import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor @NoArgsConstructor
@SuperBuilder @SuperBuilder
public class CustomerFields extends AbstractEntityFields { public class CustomerFields extends AbstractEntityFields {

2
common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/DashboardFields.java

@ -19,6 +19,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
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 lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
@ -28,6 +29,7 @@ import java.util.UUID;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor @NoArgsConstructor
@SuperBuilder @SuperBuilder
public class DashboardFields extends AbstractEntityFields { public class DashboardFields extends AbstractEntityFields {

2
common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/DeviceFields.java

@ -18,6 +18,7 @@ package org.thingsboard.server.common.data.edqs.fields;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
@ -26,6 +27,7 @@ import java.util.UUID;
import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText; import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor @NoArgsConstructor
@SuperBuilder @SuperBuilder
public class DeviceFields extends AbstractEntityFields implements ProfileAwareFields { public class DeviceFields extends AbstractEntityFields implements ProfileAwareFields {

2
common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/DeviceProfileFields.java

@ -16,6 +16,7 @@
package org.thingsboard.server.common.data.edqs.fields; package org.thingsboard.server.common.data.edqs.fields;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
import org.thingsboard.server.common.data.DeviceProfileType; import org.thingsboard.server.common.data.DeviceProfileType;
@ -23,6 +24,7 @@ import org.thingsboard.server.common.data.DeviceProfileType;
import java.util.UUID; import java.util.UUID;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor @NoArgsConstructor
@SuperBuilder @SuperBuilder
public class DeviceProfileFields extends AbstractEntityFields { public class DeviceProfileFields extends AbstractEntityFields {

2
common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/EdgeFields.java

@ -17,6 +17,7 @@ package org.thingsboard.server.common.data.edqs.fields;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
@ -25,6 +26,7 @@ import java.util.UUID;
import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText; import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor @NoArgsConstructor
@SuperBuilder @SuperBuilder
public class EdgeFields extends AbstractEntityFields { public class EdgeFields extends AbstractEntityFields {

2
common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/EntityViewFields.java

@ -17,6 +17,7 @@ package org.thingsboard.server.common.data.edqs.fields;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
@ -25,6 +26,7 @@ import java.util.UUID;
import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText; import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor @NoArgsConstructor
@SuperBuilder @SuperBuilder
public class EntityViewFields extends AbstractEntityFields { public class EntityViewFields extends AbstractEntityFields {

2
common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/QueueStatsFields.java

@ -16,12 +16,14 @@
package org.thingsboard.server.common.data.edqs.fields; package org.thingsboard.server.common.data.edqs.fields;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
import java.util.UUID; import java.util.UUID;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor @NoArgsConstructor
@SuperBuilder @SuperBuilder
public class QueueStatsFields extends AbstractEntityFields { public class QueueStatsFields extends AbstractEntityFields {

2
common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/RuleChainFields.java

@ -17,6 +17,7 @@ package org.thingsboard.server.common.data.edqs.fields;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
@ -25,6 +26,7 @@ import java.util.UUID;
import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText; import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor @NoArgsConstructor
@SuperBuilder @SuperBuilder
public class RuleChainFields extends AbstractEntityFields { public class RuleChainFields extends AbstractEntityFields {

2
common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/TenantFields.java

@ -17,6 +17,7 @@ package org.thingsboard.server.common.data.edqs.fields;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
@ -25,6 +26,7 @@ import java.util.UUID;
import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText; import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor @NoArgsConstructor
@SuperBuilder @SuperBuilder
public class TenantFields extends AbstractEntityFields { public class TenantFields extends AbstractEntityFields {

2
common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/TenantProfileFields.java

@ -16,6 +16,7 @@
package org.thingsboard.server.common.data.edqs.fields; package org.thingsboard.server.common.data.edqs.fields;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
@ -23,6 +24,7 @@ import org.thingsboard.server.common.data.id.TenantId;
import java.util.UUID; import java.util.UUID;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor @NoArgsConstructor
@SuperBuilder @SuperBuilder
public class TenantProfileFields extends AbstractEntityFields { public class TenantProfileFields extends AbstractEntityFields {

2
common/data/src/main/java/org/thingsboard/server/common/data/edqs/fields/UserFields.java

@ -17,6 +17,7 @@ package org.thingsboard.server.common.data.edqs.fields;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
@ -25,6 +26,7 @@ import java.util.UUID;
import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText; import static org.thingsboard.server.common.data.edqs.fields.FieldsUtil.getText;
@Data @Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor @NoArgsConstructor
@SuperBuilder @SuperBuilder
public class UserFields extends AbstractEntityFields { public class UserFields extends AbstractEntityFields {

10
common/data/src/main/java/org/thingsboard/server/common/data/job/task/Task.java

@ -20,6 +20,8 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type; import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeInfo;
import io.swagger.v3.oas.annotations.media.DiscriminatorMapping;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
@ -29,6 +31,12 @@ import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.job.JobType; import org.thingsboard.server.common.data.job.JobType;
@Data @Data
@Schema(
discriminatorProperty = "jobType",
discriminatorMapping = {
@DiscriminatorMapping(value = "DUMMY", schema = DummyTask.class)
}
)
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "jobType") @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "jobType")
@JsonSubTypes({ @JsonSubTypes({
@ -46,7 +54,7 @@ public abstract class Task<R extends TaskResult> {
public Task() { public Task() {
} }
private int attempt = 0; private int attempt;
public abstract R toFailed(Throwable error); public abstract R toFailed(Throwable error);

8
common/data/src/main/java/org/thingsboard/server/common/data/job/task/TaskResult.java

@ -20,12 +20,20 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type; import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeInfo;
import io.swagger.v3.oas.annotations.media.DiscriminatorMapping;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.thingsboard.server.common.data.job.JobType; import org.thingsboard.server.common.data.job.JobType;
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@Schema(
discriminatorProperty = "jobType",
discriminatorMapping = {
@DiscriminatorMapping(value = "DUMMY", schema = DummyTaskResult.class)
}
)
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "jobType") @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "jobType")
@JsonSubTypes({ @JsonSubTypes({

2
common/data/src/main/java/org/thingsboard/server/common/data/kv/BaseDeleteTsKvQuery.java

@ -16,8 +16,10 @@
package org.thingsboard.server.common.data.kv; package org.thingsboard.server.common.data.kv;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
@Data @Data
@EqualsAndHashCode(callSuper = true)
public class BaseDeleteTsKvQuery extends BaseTsKvQuery implements DeleteTsKvQuery { public class BaseDeleteTsKvQuery extends BaseTsKvQuery implements DeleteTsKvQuery {
private final Boolean rewriteLatestIfDeleted; private final Boolean rewriteLatestIfDeleted;

1
common/data/src/main/java/org/thingsboard/server/common/data/mobile/layout/MobileLayoutConfig.java

@ -40,6 +40,7 @@ public class MobileLayoutConfig {
@ArraySchema(schema = @Schema(implementation = MobilePage.class)) @ArraySchema(schema = @Schema(implementation = MobilePage.class))
@JsonView(Views.Public.class) @JsonView(Views.Public.class)
@Valid @Valid
@Builder.Default
private List<MobilePage> pages = new ArrayList<>(); private List<MobilePage> pages = new ArrayList<>();
} }

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save