/**
* 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.ql.processors;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.lang.reflect.Field;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.conf.SystemVariables;
import org.apache.hadoop.hive.ql.session.SessionState;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class TestSetProcessor {
private static final String TEST_SYSTEM_PROPERTY = "testSystemPropertyPassword";
private static final String TEST_SYSTEM_PROPERTY_VALUE = "testSystemPropertyValue";
private static final String TEST_ENV_VAR_PASSWORD_VALUE = "testEnvPasswordValue";
private static final String TEST_ENV_VAR_PASSWORD = "testEnvPassword";
private ByteArrayOutputStream baos;
private static SessionState state;
private SetProcessor processor;
@BeforeClass
public static void before() throws Exception {
Map<String, String> env = new HashMap<>();
env.put(TEST_ENV_VAR_PASSWORD, TEST_ENV_VAR_PASSWORD_VALUE);
setEnv(env);
System.setProperty(TEST_SYSTEM_PROPERTY, TEST_SYSTEM_PROPERTY_VALUE);
HiveConf conf = new HiveConf();
SessionState.start(conf);
state = SessionState.get();
}
@Before
public void setupTest() {
baos = new ByteArrayOutputStream();
state.out = new PrintStream(baos);
processor = new SetProcessor();
}
@Test
public void testHiddenConfig() throws Exception {
runSetProcessor("");
String output = baos.toString();
Assert.assertFalse(output.contains(HiveConf.ConfVars.METASTOREPWD.varname + "="));
Assert.assertFalse(output.contains(HiveConf.ConfVars.HIVE_SERVER2_SSL_KEYSTORE_PASSWORD.varname + "="));
}
@Test
public void testHiddenConfigSetVarName() {
runSetProcessor(HiveConf.ConfVars.METASTOREPWD.varname);
String output = baos.toString();
Assert.assertTrue(output.contains("hidden"));
}
@Test
public void testEnvPasswordMask() throws Exception {
runSetProcessor("");
String output = baos.toString();
Assert.assertFalse(output.contains(TEST_ENV_VAR_PASSWORD + "="));
}
@Test
public void testEnvPasswordMaskIndividual() throws Exception {
runSetProcessor(SystemVariables.ENV_PREFIX + TEST_ENV_VAR_PASSWORD);
String output = baos.toString();
Assert.assertFalse(output.contains(TEST_ENV_VAR_PASSWORD_VALUE));
Assert.assertTrue(output.contains("hidden"));
}
@Test
public void testSystemProperty() throws Exception {
runSetProcessor("");
String output = baos.toString();
Assert.assertFalse(output.contains(TEST_SYSTEM_PROPERTY + "="));
}
@Test
public void testSystemPropertyIndividual() throws Exception {
runSetProcessor(SystemVariables.SYSTEM_PREFIX + TEST_SYSTEM_PROPERTY);
String output = baos.toString();
Assert.assertFalse(output.contains(TEST_SYSTEM_PROPERTY_VALUE));
Assert.assertTrue(output.contains("hidden"));
}
/*
* Simulates the set <command>;
*/
private void runSetProcessor(String command) {
processor.run(command);
state.out.flush();
}
/*
* Dirty hack to set the environment variables using reflection code. This method is for testing
* purposes only and should not be used elsewhere
*/
private final static void setEnv(Map<String, String> newenv) throws Exception {
Class[] classes = Collections.class.getDeclaredClasses();
Map<String, String> env = System.getenv();
for (Class cl : classes) {
if ("java.util.Collections$UnmodifiableMap".equals(cl.getName())) {
Field field = cl.getDeclaredField("m");
field.setAccessible(true);
Object obj = field.get(env);
Map<String, String> map = (Map<String, String>) obj;
map.clear();
map.putAll(newenv);
}
}
}
}