|
|
|
@ -16,12 +16,15 @@ |
|
|
|
package org.thingsboard.server.dao.service; |
|
|
|
|
|
|
|
import com.datastax.oss.driver.api.core.uuid.Uuids; |
|
|
|
import org.hibernate.exception.ConstraintViolationException; |
|
|
|
import org.junit.After; |
|
|
|
import org.junit.Assert; |
|
|
|
import org.junit.Before; |
|
|
|
import org.junit.Test; |
|
|
|
import org.junit.jupiter.api.Assertions; |
|
|
|
import org.mockito.Mockito; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.springframework.boot.test.mock.mockito.SpyBean; |
|
|
|
import org.springframework.transaction.PlatformTransactionManager; |
|
|
|
import org.springframework.transaction.TransactionStatus; |
|
|
|
import org.springframework.transaction.support.DefaultTransactionDefinition; |
|
|
|
@ -35,8 +38,6 @@ import org.thingsboard.server.common.data.OtaPackage; |
|
|
|
import org.thingsboard.server.common.data.StringUtils; |
|
|
|
import org.thingsboard.server.common.data.Tenant; |
|
|
|
import org.thingsboard.server.common.data.TenantProfile; |
|
|
|
import org.thingsboard.server.common.data.asset.Asset; |
|
|
|
import org.thingsboard.server.common.data.asset.AssetProfile; |
|
|
|
import org.thingsboard.server.common.data.id.CustomerId; |
|
|
|
import org.thingsboard.server.common.data.id.TenantId; |
|
|
|
import org.thingsboard.server.common.data.ota.ChecksumAlgorithm; |
|
|
|
@ -50,15 +51,19 @@ import org.thingsboard.server.dao.device.DeviceCredentialsService; |
|
|
|
import org.thingsboard.server.dao.device.DeviceProfileService; |
|
|
|
import org.thingsboard.server.dao.device.DeviceService; |
|
|
|
import org.thingsboard.server.dao.exception.DataValidationException; |
|
|
|
import org.thingsboard.server.dao.exception.DeviceCredentialsValidationException; |
|
|
|
import org.thingsboard.server.dao.ota.OtaPackageService; |
|
|
|
import org.thingsboard.server.dao.service.validator.DeviceCredentialsDataValidator; |
|
|
|
import org.thingsboard.server.dao.tenant.TenantProfileService; |
|
|
|
|
|
|
|
import java.nio.ByteBuffer; |
|
|
|
import java.sql.SQLException; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.Collections; |
|
|
|
import java.util.List; |
|
|
|
|
|
|
|
import static org.assertj.core.api.Assertions.assertThatThrownBy; |
|
|
|
import static org.mockito.ArgumentMatchers.any; |
|
|
|
import static org.thingsboard.server.common.data.ota.OtaPackageType.FIRMWARE; |
|
|
|
import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; |
|
|
|
|
|
|
|
@ -79,6 +84,8 @@ public class DeviceServiceTest extends AbstractServiceTest { |
|
|
|
TenantProfileService tenantProfileService; |
|
|
|
@Autowired |
|
|
|
private PlatformTransactionManager platformTransactionManager; |
|
|
|
@SpyBean |
|
|
|
private DeviceCredentialsDataValidator validator; |
|
|
|
|
|
|
|
private IdComparator<Device> idComparator = new IdComparator<>(); |
|
|
|
private TenantId anotherTenantId; |
|
|
|
@ -129,6 +136,67 @@ public class DeviceServiceTest extends AbstractServiceTest { |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testSaveDevicesWithTheSameAccessToken() { |
|
|
|
Device device = new Device(); |
|
|
|
device.setTenantId(tenantId); |
|
|
|
device.setName(StringUtils.randomAlphabetic(10)); |
|
|
|
device.setType("default"); |
|
|
|
String accessToken = StringUtils.generateSafeToken(10); |
|
|
|
Device savedDevice = deviceService.saveDeviceWithAccessToken(device, accessToken); |
|
|
|
|
|
|
|
DeviceCredentials deviceCredentials = deviceCredentialsService.findDeviceCredentialsByDeviceId(tenantId, savedDevice.getId()); |
|
|
|
Assert.assertEquals(accessToken, deviceCredentials.getCredentialsId()); |
|
|
|
|
|
|
|
Device duplicatedDevice = new Device(); |
|
|
|
duplicatedDevice.setTenantId(tenantId); |
|
|
|
duplicatedDevice.setName(StringUtils.randomAlphabetic(10)); |
|
|
|
duplicatedDevice.setType("default"); |
|
|
|
assertThatThrownBy(() -> deviceService.saveDeviceWithAccessToken(duplicatedDevice, accessToken)) |
|
|
|
.isInstanceOf(DeviceCredentialsValidationException.class) |
|
|
|
.hasMessageContaining("Device credentials are already assigned to another device!"); |
|
|
|
|
|
|
|
Device deviceByName = deviceService.findDeviceByTenantIdAndName(tenantId, duplicatedDevice.getName()); |
|
|
|
Assertions.assertNull(deviceByName); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testShouldRollbackNotValidatedDeviceIfDeviceCredentialsValidationFailed() { |
|
|
|
Mockito.reset(validator); |
|
|
|
Mockito.doThrow(new DataValidationException("mock message")) |
|
|
|
.when(validator).validate(any(), any()); |
|
|
|
|
|
|
|
Device device = new Device(); |
|
|
|
device.setTenantId(tenantId); |
|
|
|
device.setName(StringUtils.randomAlphabetic(10)); |
|
|
|
device.setType("default"); |
|
|
|
assertThatThrownBy(() -> deviceService.saveDevice(device, false)) |
|
|
|
.isInstanceOf(DataValidationException.class) |
|
|
|
.hasMessageContaining("mock message"); |
|
|
|
|
|
|
|
Device deviceByName = deviceService.findDeviceByTenantIdAndName(tenantId, device.getName()); |
|
|
|
Assertions.assertNull(deviceByName); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testShouldRollbackValidatedDeviceIfDeviceCredentialsValidationFailed() { |
|
|
|
Mockito.reset(validator); |
|
|
|
Mockito.doThrow(new DataValidationException("mock message")) |
|
|
|
.when(validator).validate(any(), any()); |
|
|
|
|
|
|
|
Device device = new Device(); |
|
|
|
device.setTenantId(tenantId); |
|
|
|
device.setName(StringUtils.randomAlphabetic(10)); |
|
|
|
device.setType("default"); |
|
|
|
|
|
|
|
assertThatThrownBy(() -> deviceService.saveDevice(device)) |
|
|
|
.isInstanceOf(DataValidationException.class) |
|
|
|
.hasMessageContaining("mock message"); |
|
|
|
|
|
|
|
Device deviceByName = deviceService.findDeviceByTenantIdAndName(tenantId, device.getName()); |
|
|
|
Assertions.assertNull(deviceByName); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testCountByTenantId() { |
|
|
|
Assert.assertEquals(0, deviceService.countByTenantId(tenantId)); |
|
|
|
|