/** * 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.hadoop.hive.conf; import org.apache.hadoop.mapred.JobConf; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hive.conf.HiveConf.ConfVars; import org.apache.hadoop.util.Shell; import org.apache.hive.common.util.HiveTestUtils; import org.junit.Assert; import org.junit.Test; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.concurrent.TimeUnit; /** * TestHiveConf * * Test cases for HiveConf. Loads configuration files located * in common/src/test/resources. */ public class TestHiveConf { @Test public void testHiveSitePath() throws Exception { String expectedPath = HiveTestUtils.getFileFromClasspath("hive-site.xml"); String hiveSiteLocation = HiveConf.getHiveSiteLocation().getPath(); Assert.assertEquals(expectedPath, hiveSiteLocation); } private void checkHadoopConf(String name, String expectedHadoopVal) throws Exception { Assert.assertEquals(expectedHadoopVal, new JobConf(HiveConf.class).get(name)); } private void checkConfVar(ConfVars var, String expectedConfVarVal) throws Exception { Assert.assertEquals(expectedConfVarVal, var.getDefaultValue()); } private void checkHiveConf(String name, String expectedHiveVal) throws Exception { Assert.assertEquals(expectedHiveVal, new HiveConf().get(name)); } @Test public void testConfProperties() throws Exception { // Make sure null-valued ConfVar properties do not override the Hadoop Configuration // NOTE: Comment out the following test case for now until a better way to test is found, // as this test case cannot be reliably tested. The reason for this is that Hive does // overwrite fs.default.name in HiveConf if the property is set in system properties. // checkHadoopConf(ConfVars.HADOOPFS.varname, "core-site.xml"); // checkConfVar(ConfVars.HADOOPFS, null); // checkHiveConf(ConfVars.HADOOPFS.varname, "core-site.xml"); // Make sure non-null-valued ConfVar properties *do* override the Hadoop Configuration checkHadoopConf(ConfVars.HADOOPNUMREDUCERS.varname, "1"); checkConfVar(ConfVars.HADOOPNUMREDUCERS, "-1"); checkHiveConf(ConfVars.HADOOPNUMREDUCERS.varname, "-1"); // Non-null ConfVar only defined in ConfVars checkHadoopConf(ConfVars.HIVESKEWJOINKEY.varname, null); checkConfVar(ConfVars.HIVESKEWJOINKEY, "100000"); checkHiveConf(ConfVars.HIVESKEWJOINKEY.varname, "100000"); // ConfVar overridden in in hive-site.xml checkHadoopConf(ConfVars.HIVETESTMODEDUMMYSTATAGGR.varname, null); checkConfVar(ConfVars.HIVETESTMODEDUMMYSTATAGGR, ""); checkHiveConf(ConfVars.HIVETESTMODEDUMMYSTATAGGR.varname, "value2"); // Property defined in hive-site.xml only checkHadoopConf("test.property1", null); checkHiveConf("test.property1", "value1"); // Test HiveConf property variable substitution in hive-site.xml checkHiveConf("test.var.hiveconf.property", ConfVars.DEFAULTPARTITIONNAME.getDefaultValue()); } @Test public void testColumnNameMapping() throws Exception { for (int i = 0 ; i < 20 ; i++ ){ Assert.assertTrue(i == HiveConf.getPositionFromInternalName(HiveConf.getColumnInternalName(i))); } } @Test public void testUnitFor() throws Exception { Assert.assertEquals(TimeUnit.SECONDS, HiveConf.unitFor("L", TimeUnit.SECONDS)); Assert.assertEquals(TimeUnit.MICROSECONDS, HiveConf.unitFor("", TimeUnit.MICROSECONDS)); Assert.assertEquals(TimeUnit.DAYS, HiveConf.unitFor("d", null)); Assert.assertEquals(TimeUnit.DAYS, HiveConf.unitFor("days", null)); Assert.assertEquals(TimeUnit.HOURS, HiveConf.unitFor("h", null)); Assert.assertEquals(TimeUnit.HOURS, HiveConf.unitFor("hours", null)); Assert.assertEquals(TimeUnit.MINUTES, HiveConf.unitFor("m", null)); Assert.assertEquals(TimeUnit.MINUTES, HiveConf.unitFor("minutes", null)); Assert.assertEquals(TimeUnit.SECONDS, HiveConf.unitFor("s", null)); Assert.assertEquals(TimeUnit.SECONDS, HiveConf.unitFor("seconds", null)); Assert.assertEquals(TimeUnit.MILLISECONDS, HiveConf.unitFor("ms", null)); Assert.assertEquals(TimeUnit.MILLISECONDS, HiveConf.unitFor("msecs", null)); Assert.assertEquals(TimeUnit.MICROSECONDS, HiveConf.unitFor("us", null)); Assert.assertEquals(TimeUnit.MICROSECONDS, HiveConf.unitFor("useconds", null)); Assert.assertEquals(TimeUnit.NANOSECONDS, HiveConf.unitFor("ns", null)); Assert.assertEquals(TimeUnit.NANOSECONDS, HiveConf.unitFor("nsecs", null)); } @Test public void testHiddenConfig() throws Exception { HiveConf conf = new HiveConf(); // check password configs are hidden Assert.assertTrue(conf.isHiddenConfig(HiveConf.ConfVars.METASTOREPWD.varname)); Assert.assertTrue(conf.isHiddenConfig( HiveConf.ConfVars.HIVE_SERVER2_SSL_KEYSTORE_PASSWORD.varname)); // check change hidden list should fail try { final String name = HiveConf.ConfVars.HIVE_CONF_HIDDEN_LIST.varname; conf.verifyAndSet(name, ""); Assert.fail("Setting config property " + name + " should fail"); } catch (IllegalArgumentException e) { // the verifyAndSet in this case is expected to fail with the IllegalArgumentException } // check stripHiddenConfigurations Configuration conf2 = new Configuration(conf); conf2.set(HiveConf.ConfVars.METASTOREPWD.varname, "password"); conf2.set(HiveConf.ConfVars.HIVE_SERVER2_SSL_KEYSTORE_PASSWORD.varname, "password"); conf.stripHiddenConfigurations(conf2); Assert.assertEquals("", conf2.get(HiveConf.ConfVars.METASTOREPWD.varname)); Assert.assertEquals("", conf2.get(HiveConf.ConfVars.HIVE_SERVER2_SSL_KEYSTORE_PASSWORD.varname)); } @Test public void testSparkConfigUpdate(){ HiveConf conf = new HiveConf(); Assert.assertFalse(conf.getSparkConfigUpdated()); conf.verifyAndSet("spark.master", "yarn"); Assert.assertTrue(conf.getSparkConfigUpdated()); conf.verifyAndSet("hive.execution.engine", "spark"); Assert.assertTrue("Expected spark config updated.", conf.getSparkConfigUpdated()); conf.setSparkConfigUpdated(false); Assert.assertFalse(conf.getSparkConfigUpdated()); } @Test public void testEncodingDecoding() throws UnsupportedEncodingException { HiveConf conf = new HiveConf(); String query = "select blah, '\u0001' from random_table"; conf.setQueryString(query); Assert.assertEquals(URLEncoder.encode(query, "UTF-8"), conf.get(ConfVars.HIVEQUERYSTRING.varname)); Assert.assertEquals(query, conf.getQueryString()); } }