Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 38 additions & 18 deletions doi/src/intTest/java/ca/nrc/cadc/doi/AltPermissionsTest.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package ca.nrc.cadc.doi;

import ca.nrc.cadc.doi.datacite.Date;
import ca.nrc.cadc.doi.datacite.DateType;
import ca.nrc.cadc.doi.datacite.Resource;
import ca.nrc.cadc.doi.io.DoiParsingException;
import ca.nrc.cadc.doi.io.DoiXmlReader;
Expand All @@ -15,17 +13,11 @@
import ca.nrc.cadc.util.Log4jInit;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.json.JSONArray;
import org.json.JSONObject;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import org.opencadc.vospace.ContainerNode;

Expand All @@ -40,8 +32,8 @@
import java.security.PrivilegedExceptionAction;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.opencadc.vospace.Node;

public class AltPermissionsTest extends LifecycleTest {

Expand Down Expand Up @@ -102,14 +94,10 @@ public void testDOILifecycleWithAlternateSettings() throws Exception {

ContainerNode doiNode = getContainerNode(doiID, doiAltParentPathURI, doiAltVosClient);
Assert.assertNotNull(doiNode);
Assert.assertEquals(2, doiNode.getReadOnlyGroup().size());
Assert.assertEquals(2, doiNode.getReadWriteGroup().size());
Assert.assertEquals(1, doiNode.getReadOnlyGroup().size());
Assert.assertEquals(1, doiNode.getReadWriteGroup().size());
log.debug("readWriteSubject - DOI created successfully: " + doiID);

// update - success expected
update(actual, doiID, doiAltServiceURL);
log.debug("readWriteSubject - DOI updated successfully: " + doiID);

// publish: failure expected
mintDOI403Expected(doiID);
log.debug("readWriteSubject - DOI minting failed successfully: " + doiID);
Expand All @@ -128,20 +116,29 @@ public void testDOILifecycleWithAlternateSettings() throws Exception {
List<DoiStatus> draftDoiStatusList = searchDOIStatuses(null, List.of("in progress"));
long draftDOIsCount = draftDoiStatusList.stream().filter(e -> e.getStatus().equals(Status.DRAFT)).count();
Assert.assertEquals(draftDoiStatusList.size(), draftDOIsCount);

// update doi status to 'review ready' so publisher has read access
log.debug("readWriteSubject - update status to 'review ready'");
updateStatus(doiID, Status.REVIEW_READY, true);
doiNode = getContainerNode(doiID, doiAltParentPathURI, doiAltVosClient);
checkStatus(doiNode, Status.REVIEW_READY);
log.debug("readWriteSubject - checked status");

return doiID;
});

Subject.doAs(publisherSubject, (PrivilegedExceptionAction<String>) () -> {
URL doiURL = new URL(String.format("%s/%s", doiAltServiceURL, doiSuffix));
log.debug("readWriteSubject - URL: " + doiURL);

// Get DOI : Success expected
Resource actual = getDOI(doiURL, doiSuffix);
log.debug("publisherSubject - get DOI success for DOI ID : " + doiSuffix);

// get all DOIs - publisher should find the created draft DOI
// get all DOIs - publisher should find the 'review ready' DOI
List<DoiStatus> doiStatusList = getDoiStatuses();
Optional<DoiStatus> createdDOIStatus = doiStatusList.stream().filter(doiStatus -> getDOISuffix(doiStatus.getIdentifier().getValue()).equals(doiSuffix)).findFirst();
Assert.assertTrue(createdDOIStatus.isPresent());
Optional<DoiStatus> reviewReadyStatus = doiStatusList.stream().filter(doiStatus -> getDOISuffix(doiStatus.getIdentifier().getValue()).equals(doiSuffix)).findFirst();
Assert.assertTrue(reviewReadyStatus.isPresent());
log.debug("publisherSubject - get All DOI Status success");

// Get DOI status : Success expected
Expand All @@ -155,6 +152,13 @@ public void testDOILifecycleWithAlternateSettings() throws Exception {
Assert.assertEquals(200, get.getResponseCode());
log.debug("publisherSubject - get DOI status success for DOI ID : " + doiSuffix);

// update status to 'in review' to allow the publisher to publish the doi
log.debug("publisherSubject - update status to 'in review'");
updateStatus(doiSuffix, Status.IN_REVIEW, true);
ContainerNode doiNode = getContainerNode(doiSuffix, doiAltParentPathURI, doiAltVosClient);
checkStatus(doiNode, Status.IN_REVIEW);
log.debug("publisherSubject - checked status");

//publish DOI : Success expected
publish(actual, doiSuffix, DOISettingsType.ALT_DOI);

Expand Down Expand Up @@ -342,10 +346,26 @@ public void testDOISearchEndpoint() throws PrivilegedActionException, DoiParsing
Resource actual = create(expected, DOISettingsType.ALT_DOI);
String doiID = getDOISuffix(actual.getIdentifier().getValue());
Assert.assertNotNull(doiID);

// update doi status to review ready so publisher has read access
log.debug("readWriteSubject - update status to 'review ready'");
updateStatus(doiID, Status.REVIEW_READY, true);
Node doiNode = getContainerNode(doiID, doiAltParentPathURI, vosClient);
checkStatus(doiNode, Status.REVIEW_READY);
log.debug("readWriteSubject - checked status");

return doiID;
});

Subject.doAs(publisherSubject, (PrivilegedExceptionAction<String>) () -> {

// update doi status to in review ready so publisher can publish
log.debug("publisherSubject - update status to 'in review'");
updateStatus(mintedDOIId, Status.IN_REVIEW, true);
Node doiNode = getContainerNode(mintedDOIId, doiAltParentPathURI, vosClient);
checkStatus(doiNode, Status.IN_REVIEW);
log.debug("readWriteSubject - checked status");

URL doiURL = new URL(String.format("%s/%s", doiAltServiceURL, mintedDOIId));
Resource actual = getDOI(doiURL, mintedDOIId);

Expand Down
46 changes: 2 additions & 44 deletions doi/src/intTest/java/ca/nrc/cadc/doi/AltStatusTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -72,18 +72,13 @@
import ca.nrc.cadc.doi.datacite.Resource;
import ca.nrc.cadc.doi.status.Status;
import ca.nrc.cadc.util.Log4jInit;
import java.net.URL;
import java.security.PrivilegedExceptionAction;
import java.util.HashMap;
import java.util.Map;
import javax.security.auth.Subject;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import org.opencadc.vospace.Node;
import org.opencadc.vospace.NodeProperty;
import org.opencadc.vospace.VOSURI;
import org.opencadc.vospace.client.VOSpaceClient;

Expand Down Expand Up @@ -160,7 +155,7 @@ public void testUpdateStatus() {
checkStatus(doiNode, Status.IN_REVIEW);
log.debug("publisher - checked status");

// 'review ready' node permissions, doi-group:r reviewer-group:r public:false
// 'in review' node permissions, doi-group:r reviewer-group:r public:false
checkPermissions(doiNode, false, false, 2,0);
log.debug("publisher - checked permissions");

Expand Down Expand Up @@ -218,7 +213,7 @@ public void testUpdateStatus() {
log.debug("publisher - checked status");

// 'rejected' node permissions, doi-group:r reviewer-group:r public:false
checkPermissions(doiNode, false, false, 2,1);
checkPermissions(doiNode, false, false, 2,0);
log.debug("publisher - checked permissions");

return null;
Expand Down Expand Up @@ -281,49 +276,12 @@ public void testUpdateStatus() {
return null;
});

Subject.doAs(readWriteSubject, (PrivilegedExceptionAction<String>) () -> {

// update status = 'in progress'
log.debug("submitter - update status to 'in progress");
updateStatus(doiSuffix, Status.DRAFT, false);

Node doiNode = getContainerNode(doiSuffix, doiParentPathURI, vosClient);
checkStatus(doiNode, Status.DRAFT);
log.debug("submitter - checked status");

// 'in progress' node permissions, doi-group:rw reviewer-group:- public:false
checkPermissions(doiNode, false, false, 1,1);
log.debug("submitter - checked permissions");

return null;
});

} catch (Exception unexpected) {
log.debug("unexpected error: " + unexpected);
Assert.fail("unexpected error: " + unexpected.getMessage());
}
}

void updateStatus(String doiID, Status requestedStatus, boolean followRedirect)
throws Exception {
log.debug(String.format("update status to '%s'", requestedStatus.getValue()));
URL doiURL = new URL(String.format("%s/%s", doiAltServiceURL, doiID));
Map<String, String> params = new HashMap<>();
params.put(DOI.STATUS_NODE_PARAMETER, requestedStatus.getValue());
postDOI(doiURL , null, params, followRedirect);
log.debug(String.format("status updated to '%s'", requestedStatus.getValue()));
}

void checkStatus(Node doiNode, Status expectedStatus) {

Assert.assertNotNull(doiNode);

// check the status mode property
NodeProperty status = doiNode.getProperty(DOI.VOSPACE_DOI_STATUS_PROPERTY);
Assert.assertNotNull(status);
Assert.assertEquals(expectedStatus.getValue(), status.getValue());
}

void checkPermissions(Node doiNode, boolean isLocked, boolean isPublic,
int readOnlyGroups, int readWriteGroups) {

Expand Down
33 changes: 32 additions & 1 deletion doi/src/intTest/java/ca/nrc/cadc/doi/IntTestBase.java
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@
import ca.nrc.cadc.auth.SSLUtil;
import ca.nrc.cadc.doi.datacite.Resource;
import ca.nrc.cadc.doi.io.DoiXmlWriter;
import ca.nrc.cadc.doi.status.Status;
import ca.nrc.cadc.net.FileContent;
import ca.nrc.cadc.net.HttpPost;
import ca.nrc.cadc.reg.Standards;
Expand All @@ -96,6 +97,8 @@
import org.junit.BeforeClass;
import org.opencadc.vospace.ContainerNode;
import org.opencadc.vospace.DataNode;
import org.opencadc.vospace.Node;
import org.opencadc.vospace.NodeProperty;
import org.opencadc.vospace.VOSURI;
import org.opencadc.vospace.client.VOSpaceClient;
import org.opencadc.vospace.client.async.RecursiveDeleteNode;
Expand Down Expand Up @@ -221,14 +224,42 @@ protected DataNode createDataNode(String path, String name, DOISettingsType doiS
return (DataNode) getVOSClient(doiSettingsType).createNode(nodeURI, node);
}

protected ContainerNode getContainerNode(String path, VOSURI doiParentPathURI, VOSpaceClient vosClient) throws Exception {
protected ContainerNode getContainerNode(String path, VOSURI doiParentPathURI, VOSpaceClient vosClient) throws Exception {
String nodePath = doiParentPathURI.getPath();
if (StringUtil.hasText(path)) {
nodePath = String.format("%s/%s", nodePath, path);
}
return (ContainerNode) vosClient.getNode(nodePath);
}

protected DataNode getDataNode(String path, VOSURI doiParentPathURI, VOSpaceClient vosClient) throws Exception {
String nodePath = doiParentPathURI.getPath();
if (StringUtil.hasText(path)) {
nodePath = String.format("%s/%s", nodePath, path);
}
return (DataNode) vosClient.getNode(nodePath);
}

void updateStatus(String doiID, Status requestedStatus, boolean followRedirect)
throws Exception {
log.debug(String.format("update status to '%s'", requestedStatus.getValue()));
URL doiURL = new URL(String.format("%s/%s", doiAltServiceURL, doiID));
Map<String, String> params = new HashMap<>();
params.put(DOI.STATUS_NODE_PARAMETER, requestedStatus.getValue());
postDOI(doiURL , null, params, followRedirect);
log.debug(String.format("status updated to '%s'", requestedStatus.getValue()));
}

void checkStatus(Node doiNode, Status expectedStatus) {

Assert.assertNotNull(doiNode);

// check the status mode property
NodeProperty status = doiNode.getProperty(DOI.VOSPACE_DOI_STATUS_PROPERTY);
Assert.assertNotNull(status);
Assert.assertEquals(expectedStatus.getValue(), status.getValue());
}

protected String postDOI(URL postUrl, String doiXML, Map<String, String> nodeMetadata, boolean followRedirect)
throws Exception {
Map<String, Object> params = new HashMap<>();
Expand Down
Loading