From 32f01438b1cd02d8b90c71177abc9542056ea53f Mon Sep 17 00:00:00 2001 From: Andrii Shvaika Date: Thu, 3 Nov 2022 17:43:59 +0200 Subject: [PATCH] Test for recursive relation depth --- .../dao/service/BaseRelationServiceTest.java | 49 ++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/BaseRelationServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/BaseRelationServiceTest.java index 75ac95d470..ca85c88337 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/BaseRelationServiceTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/BaseRelationServiceTest.java @@ -80,7 +80,7 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { Assert.assertTrue(relationService.deleteRelationAsync(SYSTEM_TENANT_ID, relationA).get()); - Assert.assertFalse(relationService.checkRelation(SYSTEM_TENANT_ID, parentId, childId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON)); + Assert.assertFalse(relationService.checkRelation(SYSTEM_TENANT_ID, parentId, childId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON)); Assert.assertTrue(relationService.checkRelation(SYSTEM_TENANT_ID, childId, subChildId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON)); @@ -288,6 +288,53 @@ public abstract class BaseRelationServiceTest extends AbstractServiceTest { Assert.assertTrue(relations.contains(relationBC)); } + @Test + public void testRecursiveRelationDepth() throws ExecutionException, InterruptedException { + int maxLevel = 100; + AssetId root = new AssetId(Uuids.timeBased()); + AssetId left = new AssetId(Uuids.timeBased()); + AssetId right = new AssetId(Uuids.timeBased()); + + List expected = new ArrayList<>(); + + EntityRelation relationAB = new EntityRelation(root, left, EntityRelation.CONTAINS_TYPE); + EntityRelation relationBC = new EntityRelation(root, right, EntityRelation.CONTAINS_TYPE); + saveRelation(relationAB); + expected.add(relationAB); + + saveRelation(relationBC); + expected.add(relationBC); + + for (int i = 0; i < maxLevel; i++) { + var newLeft = new AssetId(Uuids.timeBased()); + var newRight = new AssetId(Uuids.timeBased()); + EntityRelation relationLeft = new EntityRelation(left, newLeft, EntityRelation.CONTAINS_TYPE); + EntityRelation relationRight = new EntityRelation(right, newRight, EntityRelation.CONTAINS_TYPE); + saveRelation(relationLeft); + expected.add(relationLeft); + saveRelation(relationRight); + expected.add(relationRight); + left = newLeft; + right = newRight; + } + + + EntityRelationsQuery query = new EntityRelationsQuery(); + query.setParameters(new RelationsSearchParameters(root, EntitySearchDirection.FROM, -1, false)); + query.setFilters(Collections.singletonList(new RelationEntityTypeFilter(EntityRelation.CONTAINS_TYPE, Collections.singletonList(EntityType.ASSET)))); + List relations = relationService.findByQuery(SYSTEM_TENANT_ID, query).get(); + Assert.assertEquals(expected.size(), relations.size()); + for(EntityRelation r : expected){ + Assert.assertTrue(relations.contains(r)); + } + + //Test from cache + relations = relationService.findByQuery(SYSTEM_TENANT_ID, query).get(); + Assert.assertEquals(expected.size(), relations.size()); + for(EntityRelation r : expected){ + Assert.assertTrue(relations.contains(r)); + } + } @Test(expected = DataValidationException.class) public void testSaveRelationWithEmptyFrom() throws ExecutionException, InterruptedException {