org.apache.vxquery.rest.AbstractRestServerTest.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.vxquery.rest.AbstractRestServerTest.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF 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.apache.vxquery.rest;

import java.net.URI;
import java.util.concurrent.TimeUnit;

import javax.ws.rs.HttpMethod;

import org.apache.http.HttpEntity;
import org.apache.http.HttpHeaders;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.utils.HttpClientUtils;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.vxquery.app.VXQueryApplication;
import org.apache.vxquery.app.util.LocalClusterUtil;
import org.apache.vxquery.app.util.RestUtils;
import org.apache.vxquery.rest.request.QueryRequest;
import org.apache.vxquery.rest.request.QueryResultRequest;
import org.apache.vxquery.rest.response.AsyncQueryResponse;
import org.apache.vxquery.rest.response.QueryResponse;
import org.apache.vxquery.rest.response.QueryResultResponse;
import org.apache.vxquery.rest.response.SyncQueryResponse;
import org.apache.vxquery.rest.service.VXQueryConfig;
import org.apache.vxquery.rest.service.VXQueryService;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;

import io.netty.handler.codec.http.HttpResponseStatus;

/**
 * Abstract test class to be used for {@link VXQueryApplication} related tests.
 * These tests are expected to use the REST API for querying and fetching
 * results
 *
 * @author Erandi Ganepola
 */
public class AbstractRestServerTest {

    protected static LocalClusterUtil vxqueryLocalCluster = new LocalClusterUtil();
    protected static String restIpAddress;
    protected static int restPort;
    protected static VXQueryService vxQueryService;

    @BeforeClass
    public static void setUp() throws Exception {
        vxqueryLocalCluster.init(new VXQueryConfig());
        vxQueryService = vxqueryLocalCluster.getVxQueryService();
        restIpAddress = vxqueryLocalCluster.getIpAddress();
        restPort = vxqueryLocalCluster.getRestPort();
    }

    @AfterClass
    public static void tearDown() throws Exception {
        vxqueryLocalCluster.deinit();
    }

    protected static String normalize(String string) {
        if (string == null) {
            return null;
        }

        return string.replace("\r\n", "").replace("\n", "").replace("\r", "");
    }

    protected static void checkMetrics(QueryResponse response, boolean showMetrics) {
        if (showMetrics) {
            Assert.assertTrue(response.getMetrics().getCompileTime() > 0);
            Assert.assertTrue(response.getMetrics().getElapsedTime() > 0);
        } else {
            Assert.assertTrue(response.getMetrics().getCompileTime() == 0);
            Assert.assertTrue(response.getMetrics().getElapsedTime() == 0);
        }
    }

    protected static void checkResults(AsyncQueryResponse response, boolean compileOnly) {
        if (compileOnly) {
            Assert.assertNull(response.getResultUrl());
            Assert.assertEquals(0, response.getResultId());
        } else {
            Assert.assertTrue(response.getResultUrl().startsWith(Constants.RESULT_URL_PREFIX));
            Assert.assertNotEquals(0, response.getResultId());
        }
    }

    protected static void checkResults(SyncQueryResponse response, boolean compileOnly) {
        if (compileOnly) {
            Assert.assertNull(response.getResults());
        } else {
            Assert.assertNotNull(response.getResults());
            Assert.assertFalse(response.getResults().isEmpty());
        }
    }

    /**
     * Submit a {@link QueryRequest} and fetth the resulting
     * {@link AsyncQueryResponse}
     *
     * @param uri
     *            uri of the GET request
     * @param accepts
     *            application/json | application/xml
     * @param method
     *            Http Method to be used to send the request
     * @return Response received for the query request
     * @throws Exception
     */
    protected static <T> T getQuerySuccessResponse(URI uri, String accepts, Class<T> type, String method)
            throws Exception {
        CloseableHttpClient httpClient = HttpClients.custom().setConnectionTimeToLive(20, TimeUnit.SECONDS).build();

        try {
            HttpUriRequest request = getRequest(uri, method);

            if (accepts != null) {
                request.setHeader(HttpHeaders.ACCEPT, accepts);
            }

            try (CloseableHttpResponse httpResponse = httpClient.execute(request)) {
                Assert.assertEquals(HttpResponseStatus.OK.code(), httpResponse.getStatusLine().getStatusCode());
                if (accepts != null) {
                    Assert.assertEquals(accepts, httpResponse.getFirstHeader(HttpHeaders.CONTENT_TYPE).getValue());
                }

                HttpEntity entity = httpResponse.getEntity();
                Assert.assertNotNull(entity);

                String response = RestUtils.readEntity(entity);
                return RestUtils.mapEntity(response, type, accepts);
            }
        } finally {
            HttpClientUtils.closeQuietly(httpClient);
        }
    }

    /**
     * Fetch the {@link QueryResultResponse} from query result endpoint once the
     * corresponding {@link QueryResultRequest} is given.
     *
     * @param resultRequest
     *            {@link QueryResultRequest}
     * @param accepts
     *            expected
     * 
     *            <pre>
     *            Accepts
     *            </pre>
     * 
     *            header in responses
     * @param method
     *            Http Method to be used to send the request
     * @return query result response received
     * @throws Exception
     */
    protected static QueryResultResponse getQueryResultResponse(QueryResultRequest resultRequest, String accepts,
            String method) throws Exception {
        URI uri = RestUtils.buildQueryResultURI(resultRequest, restIpAddress, restPort);
        CloseableHttpClient httpClient = HttpClients.custom().setConnectionTimeToLive(20, TimeUnit.SECONDS).build();
        try {
            HttpUriRequest request = getRequest(uri, method);

            if (accepts != null) {
                request.setHeader(HttpHeaders.ACCEPT, accepts);
            }

            try (CloseableHttpResponse httpResponse = httpClient.execute(request)) {
                if (accepts != null) {
                    Assert.assertEquals(accepts, httpResponse.getFirstHeader(HttpHeaders.CONTENT_TYPE).getValue());
                }
                Assert.assertEquals(httpResponse.getStatusLine().getStatusCode(), HttpResponseStatus.OK.code());

                HttpEntity entity = httpResponse.getEntity();
                Assert.assertNotNull(entity);

                String response = RestUtils.readEntity(entity);
                return RestUtils.mapEntity(response, QueryResultResponse.class, accepts);
            }
        } finally {
            HttpClientUtils.closeQuietly(httpClient);
        }
    }

    /**
     * Creates a POST or GET request accordingly from the given {@link URI}
     *
     * @param uri
     *            URI to which the request us to be sent
     * @param method
     *            Http method- GET or POST
     * @return request
     */
    protected static HttpUriRequest getRequest(URI uri, String method) {
        HttpUriRequest request;
        switch (method) {
        case HttpMethod.POST:
            request = new HttpPost(uri);
            break;
        case HttpMethod.GET:
        default:
            request = new HttpGet(uri);
        }

        return request;
    }
}