/**
* 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.beeline.hs2connection;
import static org.junit.Assert.assertFalse;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.sql.DriverManager;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
import org.apache.hive.beeline.BeeLine;
import org.apache.hive.jdbc.miniHS2.MiniHS2;
import org.apache.hive.service.cli.CLIServiceClient;
import org.apache.hive.service.cli.HiveSQLException;
import org.apache.hive.service.cli.OperationHandle;
import org.apache.hive.service.cli.RowSet;
import org.apache.hive.service.cli.SessionHandle;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
public abstract class BeelineWithHS2ConnectionFileTestBase {
protected MiniHS2 miniHS2;
protected HiveConf hiveConf = new HiveConf();
protected final String tableName = "testBeelineTable";
protected String dataFileDir = hiveConf.get("test.data.files");
protected static final String LOCALHOST_KEY_STORE_NAME = "keystore.jks";
protected static final String TRUST_STORE_NAME = "truststore.jks";
protected static final String KEY_STORE_TRUST_STORE_PASSWORD = "HiveJdbc";
protected static final String HS2_HTTP_MODE = "http";
protected static final String HS2_HTTP_ENDPOINT = "cliservice";
private final String fileLocation =
System.getProperty("java.io.tmpdir") + "testHs2ConnectionConfig.xml";
protected static final String JAVA_TRUST_STORE_PROP = "javax.net.ssl.trustStore";
protected static final String JAVA_TRUST_STORE_PASS_PROP = "javax.net.ssl.trustStorePassword";
protected Map<String, String> confOverlay = new HashMap<>();
protected class TestBeeLine extends BeeLine {
UserHS2ConnectionFileParser testHs2ConfigFileManager;
ByteArrayOutputStream os;
TestBeeLine(List<String> defaultHS2ConnectionFiles) {
testHs2ConfigFileManager = new UserHS2ConnectionFileParser(defaultHS2ConnectionFiles);
os = new ByteArrayOutputStream();
PrintStream beelineOutputStream = new PrintStream(os);
setOutputStream(beelineOutputStream);
setErrorStream(beelineOutputStream);
}
TestBeeLine() {
testHs2ConfigFileManager = new UserHS2ConnectionFileParser(null);
os = new ByteArrayOutputStream();
PrintStream beelineOutputStream = new PrintStream(os);
setOutputStream(beelineOutputStream);
setErrorStream(beelineOutputStream);
}
public String getOutput() throws UnsupportedEncodingException {
return os.toString("UTF8");
}
@Override
public HS2ConnectionFileParser getUserHS2ConnFileParser() {
return testHs2ConfigFileManager;
}
@Override
public HS2ConnectionFileParser getHiveSiteHS2ConnectionFileParser() {
HiveSiteHS2ConnectionFileParser ret = new HiveSiteHS2ConnectionFileParser();
ret.setHiveConf(miniHS2.getHiveConf());
return ret;
}
}
/*
* Wrapper class to write a HS2ConnectionConfig file
*/
protected class Hs2ConnectionXmlConfigFileWriter {
private final PrintWriter writer;
private final File file;
private final Configuration conf;
protected Hs2ConnectionXmlConfigFileWriter() throws IOException {
file = new File(fileLocation);
conf = new Configuration(false);
try {
if (file.exists()) {
file.delete();
}
file.createNewFile();
writer = new PrintWriter(file.getAbsolutePath(), "UTF-8");
} finally {
file.deleteOnExit();
}
}
protected void writeProperty(String key, String value) {
conf.set(key, value);
}
protected String path() {
return file.getAbsolutePath();
}
protected void close() throws IOException {
try {
conf.writeXml(writer);
} finally {
writer.close();
}
}
}
@BeforeClass
public static void beforeTest() throws Exception {
MiniHS2.cleanupLocalDir();
Class.forName(MiniHS2.getJdbcDriverName());
}
@AfterClass
public static void afterClass() throws IOException {
MiniHS2.cleanupLocalDir();
}
@Before
public void before() throws Exception {
DriverManager.setLoginTimeout(0);
if (!System.getProperty("test.data.files", "").isEmpty()) {
dataFileDir = System.getProperty("test.data.files");
}
dataFileDir = dataFileDir.replace('\\', '/').replace("c:", "");
hiveConf = new HiveConf();
miniHS2 = getNewMiniHS2();
confOverlay = new HashMap<String, String>();
confOverlay.put(ConfVars.HIVE_SUPPORT_CONCURRENCY.varname, "false");
confOverlay.put(ConfVars.HIVE_SERVER2_TRANSPORT_MODE.varname, "binary");
}
protected MiniHS2 getNewMiniHS2() throws Exception {
return new MiniHS2.Builder().withConf(hiveConf).cleanupLocalDirOnStartup(false).build();
}
@After
public void tearDown() throws Exception {
if (miniHS2 != null && miniHS2.isStarted()) {
miniHS2.stop();
}
miniHS2 = null;
System.clearProperty(JAVA_TRUST_STORE_PROP);
System.clearProperty(JAVA_TRUST_STORE_PASS_PROP);
}
protected void createTable() throws HiveSQLException {
CLIServiceClient serviceClient = miniHS2.getServiceClient();
SessionHandle sessHandle = serviceClient.openSession("foo", "bar");
serviceClient.executeStatement(sessHandle, "DROP TABLE IF EXISTS " + tableName, confOverlay);
serviceClient.executeStatement(sessHandle, "CREATE TABLE " + tableName + " (id INT)",
confOverlay);
OperationHandle opHandle =
serviceClient.executeStatement(sessHandle, "SHOW TABLES", confOverlay);
RowSet rowSet = serviceClient.fetchResults(opHandle);
assertFalse(rowSet.numRows() == 0);
}
protected String testBeeLineConnection(String path, String[] beelineArgs,
String expectedOutput) throws IOException {
TestBeeLine beeLine = null;
try {
if(path != null) {
List<String> testLocations = new ArrayList<>();
testLocations.add(path);
beeLine = new TestBeeLine(testLocations);
} else {
beeLine = new TestBeeLine();
}
beeLine.begin(beelineArgs, null);
String output = beeLine.getOutput();
System.out.println(output);
Assert.assertNotNull(output);
Assert.assertTrue("Output " + output + " does not contain " + expectedOutput,
output.toLowerCase().contains(expectedOutput.toLowerCase()));
return output;
} finally {
if (beeLine != null) {
beeLine.close();
}
}
}
}