/** * 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.hwi; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.ArrayList; import junit.framework.TestCase; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.hive.ql.history.HiveHistoryViewer; /** * TestHWISessionManager. * */ public class TestHWISessionManager extends TestCase { private static String tableName = "test_hwi_table"; private final HiveConf conf; private final Path dataFilePath; private HWISessionManager hsm; public TestHWISessionManager(String name) { super(name); conf = new HiveConf(TestHWISessionManager.class); String dataFileDir = conf.get("test.data.files").replace('\\', '/') .replace("c:", ""); dataFilePath = new Path(dataFileDir, "kv1.txt"); } @Override protected void setUp() throws Exception { super.setUp(); hsm = new HWISessionManager(); Thread t = new Thread(hsm); t.start(); } @Override protected void tearDown() throws Exception { super.tearDown(); hsm.setGoOn(false); } public final void testHiveDriver() throws Exception { // create a user HWIAuth user1 = new HWIAuth(); user1.setUser("hadoop"); user1.setGroups(new String[] {"hadoop"}); // create two sessions for user HWISessionItem user1_item1 = hsm.createSession(user1, "session1"); HWISessionItem user1_item2 = hsm.createSession(user1, "session2"); // create second user HWIAuth user2 = new HWIAuth(); user2.setUser("user2"); user2.setGroups(new String[] {"user2"}); // create one session for this user HWISessionItem user2_item1 = hsm.createSession(user2, "session1"); // testing storage of sessions in HWISessionManager assertEquals(hsm.findAllSessionsForUser(user1).size(), 2); assertEquals(hsm.findAllSessionsForUser(user2).size(), 1); assertEquals(hsm.findAllSessionItems().size(), 3); user1_item1.addQuery("set hive.support.concurrency = false"); user1_item2.addQuery("set hive.support.concurrency = false"); user2_item1.addQuery("set hive.support.concurrency = false"); HWISessionItem searchItem = hsm.findSessionItemByName(user1, "session1"); assertEquals(searchItem, user1_item1); searchItem.addQuery("create table " + tableName + " (key int, value string)"); searchItem.addQuery("describe " + tableName); searchItem.clientStart(); // wait for the session manager to make the table. It is non blocking API. synchronized (searchItem.runnable) { while (searchItem.getStatus() != HWISessionItem.WebSessionItemStatus.READY) { searchItem.runnable.wait(); } } ArrayList<Integer> zero = new ArrayList<Integer>(); zero.add(0); zero.add(0); zero.add(0); zero.add(0); zero.add(0); ArrayList<Integer> zero3 = new ArrayList<Integer>(); zero3.add(0); zero3.add(0); zero3.add(0); zero3.add(0); ArrayList<Integer> zero1 = new ArrayList<Integer>(); zero1.add(0); assertEquals(zero, searchItem.getQueryRet()); ArrayList<ArrayList<String>> searchBlockRes = searchItem.getResultBucket(); String resLine = searchBlockRes.get(0).get(0); assertEquals(true, resLine.contains("key")); assertEquals(true, resLine.contains("int")); String resLine2 = searchBlockRes.get(0).get(1); assertEquals(true, resLine2.contains("value")); assertEquals(true, resLine2.contains("string")); // load data into table searchItem.clientRenew(); searchItem.addQuery("load data local inpath '" + dataFilePath.toString() + "' into table " + tableName); searchItem.clientStart(); while (searchItem.getStatus() != HWISessionItem.WebSessionItemStatus.READY) { Thread.sleep(1); } assertEquals(zero1, searchItem.getQueryRet()); // start two queries simultaniously user1_item2.addQuery("select distinct(test_hwi_table.key) from " + tableName); user2_item1.addQuery("select distinct(test_hwi_table.key) from " + tableName); // set result files to compare results File tmpdir = new File("/tmp/" + System.getProperty("user.name") + "/"); if (tmpdir.exists() && !tmpdir.isDirectory()) { throw new RuntimeException(tmpdir + " exists but is not a directory"); } if (!tmpdir.exists()) { if (!tmpdir.mkdirs()) { throw new RuntimeException("Could not make scratch directory " + tmpdir); } } File result1 = new File(tmpdir, "user1_item2"); File result2 = new File(tmpdir, "user2_item1"); user1_item2.setResultFile(result1.toString()); user2_item1.setResultFile(result2.toString()); user1_item2.setSSIsSilent(true); user2_item1.setSSIsSilent(true); user1_item2.clientStart(); user2_item1.clientStart(); synchronized (user1_item2.runnable) { while (user1_item2.getStatus() != HWISessionItem.WebSessionItemStatus.READY) { user1_item2.runnable.wait(); } } synchronized (user2_item1.runnable) { while (user2_item1.getStatus() != HWISessionItem.WebSessionItemStatus.READY) { user2_item1.runnable.wait(); } } assertEquals(zero3, user1_item2.getQueryRet()); assertEquals(zero3, user2_item1.getQueryRet()); assertEquals(true, isFileContentEqual(result1, result2)); // clean up the files result1.delete(); result2.delete(); // test a session renew/refresh user2_item1.clientRenew(); user2_item1.addQuery("select distinct(test_hwi_table.key) from " + tableName); user2_item1.clientStart(); synchronized (user2_item1.runnable) { while (user2_item1.getStatus() != HWISessionItem.WebSessionItemStatus.READY) { user2_item1.runnable.wait(); } } // cleanup HWISessionItem cleanup = hsm.createSession(user1, "cleanup"); cleanup.addQuery("set hive.support.concurrency = false"); cleanup.addQuery("drop table " + tableName); cleanup.clientStart(); synchronized (cleanup.runnable) { while (cleanup.getStatus() != HWISessionItem.WebSessionItemStatus.READY) { cleanup.runnable.wait(); } } // test the history is non null object. HiveHistoryViewer hhv = cleanup.getHistoryViewer(); assertNotNull(hhv); assertEquals(zero3, cleanup.getQueryRet()); } public boolean isFileContentEqual(File one, File two) throws Exception { if (one.exists() && two.exists()) { if (one.isFile() && two.isFile()) { if (one.length() == two.length()) { BufferedReader br1 = new BufferedReader(new FileReader(one)); BufferedReader br2 = new BufferedReader(new FileReader(one)); String line1 = null; String line2 = null; while ((line1 = br1.readLine()) != null) { line2 = br2.readLine(); if (!line1.equals(line2)) { br1.close(); br2.close(); return false; } } br1.close(); br2.close(); return true; } } } return false; } }