org.apache.hive.service.cli.thrift.TestThriftHttpCLIService.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.hive.service.cli.thrift.TestThriftHttpCLIService.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.hive.service.cli.thrift;

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
import org.apache.hive.jdbc.HttpBasicAuthInterceptor;
import org.apache.hive.service.auth.HiveAuthFactory;
import org.apache.hive.service.auth.HiveAuthFactory.AuthTypes;
import org.apache.http.HttpException;
import org.apache.http.HttpRequest;
import org.apache.http.client.CookieStore;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.HttpContext;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.THttpClient;
import org.apache.thrift.transport.TTransport;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

/**
 *
 * TestThriftHttpCLIService.
 * This tests ThriftCLIService started in http mode.
 *
 */

public class TestThriftHttpCLIService extends ThriftCLIServiceTest {

    private static String transportMode = "http";
    private static String thriftHttpPath = "cliservice";

    /**
     *  HttpBasicAuthInterceptorWithLogging
     *  This adds httpRequestHeaders to the BasicAuthInterceptor
     */
    public class HttpBasicAuthInterceptorWithLogging extends HttpBasicAuthInterceptor {

        ArrayList<String> requestHeaders;

        public HttpBasicAuthInterceptorWithLogging(String username, String password, CookieStore cookieStore,
                String cn, boolean isSSL, Map<String, String> additionalHeaders) {
            super(username, password, cookieStore, cn, isSSL, additionalHeaders);
            requestHeaders = new ArrayList<String>();
        }

        @Override
        public void process(HttpRequest httpRequest, HttpContext httpContext) throws HttpException, IOException {
            super.process(httpRequest, httpContext);

            String currHeaders = "";

            for (org.apache.http.Header h : httpRequest.getAllHeaders()) {
                currHeaders += h.getName() + ":" + h.getValue() + " ";
            }
            requestHeaders.add(currHeaders);
        }

        public ArrayList<String> getRequestHeaders() {
            return requestHeaders;
        }
    }

    /**
     * @throws java.lang.Exception
     */
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        // Set up the base class
        ThriftCLIServiceTest.setUpBeforeClass();

        assertNotNull(port);
        assertNotNull(hiveServer2);
        assertNotNull(hiveConf);

        hiveConf.setBoolVar(ConfVars.HIVE_SERVER2_ENABLE_DOAS, false);
        hiveConf.setVar(ConfVars.HIVE_SERVER2_THRIFT_BIND_HOST, host);
        hiveConf.setIntVar(ConfVars.HIVE_SERVER2_THRIFT_HTTP_PORT, port);
        hiveConf.setVar(ConfVars.HIVE_SERVER2_AUTHENTICATION, AuthTypes.NOSASL.toString());
        hiveConf.setVar(ConfVars.HIVE_SERVER2_TRANSPORT_MODE, transportMode);
        hiveConf.setVar(ConfVars.HIVE_SERVER2_THRIFT_HTTP_PATH, thriftHttpPath);

        startHiveServer2WithConf(hiveConf);

        client = getServiceClientInternal();
    }

    /**
     * @throws java.lang.Exception
     */
    @AfterClass
    public static void tearDownAfterClass() throws Exception {
        ThriftCLIServiceTest.tearDownAfterClass();
    }

    /**
     * @throws java.lang.Exception
     */
    @Override
    @Before
    public void setUp() throws Exception {

    }

    /**
     * @throws java.lang.Exception
     */
    @Override
    @After
    public void tearDown() throws Exception {

    }

    @Test
    /**
     * Tests calls from a raw (NOSASL) binary client,
     * to a HiveServer2 running in http mode.
     * This should throw an expected exception due to incompatibility.
     * @throws Exception
     */
    public void testBinaryClientHttpServer() throws Exception {
        TTransport transport = getRawBinaryTransport();
        TCLIService.Client rawBinaryClient = getClient(transport);

        // This will throw an expected exception since client-server modes are incompatible
        testOpenSessionExpectedException(rawBinaryClient);
    }

    /**
     * Configure a wrong service endpoint for the client transport,
     * and test for error.
     * @throws Exception
     */
    @Test
    public void testIncorrectHttpPath() throws Exception {
        thriftHttpPath = "wrongPath";
        TTransport transport = getHttpTransport();
        TCLIService.Client httpClient = getClient(transport);

        // This will throw an expected exception since
        // client is communicating with the wrong http service endpoint
        testOpenSessionExpectedException(httpClient);

        // Reset to correct http path
        thriftHttpPath = "cliservice";
    }

    private void testOpenSessionExpectedException(TCLIService.Client client) {
        boolean caughtEx = false;
        // Create a new open session request object
        TOpenSessionReq openReq = new TOpenSessionReq();
        try {
            client.OpenSession(openReq).getSessionHandle();
        } catch (Exception e) {
            caughtEx = true;
            System.out.println("Exception expected: " + e.toString());
        }
        assertTrue("Exception expected", caughtEx);
    }

    private TCLIService.Client getClient(TTransport transport) throws Exception {
        // Create the corresponding client
        TProtocol protocol = new TBinaryProtocol(transport);
        return new TCLIService.Client(protocol);
    }

    private TTransport getRawBinaryTransport() throws Exception {
        return HiveAuthFactory.getSocketTransport(host, port, 0);
    }

    private static TTransport getHttpTransport() throws Exception {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        String httpUrl = transportMode + "://" + host + ":" + port + "/" + thriftHttpPath + "/";
        httpClient.addRequestInterceptor(new HttpBasicAuthInterceptor(USERNAME, PASSWORD, null, null, false, null));
        return new THttpClient(httpUrl, httpClient);
    }

    /**
     * Test additional http headers passed to request interceptor.
     * @throws Exception
     */
    @Test
    public void testAdditionalHttpHeaders() throws Exception {
        TTransport transport;
        DefaultHttpClient hClient = new DefaultHttpClient();
        String httpUrl = transportMode + "://" + host + ":" + port + "/" + thriftHttpPath + "/";
        Map<String, String> additionalHeaders = new HashMap<String, String>();
        additionalHeaders.put("key1", "value1");
        additionalHeaders.put("key2", "value2");
        HttpBasicAuthInterceptorWithLogging authInt = new HttpBasicAuthInterceptorWithLogging(USERNAME, PASSWORD,
                null, null, false, additionalHeaders);
        hClient.addRequestInterceptor(authInt);
        transport = new THttpClient(httpUrl, hClient);
        TCLIService.Client httpClient = getClient(transport);

        // Create a new open session request object
        TOpenSessionReq openReq = new TOpenSessionReq();
        httpClient.OpenSession(openReq).getSessionHandle();
        ArrayList<String> headers = authInt.getRequestHeaders();

        for (String h : headers) {
            assertTrue(h.contains("key1:value1"));
            assertTrue(h.contains("key2:value2"));
        }
    }
}