24 changed files with 97 additions and 374 deletions
@ -1,284 +0,0 @@ |
|||
/** |
|||
* Copyright © 2016-2017 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.dao.service; |
|||
|
|||
import com.datastax.driver.core.utils.UUIDs; |
|||
import com.google.common.util.concurrent.ListenableFuture; |
|||
import org.junit.After; |
|||
import org.junit.Assert; |
|||
import org.junit.Before; |
|||
import org.junit.Test; |
|||
import org.thingsboard.server.common.data.EntityType; |
|||
import org.thingsboard.server.common.data.asset.Asset; |
|||
import org.thingsboard.server.common.data.id.AssetId; |
|||
import org.thingsboard.server.common.data.id.DeviceId; |
|||
import org.thingsboard.server.common.data.relation.EntityRelation; |
|||
import org.thingsboard.server.common.data.relation.RelationTypeGroup; |
|||
import org.thingsboard.server.dao.exception.DataValidationException; |
|||
import org.thingsboard.server.dao.relation.EntityRelationsQuery; |
|||
import org.thingsboard.server.dao.relation.EntitySearchDirection; |
|||
import org.thingsboard.server.dao.relation.EntityTypeFilter; |
|||
import org.thingsboard.server.dao.relation.RelationsSearchParameters; |
|||
|
|||
import java.util.Collections; |
|||
import java.util.List; |
|||
import java.util.concurrent.ExecutionException; |
|||
|
|||
public class RelationServiceTest extends AbstractServiceTest { |
|||
|
|||
@Before |
|||
public void before() { |
|||
} |
|||
|
|||
@After |
|||
public void after() { |
|||
} |
|||
|
|||
@Test |
|||
public void testSaveRelation() throws ExecutionException, InterruptedException { |
|||
AssetId parentId = new AssetId(UUIDs.timeBased()); |
|||
AssetId childId = new AssetId(UUIDs.timeBased()); |
|||
|
|||
EntityRelation relation = new EntityRelation(parentId, childId, EntityRelation.CONTAINS_TYPE); |
|||
|
|||
Assert.assertTrue(saveRelation(relation)); |
|||
|
|||
Assert.assertTrue(relationService.checkRelation(parentId, childId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get()); |
|||
|
|||
Assert.assertFalse(relationService.checkRelation(parentId, childId, "NOT_EXISTING_TYPE", RelationTypeGroup.COMMON).get()); |
|||
|
|||
Assert.assertFalse(relationService.checkRelation(childId, parentId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get()); |
|||
|
|||
Assert.assertFalse(relationService.checkRelation(childId, parentId, "NOT_EXISTING_TYPE", RelationTypeGroup.COMMON).get()); |
|||
} |
|||
|
|||
@Test |
|||
public void testDeleteRelation() throws ExecutionException, InterruptedException { |
|||
AssetId parentId = new AssetId(UUIDs.timeBased()); |
|||
AssetId childId = new AssetId(UUIDs.timeBased()); |
|||
AssetId subChildId = new AssetId(UUIDs.timeBased()); |
|||
|
|||
EntityRelation relationA = new EntityRelation(parentId, childId, EntityRelation.CONTAINS_TYPE); |
|||
EntityRelation relationB = new EntityRelation(childId, subChildId, EntityRelation.CONTAINS_TYPE); |
|||
|
|||
saveRelation(relationA); |
|||
saveRelation(relationB); |
|||
|
|||
Assert.assertTrue(relationService.deleteRelation(relationA).get()); |
|||
|
|||
Assert.assertFalse(relationService.checkRelation(parentId, childId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get()); |
|||
|
|||
Assert.assertTrue(relationService.checkRelation(childId, subChildId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get()); |
|||
|
|||
Assert.assertTrue(relationService.deleteRelation(childId, subChildId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get()); |
|||
} |
|||
|
|||
@Test |
|||
public void testDeleteEntityRelations() throws ExecutionException, InterruptedException { |
|||
AssetId parentId = new AssetId(UUIDs.timeBased()); |
|||
AssetId childId = new AssetId(UUIDs.timeBased()); |
|||
AssetId subChildId = new AssetId(UUIDs.timeBased()); |
|||
|
|||
EntityRelation relationA = new EntityRelation(parentId, childId, EntityRelation.CONTAINS_TYPE); |
|||
EntityRelation relationB = new EntityRelation(childId, subChildId, EntityRelation.CONTAINS_TYPE); |
|||
|
|||
saveRelation(relationA); |
|||
saveRelation(relationB); |
|||
|
|||
Assert.assertTrue(relationService.deleteEntityRelations(childId).get()); |
|||
|
|||
Assert.assertFalse(relationService.checkRelation(parentId, childId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get()); |
|||
|
|||
Assert.assertFalse(relationService.checkRelation(childId, subChildId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get()); |
|||
} |
|||
|
|||
@Test |
|||
public void testFindFrom() throws ExecutionException, InterruptedException { |
|||
AssetId parentA = new AssetId(UUIDs.timeBased()); |
|||
AssetId parentB = new AssetId(UUIDs.timeBased()); |
|||
AssetId childA = new AssetId(UUIDs.timeBased()); |
|||
AssetId childB = new AssetId(UUIDs.timeBased()); |
|||
|
|||
EntityRelation relationA1 = new EntityRelation(parentA, childA, EntityRelation.CONTAINS_TYPE); |
|||
EntityRelation relationA2 = new EntityRelation(parentA, childB, EntityRelation.CONTAINS_TYPE); |
|||
|
|||
EntityRelation relationB1 = new EntityRelation(parentB, childA, EntityRelation.MANAGES_TYPE); |
|||
EntityRelation relationB2 = new EntityRelation(parentB, childB, EntityRelation.MANAGES_TYPE); |
|||
|
|||
saveRelation(relationA1); |
|||
saveRelation(relationA2); |
|||
|
|||
saveRelation(relationB1); |
|||
saveRelation(relationB2); |
|||
|
|||
List<EntityRelation> relations = relationService.findByFrom(parentA, RelationTypeGroup.COMMON).get(); |
|||
Assert.assertEquals(2, relations.size()); |
|||
for (EntityRelation relation : relations) { |
|||
Assert.assertEquals(EntityRelation.CONTAINS_TYPE, relation.getType()); |
|||
Assert.assertEquals(parentA, relation.getFrom()); |
|||
Assert.assertTrue(childA.equals(relation.getTo()) || childB.equals(relation.getTo())); |
|||
} |
|||
|
|||
relations = relationService.findByFromAndType(parentA, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get(); |
|||
Assert.assertEquals(2, relations.size()); |
|||
|
|||
relations = relationService.findByFromAndType(parentA, EntityRelation.MANAGES_TYPE, RelationTypeGroup.COMMON).get(); |
|||
Assert.assertEquals(0, relations.size()); |
|||
|
|||
relations = relationService.findByFrom(parentB, RelationTypeGroup.COMMON).get(); |
|||
Assert.assertEquals(2, relations.size()); |
|||
for (EntityRelation relation : relations) { |
|||
Assert.assertEquals(EntityRelation.MANAGES_TYPE, relation.getType()); |
|||
Assert.assertEquals(parentB, relation.getFrom()); |
|||
Assert.assertTrue(childA.equals(relation.getTo()) || childB.equals(relation.getTo())); |
|||
} |
|||
|
|||
relations = relationService.findByFromAndType(parentB, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get(); |
|||
Assert.assertEquals(0, relations.size()); |
|||
|
|||
relations = relationService.findByFromAndType(parentB, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get(); |
|||
Assert.assertEquals(0, relations.size()); |
|||
} |
|||
|
|||
private Boolean saveRelation(EntityRelation relationA1) throws ExecutionException, InterruptedException { |
|||
return relationService.saveRelation(relationA1).get(); |
|||
} |
|||
|
|||
@Test |
|||
public void testFindTo() throws ExecutionException, InterruptedException { |
|||
AssetId parentA = new AssetId(UUIDs.timeBased()); |
|||
AssetId parentB = new AssetId(UUIDs.timeBased()); |
|||
AssetId childA = new AssetId(UUIDs.timeBased()); |
|||
AssetId childB = new AssetId(UUIDs.timeBased()); |
|||
|
|||
EntityRelation relationA1 = new EntityRelation(parentA, childA, EntityRelation.CONTAINS_TYPE); |
|||
EntityRelation relationA2 = new EntityRelation(parentA, childB, EntityRelation.CONTAINS_TYPE); |
|||
|
|||
EntityRelation relationB1 = new EntityRelation(parentB, childA, EntityRelation.MANAGES_TYPE); |
|||
EntityRelation relationB2 = new EntityRelation(parentB, childB, EntityRelation.MANAGES_TYPE); |
|||
|
|||
saveRelation(relationA1); |
|||
saveRelation(relationA2); |
|||
|
|||
saveRelation(relationB1); |
|||
saveRelation(relationB2); |
|||
|
|||
// Data propagation to views is async
|
|||
Thread.sleep(3000); |
|||
|
|||
List<EntityRelation> relations = relationService.findByTo(childA, RelationTypeGroup.COMMON).get(); |
|||
Assert.assertEquals(2, relations.size()); |
|||
for (EntityRelation relation : relations) { |
|||
Assert.assertEquals(childA, relation.getTo()); |
|||
Assert.assertTrue(parentA.equals(relation.getFrom()) || parentB.equals(relation.getFrom())); |
|||
} |
|||
|
|||
relations = relationService.findByToAndType(childA, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.COMMON).get(); |
|||
Assert.assertEquals(1, relations.size()); |
|||
|
|||
relations = relationService.findByToAndType(childB, EntityRelation.MANAGES_TYPE, RelationTypeGroup.COMMON).get(); |
|||
Assert.assertEquals(1, relations.size()); |
|||
|
|||
relations = relationService.findByToAndType(parentA, EntityRelation.MANAGES_TYPE, RelationTypeGroup.COMMON).get(); |
|||
Assert.assertEquals(0, relations.size()); |
|||
|
|||
relations = relationService.findByToAndType(parentB, EntityRelation.MANAGES_TYPE, RelationTypeGroup.COMMON).get(); |
|||
Assert.assertEquals(0, relations.size()); |
|||
|
|||
relations = relationService.findByTo(childB, RelationTypeGroup.COMMON).get(); |
|||
Assert.assertEquals(2, relations.size()); |
|||
for (EntityRelation relation : relations) { |
|||
Assert.assertEquals(childB, relation.getTo()); |
|||
Assert.assertTrue(parentA.equals(relation.getFrom()) || parentB.equals(relation.getFrom())); |
|||
} |
|||
} |
|||
|
|||
@Test |
|||
public void testCyclicRecursiveRelation() throws ExecutionException, InterruptedException { |
|||
// A -> B -> C -> A
|
|||
AssetId assetA = new AssetId(UUIDs.timeBased()); |
|||
AssetId assetB = new AssetId(UUIDs.timeBased()); |
|||
AssetId assetC = new AssetId(UUIDs.timeBased()); |
|||
|
|||
EntityRelation relationA = new EntityRelation(assetA, assetB, EntityRelation.CONTAINS_TYPE); |
|||
EntityRelation relationB = new EntityRelation(assetB, assetC, EntityRelation.CONTAINS_TYPE); |
|||
EntityRelation relationC = new EntityRelation(assetC, assetA, EntityRelation.CONTAINS_TYPE); |
|||
|
|||
saveRelation(relationA); |
|||
saveRelation(relationB); |
|||
saveRelation(relationC); |
|||
|
|||
EntityRelationsQuery query = new EntityRelationsQuery(); |
|||
query.setParameters(new RelationsSearchParameters(assetA, EntitySearchDirection.FROM, -1)); |
|||
query.setFilters(Collections.singletonList(new EntityTypeFilter(EntityRelation.CONTAINS_TYPE, Collections.singletonList(EntityType.ASSET)))); |
|||
List<EntityRelation> relations = relationService.findByQuery(query).get(); |
|||
Assert.assertEquals(3, relations.size()); |
|||
Assert.assertTrue(relations.contains(relationA)); |
|||
Assert.assertTrue(relations.contains(relationB)); |
|||
Assert.assertTrue(relations.contains(relationC)); |
|||
} |
|||
|
|||
@Test |
|||
public void testRecursiveRelation() throws ExecutionException, InterruptedException { |
|||
// A -> B -> [C,D]
|
|||
AssetId assetA = new AssetId(UUIDs.timeBased()); |
|||
AssetId assetB = new AssetId(UUIDs.timeBased()); |
|||
AssetId assetC = new AssetId(UUIDs.timeBased()); |
|||
DeviceId deviceD = new DeviceId(UUIDs.timeBased()); |
|||
|
|||
EntityRelation relationAB = new EntityRelation(assetA, assetB, EntityRelation.CONTAINS_TYPE); |
|||
EntityRelation relationBC = new EntityRelation(assetB, assetC, EntityRelation.CONTAINS_TYPE); |
|||
EntityRelation relationBD = new EntityRelation(assetB, deviceD, EntityRelation.CONTAINS_TYPE); |
|||
|
|||
|
|||
saveRelation(relationAB); |
|||
saveRelation(relationBC); |
|||
saveRelation(relationBD); |
|||
|
|||
EntityRelationsQuery query = new EntityRelationsQuery(); |
|||
query.setParameters(new RelationsSearchParameters(assetA, EntitySearchDirection.FROM, -1)); |
|||
query.setFilters(Collections.singletonList(new EntityTypeFilter(EntityRelation.CONTAINS_TYPE, Collections.singletonList(EntityType.ASSET)))); |
|||
List<EntityRelation> relations = relationService.findByQuery(query).get(); |
|||
Assert.assertEquals(2, relations.size()); |
|||
Assert.assertTrue(relations.contains(relationAB)); |
|||
Assert.assertTrue(relations.contains(relationBC)); |
|||
} |
|||
|
|||
|
|||
@Test(expected = DataValidationException.class) |
|||
public void testSaveRelationWithEmptyFrom() throws ExecutionException, InterruptedException { |
|||
EntityRelation relation = new EntityRelation(); |
|||
relation.setTo(new AssetId(UUIDs.timeBased())); |
|||
relation.setType(EntityRelation.CONTAINS_TYPE); |
|||
Assert.assertTrue(saveRelation(relation)); |
|||
} |
|||
|
|||
@Test(expected = DataValidationException.class) |
|||
public void testSaveRelationWithEmptyTo() throws ExecutionException, InterruptedException { |
|||
EntityRelation relation = new EntityRelation(); |
|||
relation.setFrom(new AssetId(UUIDs.timeBased())); |
|||
relation.setType(EntityRelation.CONTAINS_TYPE); |
|||
Assert.assertTrue(saveRelation(relation)); |
|||
} |
|||
|
|||
@Test(expected = DataValidationException.class) |
|||
public void testSaveRelationWithEmptyType() throws ExecutionException, InterruptedException { |
|||
EntityRelation relation = new EntityRelation(); |
|||
relation.setFrom(new AssetId(UUIDs.timeBased())); |
|||
relation.setTo(new AssetId(UUIDs.timeBased())); |
|||
Assert.assertTrue(saveRelation(relation)); |
|||
} |
|||
} |
|||
@ -0,0 +1,2 @@ |
|||
TRUNCATE TABLE plugin; |
|||
TRUNCATE TABLE rule; |
|||
Loading…
Reference in new issue