org.lilyproject.process.test.AbstractRestTest.java Source code

Java tutorial

Introduction

Here is the source code for org.lilyproject.process.test.AbstractRestTest.java

Source

/*
 * 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);
    }

}