package org.mitre.rhex;
import edu.umd.cs.findbugs.annotations.NonNull;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPut;
import org.mitre.test.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Collections;
import java.util.List;
/**
* Test for section PUT operation
*
* <pre>
* 6.4 baseURL/sectionpath
*
* 6.4.3 PUT
*
* This operation is not defined by this specification.
*
* Status Code: 405, unless an implementer defines this operation.
* </pre>
*
* @author Jason Mathews, MITRE Corp.
* Date: 2/20/12 10:45 AM
*/
public class SectionPut extends BaseTest {
@NonNull
public String getId() {
return "6.4.3";
}
@Override
public boolean isRequired() {
return true;
}
@NonNull
public String getName() {
return "PUT on section MUST return a 405";
}
@NonNull
public List<Class<? extends TestUnit>> getDependencyClasses() {
return Collections.<Class<? extends TestUnit>> singletonList(BaseSectionFromRootXml.class); // 6.4.1.1
}
public void execute() throws TestException {
// pre-conditions: for this test to be executed the prerequisite test BaseSectionFromRootXml
// must have passed with 200 HTTP and has a Map of all section ATOM DOMs and list of sections.
TestUnit baseTest = getDependency(BaseSectionFromRootXml.class);
if (baseTest == null) {
// assertion failed: this should never be null
log.error("Failed to retrieve prerequisite test");
setStatus(StatusEnumType.SKIPPED, "Failed to retrieve prerequisite test");
return;
}
List<String> sections = ((BaseSectionFromRootXml)baseTest).getSectionList();
if (sections.isEmpty()) {
log.error("Failed to retrieve prerequisite test results");
setStatus(StatusEnumType.SKIPPED, "Failed to retrieve prerequisite test results");
return;
}
final Context context = Loader.getInstance().getContext();
String section = context.getString("updateDocument.section"); // e.g. "vital_signs"
if (StringUtils.isBlank(section)) {
// check pre-conditions and setup
log.error("Failed to specify valid updateDocument/section property in configuration");
setStatus(StatusEnumType.SKIPPED, "Failed to specify valid updateDocument/section property in configuration");
return;
}
if (!sections.contains(section)) {
// test pre-conditions
setStatus(StatusEnumType.SKIPPED, "Unable to find section in test results");
return;
}
// -------------------------------------------------
// start the actual test
// -------------------------------------------------
HttpClient client = null;
try {
URI baseUrl = context.getBaseURL(section);
System.out.println("\nPUT URL: " + baseUrl);
client = context.getHttpClient();
HttpPut request = new HttpPut(baseUrl);
HttpResponse response = context.executeRequest(client, request);
int code = response.getStatusLine().getStatusCode();
if (code != 405) {
dumpResponse(request, response, true);
setStatus(StatusEnumType.FAILED, "Expected 405 HTTP status code but was: " + code);
return;
}
if (log.isDebugEnabled()) {
dumpResponse(request, response);
}
setStatus(StatusEnumType.SUCCESS);
} catch (URISyntaxException e) {
log.error("", e);
setStatus(StatusEnumType.SKIPPED, "Failed to construct valid URI for section");
} catch (IOException e) {
throw new TestException(e);
} finally {
if (client != null)
client.getConnectionManager().shutdown();
}
}
}