/** * 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.server; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.StringWriter; import java.net.HttpURLConnection; import java.net.URL; import org.apache.commons.io.IOUtils; import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.hive.conf.HiveConf.ConfVars; import org.apache.hadoop.hive.metastore.MetaStoreUtils; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNotNull; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; /** * TestHS2HttpServer -- executes tests of HiveServer2 HTTP Server */ public class TestHS2HttpServer { private static HiveServer2 hiveServer2 = null; private static HiveConf hiveConf = null; private static String metastorePasswd = "61ecbc41cdae3e6b32712a06c73606fa"; //random md5 private static Integer webUIPort = null; @BeforeClass public static void beforeTests() throws Exception { webUIPort = MetaStoreUtils.findFreePortExcepting( Integer.valueOf(ConfVars.HIVE_SERVER2_WEBUI_PORT.getDefaultValue())); hiveConf = new HiveConf(); hiveConf.set(ConfVars.METASTOREPWD.varname, metastorePasswd); hiveConf.set(ConfVars.HIVE_SERVER2_WEBUI_PORT.varname, webUIPort.toString()); hiveConf .setVar(HiveConf.ConfVars.HIVE_AUTHORIZATION_MANAGER, "org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory"); hiveServer2 = new HiveServer2(); hiveServer2.init(hiveConf); hiveServer2.start(); Thread.sleep(5000); } @Test public void testStackServlet() throws Exception { String baseURL = "http://localhost:" + webUIPort + "/stacks"; URL url = new URL(baseURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); Assert.assertEquals(HttpURLConnection.HTTP_OK, conn.getResponseCode()); BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); boolean contents = false; String line; while ((line = reader.readLine()) != null) { if (line.contains("Process Thread Dump:")) { contents = true; } } Assert.assertTrue(contents); } @Test public void testContextRootUrlRewrite() throws Exception { String datePattern = "[a-zA-Z]{3} [a-zA-Z]{3} [0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}"; String dateMask = "xxxMasked_DateTime_xxx"; String baseURL = "http://localhost:" + webUIPort + "/"; String contextRootContent = getURLResponseAsString(baseURL); String jspUrl = "http://localhost:" + webUIPort + "/hiveserver2.jsp"; String jspContent = getURLResponseAsString(jspUrl); String expected = contextRootContent.replaceAll(datePattern, dateMask); String actual = jspContent.replaceAll(datePattern, dateMask); Assert.assertEquals(expected, actual); } @Test public void testConfStrippedFromWebUI() throws Exception { String pwdValFound = null; String pwdKeyFound = null; CloseableHttpClient httpclient = null; try { httpclient = HttpClients.createDefault(); HttpGet httpGet = new HttpGet("http://localhost:"+webUIPort+"/conf"); CloseableHttpResponse response1 = httpclient.execute(httpGet); try { HttpEntity entity1 = response1.getEntity(); BufferedReader br = new BufferedReader(new InputStreamReader(entity1.getContent())); String line; while ((line = br.readLine())!= null) { if (line.contains(metastorePasswd)){ pwdValFound = line; } if (line.contains(ConfVars.METASTOREPWD.varname)){ pwdKeyFound = line; } } EntityUtils.consume(entity1); } finally { response1.close(); } } finally { if (httpclient != null){ httpclient.close(); } } assertNotNull(pwdKeyFound); assertNull(pwdValFound); } private String getURLResponseAsString(String baseURL) throws IOException { URL url = new URL(baseURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); Assert.assertEquals("Got an HTTP response code other thank OK.", HttpURLConnection.HTTP_OK, conn.getResponseCode()); StringWriter writer = new StringWriter(); IOUtils.copy(conn.getInputStream(), writer, "UTF-8"); return writer.toString(); } @AfterClass public static void afterTests() throws Exception { hiveServer2.stop(); } }