/* * Licensed to DuraSpace under one or more contributor license agreements. * See the NOTICE file distributed with this work for additional information * regarding copyright ownership. * * DuraSpace licenses this file to you 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.fcrepo.integration; import static java.lang.Integer.MAX_VALUE; import static javax.ws.rs.core.HttpHeaders.CONTENT_TYPE; import static javax.ws.rs.core.HttpHeaders.LINK; import static org.apache.http.HttpStatus.SC_BAD_REQUEST; import static org.apache.http.HttpStatus.SC_CONFLICT; import static org.apache.http.HttpStatus.SC_CREATED; import static org.apache.http.HttpStatus.SC_NO_CONTENT; import static org.apache.http.HttpStatus.SC_OK; import static org.fcrepo.kernel.api.RdfLexicon.CONSTRAINED_BY; import static org.junit.Assert.assertEquals; import java.io.IOException; import java.net.URI; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.util.EntityUtils; import org.junit.Before; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.ws.rs.core.Link; /** * <p>SanityCheckIT class.</p> * * @author fasseg */ public class SanityCheckIT { /** * The server port of the application, set as system property by * maven-failsafe-plugin. */ private static final String SERVER_PORT = System.getProperty("fcrepo.dynamic.test.port"); /** * The context path of the application (including the leading "/"), set as * system property by maven-failsafe-plugin. */ private static final String CONTEXT_PATH = System .getProperty("fcrepo.test.context.path"); protected Logger logger; @Before public void setLogger() { logger = LoggerFactory.getLogger(this.getClass()); } protected static final String HOSTNAME = "localhost"; protected static final String serverAddress = "http://" + HOSTNAME + ":" + SERVER_PORT + CONTEXT_PATH; protected static HttpClient client; static { client = HttpClientBuilder.create().setMaxConnPerRoute(MAX_VALUE) .setMaxConnTotal(MAX_VALUE).build(); } @Test public void doASanityCheck() throws IOException { executeAndVerify(new HttpGet(serverAddress + "rest/"), SC_OK); } private HttpResponse executeAndVerify(final HttpUriRequest method, final int statusCode) throws IOException { logger.debug("Executing: " + method.getMethod() + " to " + method.getURI()); final HttpResponse response = client.execute(method); assertEquals(statusCode, response.getStatusLine().getStatusCode()); return response; } @Test public void testConstraintLink() throws Exception { // Create a resource final HttpPost post = new HttpPost(serverAddress + "rest/"); final HttpResponse postResponse = executeAndVerify(post, SC_CREATED); final String location = postResponse.getFirstHeader("Location").getValue(); logger.debug("new resource location: {}", location); // GET the new resource final HttpGet get = new HttpGet(location); final HttpResponse getResponse = executeAndVerify(get, SC_OK); final String body = EntityUtils.toString(getResponse.getEntity()); logger.debug("new resource body: {}", body); // PUT the exact body back to the new resource... successfully final HttpPut put = new HttpPut(location); put.setEntity(new StringEntity(body)); put.setHeader(CONTENT_TYPE, "text/turtle"); executeAndVerify(put, SC_NO_CONTENT); // Update a server managed property in the resource body... not allowed! final String body2 = body.replaceFirst("fedora:created \"2\\d\\d\\d", "fedora:created \"1999"); // PUT the erroneous body back to the new resource... unsuccessfully final HttpPut put2 = new HttpPut(location); put2.setEntity(new StringEntity(body2)); put2.setHeader(CONTENT_TYPE, "text/turtle"); final HttpResponse put2Response = executeAndVerify(put2, SC_CONFLICT); // Verify the returned LINK header final String linkHeader = put2Response.getFirstHeader(LINK).getValue(); final Link link = Link.valueOf(linkHeader); logger.debug("constraint linkHeader: {}", linkHeader); // Verify the LINK rel final String linkRel = link.getRel(); assertEquals(CONSTRAINED_BY.getURI(), linkRel); // Verify the LINK URI by fetching it final URI linkURI = link.getUri(); logger.debug("constraint linkURI: {}", linkURI); final HttpGet getLink = new HttpGet(linkURI); executeAndVerify(getLink, SC_OK); } @Test public void testCannotCreateResourceConstraintLink() throws Exception { // Create a ldp:Resource resource, this should fail final HttpPost post = new HttpPost(serverAddress + "rest/"); post.setHeader(LINK,"<http://www.w3.org/ns/ldp#Resource>; rel=\"type\""); final HttpResponse postResponse = executeAndVerify(post, SC_BAD_REQUEST); // Verify the returned LINK header final String linkHeader = postResponse.getFirstHeader(LINK).getValue(); final Link link = Link.valueOf(linkHeader); logger.debug("constraint linkHeader: {}", linkHeader); // Verify the LINK rel final String linkRel = link.getRel(); assertEquals(CONSTRAINED_BY.getURI(), linkRel); // Verify the LINK URI by fetching it final URI linkURI = link.getUri(); logger.debug("constraint linkURI: {}", linkURI); final HttpGet getLink = new HttpGet(linkURI); executeAndVerify(getLink, SC_OK); } }