Skip to content
NodeDAOTest.java 10.7 KiB
Newer Older
package it.inaf.oats.vospace.persistence;

Sonia Zorba's avatar
Sonia Zorba committed
import it.inaf.oats.vospace.datamodel.NodeProperties;
import it.inaf.oats.vospace.datamodel.NodeUtils;
import it.inaf.oats.vospace.exception.InternalFaultException;
import it.inaf.oats.vospace.exception.NodeNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.sql.DataSource;
import net.ivoa.xml.vospace.v2.ContainerNode;
import net.ivoa.xml.vospace.v2.Node;
import net.ivoa.xml.vospace.v2.Property;
import net.ivoa.xml.vospace.v2.View;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertThrows;
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);
    }
    public void testCreateNode() {
        DataNode dataNode = new DataNode();
        dataNode.setUri("vos://example.com!vospace/mydata1");
        dataNode.setAccepts(getViews());
        dataNode.setProvides(getViews());
        dataNode.setBusy(true);


        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());
    public void testListNode() {
        ContainerNode root = (ContainerNode) dao.listNode("/").get();
        assertEquals(2, root.getNodes().size());
        assertEquals("true", NodeProperties.getNodePropertyByURI(root, NodeProperties.PUBLIC_READ_URI));
        assertEquals("0", NodeProperties.getNodePropertyByURI(root, NodeProperties.LENGTH_URI));
        assertEquals("group1 group2", NodeProperties.getNodePropertyByURI(root.getNodes().get(0), NodeProperties.GROUP_READ_URI));

        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));
    public void testGetNodeId() {
        assertEquals(2, dao.getNodeId("/test1"));
        assertEquals(3, dao.getNodeId("/test1/f1"));

        assertThrows(NodeNotFoundException.class,
                () -> {
                    dao.getNodeId("/pippo123123");
                });
    }

    @Test
    public void testListNodesInBranch() {
        List<Node> result = dao.listNodesInBranch(dao.getNodeId("/test1/f1"), 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(dao.getNodeId("/test1/f1"), true);
                });

    }

    @Test
    public void testSetBranchBusy() {
        Long rootId = dao.getNodeId("/test1/f1");
        dao.setBranchBusy(rootId, true);
        List<Node> busyList = dao.listNodesInBranch(rootId, false);
        boolean busyTrue = busyList.stream().allMatch((n) -> {
            if (n instanceof DataNode) {
                return ((DataNode) n).isBusy();
            } else {
                return true;
            }
        }
        );

        assertTrue(busyTrue);

        dao.setBranchBusy(rootId, false);

        busyList = dao.listNodesInBranch(rootId, false);

        boolean busyFalse = busyList.stream().allMatch((n) -> {
            if (n instanceof DataNode) {
                return !((DataNode) n).isBusy();
            } else {
                return true;
            }
        }
        );

        assertTrue(busyFalse);
    }

    @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());
        Long rootId = dao.getNodeId(oldPath);

        dao.renameNode(rootId, "f_pippo");

        assertTrue(dao.listNode(oldPath).isEmpty());
        assertTrue(dao.listNode(oldPathChild).isEmpty());

        assertTrue(dao.listNode(newPath).isPresent());
        assertTrue(dao.listNode(newPathChild).isPresent());

    }

    //@Test
    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");

        assertEquals(1, dao.countNodesWithPath("/test2/f4"), "Test db has been changed");
        assertEquals(1, dao.countNodesWithPath("/test2/f5"), "Test db has been changed");
        assertEquals(0, dao.countNodesWithPath("/pippooo"), "Test db has been changed");
        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");
        dao.createNode(dataNode);

        dao.setNodeLocation("/mydata2", 1, "mydata2");
    }
    public void testSetNodeLocationFailure() {
        boolean exception = false;
        try {
            dao.setNodeLocation("/foo", 1, "foo");
        } catch (InternalFaultException ex) {
            exception = true;
        }
        assertTrue(exception);
    }
        Property publicReadProperty = getProperty(NodeProperties.PUBLIC_READ_URI, String.valueOf(false));

        Node node = new DataNode();
        node.setUri("vos://example.com!vospace/mydata3");
        node.getProperties().add(publicReadProperty);
        dao.createNode(node);

        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);
        dao.createNode(node);
        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"));
        dao.createNode(child1);

        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"));
        dao.createNode(child2);

        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;
    }