/* * Copyright 2010 Outerthought bvba * * Licensed 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.lilyproject.process.test; import java.io.IOException; import org.apache.commons.io.IOUtils; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpDelete; 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.DefaultHttpClient; import org.apache.http.util.EntityUtils; import org.codehaus.jackson.JsonNode; import org.junit.AfterClass; import org.junit.BeforeClass; import org.lilyproject.lilyservertestfw.LilyProxy; import org.lilyproject.util.json.JsonFormat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public abstract class AbstractRestTest { protected static String BASE_URI; private static HttpClient httpClient; private static LilyProxy lilyProxy; @BeforeClass public static void setUpBeforeClass() throws Exception { lilyProxy = new LilyProxy(); lilyProxy.start(); httpClient = new DefaultHttpClient(); BASE_URI = "http://localhost:12060/repository"; } @AfterClass public static void tearDownAfterClass() throws Exception { try { if (lilyProxy != null) { lilyProxy.stop(); } } catch (Throwable t) { t.printStackTrace(); } } protected void makeBookSchema() throws Exception { // Create field type String body = json("{name: 'b$title', valueType: 'STRING', " + "scope: 'versioned', namespaces: { 'org.lilyproject.resttest': 'b' } }"); ResponseAndContent response = put("/schema/fieldType/b$title?ns.b=org.lilyproject.resttest", body); assertTrue(isSuccess(response)); // Create field type body = json("{name: 'b$summary', valueType: 'STRING', " + "scope: 'versioned', namespaces: { 'org.lilyproject.resttest': 'b' } }"); response = put("/schema/fieldType/b$summary?ns.b=org.lilyproject.resttest", body); assertTrue(isSuccess(response)); // Create a record type body = json("{name: 'b$book', fields: [ {name: 'b$title'}, {name: 'b$summary'} ]," + "namespaces: { 'org.lilyproject.resttest': 'b' } }"); response = put("/schema/recordType/b$book?ns.b=org.lilyproject.resttest", body); assertTrue(isSuccess(response)); } protected boolean isSuccess(ResponseAndContent response) { int code = response.getResponse().getStatusLine().getStatusCode(); return (code >= 200 && code < 210); } protected JsonNode getFieldValue(JsonNode recordJson, String fieldName) { String prefix = recordJson.get("namespaces").get("org.lilyproject.resttest").getTextValue(); JsonNode fieldsNode = recordJson.get("fields"); return fieldsNode.get(prefix + "$" + fieldName); } protected void assertStatus(int expectedStatus, ResponseAndContent response) throws IOException { StackTraceElement[] trace = new Exception().getStackTrace(); if (expectedStatus != response.getResponse().getStatusLine().getStatusCode()) { System.err.println("Detected unexpected response status."); System.err.println("Expected status: " + expectedStatus); System.err.println("Got status: " + response.getResponse().getStatusLine().getStatusCode()); System.err.println("Called from: " + trace[1].toString()); System.err.println("Body of the response is:"); printErrorResponse(response); assertEquals(expectedStatus, response.getResponse().getStatusLine().getStatusCode()); } } protected void printErrorResponse(ResponseAndContent response) throws IOException { if (response.getResponse().getEntity() != null && response.getResponse().getEntity().getContentType() != null && "application/json".equals(response.getResponse().getEntity().getContentType().getValue())) { JsonNode json = JsonFormat.deserializeNonStd(response.getContent()); System.err.println("Error:"); System.err.println(" Description: " + (json.get("description") != null ? json.get("description").getTextValue() : null)); System.err.println(" Status: " + (json.get("status") != null ? json.get("status").getIntValue() : null)); System.err.println(" StackTrace:"); JsonNode stackTrace = json.get("stackTrace"); System.out.println(stackTrace != null ? stackTrace.getValueAsText() : null); } else if (response.getContent() != null) { System.err.println(new String(response.getContent(), "UTF-8")); } else { System.err.println("response has no content)"); } } protected String buildUri(String path) { return BASE_URI + path; } protected ResponseAndContent post(String path, String body) throws Exception { HttpPost post = new HttpPost(buildUri(path)); post.setEntity(new StringEntity(body, "application/json", "UTF-8")); return processResponseAndContent(post); } protected ResponseAndContent postText(String path, String body) throws Exception { HttpPost post = new HttpPost(buildUri(path)); post.setEntity(new StringEntity(body, "text/plain", "UTF-8")); return processResponseAndContent(post); } protected ResponseAndContent put(String path, String body) throws Exception { return putUri(buildUri(path), body); } protected ResponseAndContent putUri(String uri, String body) throws Exception { HttpPut put = new HttpPut(uri); put.setEntity(new StringEntity(body, "application/json", "UTF-8")); return processResponseAndContent(put); } protected ResponseAndContent get(String path) throws Exception { return getUri(buildUri(path)); } protected ResponseAndContent getUri(String uri) throws Exception { return processResponseAndContent(new HttpGet(uri)); } protected ResponseAndContent delete(String path) throws Exception { return deleteUri(buildUri(path)); } protected ResponseAndContent deleteUri(String uri) throws Exception { return processResponseAndContent(new HttpDelete(uri)); } public static JsonNode readJson(ResponseAndContent rac) throws IOException { return JsonFormat.deserializeNonStd(rac.getContent()); } protected String json(String input) { return input.replaceAll("'", "\""); } protected ResponseAndContent processResponseAndContent(HttpUriRequest request) throws Exception { HttpResponse response = null; byte[] data = null; try { response = httpClient.execute(request); if (response.getEntity() != null) { data = IOUtils.toByteArray(response.getEntity().getContent()); } } finally { if (response != null) { EntityUtils.consume(response.getEntity()); } } return new ResponseAndContent(response, data); } }