/** * 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 java.io.File; import java.util.ArrayList; import java.util.List; import org.apache.hive.beeline.hs2connection.BeelineHS2ConnectionFileParseException; import org.apache.hive.beeline.hs2connection.UserHS2ConnectionFileParser; import org.apache.hive.beeline.hs2connection.HS2ConnectionFileUtils; import org.apache.hive.common.util.HiveTestUtils; import org.junit.After; import org.junit.Assert; import org.junit.Test; public class TestUserHS2ConnectionFileParser { private final String LOCATION_1 = System.getProperty("java.io.tmpdir") + "loc1" + File.separator + UserHS2ConnectionFileParser.DEFAULT_CONNECTION_CONFIG_FILE_NAME; private final String LOCATION_2 = System.getProperty("java.io.tmpdir") + "loc2" + File.separator + UserHS2ConnectionFileParser.DEFAULT_CONNECTION_CONFIG_FILE_NAME; private final String LOCATION_3 = System.getProperty("java.io.tmpdir") + "loc3" + File.separator + UserHS2ConnectionFileParser.DEFAULT_CONNECTION_CONFIG_FILE_NAME; List<String> testLocations = new ArrayList<>(); @After public void cleanUp() { try { deleteFile(LOCATION_1); deleteFile(LOCATION_2); deleteFile(LOCATION_3); } catch (Exception e) { e.printStackTrace(); } testLocations.clear(); } @Test public void testParseNoAuthentication() throws BeelineHS2ConnectionFileParseException { String url = getParsedUrlFromConfigFile("test-hs2-connection-config-noauth.xml"); String expectedUrl = "jdbc:hive2://localhost:10000/default;user=hive"; Assert.assertTrue("Expected " + expectedUrl + " got " + url, expectedUrl.equals(url)); } @Test public void testParseZookeeper() throws BeelineHS2ConnectionFileParseException { String url = getParsedUrlFromConfigFile("test-hs2-connection-zookeeper-config.xml"); String expectedUrl = "jdbc:hive2://zk-node-1:10000,zk-node-2:10001,zk-node-3:10004/default;serviceDiscoveryMode=zookeeper;zooKeeperNamespace=hiveserver2"; Assert.assertTrue("Expected " + expectedUrl + " got " + url, expectedUrl.equals(url)); } @Test public void testParseWithKerberosNoSSL() throws BeelineHS2ConnectionFileParseException { String url = getParsedUrlFromConfigFile("test-hs2-conn-conf-kerberos-nossl.xml"); String expectedUrl = "jdbc:hive2://localhost:10000/default;principal=hive/dummy-hostname@domain.com;ssl=false"; Assert.assertTrue("Expected " + expectedUrl + " got " + url, expectedUrl.equals(url)); } @Test public void testParseWithKerberosSSL() throws BeelineHS2ConnectionFileParseException { String url = getParsedUrlFromConfigFile("test-hs2-conn-conf-kerberos-ssl.xml"); String expectedUrl = "jdbc:hive2://localhost:10000/default;principal=hive/dummy-hostname@domain.com;ssl=true;" + "sslTrustStore=test/truststore;trustStorePassword=testTruststorePassword"; Assert.assertTrue("Expected " + expectedUrl + " got " + url, expectedUrl.equals(url)); } @Test public void testParseWithSSLAndHttpMode() throws BeelineHS2ConnectionFileParseException { String url = getParsedUrlFromConfigFile("test-hs2-conn-conf-kerberos-http.xml"); String expectedUrl = "jdbc:hive2://localhost:10000/default;httpPath=testHTTPPath;principal=hive/dummy-hostname@domain.com;" + "ssl=true;sslTrustStore=test/truststore;transportMode=http;trustStorePassword=testTruststorePassword"; Assert.assertTrue("Expected " + expectedUrl + " got " + url, expectedUrl.equals(url)); } @Test public void testUrlWithHiveConfValues() throws Exception { String url = getParsedUrlFromConfigFile("test-hs2-connection-conf-list.xml"); String expectedUrl = "jdbc:hive2://localhost:10000/default;user=hive?hive.cli.print.current.db=false#testVarName1=value1"; Assert.assertTrue("Expected " + expectedUrl + " got " + url, expectedUrl.equals(url)); } @Test public void testUrlWithMultipleHiveConfValues() throws Exception { String url = getParsedUrlFromConfigFile("test-hs2-connection-multi-conf-list.xml"); String expectedUrl = "jdbc:hive2://localhost:10000/default;user=hive?hive.cli.print.current.db=true;" + "hive.cli.print.header=true#testVarName1=value1;testVarName2=value2"; Assert.assertTrue("Expected " + expectedUrl + " got " + url, expectedUrl.equals(url)); } /* * Tests if null value returned when file is not present in any of the lookup locations */ @Test public void testNoLocationFoundCase() throws Exception { testLocations.add(LOCATION_1); testLocations.add(LOCATION_2); testLocations.add(LOCATION_3); UserHS2ConnectionFileParser testHS2ConfigManager = new UserHS2ConnectionFileParser(testLocations); Assert.assertTrue(testHS2ConfigManager.getConnectionProperties().isEmpty()); } /* * Tests if LOCATION_1 is returned when file is present in the first directory in lookup order */ @Test public void testGetLocation1() throws Exception { createNewFile(LOCATION_1); testLocations.add(LOCATION_1); testLocations.add(LOCATION_2); testLocations.add(LOCATION_3); UserHS2ConnectionFileParser testHS2ConfigManager = new UserHS2ConnectionFileParser(testLocations); Assert.assertTrue("File location " + LOCATION_1 + " was not returned", LOCATION_1.equals(testHS2ConfigManager.getFileLocation())); } /* * Tests if LOCATION_3 is returned when the first file is found is later in lookup order */ @Test public void testGetLocation3() throws Exception { createNewFile(LOCATION_3); testLocations.add(LOCATION_1); testLocations.add(LOCATION_2); testLocations.add(LOCATION_3); UserHS2ConnectionFileParser testHS2ConfigManager = new UserHS2ConnectionFileParser(testLocations); Assert.assertTrue("File location " + LOCATION_3 + " was not returned", LOCATION_3.equals(testHS2ConfigManager.getFileLocation())); } /* * Tests if it returns the first file present in the lookup order when files are present in the * lookup order */ @Test public void testGetLocationOrder() throws Exception { createNewFile(LOCATION_2); createNewFile(LOCATION_3); testLocations.add(LOCATION_1); testLocations.add(LOCATION_2); testLocations.add(LOCATION_3); UserHS2ConnectionFileParser testHS2ConfigManager = new UserHS2ConnectionFileParser(testLocations); Assert.assertTrue("File location " + LOCATION_2 + " was not returned", LOCATION_2.equals(testHS2ConfigManager.getFileLocation())); } private String getParsedUrlFromConfigFile(String filename) throws BeelineHS2ConnectionFileParseException { String path = HiveTestUtils.getFileFromClasspath(filename); testLocations.add(path); UserHS2ConnectionFileParser testHS2ConfigManager = new UserHS2ConnectionFileParser(testLocations); String url = HS2ConnectionFileUtils.getUrl(testHS2ConfigManager.getConnectionProperties()); return url; } private void createNewFile(final String path) throws Exception { File file = new File(path); if (file.exists()) { return; } String dir = path.substring(0, path.indexOf(UserHS2ConnectionFileParser.DEFAULT_CONNECTION_CONFIG_FILE_NAME)); if (!new File(dir).exists()) { if (!new File(dir).mkdirs()) { throw new Exception("Could not create directory " + dir); } } if (!file.createNewFile()) { throw new Exception("Could not create new file at " + path); } } private void deleteFile(final String path) throws Exception { File file = new File(path); if (file.exists()) { if (!file.delete()) { throw new Exception("Could not delete file at " + path); } } } }