Package org.apache.hadoop.hive.hwi

Source Code of org.apache.hadoop.hive.hwi.TestHWISessionManager

/**
* 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;
  }
}
TOP

Related Classes of org.apache.hadoop.hive.hwi.TestHWISessionManager

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.