/**
* 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.fail;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
import org.apache.hadoop.hive.metastore.MetaStoreUtils;
import org.apache.hive.service.Service;
import org.apache.hive.service.auth.HiveAuthConstants;
import org.apache.hive.service.auth.HiveAuthConstants.AuthTypes;
import org.apache.hive.service.cli.SessionHandle;
import org.apache.hive.service.server.HiveServer2;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class ThriftCliServiceMessageSizeTest {
protected static int port;
protected static String host = "localhost";
protected static HiveServer2 hiveServer2;
protected static ThriftCLIServiceClient client;
protected static HiveConf hiveConf;
protected static String USERNAME = "anonymous";
protected static String PASSWORD = "anonymous";
/**
* @throws java.lang.Exception
*/
@BeforeClass
public static void setUpBeforeClass() throws Exception {
// Find a free port
port = MetaStoreUtils.findFreePort();
hiveServer2 = new HiveServer2();
hiveConf = new HiveConf();
}
/**
* @throws java.lang.Exception
*/
@AfterClass
public static void tearDownAfterClass() throws Exception {
}
protected static void startHiveServer2WithConf(HiveServer2 hiveServer2, HiveConf hiveConf)
throws Exception {
hiveServer2.init(hiveConf);
// Start HiveServer2 with given config
// Fail if server doesn't start
try {
hiveServer2.start();
} catch (Throwable t) {
t.printStackTrace();
fail();
}
// Wait for startup to complete
Thread.sleep(2000);
System.out.println("HiveServer2 started on port " + port);
}
protected static void stopHiveServer2(HiveServer2 hiveServer2) throws Exception {
if (hiveServer2 != null) {
hiveServer2.stop();
}
}
/**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
}
/**
* @throws java.lang.Exception
*/
@After
public void tearDown() throws Exception {
}
@Test
public void testMessageSize() throws Exception {
String transportMode = "binary";
hiveConf.setBoolVar(ConfVars.HIVE_SERVER2_ENABLE_DOAS, false);
hiveConf.setVar(ConfVars.HIVE_SERVER2_THRIFT_BIND_HOST, host);
hiveConf.setIntVar(ConfVars.HIVE_SERVER2_THRIFT_PORT, port);
hiveConf.setVar(ConfVars.HIVE_SERVER2_AUTHENTICATION, HiveAuthConstants.AuthTypes.NONE.toString());
hiveConf.setVar(ConfVars.HIVE_SERVER2_TRANSPORT_MODE, transportMode);
HiveServer2 hiveServer2 = new HiveServer2();
String url = "jdbc:hive2://localhost:" + port + "/default";
Class.forName("org.apache.hive.jdbc.HiveDriver");
try {
// First start HS2 with high message size limit. This should allow connections
hiveConf.setIntVar(ConfVars.HIVE_SERVER2_THRIFT_MAX_MESSAGE_SIZE, 100*1024*1024);
startHiveServer2WithConf(hiveServer2, hiveConf);
System.out.println("Started Thrift CLI service with message size limit "
+ hiveConf.getIntVar(ConfVars.HIVE_SERVER2_THRIFT_MAX_MESSAGE_SIZE));
// With the high message size limit this connection should work
Connection connection = DriverManager.getConnection(url, "hiveuser", "hive");
Statement stmt = connection.createStatement();
assertNotNull("Statement is null", stmt);
stmt.execute("set hive.support.concurrency = false");
connection.close();
stopHiveServer2(hiveServer2);
// Now start HS2 with low message size limit. This should prevent any connections
hiveConf.setIntVar(ConfVars.HIVE_SERVER2_THRIFT_MAX_MESSAGE_SIZE, 1);
hiveServer2 = new HiveServer2();
startHiveServer2WithConf(hiveServer2, hiveConf);
System.out.println("Started Thrift CLI service with message size limit "
+ hiveConf.getIntVar(ConfVars.HIVE_SERVER2_THRIFT_MAX_MESSAGE_SIZE));
Exception caughtException = null;
try {
// This should fail
connection = DriverManager.getConnection(url, "hiveuser", "hive");
} catch (Exception err) {
caughtException = err;
}
// Verify we hit an error while connecting
assertNotNull(caughtException);
} finally {
stopHiveServer2(hiveServer2);
hiveServer2 = null;
}
}
}