Newer
Older
/*
* This file is part of vospace-rest
* Copyright (C) 2021 Istituto Nazionale di Astrofisica
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package it.inaf.oats.vospace.persistence;
Nicola Fulvio Calabria
committed
import it.inaf.oats.vospace.URIUtils;
import it.inaf.oats.vospace.datamodel.NodeProperties;
import it.inaf.oats.vospace.exception.InternalFaultException;
import it.inaf.oats.vospace.persistence.NodeDAO.ShortNodeDescriptor;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import javax.sql.DataSource;
import net.ivoa.xml.vospace.v2.ContainerNode;
Sara Bertocco
committed
import net.ivoa.xml.vospace.v2.DataNode;
import net.ivoa.xml.vospace.v2.View;
import static org.junit.jupiter.api.Assertions.assertEquals;
import net.ivoa.xml.vospace.v2.Node;
import net.ivoa.xml.vospace.v2.Property;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringExtension;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {DataSourceConfig.class})
@TestPropertySource(locations = "classpath:test.properties")
public class NodeDAOTest {
@Autowired
private DataSource dataSource;
private NodeDAO dao;
@BeforeEach
public void init() {
dao = new NodeDAO(dataSource);
}
Sara Bertocco
committed
public void testCreateNode() {
DataNode dataNode = new DataNode();
Sara Bertocco
committed
dataNode.setUri("vos://example.com!vospace/mydata1");
dataNode.setAccepts(getViews());
dataNode.setProvides(getViews());
dataNode.setBusy(true);
Nicola Fulvio Calabria
committed
dao.createNode(dataNode,
URIUtils.returnVosPathFromNodeURI(dataNode.getUri(), "example.com!vospace"));
DataNode retrievedNode = (DataNode) dao.listNode("/mydata1").get();
assertEquals(retrievedNode.getAccepts().get(0).getUri(), dataNode.getAccepts().get(0).getUri());
assertEquals(retrievedNode.getProvides().get(0).getUri(), dataNode.getProvides().get(0).getUri());
Sara Bertocco
committed
}
ContainerNode root = (ContainerNode) dao.listNode("/").get();
assertEquals(4, root.getNodes().size());
Sonia Zorba
committed
assertEquals("true", NodeProperties.getNodePropertyByURI(root, NodeProperties.PUBLIC_READ_URI));
assertEquals("0", NodeProperties.getNodePropertyByURI(root, NodeProperties.LENGTH_URI));
Sonia Zorba
committed
assertEquals("group1 group2", NodeProperties.getNodePropertyByURI(root.getNodes().get(0), NodeProperties.GROUP_READ_URI));
Sonia Zorba
committed
String bTime = NodeProperties.getNodePropertyByURI(root.getNodes().get(0), NodeProperties.INITIAL_CREATION_TIME_URI);
assertTrue(bTime.contains("T"));
assertEquals(bTime, NodeProperties.getNodePropertyByURI(root.getNodes().get(0), NodeProperties.DATE_URI));
Sonia Zorba
committed
}
@Test
public void testGetNodeId() {
Optional<Long> id1 = dao.getNodeId("/test1");
assertTrue(id1.isPresent());
assertEquals(2, id1.get());
Optional<Long> id2 = dao.getNodeId("/test1/f1");
assertTrue(id2.isPresent());
assertEquals(3, id2.get());
Optional<Long> id3 = dao.getNodeId("/pippo123123");
assertTrue(id3.isEmpty());
}
@Test
public void testGetNodeById() {
Optional<Long> id1 = dao.getNodeId("/test1/f1");
assertTrue(id1.isPresent());
assertThrows(InternalFaultException.class,
() -> {
dao.getNodeById(id1.get(), true);
});
Optional<Node> opt1 = dao.getNodeById(id1.get(), false);
assertTrue(opt1.isPresent());
assertTrue(NodeUtils.getVosPath(opt1.get()).equals("/test1/f1"));
@Test
public void testListNodesInBranch() {
Optional<Long> id1 = dao.getNodeId("/test1/f1");
assertTrue(id1.isPresent());
List<Node> result = dao.listNodesInBranch(id1.get(), false);
assertEquals(3, result.size());
// Check if list has root node at index 0
Node root = result.get(0);
assertEquals("/test1/f1", NodeUtils.getVosPath(root));
assertThrows(InternalFaultException.class,
() -> {
dao.listNodesInBranch(id1.get(), true);
});
@Test
public void testSetBranchBusy() {
Optional<Long> rootId = dao.getNodeId("/test1/f1");
assertTrue(rootId.isPresent());
dao.setBranchBusy(rootId.get(), true);
List<Node> busyList = dao.listNodesInBranch(rootId.get(), false);
boolean busyTrue = busyList.stream().allMatch((n) -> {
if (n instanceof DataNode) {
return ((DataNode) n).isBusy();
} else {
return true;
}
}
);
assertTrue(busyTrue);
dao.setBranchBusy(rootId.get(), false);
busyList = dao.listNodesInBranch(rootId.get(), false);
boolean busyFalse = busyList.stream().allMatch((n) -> {
if (n instanceof DataNode) {
return !((DataNode) n).isBusy();
} else {
return true;
}
}
);
assertTrue(busyFalse);
} */
@Test
public void testGetShortNodeDescriptor(){
String userName = "user3";
List<String> userGroups = List.of();
Optional<ShortNodeDescriptor> snd1Opt =
dao.getShortNodeDescriptor("/test3/mstick", userName, userGroups);
assertTrue(snd1Opt.isPresent());
ShortNodeDescriptor snd1 = snd1Opt.get();
assertTrue(snd1.isContainer());
assertFalse(snd1.isPermissionDenied());
assertFalse(snd1.isWritable());
assertFalse(snd1.isBusy());
assertEquals("9.13", snd1.getDestinationNodeLtreePath());
snd1Opt =
dao.getShortNodeDescriptor("/test3/mbusy", userName, userGroups);
assertTrue(snd1Opt.isPresent());
snd1 = snd1Opt.get();
assertTrue(snd1.isWritable());
assertFalse(snd1.isPermissionDenied());
assertTrue(snd1.isBusy());
snd1Opt =
dao.getShortNodeDescriptor("/test3/masynctrans", userName, userGroups);
assertTrue(snd1Opt.isPresent());
snd1 = snd1Opt.get();
assertFalse(snd1.isWritable());
assertFalse(snd1.isBusy());
snd1Opt =
dao.getShortNodeDescriptor("/test3/asyncloc", userName, userGroups);
assertTrue(snd1Opt.isPresent());
snd1 = snd1Opt.get();
assertFalse(snd1.isWritable());
assertFalse(snd1.isBusy());
snd1Opt =
dao.getShortNodeDescriptor("/test1/f1/f2_renamed/f3", "user1", userGroups);
assertTrue(snd1Opt.isPresent());
snd1 = snd1Opt.get();
assertFalse(snd1.isContainer());
assertFalse(snd1.isWritable());
assertFalse(snd1.isPermissionDenied());
assertFalse(snd1.isBusy());
snd1Opt =
dao.getShortNodeDescriptor("/test3/group1", "user1", userGroups);
assertTrue(snd1Opt.isPresent());
snd1 = snd1Opt.get();
assertTrue(snd1.isWritable());
assertTrue(snd1.isPermissionDenied());
snd1Opt =
dao.getShortNodeDescriptor("/test3/group1", "user3", List.of("group99"));
assertTrue(snd1Opt.isPresent());
snd1 = snd1Opt.get();
assertTrue(snd1.isWritable());
assertFalse(snd1.isPermissionDenied());
snd1Opt =
dao.getShortNodeDescriptor("/test3/group1", "user1", List.of("group1", "group2"));
assertTrue(snd1Opt.isPresent());
snd1 = snd1Opt.get();
assertTrue(snd1.isWritable());
assertFalse(snd1.isPermissionDenied());
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
}
@Test
public void testIsBranchBusy() {
Optional<Long> optId = dao.getNodeId("/test3/m1");
assertTrue(optId.isPresent());
assertFalse(dao.isBranchBusy(optId.get()));
optId = dao.getNodeId("/test3");
assertTrue(optId.isPresent());
assertTrue(dao.isBranchBusy(optId.get()));
}
@Test
public void testIsBranchWritable() {
List<String> userGroups = List.of("group1");
Optional<Long> optId = dao.getNodeId("/test3/m1");
assertTrue(optId.isPresent());
assertTrue(dao.isBranchWritable(optId.get(), "user3", userGroups));
optId = dao.getNodeId("/test3");
assertTrue(optId.isPresent());
assertFalse(dao.isBranchWritable(optId.get(), "user3", userGroups));
optId = dao.getNodeId("/test3/group1");
assertTrue(optId.isPresent());
assertTrue(dao.isBranchWritable(optId.get(), "user3", userGroups));
optId = dao.getNodeId("/test3/group1");
assertTrue(optId.isPresent());
assertFalse(dao.isBranchWritable(optId.get(), "user1", List.of("group99")));
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
@Test
public void testMoveNodeBranch() {
// Let's move /test3/m1 to /test3/group1
Optional<Long> optSourceId = dao.getNodeId("/test3/m1");
assertTrue(optSourceId.isPresent());
Optional<ShortNodeDescriptor> optSnd
= dao.getShortNodeDescriptor("/test3/group1", "user3", List.of("group1"));
assertTrue(optSnd.isPresent());
ShortNodeDescriptor snd = optSnd.get();
assertEquals("9.17", snd.getDestinationNodeLtreePath());
dao.moveNodeBranch(optSourceId.get(), snd.getDestinationNodeLtreePath());
Optional<Long> optResultId = dao.getNodeId("/test3/group1/m1");
assertTrue(optSourceId.isPresent());
optSnd = dao.getShortNodeDescriptor("/test3/group1/m1", "user3", List.of("group1"));
assertEquals("9.17.10", optSnd.get().getDestinationNodeLtreePath());
Optional<Long> optResultIdChild = dao.getNodeId("/test3/group1/m1/m2");
optSnd = dao.getShortNodeDescriptor("/test3/group1/m1/m2", "user3", List.of("group1"));
assertEquals("9.17.10.11", optSnd.get().getDestinationNodeLtreePath());
assertTrue(optResultIdChild.isPresent());
}
@Test
public void testRenameNode() {
String oldPath = "/test1/f1";
String newPath = "/test1/f_pippo";
String child = "/f2_renamed";
String oldPathChild = oldPath + child;
String newPathChild = newPath + child;
assertTrue(dao.listNode(oldPath).isPresent());
assertTrue(dao.listNode(oldPathChild).isPresent());
Optional<Long> rootId = dao.getNodeId(oldPath);
assertTrue(rootId.isPresent());
dao.renameNode(rootId.get(), "f_pippo");
assertTrue(dao.listNode(oldPath).isEmpty());
assertTrue(dao.listNode(oldPathChild).isEmpty());
assertTrue(dao.listNode(newPath).isPresent());
assertTrue(dao.listNode(newPathChild).isPresent());
}
public void testCountNodeWithPath() {
assertEquals(1, dao.countNodesWithPath("/"));
assertEquals(1, dao.countNodesWithPath("/test1"), "Test db has been changed");
assertEquals(1, dao.countNodesWithPath("/test1/f1"), "Test db has been changed");
assertEquals(1, dao.countNodesWithPath("/test1/f1/f2_renamed"), "Test db has been changed");
assertEquals(1, dao.countNodesWithPath("/test1/f1/f2_renamed/f3"), "Test db has been changed");
assertEquals(1, dao.countNodesWithPath("/test2"), "Test db has been changed");
Nicola Fulvio Calabria
committed
assertEquals(1, dao.countNodesWithPath("/test2/f4"), "Test db has been changed");
assertEquals(1, dao.countNodesWithPath("/test2/f5"), "Test db has been changed");
Nicola Fulvio Calabria
committed
assertEquals(0, dao.countNodesWithPath("/pippooo"), "Test db has been changed");
}
public void testDeleteNode() {
Nicola Fulvio Calabria
committed
assertEquals(1, dao.countNodesWithPath("/test1/f1/f2_renamed/f3"), "Test db has been changed");
dao.deleteNode("/test1");
assertEquals(0, dao.countNodesWithPath("/test1"));
assertEquals(0, dao.countNodesWithPath("/test1/f1"));
assertEquals(0, dao.countNodesWithPath("/test1/f1/f2_renamed"));
assertEquals(0, dao.countNodesWithPath("/test1/f1/f2_renamed/f3"));
}
public void testSetNodeLocation() {
DataNode dataNode = new DataNode();
dataNode.setUri("vos://example.com!vospace/mydata2");
Nicola Fulvio Calabria
committed
dao.createNode(dataNode,
URIUtils.returnVosPathFromNodeURI(dataNode.getUri(), "example.com!vospace"));
dao.setNodeLocation("/mydata2", 1, "mydata2");
}
public void testSetNodeLocationFailure() {
boolean exception = false;
try {
dao.setNodeLocation("/foo", 1, "foo");
} catch (InternalFaultException ex) {
exception = true;
}
assertTrue(exception);
}
Sonia Zorba
committed
public void testSetNode() {
Property publicReadProperty = getProperty(NodeProperties.PUBLIC_READ_URI, String.valueOf(false));
Sonia Zorba
committed
Node node = new DataNode();
node.setUri("vos://example.com!vospace/mydata3");
node.getProperties().add(publicReadProperty);
Nicola Fulvio Calabria
committed
dao.createNode(node,
URIUtils.returnVosPathFromNodeURI(node.getUri(), "example.com!vospace"));
Sonia Zorba
committed
node = dao.listNode("/mydata3").get();
assertEquals("false", NodeProperties.getNodePropertyByURI(node, NodeProperties.PUBLIC_READ_URI));
node.getProperties().clear();
publicReadProperty.setValue(String.valueOf(true));
node.getProperties().add(publicReadProperty);
dao.setNode(node);
node = dao.listNode("/mydata3").get();
assertEquals("true", NodeProperties.getNodePropertyByURI(node, NodeProperties.PUBLIC_READ_URI));
}
public void testSetNodeRecursiveGroup() {
Property parentGroupRead = getProperty(NodeProperties.GROUP_READ_URI, "group1 group2");
Property parentGroupWrite = getProperty(NodeProperties.GROUP_WRITE_URI, "group2 group3");
Node node = new DataNode();
node.setUri("vos://example.com!vospace/mydata4");
node.getProperties().add(parentGroupRead);
node.getProperties().add(parentGroupWrite);
Nicola Fulvio Calabria
committed
dao.createNode(node,
URIUtils.returnVosPathFromNodeURI(node.getUri(), "example.com!vospace"));
Node child1 = new DataNode();
child1.setUri("vos://example.com!vospace/mydata4/child1");
child1.getProperties().add(getProperty(NodeProperties.GROUP_READ_URI, "group3"));
child1.getProperties().add(getProperty(NodeProperties.GROUP_WRITE_URI, "group3 group4"));
Nicola Fulvio Calabria
committed
dao.createNode(child1,
URIUtils.returnVosPathFromNodeURI(child1.getUri(), "example.com!vospace"));
Node child2 = new DataNode();
child2.setUri("vos://example.com!vospace/mydata4/child1/child2");
child2.getProperties().add(getProperty(NodeProperties.GROUP_READ_URI, "group2 group5"));
child2.getProperties().add(getProperty(NodeProperties.GROUP_WRITE_URI, "group6"));
Nicola Fulvio Calabria
committed
dao.createNode(child2,
URIUtils.returnVosPathFromNodeURI(child2.getUri(), "example.com!vospace"));
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
parentGroupRead.setValue("group1 group5"); // remove group2; add group5
parentGroupWrite.setValue("group2 group6"); // remove group3; add group6
// Recursively set node
dao.setNode(node, true);
node = dao.listNode("/mydata4").get();
child1 = dao.listNode("/mydata4/child1").get();
child2 = dao.listNode("/mydata4/child1/child2").get();
checkGroups(NodeProperties.getNodePropertyAsListByURI(node, NodeProperties.GROUP_READ_URI), "group1", "group5");
checkGroups(NodeProperties.getNodePropertyAsListByURI(node, NodeProperties.GROUP_WRITE_URI), "group2", "group6");
checkGroups(NodeProperties.getNodePropertyAsListByURI(child1, NodeProperties.GROUP_READ_URI), "group3", "group5");
checkGroups(NodeProperties.getNodePropertyAsListByURI(child1, NodeProperties.GROUP_WRITE_URI), "group4", "group6");
checkGroups(NodeProperties.getNodePropertyAsListByURI(child2, NodeProperties.GROUP_READ_URI), "group5");
checkGroups(NodeProperties.getNodePropertyAsListByURI(child2, NodeProperties.GROUP_WRITE_URI), "group6");
}
private Property getProperty(String uri, String value) {
Property property = new Property();
property.setUri(uri);
property.setValue(value);
return property;
}
private void checkGroups(List<String> groups, String... expectedGroups) {
Set<String> set1 = new HashSet<>(Arrays.asList(expectedGroups));
Set<String> set2 = new HashSet<>(groups);
assertEquals(set1, set2);
private List<View> getViews() {
View view = new View();
view.setUri("urn:myview");
List<View> views = new ArrayList<>();
views.add(view);
return views;
}