|
|
|
@ -18,11 +18,11 @@ package org.thingsboard.server.controller; |
|
|
|
import com.datastax.oss.driver.api.core.uuid.Uuids; |
|
|
|
import com.fasterxml.jackson.core.type.TypeReference; |
|
|
|
import org.apache.commons.lang3.RandomStringUtils; |
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
import org.junit.After; |
|
|
|
import org.junit.Assert; |
|
|
|
import org.junit.Before; |
|
|
|
import org.junit.Test; |
|
|
|
import org.mockito.Mockito; |
|
|
|
import org.springframework.test.context.TestPropertySource; |
|
|
|
import org.thingsboard.server.common.data.Customer; |
|
|
|
import org.thingsboard.server.common.data.Device; |
|
|
|
@ -30,12 +30,14 @@ import org.thingsboard.server.common.data.EntitySubtype; |
|
|
|
import org.thingsboard.server.common.data.Tenant; |
|
|
|
import org.thingsboard.server.common.data.User; |
|
|
|
import org.thingsboard.server.common.data.asset.Asset; |
|
|
|
import org.thingsboard.server.common.data.audit.ActionType; |
|
|
|
import org.thingsboard.server.common.data.edge.Edge; |
|
|
|
import org.thingsboard.server.common.data.id.CustomerId; |
|
|
|
import org.thingsboard.server.common.data.id.TenantId; |
|
|
|
import org.thingsboard.server.common.data.page.PageData; |
|
|
|
import org.thingsboard.server.common.data.page.PageLink; |
|
|
|
import org.thingsboard.server.common.data.security.Authority; |
|
|
|
import org.thingsboard.server.dao.exception.DataValidationException; |
|
|
|
import org.thingsboard.server.dao.model.ModelConstants; |
|
|
|
import org.thingsboard.server.edge.imitator.EdgeImitator; |
|
|
|
import org.thingsboard.server.gen.edge.v1.AdminSettingsUpdateMsg; |
|
|
|
@ -100,6 +102,9 @@ public abstract class BaseEdgeControllerTest extends AbstractControllerTest { |
|
|
|
@Test |
|
|
|
public void testSaveEdge() throws Exception { |
|
|
|
Edge edge = constructEdge("My edge", "default"); |
|
|
|
|
|
|
|
Mockito.reset(tbClusterService, auditLogService); |
|
|
|
|
|
|
|
Edge savedEdge = doPost("/api/edge", edge, Edge.class); |
|
|
|
|
|
|
|
Assert.assertNotNull(savedEdge); |
|
|
|
@ -110,23 +115,56 @@ public abstract class BaseEdgeControllerTest extends AbstractControllerTest { |
|
|
|
Assert.assertEquals(NULL_UUID, savedEdge.getCustomerId().getId()); |
|
|
|
Assert.assertEquals(edge.getName(), savedEdge.getName()); |
|
|
|
|
|
|
|
testNotifyEntityBroadcastEntityStateChangeEventOneTimeMsgToEdgeServiceNever(savedEdge, savedEdge.getId(), savedEdge.getId(), |
|
|
|
savedTenant.getId(), tenantAdmin.getCustomerId(), tenantAdmin.getId(), tenantAdmin.getEmail(), |
|
|
|
ActionType.ADDED); |
|
|
|
|
|
|
|
savedEdge.setName("My new edge"); |
|
|
|
doPost("/api/edge", savedEdge, Edge.class); |
|
|
|
|
|
|
|
Edge foundEdge = doGet("/api/edge/" + savedEdge.getId().getId().toString(), Edge.class); |
|
|
|
Assert.assertEquals(foundEdge.getName(), savedEdge.getName()); |
|
|
|
|
|
|
|
testNotifyEntityBroadcastEntityStateChangeEventOneTimeMsgToEdgeServiceNever(foundEdge, foundEdge.getId(), foundEdge.getId(), |
|
|
|
savedTenant.getId(), tenantAdmin.getCustomerId(), tenantAdmin.getId(), tenantAdmin.getEmail(), |
|
|
|
ActionType.UPDATED); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testSaveEdgeWithViolationOfLengthValidation() throws Exception { |
|
|
|
Edge edge = constructEdge(RandomStringUtils.randomAlphabetic(300), "default"); |
|
|
|
doPost("/api/edge", edge).andExpect(statusReason(containsString("length of name must be equal or less than 255"))); |
|
|
|
String msgError = msgErrorFieldLength("name"); |
|
|
|
|
|
|
|
Mockito.reset(tbClusterService, auditLogService); |
|
|
|
|
|
|
|
doPost("/api/edge", edge) |
|
|
|
.andExpect(status().isBadRequest()) |
|
|
|
.andExpect(statusReason(containsString(msgError))); |
|
|
|
|
|
|
|
testNotifyEntityEqualsOneTimeServiceNeverError(edge, savedTenant.getId(), |
|
|
|
tenantAdmin.getId(), tenantAdmin.getEmail(), ActionType.ADDED, new DataValidationException(msgError)); |
|
|
|
Mockito.reset(tbClusterService, auditLogService); |
|
|
|
|
|
|
|
msgError = msgErrorFieldLength("type"); |
|
|
|
edge.setName("normal name"); |
|
|
|
edge.setType(RandomStringUtils.randomAlphabetic(300)); |
|
|
|
doPost("/api/edge", edge).andExpect(statusReason(containsString("length of type must be equal or less than 255"))); |
|
|
|
doPost("/api/edge", edge) |
|
|
|
.andExpect(status().isBadRequest()) |
|
|
|
.andExpect(statusReason(containsString(msgError))); |
|
|
|
|
|
|
|
testNotifyEntityEqualsOneTimeServiceNeverError(edge, savedTenant.getId(), |
|
|
|
tenantAdmin.getId(), tenantAdmin.getEmail(), ActionType.ADDED, new DataValidationException(msgError)); |
|
|
|
Mockito.reset(tbClusterService, auditLogService); |
|
|
|
|
|
|
|
msgError = msgErrorFieldLength("label"); |
|
|
|
edge.setType("normal type"); |
|
|
|
edge.setLabel(RandomStringUtils.randomAlphabetic(300)); |
|
|
|
doPost("/api/edge", edge).andExpect(statusReason(containsString("length of label must be equal or less than 255"))); |
|
|
|
doPost("/api/edge", edge) |
|
|
|
.andExpect(status().isBadRequest()) |
|
|
|
.andExpect(statusReason(containsString(msgError))); |
|
|
|
|
|
|
|
testNotifyEntityEqualsOneTimeServiceNeverError(edge, savedTenant.getId(), |
|
|
|
tenantAdmin.getId(), tenantAdmin.getEmail(), ActionType.ADDED, new DataValidationException(msgError)); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
@ -141,10 +179,20 @@ public abstract class BaseEdgeControllerTest extends AbstractControllerTest { |
|
|
|
@Test |
|
|
|
public void testFindEdgeTypesByTenantId() throws Exception { |
|
|
|
List<Edge> edges = new ArrayList<>(); |
|
|
|
for (int i = 0; i < 3; i++) { |
|
|
|
|
|
|
|
int cntEntity = 3; |
|
|
|
|
|
|
|
Mockito.reset(tbClusterService, auditLogService); |
|
|
|
|
|
|
|
for (int i = 0; i < cntEntity; i++) { |
|
|
|
Edge edge = constructEdge("My edge B" + i, "typeB"); |
|
|
|
edges.add(doPost("/api/edge", edge, Edge.class)); |
|
|
|
} |
|
|
|
|
|
|
|
testNotifyManyEntityManyTimeMsgToEdgeServiceNeverAdditionalInfoAny(new Edge(), new Edge(), |
|
|
|
savedTenant.getId(), tenantAdmin.getCustomerId(), tenantAdmin.getId(), tenantAdmin.getEmail(), |
|
|
|
ActionType.ADDED, cntEntity, 0); |
|
|
|
|
|
|
|
for (int i = 0; i < 7; i++) { |
|
|
|
Edge edge = constructEdge("My edge C" + i, "typeC"); |
|
|
|
edges.add(doPost("/api/edge", edge, Edge.class)); |
|
|
|
@ -154,7 +202,7 @@ public abstract class BaseEdgeControllerTest extends AbstractControllerTest { |
|
|
|
edges.add(doPost("/api/edge", edge, Edge.class)); |
|
|
|
} |
|
|
|
List<EntitySubtype> edgeTypes = doGetTyped("/api/edge/types", |
|
|
|
new TypeReference<List<EntitySubtype>>() { |
|
|
|
new TypeReference<>() { |
|
|
|
}); |
|
|
|
|
|
|
|
Assert.assertNotNull(edgeTypes); |
|
|
|
@ -169,27 +217,48 @@ public abstract class BaseEdgeControllerTest extends AbstractControllerTest { |
|
|
|
Edge edge = constructEdge("My edge", "default"); |
|
|
|
Edge savedEdge = doPost("/api/edge", edge, Edge.class); |
|
|
|
|
|
|
|
Mockito.reset(tbClusterService, auditLogService); |
|
|
|
|
|
|
|
doDelete("/api/edge/" + savedEdge.getId().getId().toString()) |
|
|
|
.andExpect(status().isOk()); |
|
|
|
|
|
|
|
testNotifyEntityBroadcastEntityStateChangeEventOneTimeMsgToEdgeServiceNever(savedEdge, savedEdge.getId(), savedEdge.getId(), |
|
|
|
savedTenant.getId(), tenantAdmin.getCustomerId(), tenantAdmin.getId(), tenantAdmin.getEmail(), |
|
|
|
ActionType.DELETED, savedEdge.getId().getId().toString()); |
|
|
|
|
|
|
|
doGet("/api/edge/" + savedEdge.getId().getId().toString()) |
|
|
|
.andExpect(status().isNotFound()); |
|
|
|
.andExpect(status().isNotFound()) |
|
|
|
.andExpect(statusReason(containsString(msgErrorNoFound("Edge", savedEdge.getId().getId().toString())))); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testSaveEdgeWithEmptyType() throws Exception { |
|
|
|
Edge edge = constructEdge("My edge", null); |
|
|
|
|
|
|
|
Mockito.reset(tbClusterService, auditLogService); |
|
|
|
|
|
|
|
String msgError = "Edge type " + msgErrorShouldBeSpecified; |
|
|
|
doPost("/api/edge", edge) |
|
|
|
.andExpect(status().isBadRequest()) |
|
|
|
.andExpect(statusReason(containsString("Edge type should be specified"))); |
|
|
|
.andExpect(statusReason(containsString(msgError))); |
|
|
|
|
|
|
|
testNotifyEntityEqualsOneTimeServiceNeverError(edge, savedTenant.getId(), |
|
|
|
tenantAdmin.getId(), tenantAdmin.getEmail(), ActionType.ADDED, new DataValidationException(msgError)); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testSaveEdgeWithEmptyName() throws Exception { |
|
|
|
Edge edge = constructEdge(null, "default"); |
|
|
|
|
|
|
|
Mockito.reset(tbClusterService, auditLogService); |
|
|
|
|
|
|
|
String msgError = "Edge name " + msgErrorShouldBeSpecified; |
|
|
|
doPost("/api/edge", edge) |
|
|
|
.andExpect(status().isBadRequest()) |
|
|
|
.andExpect(statusReason(containsString("Edge name should be specified"))); |
|
|
|
.andExpect(statusReason(containsString(msgError))); |
|
|
|
|
|
|
|
testNotifyEntityEqualsOneTimeServiceNeverError(edge, savedTenant.getId(), |
|
|
|
tenantAdmin.getId(), tenantAdmin.getEmail(), ActionType.ADDED, new DataValidationException(msgError)); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
@ -201,10 +270,16 @@ public abstract class BaseEdgeControllerTest extends AbstractControllerTest { |
|
|
|
customer.setTitle("My customer"); |
|
|
|
Customer savedCustomer = doPost("/api/customer", customer, Customer.class); |
|
|
|
|
|
|
|
Mockito.reset(tbClusterService, auditLogService); |
|
|
|
|
|
|
|
Edge assignedEdge = doPost("/api/customer/" + savedCustomer.getId().getId().toString() |
|
|
|
+ "/edge/" + savedEdge.getId().getId().toString(), Edge.class); |
|
|
|
Assert.assertEquals(savedCustomer.getId(), assignedEdge.getCustomerId()); |
|
|
|
|
|
|
|
testNotifyEntityAllOneTimeLogEntityActionEntityEqClass(assignedEdge, assignedEdge.getId(), assignedEdge.getId(), |
|
|
|
savedTenant.getId(), savedCustomer.getId(), tenantAdmin.getId(), tenantAdmin.getEmail(), ActionType.ASSIGNED_TO_CUSTOMER, |
|
|
|
assignedEdge.getId().getId().toString(), savedCustomer.getId().getId().toString(), savedCustomer.getTitle()); |
|
|
|
|
|
|
|
Edge foundEdge = doGet("/api/edge/" + savedEdge.getId().getId().toString(), Edge.class); |
|
|
|
Assert.assertEquals(savedCustomer.getId(), foundEdge.getCustomerId()); |
|
|
|
|
|
|
|
@ -212,6 +287,10 @@ public abstract class BaseEdgeControllerTest extends AbstractControllerTest { |
|
|
|
doDelete("/api/customer/edge/" + savedEdge.getId().getId().toString(), Edge.class); |
|
|
|
Assert.assertEquals(ModelConstants.NULL_UUID, unassignedEdge.getCustomerId().getId()); |
|
|
|
|
|
|
|
testNotifyEntityAllOneTimeLogEntityActionEntityEqClass(unassignedEdge, unassignedEdge.getId(), unassignedEdge.getId(), |
|
|
|
savedTenant.getId(), savedCustomer.getId(), tenantAdmin.getId(), tenantAdmin.getEmail(), ActionType.UNASSIGNED_FROM_CUSTOMER, |
|
|
|
unassignedEdge.getId().getId().toString(), savedCustomer.getId().getId().toString(), savedCustomer.getTitle()); |
|
|
|
|
|
|
|
foundEdge = doGet("/api/edge/" + savedEdge.getId().getId().toString(), Edge.class); |
|
|
|
Assert.assertEquals(ModelConstants.NULL_UUID, foundEdge.getCustomerId().getId()); |
|
|
|
} |
|
|
|
@ -221,9 +300,18 @@ public abstract class BaseEdgeControllerTest extends AbstractControllerTest { |
|
|
|
Edge edge = constructEdge("My edge", "default"); |
|
|
|
Edge savedEdge = doPost("/api/edge", edge, Edge.class); |
|
|
|
|
|
|
|
doPost("/api/customer/" + Uuids.timeBased().toString() |
|
|
|
+ "/edge/" + savedEdge.getId().getId().toString()) |
|
|
|
.andExpect(status().isNotFound()); |
|
|
|
Mockito.reset(tbClusterService, auditLogService); |
|
|
|
|
|
|
|
CustomerId customerId = new CustomerId(Uuids.timeBased()); |
|
|
|
String customerIdStr = customerId.getId().toString(); |
|
|
|
|
|
|
|
String msgError = msgErrorNoFound("Customer", customerIdStr); |
|
|
|
doPost("/api/customer/" + customerIdStr+ "/edge/" + savedEdge.getId().getId().toString()) |
|
|
|
.andExpect(status().isNotFound()) |
|
|
|
.andExpect(statusReason(containsString(msgError))); |
|
|
|
|
|
|
|
testNotifyEntityNever(savedEdge.getId(), savedEdge); |
|
|
|
testNotifyEntityNever(customerId, new Customer()); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
@ -242,7 +330,7 @@ public abstract class BaseEdgeControllerTest extends AbstractControllerTest { |
|
|
|
tenantAdmin2.setFirstName("Joe"); |
|
|
|
tenantAdmin2.setLastName("Downs"); |
|
|
|
|
|
|
|
tenantAdmin2 = createUserAndLogin(tenantAdmin2, "testPassword1"); |
|
|
|
createUserAndLogin(tenantAdmin2, "testPassword1"); |
|
|
|
|
|
|
|
Customer customer = new Customer(); |
|
|
|
customer.setTitle("Different customer"); |
|
|
|
@ -253,9 +341,15 @@ public abstract class BaseEdgeControllerTest extends AbstractControllerTest { |
|
|
|
Edge edge = constructEdge("My edge", "default"); |
|
|
|
Edge savedEdge = doPost("/api/edge", edge, Edge.class); |
|
|
|
|
|
|
|
Mockito.reset(tbClusterService, auditLogService); |
|
|
|
|
|
|
|
doPost("/api/customer/" + savedCustomer.getId().getId().toString() |
|
|
|
+ "/edge/" + savedEdge.getId().getId().toString()) |
|
|
|
.andExpect(status().isForbidden()); |
|
|
|
.andExpect(status().isForbidden()) |
|
|
|
.andExpect(statusReason(containsString(msgErrorPermission))); |
|
|
|
|
|
|
|
testNotifyEntityNever(savedEdge.getId(), savedEdge); |
|
|
|
testNotifyEntityNever(savedCustomer.getId(), savedCustomer); |
|
|
|
|
|
|
|
loginSysAdmin(); |
|
|
|
|
|
|
|
@ -275,7 +369,7 @@ public abstract class BaseEdgeControllerTest extends AbstractControllerTest { |
|
|
|
PageData<Edge> pageData = null; |
|
|
|
do { |
|
|
|
pageData = doGetTypedWithPageLink("/api/tenant/edges?", |
|
|
|
new TypeReference<PageData<Edge>>() { |
|
|
|
new TypeReference<>() { |
|
|
|
}, pageLink); |
|
|
|
loadedEdges.addAll(pageData.getData()); |
|
|
|
if (pageData.hasNext()) { |
|
|
|
@ -352,7 +446,7 @@ public abstract class BaseEdgeControllerTest extends AbstractControllerTest { |
|
|
|
|
|
|
|
pageLink = new PageLink(4, 0, title1); |
|
|
|
pageData = doGetTypedWithPageLink("/api/tenant/edges?", |
|
|
|
new TypeReference<PageData<Edge>>() { |
|
|
|
new TypeReference<>() { |
|
|
|
}, pageLink); |
|
|
|
Assert.assertFalse(pageData.hasNext()); |
|
|
|
Assert.assertEquals(0, pageData.getData().size()); |
|
|
|
@ -364,7 +458,7 @@ public abstract class BaseEdgeControllerTest extends AbstractControllerTest { |
|
|
|
|
|
|
|
pageLink = new PageLink(4, 0, title2); |
|
|
|
pageData = doGetTypedWithPageLink("/api/tenant/edges?", |
|
|
|
new TypeReference<PageData<Edge>>() { |
|
|
|
new TypeReference<>() { |
|
|
|
}, pageLink); |
|
|
|
Assert.assertFalse(pageData.hasNext()); |
|
|
|
Assert.assertEquals(0, pageData.getData().size()); |
|
|
|
@ -460,14 +554,22 @@ public abstract class BaseEdgeControllerTest extends AbstractControllerTest { |
|
|
|
customer = doPost("/api/customer", customer, Customer.class); |
|
|
|
CustomerId customerId = customer.getId(); |
|
|
|
|
|
|
|
Mockito.reset(tbClusterService, auditLogService); |
|
|
|
|
|
|
|
List<Edge> edges = new ArrayList<>(); |
|
|
|
for (int i = 0; i < 128; i++) { |
|
|
|
int cntEntity = 128; |
|
|
|
for (int i = 0; i < cntEntity; i++) { |
|
|
|
Edge edge = constructEdge("Edge" + i, "default"); |
|
|
|
edge = doPost("/api/edge", edge, Edge.class); |
|
|
|
edges.add(doPost("/api/customer/" + customerId.getId().toString() |
|
|
|
+ "/edge/" + edge.getId().getId().toString(), Edge.class)); |
|
|
|
} |
|
|
|
|
|
|
|
testNotifyManyEntityManyTimeMsgToEdgeServiceEntityEqAny(new Edge(), new Edge(), |
|
|
|
savedTenant.getId(), customerId, tenantAdmin.getId(), tenantAdmin.getEmail(), |
|
|
|
ActionType.ASSIGNED_TO_CUSTOMER, ActionType.ASSIGNED_TO_CUSTOMER, cntEntity, cntEntity, cntEntity * 2, |
|
|
|
new String(), new String(), new String()); |
|
|
|
|
|
|
|
List<Edge> loadedEdges = new ArrayList<>(); |
|
|
|
PageLink pageLink = new PageLink(23); |
|
|
|
PageData<Edge> pageData = null; |
|
|
|
@ -518,7 +620,7 @@ public abstract class BaseEdgeControllerTest extends AbstractControllerTest { |
|
|
|
} |
|
|
|
|
|
|
|
List<Edge> loadedEdgesTitle1 = new ArrayList<>(); |
|
|
|
PageLink pageLink = new PageLink(15,0, title1); |
|
|
|
PageLink pageLink = new PageLink(15, 0, title1); |
|
|
|
PageData<Edge> pageData = null; |
|
|
|
do { |
|
|
|
pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/edges?", |
|
|
|
@ -536,7 +638,7 @@ public abstract class BaseEdgeControllerTest extends AbstractControllerTest { |
|
|
|
Assert.assertEquals(edgesTitle1, loadedEdgesTitle1); |
|
|
|
|
|
|
|
List<Edge> loadedEdgesTitle2 = new ArrayList<>(); |
|
|
|
pageLink = new PageLink(4,0, title2); |
|
|
|
pageLink = new PageLink(4, 0, title2); |
|
|
|
do { |
|
|
|
pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/edges?", |
|
|
|
new TypeReference<PageData<Edge>>() { |
|
|
|
@ -552,11 +654,18 @@ public abstract class BaseEdgeControllerTest extends AbstractControllerTest { |
|
|
|
|
|
|
|
Assert.assertEquals(edgesTitle2, loadedEdgesTitle2); |
|
|
|
|
|
|
|
Mockito.reset(tbClusterService, auditLogService); |
|
|
|
|
|
|
|
for (Edge edge : loadedEdgesTitle1) { |
|
|
|
doDelete("/api/customer/edge/" + edge.getId().getId().toString()) |
|
|
|
.andExpect(status().isOk()); |
|
|
|
} |
|
|
|
|
|
|
|
int cntEntity = loadedEdgesTitle1.size(); |
|
|
|
testNotifyManyEntityManyTimeMsgToEdgeServiceEntityEqAnyAdditionalInfoAny(new Edge(), new Edge(), |
|
|
|
savedTenant.getId(), customerId, tenantAdmin.getId(), tenantAdmin.getEmail(), |
|
|
|
ActionType.UNASSIGNED_FROM_CUSTOMER, ActionType.UNASSIGNED_FROM_CUSTOMER, cntEntity, cntEntity, 3); |
|
|
|
|
|
|
|
pageLink = new PageLink(4, 0, title1); |
|
|
|
pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/edges?", |
|
|
|
new TypeReference<PageData<Edge>>() { |
|
|
|
@ -714,7 +823,8 @@ public abstract class BaseEdgeControllerTest extends AbstractControllerTest { |
|
|
|
edgeImitator.allowIgnoredTypes(); |
|
|
|
try { |
|
|
|
edgeImitator.disconnect(); |
|
|
|
} catch (Exception ignored) {} |
|
|
|
} catch (Exception ignored) { |
|
|
|
} |
|
|
|
|
|
|
|
doDelete("/api/device/" + savedDevice.getId().getId().toString()) |
|
|
|
.andExpect(status().isOk()); |
|
|
|
|