You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ha...@apache.org on 2016/08/13 00:12:30 UTC

[2/3] hive git commit: HIVE-14444 Upgrade qtest execution framework to junit4 - migrate most of them (Zoltan Haindrich via Ashutosh Chauhan)

http://git-wip-us.apache.org/repos/asf/hive/blob/1f7e10c0/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestHBaseNegativeCliDriver.java
----------------------------------------------------------------------
diff --git a/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestHBaseNegativeCliDriver.java b/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestHBaseNegativeCliDriver.java
new file mode 100644
index 0000000..88d626c
--- /dev/null
+++ b/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestHBaseNegativeCliDriver.java
@@ -0,0 +1,62 @@
+/**
+ * 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.cli;
+
+import java.io.File;
+import java.util.List;
+
+import org.apache.hadoop.hive.cli.control.CliAdapter;
+import org.apache.hadoop.hive.cli.control.CliConfigs;
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class TestHBaseNegativeCliDriver {
+
+  static CliAdapter adapter = new CliConfigs.HBaseNegativeCliConfig().getCliAdapter();
+
+  @Parameters(name = "{0}")
+  public static List<Object[]> getParameters() throws Exception {
+    return adapter.getParameters();
+  }
+
+  @ClassRule
+  public static TestRule cliClassRule = adapter.buildClassRule();
+
+  @Rule
+  public TestRule cliTestRule = adapter.buildTestRule();
+
+  private String name;
+  private File qfile;
+
+  public TestHBaseNegativeCliDriver(String name, File qfile) {
+    this.name = name;
+    this.qfile = qfile;
+  }
+
+  @Test
+  public void testCliDriver() throws Exception {
+    adapter.runTest(name, qfile);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/1f7e10c0/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestMiniLlapCliDriver.java
----------------------------------------------------------------------
diff --git a/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestMiniLlapCliDriver.java b/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestMiniLlapCliDriver.java
new file mode 100644
index 0000000..ad525fe
--- /dev/null
+++ b/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestMiniLlapCliDriver.java
@@ -0,0 +1,62 @@
+/**
+ * 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.cli;
+
+import java.io.File;
+import java.util.List;
+
+import org.apache.hadoop.hive.cli.control.CliAdapter;
+import org.apache.hadoop.hive.cli.control.CliConfigs;
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class TestMiniLlapCliDriver {
+
+  static CliAdapter adapter = new CliConfigs.MiniLlapCliConfig().getCliAdapter();
+
+  @Parameters(name = "{0}")
+  public static List<Object[]> getParameters() throws Exception {
+    return adapter.getParameters();
+  }
+
+  @ClassRule
+  public static TestRule cliClassRule = adapter.buildClassRule();
+
+  @Rule
+  public TestRule cliTestRule = adapter.buildTestRule();
+
+  private String name;
+  private File qfile;
+
+  public TestMiniLlapCliDriver(String name, File qfile) {
+    this.name = name;
+    this.qfile = qfile;
+  }
+
+  @Test
+  public void testCliDriver() throws Exception {
+    adapter.runTest(name, qfile);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/1f7e10c0/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestMiniTezCliDriver.java
----------------------------------------------------------------------
diff --git a/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestMiniTezCliDriver.java b/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestMiniTezCliDriver.java
new file mode 100644
index 0000000..c23b0b3
--- /dev/null
+++ b/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestMiniTezCliDriver.java
@@ -0,0 +1,62 @@
+/**
+ * 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.cli;
+
+import java.io.File;
+import java.util.List;
+
+import org.apache.hadoop.hive.cli.control.CliAdapter;
+import org.apache.hadoop.hive.cli.control.CliConfigs;
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class TestMiniTezCliDriver {
+
+  static CliAdapter adapter = new CliConfigs.MiniTezCliConfig().getCliAdapter();
+
+  @Parameters(name = "{0}")
+  public static List<Object[]> getParameters() throws Exception {
+    return adapter.getParameters();
+  }
+
+  @ClassRule
+  public static TestRule cliClassRule = adapter.buildClassRule();
+
+  @Rule
+  public TestRule cliTestRule = adapter.buildTestRule();
+
+  private String name;
+  private File qfile;
+
+  public TestMiniTezCliDriver(String name, File qfile) {
+    this.name = name;
+    this.qfile = qfile;
+  }
+
+  @Test
+  public void testCliDriver() throws Exception {
+    adapter.runTest(name, qfile);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/1f7e10c0/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestMinimrCliDriver.java
----------------------------------------------------------------------
diff --git a/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestMinimrCliDriver.java b/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestMinimrCliDriver.java
new file mode 100644
index 0000000..96a9e8f
--- /dev/null
+++ b/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestMinimrCliDriver.java
@@ -0,0 +1,62 @@
+/**
+ * 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.cli;
+
+import java.io.File;
+import java.util.List;
+
+import org.apache.hadoop.hive.cli.control.CliAdapter;
+import org.apache.hadoop.hive.cli.control.CliConfigs;
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class TestMinimrCliDriver {
+
+  static CliAdapter adapter = new CliConfigs.MinimrCliConfig().getCliAdapter();
+
+  @Parameters(name = "{0}")
+  public static List<Object[]> getParameters() throws Exception {
+    return adapter.getParameters();
+  }
+
+  @ClassRule
+  public static TestRule cliClassRule = adapter.buildClassRule();
+
+  @Rule
+  public TestRule cliTestRule = adapter.buildTestRule();
+
+  private String name;
+  private File qfile;
+
+  public TestMinimrCliDriver(String name, File qfile) {
+    this.name = name;
+    this.qfile = qfile;
+  }
+
+  @Test
+  public void testCliDriver() throws Exception {
+    adapter.runTest(name, qfile);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/1f7e10c0/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestNegativeCliDriver.java
----------------------------------------------------------------------
diff --git a/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestNegativeCliDriver.java b/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestNegativeCliDriver.java
new file mode 100644
index 0000000..1040228
--- /dev/null
+++ b/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestNegativeCliDriver.java
@@ -0,0 +1,62 @@
+/**
+ * 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.cli;
+
+import java.io.File;
+import java.util.List;
+
+import org.apache.hadoop.hive.cli.control.CliAdapter;
+import org.apache.hadoop.hive.cli.control.CliConfigs;
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class TestNegativeCliDriver {
+
+  static CliAdapter adapter = new CliConfigs.NegativeCliConfig().getCliAdapter();
+
+  @Parameters(name = "{0}")
+  public static List<Object[]> getParameters() throws Exception {
+    return adapter.getParameters();
+  }
+
+  @ClassRule
+  public static TestRule cliClassRule = adapter.buildClassRule();
+
+  @Rule
+  public TestRule cliTestRule = adapter.buildTestRule();
+
+  private String name;
+  private File qfile;
+
+  public TestNegativeCliDriver(String name, File qfile) {
+    this.name = name;
+    this.qfile = qfile;
+  }
+
+  @Test
+  public void testCliDriver() throws Exception {
+    adapter.runTest(name, qfile);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/1f7e10c0/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestNegativeMinimrCliDriver.java
----------------------------------------------------------------------
diff --git a/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestNegativeMinimrCliDriver.java b/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestNegativeMinimrCliDriver.java
new file mode 100644
index 0000000..f7e2caa
--- /dev/null
+++ b/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestNegativeMinimrCliDriver.java
@@ -0,0 +1,62 @@
+/**
+ * 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.cli;
+
+import java.io.File;
+import java.util.List;
+
+import org.apache.hadoop.hive.cli.control.CliAdapter;
+import org.apache.hadoop.hive.cli.control.CliConfigs;
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class TestNegativeMinimrCliDriver {
+
+  static CliAdapter adapter = new CliConfigs.NegativeMinimrCli().getCliAdapter();
+
+  @Parameters(name = "{0}")
+  public static List<Object[]> getParameters() throws Exception {
+    return adapter.getParameters();
+  }
+
+  @ClassRule
+  public static TestRule cliClassRule = adapter.buildClassRule();
+
+  @Rule
+  public TestRule cliTestRule = adapter.buildTestRule();
+
+  private String name;
+  private File qfile;
+
+  public TestNegativeMinimrCliDriver(String name, File qfile) {
+    this.name = name;
+    this.qfile = qfile;
+  }
+
+  @Test
+  public void testCliDriver() throws Exception {
+    adapter.runTest(name, qfile);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/1f7e10c0/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestPerfCliDriver.java
----------------------------------------------------------------------
diff --git a/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestPerfCliDriver.java b/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestPerfCliDriver.java
new file mode 100644
index 0000000..4df4eeb
--- /dev/null
+++ b/itests/qtest/src/test/java/org/apache/hadoop/hive/cli/TestPerfCliDriver.java
@@ -0,0 +1,62 @@
+/**
+ * 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.cli;
+
+import java.io.File;
+import java.util.List;
+
+import org.apache.hadoop.hive.cli.control.CliAdapter;
+import org.apache.hadoop.hive.cli.control.CliConfigs;
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class TestPerfCliDriver {
+
+  static CliAdapter adapter = new CliConfigs.PerfCliConfig().getCliAdapter();
+
+  @Parameters(name = "{0}")
+  public static List<Object[]> getParameters() throws Exception {
+    return adapter.getParameters();
+  }
+
+  @ClassRule
+  public static TestRule cliClassRule = adapter.buildClassRule();
+
+  @Rule
+  public TestRule cliTestRule = adapter.buildTestRule();
+
+  private String name;
+  private File qfile;
+
+  public TestPerfCliDriver(String name, File qfile) {
+    this.name = name;
+    this.qfile = qfile;
+  }
+
+  @Test
+  public void testCliDriver() throws Exception {
+    adapter.runTest(name, qfile);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/1f7e10c0/itests/qtest/src/test/java/org/apache/hadoop/hive/ql/parse/TestParseNegativeDriver.java
----------------------------------------------------------------------
diff --git a/itests/qtest/src/test/java/org/apache/hadoop/hive/ql/parse/TestParseNegativeDriver.java b/itests/qtest/src/test/java/org/apache/hadoop/hive/ql/parse/TestParseNegativeDriver.java
new file mode 100644
index 0000000..4c1224f
--- /dev/null
+++ b/itests/qtest/src/test/java/org/apache/hadoop/hive/ql/parse/TestParseNegativeDriver.java
@@ -0,0 +1,62 @@
+/**
+ * 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.parse;
+
+import java.io.File;
+import java.util.List;
+
+import org.apache.hadoop.hive.cli.control.CliAdapter;
+import org.apache.hadoop.hive.cli.control.CliConfigs;
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class TestParseNegativeDriver {
+
+  static CliAdapter adapter = new CliConfigs.ParseNegativeConfig().getCliAdapter();
+
+  @Parameters(name = "{0}")
+  public static List<Object[]> getParameters() throws Exception {
+    return adapter.getParameters();
+  }
+
+  @ClassRule
+  public static TestRule cliClassRule = adapter.buildClassRule();
+
+  @Rule
+  public TestRule cliTestRule = adapter.buildTestRule();
+
+  private String name;
+  private File qfile;
+
+  public TestParseNegativeDriver(String name, File qfile) {
+    this.name = name;
+    this.qfile = qfile;
+  }
+
+  @Test
+  public void testCliDriver() throws Exception {
+    adapter.runTest(name, qfile);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/1f7e10c0/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/AbstractCliConfig.java
----------------------------------------------------------------------
diff --git a/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/AbstractCliConfig.java b/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/AbstractCliConfig.java
new file mode 100644
index 0000000..efbd465
--- /dev/null
+++ b/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/AbstractCliConfig.java
@@ -0,0 +1,417 @@
+/**
+ * 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.cli.control;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Constructor;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Properties;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.hadoop.hive.ql.QTestUtil;
+import org.apache.hadoop.hive.ql.QTestUtil.MiniClusterType;
+import com.google.common.base.Splitter;
+import com.google.common.collect.Sets;
+
+public abstract class AbstractCliConfig {
+
+  public static final String HIVE_ROOT = getHiveRoot();
+
+  public static enum MetastoreType {
+    sql, hbase
+  };
+
+  private MetastoreType metastoreType = MetastoreType.sql;
+  private String queryFile;
+  private String queryFileRegex;
+  private String queryDirectory;
+  // pending change to boolean
+  private String runDisabled;
+  // FIXME: file paths in strings should be changed to either File or Path ... anything but String
+  private String resultsDirectory;
+  private Set<String> excludedQueryFileNames = new LinkedHashSet<>();
+  private String hadoopVersion;
+  private String logDirectory;
+  // these should have viable defaults
+  private String cleanupScript;
+  private String initScript;
+  private String hiveConfDir;
+  private MiniClusterType clusterType;
+
+  // FIXME: null value is treated differently on the other end..when those filter will be
+  // moved...this may change
+  private Set<String> includeQueryFileNames;
+  private Class<? extends CliAdapter> cliAdapter;
+
+  public AbstractCliConfig(Class<? extends CliAdapter> adapter) {
+    cliAdapter=adapter;
+    clusterType = MiniClusterType.none;
+    queryFile = getSysPropValue("qfile");
+    queryFileRegex = getSysPropValue("qfile_regex");
+    runDisabled = getSysPropValue("run_disabled");
+  }
+
+  private static String getHiveRoot() {
+    List<String> candidateSiblings = new ArrayList<>();
+    if (System.getProperty("hive.root") != null) {
+      try {
+        candidateSiblings.add(new File(System.getProperty("hive.root")).getCanonicalPath());
+      } catch (IOException e) {
+        throw new RuntimeException("error getting hive.root",e);
+      }
+    }
+    candidateSiblings.add(new File(".").getAbsolutePath());
+
+    for (String string : candidateSiblings) {
+      File curr = new File(string);
+      do {
+        Set<String> lls = Sets.newHashSet(curr.list());
+        if (lls.contains("itests") && lls.contains("ql") && lls.contains("metastore")) {
+          System.out.println("detected hiveRoot: " + curr);
+          return QTestUtil.ensurePathEndsInSlash(curr.getAbsolutePath());
+        }
+        curr = curr.getParentFile();
+      } while (curr != null);
+    }
+    throw new RuntimeException("unable to find hiveRoot");
+  }
+
+  protected void setQueryDir(String dir) {
+    queryDirectory = getAbsolutePath(dir);
+  }
+
+  @Deprecated
+  public void overrideUserQueryFile(String q) {
+    queryFile = q;
+  }
+
+  public void includesFrom(URL resource, String key) {
+    try (InputStream is = resource.openStream()) {
+      Properties props = new Properties();
+      props.load(is);
+      String fileNames = getSysPropValue(key);
+      if (fileNames == null) {
+        fileNames = props.getProperty(key);
+      }
+      if (fileNames != null) {
+        for (String qFile : TEST_SPLITTER.split(fileNames)) {
+          includeQuery(qFile);
+        }
+      }
+    } catch (IOException e) {
+      throw new RuntimeException("error processing:" + resource, e);
+    }
+  }
+
+  protected void includeQuery(String qFile) {
+    if (includeQueryFileNames == null) {
+      includeQueryFileNames = new HashSet<>();
+    }
+    includeQueryFileNames.add(qFile);
+  }
+
+  public void excludesFrom(URL resource, String key) {
+    try (InputStream is = resource.openStream()) {
+      Properties props = new Properties();
+      props.load(is);
+
+      String fileNames = getSysPropValue(key);
+      if (fileNames == null) {
+        fileNames = props.getProperty(key);
+      }
+      if (fileNames != null) {
+        for (String qFile : TEST_SPLITTER.split(fileNames)) {
+          excludeQuery(qFile);
+        }
+      }
+    } catch (IOException e) {
+      throw new RuntimeException("error processing:" + resource, e);
+    }
+  }
+
+  protected void excludeQuery(String qFile) {
+    excludedQueryFileNames.add(qFile);
+  }
+
+
+  private static final Splitter TEST_SPLITTER =
+      Splitter.onPattern("[, ]").trimResults().omitEmptyStrings();
+
+  public static class IncludeFilter implements FileFilter {
+
+    Set<String> includeOnly;
+
+    public IncludeFilter(Set<String> includeOnly) {
+      this.includeOnly = includeOnly;
+    }
+
+    @Override
+    public boolean accept(File fpath) {
+      return includeOnly == null || includeOnly.contains(fpath.getName());
+    }
+  }
+
+  public static class QFileFilter extends IncludeFilter {
+
+    public QFileFilter(Set<String> includeOnly) {
+      super(includeOnly);
+    }
+
+    @Override
+    public boolean accept(File fpath) {
+      if (!super.accept(fpath)) {
+        return false;
+      }
+      if (fpath.isDirectory() || !fpath.getName().endsWith(".q")) {
+        return false;
+      }
+      return true;
+    }
+  }
+
+  public static class DisabledQFileFilter extends IncludeFilter {
+    public DisabledQFileFilter(Set<String> includeOnly) {
+      super(includeOnly);
+    }
+
+    @Override
+    public boolean accept(File fpath) {
+      if (!super.accept(fpath)) {
+        return false;
+      }
+      return !fpath.isDirectory() && fpath.getName().endsWith(".q.disabled");
+    }
+  }
+
+  public static class QFileRegexFilter implements FileFilter {
+    Pattern filterPattern;
+
+    public QFileRegexFilter(String filter) {
+      filterPattern = Pattern.compile(filter);
+    }
+
+    @Override
+    public boolean accept(File filePath) {
+      if (filePath.isDirectory() || !filePath.getName().endsWith(".q")) {
+        return false;
+      }
+      String testName = StringUtils.chomp(filePath.getName(), ".q");
+      return filterPattern.matcher(testName).matches();
+    }
+  }
+
+  public Set<File> getQueryFiles() throws Exception {
+    prepareDirs();
+
+    Set<String> includeOnly = includeQueryFileNames;
+
+    // queryDirectory should not be null
+    File queryDir = new File(queryDirectory);
+
+    // dedup file list
+    Set<File> testFiles = new LinkedHashSet<>();
+    if (queryFile != null && !queryFile.equals("")) {
+      // The user may have passed a list of files - comma separated
+      for (String qFile : TEST_SPLITTER.split(queryFile)) {
+        if (null != queryDir) {
+          testFiles.add(new File(queryDir, qFile));
+        } else {
+          testFiles.add(new File(qFile));
+        }
+      }
+    } else if (queryFileRegex != null && !queryFileRegex.equals("")) {
+      for (String regex : TEST_SPLITTER.split(queryFileRegex)) {
+        testFiles.addAll(Arrays.asList(queryDir.listFiles(new QFileRegexFilter(regex))));
+      }
+    } else if (runDisabled != null && runDisabled.equals("true")) {
+      testFiles.addAll(Arrays.asList(queryDir.listFiles(new DisabledQFileFilter(includeOnly))));
+    } else {
+      testFiles.addAll(Arrays.asList(queryDir.listFiles(new QFileFilter(includeOnly))));
+    }
+
+    for (String qFileName : excludedQueryFileNames) {
+      testFiles.remove(new File(queryDir, qFileName));
+    }
+
+    return testFiles;
+  }
+
+  private void prepareDirs() throws Exception {
+    File hiveRootDir = new File(HIVE_ROOT);
+    if (!hiveRootDir.exists()) {
+      throw new RuntimeException(
+          "Hive Root Directory " + hiveRootDir.getCanonicalPath() + " does not exist");
+    }
+
+    File logDir = new File(logDirectory);
+    if (!logDir.exists()) {
+      FileUtils.forceMkdir(logDir);
+    }
+
+    File resultsDir = new File(resultsDirectory);
+    if (!resultsDir.exists()) {
+      FileUtils.forceMkdir(resultsDir);
+    }
+  }
+
+  public String getHadoopVersion() {
+    if (hadoopVersion == null) {
+      System.out.println("detecting hadoop.version from loaded libs");
+      try {
+        String hadoopPropsLoc = "/META-INF/maven/org.apache.hadoop/hadoop-hdfs/pom.properties";
+        URL hadoopPropsURL = getClass().getResource(hadoopPropsLoc);
+        if (hadoopPropsURL == null) {
+          throw new RuntimeException("failed to get hadoop properties: " + hadoopPropsLoc);
+        }
+        try (InputStream is = hadoopPropsURL.openStream()) {
+          Properties props = new Properties();
+          props.load(is);
+          hadoopVersion = props.getProperty("version");
+          if (hadoopVersion == null) {
+            throw new RuntimeException("version property not found");
+          }
+        } catch (IOException e) {
+          throw new RuntimeException("unable to extract hadoop.version from: " + hadoopPropsURL, e);
+        }
+      } catch (Exception e) {
+        throw new RuntimeException(
+            "can't get hadoop.version ; specify manually using hadoop.version property!");
+      }
+    }
+    return hadoopVersion;
+  }
+
+  protected void setHadoopVersion(String hadoopVersion) {
+    this.hadoopVersion = hadoopVersion;
+  }
+
+  public String getLogDir() {
+    return logDirectory;
+  }
+
+  protected void setLogDir(String logDirectory) {
+    this.logDirectory = getAbsolutePath(logDirectory);
+  }
+
+  public String getResultsDir() {
+    return resultsDirectory;
+  }
+
+  protected void setResultsDir(String resultsDir) {
+    resultsDirectory = getAbsolutePath(resultsDir);
+  }
+
+  public String getCleanupScript() {
+    return cleanupScript;
+  }
+
+  protected void setCleanupScript(String cleanupScript) {
+    this.cleanupScript = cleanupScript;
+  }
+
+  public String getInitScript() {
+    return initScript;
+  }
+
+  protected void setInitScript(String initScript) {
+    String initScriptPropValue = getSysPropValue("initScript");
+    if (initScriptPropValue != null) {
+      System.out.println("initScript override(by system property):" + initScriptPropValue);
+      this.initScript = initScriptPropValue;
+    } else {
+      this.initScript = initScript;
+    }
+  }
+
+  public String getHiveConfDir() {
+    return hiveConfDir;
+  }
+
+  protected void setHiveConfDir(String hiveConfDir) {
+    if (hiveConfDir.trim().isEmpty()) {
+      this.hiveConfDir = hiveConfDir;
+    } else {
+      this.hiveConfDir = getAbsolutePath(hiveConfDir);
+    }
+  }
+
+  public MiniClusterType getClusterType() {
+    return clusterType;
+  }
+
+  protected void setClusterType(MiniClusterType type) {
+    String modeStr = getSysPropValue("clustermode");
+    if (modeStr != null) {
+      // FIXME: this should be changeto valueOf ...
+      // that will also kill that fallback 'none' which is I think more like a problem than a
+      // feature ;)
+      clusterType = MiniClusterType.valueForString(modeStr);
+    } else {
+      clusterType = type;
+    }
+    if (clusterType == null) {
+      throw new RuntimeException("clustertype cant be null");
+    }
+  }
+
+  private String getSysPropValue(String propName) {
+    String propValue = System.getProperty(propName);
+    if (propValue == null || propValue.trim().length() == 0) {
+      return null;
+    }
+    System.out.println("property: " + propName + " used as override with val: " + propValue);
+    return propValue.trim();
+  }
+
+  public CliAdapter getCliAdapter() {
+    try {
+      Constructor<? extends CliAdapter> cz = cliAdapter.getConstructor(AbstractCliConfig.class);
+      return cz.newInstance(this);
+    } catch (Exception e) {
+      throw new RuntimeException("unable to build adapter", e);
+    }
+  }
+
+  protected void setMetastoreType(MetastoreType mt) {
+    metastoreType=mt;
+  }
+
+  public MetastoreType getMetastoreType() {
+    return metastoreType;
+  }
+
+  public String getQueryDirectory() {
+    return queryDirectory;
+  }
+
+  private String getAbsolutePath(String dir) {
+    return new File(new File(HIVE_ROOT), dir).getAbsolutePath();
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/1f7e10c0/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CliAdapter.java
----------------------------------------------------------------------
diff --git a/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CliAdapter.java b/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CliAdapter.java
new file mode 100644
index 0000000..b89d6e7
--- /dev/null
+++ b/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CliAdapter.java
@@ -0,0 +1,107 @@
+/**
+ * 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.cli.control;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
+
+/**
+ * This class adapts old vm test-executors to be executed in multiple instances
+ */
+public abstract class CliAdapter {
+
+  protected final AbstractCliConfig cliConfig;
+
+  public CliAdapter(AbstractCliConfig cliConfig) {
+    this.cliConfig = cliConfig;
+  }
+
+  public final List<Object[]> getParameters() throws Exception {
+    Set<File> f = cliConfig.getQueryFiles();
+    List<Object[]> ret = new ArrayList<>();
+
+    for (File file : f) {
+      String label = file.getName().replaceAll("\\.[^\\.]+$", "");
+      ret.add(new Object[] { label, file });
+    }
+    return ret;
+  }
+
+  abstract public void beforeClass() throws Exception;
+
+  // HIVE-14444 pending rename: before
+  abstract public void setUp();
+
+  // HIVE-14444 pending rename: after
+  abstract public void tearDown();
+
+  // HIVE-14444 pending rename: afterClass
+  abstract public void shutdown() throws Exception;
+
+  abstract public void runTest(String name, String name2, String absolutePath) throws Exception;
+
+  public final TestRule buildClassRule() {
+    return new TestRule() {
+      @Override
+      public Statement apply(final Statement base, Description description) {
+        return new Statement() {
+          @Override
+          public void evaluate() throws Throwable {
+            CliAdapter.this.beforeClass();
+            try {
+              base.evaluate();
+            } finally {
+              CliAdapter.this.shutdown();
+            }
+          }
+        };
+      }
+    };
+  }
+
+  public final TestRule buildTestRule() {
+    return new TestRule() {
+      @Override
+      public Statement apply(final Statement base, Description description) {
+        return new Statement() {
+          @Override
+          public void evaluate() throws Throwable {
+            CliAdapter.this.setUp();
+            try {
+              base.evaluate();
+            } finally {
+              CliAdapter.this.tearDown();
+            }
+          }
+        };
+      }
+    };
+  }
+
+  // HIVE-14444: pending refactor to push File forward
+  public final void runTest(String name, File qfile) throws Exception {
+    runTest(name, qfile.getName(), qfile.getAbsolutePath());
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/1f7e10c0/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CliConfigs.java
----------------------------------------------------------------------
diff --git a/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CliConfigs.java b/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CliConfigs.java
new file mode 100644
index 0000000..e7af372
--- /dev/null
+++ b/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CliConfigs.java
@@ -0,0 +1,503 @@
+/**
+ * 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.cli.control;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.apache.hadoop.hive.ql.QTestUtil.MiniClusterType;
+import org.apache.hadoop.hive.ql.parse.CoreParseNegative;
+
+public class CliConfigs {
+
+  private static URL testConfigProps = getTestPropsURL();
+
+  private static URL getTestPropsURL() {
+    try {
+      return new File(
+          AbstractCliConfig.HIVE_ROOT + "/itests/src/test/resources/testconfiguration.properties")
+              .toURI().toURL();
+    } catch (MalformedURLException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  public static class CliConfig extends AbstractCliConfig {
+
+    public CliConfig() {
+      super(CoreCliDriver.class);
+      try {
+        setQueryDir("ql/src/test/queries/clientpositive");
+
+        excludesFrom(testConfigProps, "minillap.query.files");
+        excludesFrom(testConfigProps, "minimr.query.files");
+        excludesFrom(testConfigProps, "minitez.query.files");
+        excludesFrom(testConfigProps, "encrypted.query.files");
+        excludesFrom(testConfigProps, "spark.only.query.files");
+        excludesFrom(testConfigProps, "disabled.query.files");
+
+        setResultsDir("ql/src/test/results/clientpositive");
+        setLogDir("itests/qtest/target/qfile-results/clientpositive");
+
+        setInitScript("q_test_init.sql");
+        setCleanupScript("q_test_cleanup.sql");
+
+        setHiveConfDir("");
+        setClusterType(MiniClusterType.none);
+      } catch (Exception e) {
+        throw new RuntimeException("can't construct cliconfig", e);
+      }
+    }
+  }
+
+  public static class ParseNegativeConfig extends AbstractCliConfig {
+    public ParseNegativeConfig() {
+      super(CoreParseNegative.class);
+      try {
+        setQueryDir("ql/src/test/queries/negative");
+
+        setResultsDir("ql/src/test/results/compiler/errors");
+        setLogDir("itests/qtest/target/qfile-results/negative");
+
+        setInitScript("q_test_init.sql");
+        setCleanupScript("q_test_cleanup.sql");
+
+        setHiveConfDir("data/conf/perf-reg/");
+        setClusterType(MiniClusterType.none);
+      } catch (Exception e) {
+        throw new RuntimeException("can't construct cliconfig", e);
+      }
+    }
+  }
+
+  public static class MinimrCliConfig extends AbstractCliConfig {
+    public MinimrCliConfig() {
+      super(CoreCliDriver.class);
+      try {
+        setQueryDir("ql/src/test/queries/clientpositive");
+
+        includesFrom(testConfigProps, "minimr.query.files");
+
+        setResultsDir("ql/src/test/results/clientpositive");
+        setLogDir("itests/qtest/target/qfile-results/clientpositive");
+
+        setInitScript("q_test_init.sql");
+        setCleanupScript("q_test_cleanup.sql");
+
+        setHiveConfDir("");
+        setClusterType(MiniClusterType.mr);
+      } catch (Exception e) {
+        throw new RuntimeException("can't construct cliconfig", e);
+      }
+    }
+  }
+
+  public static class MiniTezCliConfig extends AbstractCliConfig {
+    public MiniTezCliConfig() {
+      super(CoreCliDriver.class);
+      try {
+        setQueryDir("ql/src/test/queries/clientpositive");
+
+        includesFrom(testConfigProps, "minitez.query.files");
+        includesFrom(testConfigProps, "minitez.query.files.shared");
+
+        setResultsDir("ql/src/test/results/clientpositive/tez");
+        setLogDir("itests/qtest/target/qfile-results/clientpositive");
+
+        setInitScript("q_test_init.sql");
+        setCleanupScript("q_test_cleanup.sql");
+
+        setHiveConfDir("data/conf/tez");
+        setClusterType(MiniClusterType.tez);
+        setMetastoreType(MetastoreType.hbase);
+      } catch (Exception e) {
+        throw new RuntimeException("can't construct cliconfig", e);
+      }
+    }
+  }
+
+  public static class MiniLlapCliConfig extends AbstractCliConfig {
+    public MiniLlapCliConfig() {
+      super(CoreCliDriver.class);
+      try {
+        setQueryDir("ql/src/test/queries/clientpositive");
+
+        includesFrom(testConfigProps, "minillap.query.files");
+        includesFrom(testConfigProps, "minillap.shared.query.files");
+
+        setResultsDir("ql/src/test/results/clientpositive/llap");
+        setLogDir("itests/qtest/target/qfile-results/clientpositive");
+
+        setInitScript("q_test_init.sql");
+        setCleanupScript("q_test_cleanup.sql");
+
+        setHiveConfDir("data/conf/llap");
+        setClusterType(MiniClusterType.llap);
+      } catch (Exception e) {
+        throw new RuntimeException("can't construct cliconfig", e);
+      }
+    }
+  }
+
+  public static class EncryptedHDFSCliConfig extends AbstractCliConfig {
+    public EncryptedHDFSCliConfig() {
+      super(CoreCliDriver.class);
+      try {
+        setQueryDir("ql/src/test/queries/clientpositive");
+
+        includesFrom(testConfigProps, "encrypted.query.files");
+
+        setResultsDir("ql/src/test/results/clientpositive/encrypted");
+        setLogDir("itests/qtest/target/qfile-results/clientpositive");
+
+        setInitScript("q_test_init_for_encryption.sql");
+        setCleanupScript("q_test_cleanup_for_encryption.sql");
+
+        setHiveConfDir("data/conf");
+        setClusterType(MiniClusterType.encrypted);
+      } catch (Exception e) {
+        throw new RuntimeException("can't construct cliconfig", e);
+      }
+    }
+  }
+
+  public static class ContribCliConfig extends AbstractCliConfig {
+    public ContribCliConfig() {
+      super(CoreCliDriver.class);
+      try {
+        setQueryDir("contrib/src/test/queries/clientpositive");
+
+        setResultsDir("contrib/src/test/results/clientpositive");
+        setLogDir("itests/qtest/target/qfile-results/contribclientpositive");
+
+        setInitScript("q_test_init.sql");
+        setCleanupScript("q_test_cleanup.sql");
+
+        setHiveConfDir("");
+      } catch (Exception e) {
+        throw new RuntimeException("can't construct cliconfig", e);
+      }
+    }
+  }
+
+  public static class PerfCliConfig extends AbstractCliConfig {
+    public PerfCliConfig() {
+      super(CorePerfCliDriver.class);
+      try {
+        setQueryDir("ql/src/test/queries/clientpositive/perf");
+
+        excludesFrom(testConfigProps, "minimr.query.files");
+        excludesFrom(testConfigProps, "minitez.query.files");
+        excludesFrom(testConfigProps, "encrypted.query.files");
+
+        setResultsDir("ql/src/test/results/clientpositive/perf/");
+        setLogDir("itests/qtest/target/qfile-results/clientpositive/");
+
+        setInitScript("q_perf_test_init.sql");
+        setCleanupScript("q_perf_test_cleanup.sql");
+
+        setHiveConfDir("data/conf/perf-reg/");
+        setClusterType(MiniClusterType.tez);
+      } catch (Exception e) {
+        throw new RuntimeException("can't construct cliconfig", e);
+      }
+    }
+  }
+
+  public static class CompareCliConfig extends AbstractCliConfig {
+    public CompareCliConfig() {
+      super(CoreCompareCliDriver.class);
+      try {
+        setQueryDir("ql/src/test/queries/clientcompare");
+
+        setResultsDir("ql/src/test/results/clientcompare");
+        setLogDir("itests/qtest/target/qfile-results/clientcompare");
+
+        setInitScript("q_test_init.sql");
+        setCleanupScript("q_test_cleanup.sql");
+
+        setHiveConfDir("");
+        setClusterType(MiniClusterType.none);
+      } catch (Exception e) {
+        throw new RuntimeException("can't construct cliconfig", e);
+      }
+    }
+  }
+
+  public static class NegativeCliConfig extends AbstractCliConfig {
+    public NegativeCliConfig() {
+      super(CoreNegativeCliDriver.class);
+      try {
+        setQueryDir("ql/src/test/queries/clientnegative");
+
+        excludesFrom(testConfigProps, "minimr.query.negative.files");
+        excludeQuery("authorization_uri_import.q");
+
+        setResultsDir("ql/src/test/results/clientnegative");
+        setLogDir("itests/qtest/target/qfile-results/clientnegative");
+
+        setInitScript("q_test_init.sql");
+        setCleanupScript("q_test_cleanup.sql");
+
+        setHiveConfDir("");
+        setClusterType(MiniClusterType.none);
+      } catch (Exception e) {
+        throw new RuntimeException("can't construct cliconfig", e);
+      }
+    }
+  }
+
+  public static class NegativeMinimrCli extends AbstractCliConfig {
+    public NegativeMinimrCli() {
+      super(CoreNegativeCliDriver.class);
+      try {
+        setQueryDir("ql/src/test/queries/clientnegative");
+
+        includesFrom(testConfigProps, "minimr.query.negative.files");
+
+        setResultsDir("ql/src/test/results/clientnegative");
+        setLogDir("itests/qtest/target/qfile-results/clientnegative");
+
+        setInitScript("q_test_init.sql");
+        setCleanupScript("q_test_cleanup.sql");
+
+        setHiveConfDir("");
+        setClusterType(MiniClusterType.mr);
+      } catch (Exception e) {
+        throw new RuntimeException("can't construct cliconfig", e);
+      }
+    }
+  }
+
+  public static class HBaseCliConfig extends AbstractCliConfig {
+    public HBaseCliConfig() {
+      super(CoreHBaseCliDriver.class);
+      try {
+        setQueryDir("hbase-handler/src/test/queries/positive");
+
+        setResultsDir("hbase-handler/src/test/results/positive");
+        setLogDir("itests/qtest/target/qfile-results/hbase-handler/positive");
+
+        setInitScript("q_test_init.sql");
+        setCleanupScript("q_test_cleanup.sql");
+
+        setHiveConfDir("");
+        setClusterType(MiniClusterType.none);
+      } catch (Exception e) {
+        throw new RuntimeException("can't construct cliconfig", e);
+      }
+    }
+  }
+
+  public static class HBaseMinimrCliConfig extends AbstractCliConfig {
+    public HBaseMinimrCliConfig() {
+      super(CoreHBaseCliDriver.class);
+      try {
+        setQueryDir("hbase-handler/src/test/queries/positive");
+        // XXX: i think this was non intentionally set to run only hbase_bulk.m???
+        // includeQuery("hbase_bulk.m"); => will be filter out because not ends with .q
+        // to keep existing behaviour i added this method
+        overrideUserQueryFile("hbase_bulk.m");
+
+        setResultsDir("hbase-handler/src/test/results/positive");
+        setLogDir("itests/qtest/target/qfile-results/hbase-handler/minimrpositive");
+        setInitScript("q_test_init.sql");
+        setCleanupScript("q_test_cleanup.sql");
+        setHiveConfDir("");
+        setClusterType(MiniClusterType.mr);
+      } catch (Exception e) {
+        throw new RuntimeException("can't construct cliconfig", e);
+      }
+    }
+  }
+
+  public static class DummyConfig extends AbstractCliConfig {
+    public DummyConfig() {
+      super(CoreDummy.class);
+      try {
+        setQueryDir("ql/src/test/queries/clientcompare");
+
+        setResultsDir("ql/src/test/results/clientcompare");
+        setLogDir("itests/qtest/target/qfile-results/clientcompare");
+
+        setInitScript("q_test_init.sql");
+        setCleanupScript("q_test_cleanup.sql");
+
+        setHiveConfDir("");
+        setClusterType(MiniClusterType.none);
+      } catch (Exception e) {
+        throw new RuntimeException("can't construct cliconfig", e);
+      }
+    }
+  }
+
+  public static class HBaseNegativeCliConfig extends AbstractCliConfig {
+    public HBaseNegativeCliConfig() {
+      super(CoreHBaseNegativeCliDriver.class);
+      try {
+        setQueryDir("hbase-handler/src/test/queries/negative");
+
+        setResultsDir("hbase-handler/src/test/results/negative");
+        setLogDir("itests/qtest/target/qfile-results/hbase-handler/negative");
+
+        setInitScript("q_test_init.sql");
+        setCleanupScript("q_test_cleanup.sql");
+
+        setHiveConfDir("");
+        setClusterType(MiniClusterType.none);
+      } catch (Exception e) {
+        throw new RuntimeException("can't construct cliconfig", e);
+      }
+    }
+  }
+
+  public static class ContribNegativeCliConfig extends AbstractCliConfig {
+    public ContribNegativeCliConfig() {
+      super(CoreNegativeCliDriver.class);
+      try {
+        setQueryDir("contrib/src/test/queries/clientnegative");
+
+        setResultsDir("contrib/src/test/results/clientnegative");
+        setLogDir("itests/qtest/target/qfile-results/contribclientnegative");
+
+        setInitScript("q_test_init.sql");
+        setCleanupScript("q_test_cleanup.sql");
+
+        setHiveConfDir("");
+        setClusterType(MiniClusterType.none);
+      } catch (Exception e) {
+        throw new RuntimeException("can't construct cliconfig", e);
+      }
+    }
+  }
+
+  public static class BeeLineConfig extends AbstractCliConfig {
+    public BeeLineConfig() {
+      // FIXME: beeline is disabled...
+      super(null);
+      // super(CoreBeeLineDriver.class);
+      try {
+        setQueryDir("ql/src/test/queries/clientpositive");
+
+        excludesFrom(testConfigProps, "beeline.positive.exclude");
+
+        setResultsDir("ql/src/test/results/clientpositive");
+        setLogDir("itests/qtest/target/qfile-results/beelinepositive");
+
+        setInitScript("q_test_init.sql");
+        setCleanupScript("q_test_cleanup.sql");
+
+        setHiveConfDir("");
+        setClusterType(MiniClusterType.none);
+      } catch (Exception e) {
+        throw new RuntimeException("can't construct cliconfig", e);
+      }
+    }
+  }
+
+  // XXX: pending merge of ACC ; and upgrade of executor
+  public static class AccumuloCliConfig extends AbstractCliConfig {
+    public AccumuloCliConfig() {
+      super(null);
+      // super(CoreAccumuloCliDriver.class);
+      try {
+        setQueryDir("accumulo-handler/src/test/queries/positive");
+
+        excludesFrom(testConfigProps, "beeline.positive.exclude");
+
+        setResultsDir("accumulo-handler/src/test/results/positive");
+        setLogDir("itests/qtest/target/qfile-results/accumulo-handler/positive");
+
+        setInitScript("q_test_init.sql");
+        setCleanupScript("q_test_cleanup.sql");
+
+        setHiveConfDir("");
+        setClusterType(MiniClusterType.none);
+      } catch (Exception e) {
+        throw new RuntimeException("can't construct cliconfig", e);
+      }
+    }
+  }
+
+  public static class SparkCliConfig extends AbstractCliConfig {
+    public SparkCliConfig() {
+      super(CoreCliDriver.class);
+      try {
+        setQueryDir("ql/src/test/queries/clientpositive");
+
+        includesFrom(testConfigProps, "spark.query.files");
+
+        setResultsDir("ql/src/test/results/clientpositive/spark");
+        setLogDir("itests/qtest-spark/target/qfile-results/clientpositive/spark");
+
+        setInitScript("q_test_init.sql");
+        setCleanupScript("q_test_cleanup.sql");
+
+        setHiveConfDir("data/conf/spark/standalone");
+        setClusterType(MiniClusterType.spark);
+      } catch (Exception e) {
+        throw new RuntimeException("can't construct cliconfig", e);
+      }
+    }
+  }
+
+  public static class SparkOnYarnCliConfig extends AbstractCliConfig {
+    public SparkOnYarnCliConfig() {
+      super(CoreCliDriver.class);
+      try {
+        setQueryDir("ql/src/test/queries/clientpositive");
+
+        includesFrom(testConfigProps, "miniSparkOnYarn.query.files");
+
+        setResultsDir("ql/src/test/results/clientpositive/spark");
+        setLogDir("itests/qtest-spark/target/qfile-results/clientpositive/spark");
+
+        setInitScript("q_test_init.sql");
+        setCleanupScript("q_test_cleanup.sql");
+
+        setHiveConfDir("data/conf/spark/yarn-client");
+        setClusterType(MiniClusterType.miniSparkOnYarn);
+      } catch (Exception e) {
+        throw new RuntimeException("can't construct cliconfig", e);
+      }
+    }
+  }
+
+  public static class SparkNegativeCliConfig extends AbstractCliConfig {
+    public SparkNegativeCliConfig() {
+      super(CoreNegativeCliDriver.class);
+      try {
+        setQueryDir("ql/src/test/queries/clientnegative");
+
+        includesFrom(testConfigProps, "spark.query.negative.files");
+
+        setResultsDir("ql/src/test/results/clientnegative/spark");
+        setLogDir("itests/qtest-spark/target/qfile-results/clientnegative/spark");
+
+        setInitScript("q_test_init.sql");
+        setCleanupScript("q_test_cleanup.sql");
+
+        setHiveConfDir("data/conf/spark/standalone");
+        setClusterType(MiniClusterType.spark);
+      } catch (Exception e) {
+        throw new RuntimeException("can't construct cliconfig", e);
+      }
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/1f7e10c0/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreBeeLineDriver.java
----------------------------------------------------------------------
diff --git a/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreBeeLineDriver.java b/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreBeeLineDriver.java
new file mode 100644
index 0000000..e5144e3
--- /dev/null
+++ b/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreBeeLineDriver.java
@@ -0,0 +1,171 @@
+/**
+ * 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.cli.control;
+//beeline is excluded by default
+//AFAIK contains broken tests
+//and produces compile errors...i'll comment out this whole class for now...
+/*
+
+import static org.junit.Assert.fail;
+import static org.apache.hadoop.hive.conf.HiveConf.ConfVars.*;
+
+import org.apache.hadoop.hive.conf.HiveConf;
+import org.apache.hadoop.hive.ql.QTestUtil;
+import org.apache.hive.beeline.util.QFileClient;
+import org.apache.hive.service.server.HiveServer2;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+// HIVE-14444: i've dropped this: @RunWith(ConcurrentTestRunner.class)
+public class CoreBeeLineDriver extends CliAdapter {
+  private final String hiveRootDirectory = AbstractCliConfig.HIVE_ROOT;
+  private final String queryDirectory;
+  private final String logDirectory;
+  private final String resultsDirectory;
+  private boolean overwrite = false;
+  private static String scratchDirectory;
+  private static QTestUtil.QTestSetup miniZKCluster = null;
+
+  private static HiveServer2 hiveServer2;
+
+  public CoreBeeLineDriver(AbstractCliConfig testCliConfig) {
+    super(testCliConfig);
+    queryDirectory = testCliConfig.getQueryDirectory();
+    logDirectory = testCliConfig.getLogDir();
+    resultsDirectory = testCliConfig.getResultsDir();
+  }
+
+  @Override
+  @BeforeClass
+  public void beforeClass() throws Exception {
+    HiveConf hiveConf = new HiveConf();
+    hiveConf.logVars(System.err);
+    System.err.flush();
+
+    scratchDirectory = hiveConf.getVar(SCRATCHDIR);
+
+    String testOutputOverwrite = System.getProperty("test.output.overwrite");
+    if (testOutputOverwrite != null && "true".equalsIgnoreCase(testOutputOverwrite)) {
+      overwrite = true;
+    }
+
+    miniZKCluster = new QTestUtil.QTestSetup();
+    miniZKCluster.preTest(hiveConf);
+
+    System.setProperty("hive.zookeeper.quorum",
+        hiveConf.get("hive.zookeeper.quorum"));
+    System.setProperty("hive.zookeeper.client.port",
+        hiveConf.get("hive.zookeeper.client.port"));
+
+    String disableserver = System.getProperty("test.service.disable.server");
+    if (null != disableserver && disableserver.equalsIgnoreCase("true")) {
+      System.err.println("test.service.disable.server=true "
+        + "Skipping HiveServer2 initialization!");
+      return;
+    }
+
+    hiveServer2 = new HiveServer2();
+    hiveServer2.init(hiveConf);
+    System.err.println("Starting HiveServer2...");
+    hiveServer2.start();
+    Thread.sleep(5000);
+  }
+
+
+  @Override
+  @AfterClass
+  public void shutdown() {
+    try {
+      if (hiveServer2 != null) {
+        System.err.println("Stopping HiveServer2...");
+        hiveServer2.stop();
+      }
+    } catch (Throwable t) {
+      t.printStackTrace();
+    }
+
+    if (miniZKCluster != null) {
+      try {
+        miniZKCluster.tearDown();
+      } catch (Exception e) {
+        e.printStackTrace();
+      }
+    }
+  }
+
+  public void runTest(String qFileName) throws Exception {
+    QFileClient qClient = new QFileClient(new HiveConf(), hiveRootDirectory,
+        queryDirectory, logDirectory, resultsDirectory)
+    .setQFileName(qFileName)
+    .setUsername("user")
+    .setPassword("password")
+    .setJdbcUrl("jdbc:hive2://localhost:10000")
+    .setJdbcDriver("org.apache.hive.jdbc.HiveDriver")
+    .setTestDataDirectory(hiveRootDirectory + "/data/files")
+    .setTestScriptDirectory(hiveRootDirectory + "/data/scripts");
+
+    long startTime = System.currentTimeMillis();
+    System.err.println(">>> STARTED " + qFileName
+        + " (Thread " + Thread.currentThread().getName() + ")");
+    try {
+      qClient.run();
+    } catch (Exception e) {
+      System.err.println(">>> FAILED " + qFileName + " with exception:");
+      e.printStackTrace();
+      throw e;
+    }
+    long elapsedTime = (System.currentTimeMillis() - startTime)/1000;
+    String time = "(" + elapsedTime + "s)";
+
+    if (qClient.compareResults()) {
+      System.err.println(">>> PASSED " + qFileName + " " + time);
+    } else {
+      if (qClient.hasErrors()) {
+        System.err.println(">>> FAILED " + qFileName + " (ERROR) " + time);
+        fail();
+      }
+      if (overwrite) {
+        System.err.println(">>> PASSED " + qFileName + " (OVERWRITE) " + time);
+        qClient.overwriteResults();
+      } else {
+        System.err.println(">>> FAILED " + qFileName + " (DIFF) " + time);
+        fail();
+      }
+    }
+  }
+
+  @Override
+  public void setUp() {
+    // TODO Auto-generated method stub
+
+  }
+
+  @Override
+  public void tearDown() {
+    // TODO Auto-generated method stub
+
+  }
+
+  @Override
+  public void runTest(String name, String name2, String absolutePath) throws Exception {
+    runTest(name2);
+  }
+
+}
+
+
+*/
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/hive/blob/1f7e10c0/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreCliDriver.java
----------------------------------------------------------------------
diff --git a/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreCliDriver.java b/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreCliDriver.java
new file mode 100644
index 0000000..5435f9f
--- /dev/null
+++ b/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreCliDriver.java
@@ -0,0 +1,137 @@
+/**
+ * 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.cli.control;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.apache.hadoop.hive.cli.control.AbstractCliConfig.MetastoreType;
+import org.apache.hadoop.hive.ql.QTestUtil;
+import org.apache.hadoop.hive.ql.QTestUtil.MiniClusterType;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+
+public class CoreCliDriver extends CliAdapter {
+
+  private static QTestUtil qt;
+  
+  public CoreCliDriver(AbstractCliConfig testCliConfig) {
+    super(testCliConfig);
+  }
+
+  @Override
+  @BeforeClass
+  public void beforeClass() {
+    MiniClusterType miniMR =cliConfig.getClusterType();
+    String hiveConfDir = cliConfig.getHiveConfDir();
+    String initScript = cliConfig.getInitScript();
+    String cleanupScript = cliConfig.getCleanupScript();
+    boolean useHBaseMetastore = cliConfig.getMetastoreType() == MetastoreType.hbase;
+    try {
+      String hadoopVer = cliConfig.getHadoopVersion();
+      qt = new QTestUtil((cliConfig.getResultsDir()), (cliConfig.getLogDir()), miniMR,
+      hiveConfDir, hadoopVer, initScript, cleanupScript, useHBaseMetastore, true);
+
+      // do a one time initialization
+      qt.cleanUp();
+      qt.createSources();
+
+    } catch (Exception e) {
+      System.err.println("Exception: " + e.getMessage());
+      e.printStackTrace();
+      System.err.flush();
+      throw new RuntimeException("Unexpected exception in static initialization",e);
+    }
+  }
+
+  @Override
+  @Before
+  public void setUp() {
+    try {
+      qt.clearTestSideEffects();
+    } catch (Exception e) {
+      System.err.println("Exception: " + e.getMessage());
+      e.printStackTrace();
+      System.err.flush();
+      fail("Unexpected exception in setup");
+    }
+  }
+
+  @Override
+  @After
+  public void tearDown() {
+    try {
+      qt.clearPostTestEffects();
+    } catch (Exception e) {
+      System.err.println("Exception: " + e.getMessage());
+      e.printStackTrace();
+      System.err.flush();
+      fail("Unexpected exception in tearDown");
+    }
+  }
+
+  @Override
+  @AfterClass
+  public void shutdown() throws Exception {
+    try {
+      qt.shutdown();
+    } catch (Exception e) {
+      System.err.println("Exception: " + e.getMessage());
+      e.printStackTrace();
+      System.err.flush();
+      fail("Unexpected exception in shutdown");
+    }
+  }
+
+  static String debugHint = "\nSee ./ql/target/tmp/log/hive.log or ./itests/qtest/target/tmp/log/hive.log, "
+     + "or check ./ql/target/surefire-reports or ./itests/qtest/target/surefire-reports/ for specific test cases logs.";
+
+  @Override
+  public void runTest(String tname, String fname, String fpath) throws Exception {
+    long startTime = System.currentTimeMillis();
+    try {
+      System.err.println("Begin query: " + fname);
+
+      qt.addFile(fpath);
+
+      if (qt.shouldBeSkipped(fname)) {
+        System.err.println("Test " + fname + " skipped");
+        return;
+      }
+
+      qt.cliInit(fname, false);
+      int ecode = qt.executeClient(fname);
+      if (ecode != 0) {
+        qt.failed(ecode, fname, debugHint);
+      }
+      ecode = qt.checkCliDriverResults(fname);
+      if (ecode != 0) {
+        qt.failedDiff(ecode, fname, debugHint);
+      }
+    }
+    catch (Throwable e) {
+      qt.failed(e, fname, debugHint);
+    }
+
+    long elapsedTime = System.currentTimeMillis() - startTime;
+    System.err.println("Done query: " + fname + " elapsedTime=" + elapsedTime/1000 + "s");
+    assertTrue("Test passed", true);
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/1f7e10c0/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreCompareCliDriver.java
----------------------------------------------------------------------
diff --git a/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreCompareCliDriver.java b/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreCompareCliDriver.java
new file mode 100644
index 0000000..71a02bc
--- /dev/null
+++ b/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreCompareCliDriver.java
@@ -0,0 +1,158 @@
+/**
+ * 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.cli.control;
+
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.hadoop.hive.ql.QTestUtil;
+import org.apache.hadoop.hive.ql.QTestUtil.MiniClusterType;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+public class CoreCompareCliDriver extends CliAdapter{
+
+  private static QTestUtil qt;
+  public CoreCompareCliDriver(AbstractCliConfig testCliConfig) {
+    super(testCliConfig);
+  }
+
+
+  @Override
+  @BeforeClass
+  public void beforeClass() {
+
+    MiniClusterType miniMR = cliConfig.getClusterType();
+    String hiveConfDir = cliConfig.getHiveConfDir();
+    String initScript = cliConfig.getInitScript();
+    String cleanupScript = cliConfig.getCleanupScript();
+    try {
+      String hadoopVer = cliConfig.getHadoopVersion();
+      qt = new QTestUtil(cliConfig.getResultsDir(), cliConfig.getLogDir(), miniMR,
+      hiveConfDir, hadoopVer, initScript, cleanupScript, false, false);
+
+      // do a one time initialization
+      qt.cleanUp();
+      qt.createSources();
+
+    } catch (Exception e) {
+      System.err.println("Exception: " + e.getMessage());
+      e.printStackTrace();
+      System.err.flush();
+      fail("Unexpected exception in static initialization");
+    }
+  }
+
+  @Override
+  @Before
+  public void setUp() {
+    try {
+      qt.clearTestSideEffects();
+    } catch (Exception e) {
+      System.err.println("Exception: " + e.getMessage());
+      e.printStackTrace();
+      System.err.flush();
+      fail("Unexpected exception in setup");
+    }
+  }
+
+  @Override
+  @After
+  public void tearDown() {
+    try {
+      qt.clearPostTestEffects();
+    } catch (Exception e) {
+      System.err.println("Exception: " + e.getMessage());
+      e.printStackTrace();
+      System.err.flush();
+      fail("Unexpected exception in tearDown");
+    }
+  }
+
+  @Override
+  @AfterClass
+  public void shutdown() throws Exception {
+    try {
+      qt.shutdown();
+    } catch (Exception e) {
+      System.err.println("Exception: " + e.getMessage());
+      e.printStackTrace();
+      System.err.flush();
+      fail("Unexpected exception in shutdown");
+    }
+  }
+
+  private Map<String, List<String>> versionFiles = new HashMap<>();
+
+  static String debugHint = "\nSee ./ql/target/tmp/log/hive.log or ./itests/qtest/target/tmp/log/hive.log, "
+     + "or check ./ql/target/surefire-reports or ./itests/qtest/target/surefire-reports/ for specific test cases logs.";
+
+  @Override
+  public void runTest(String tname, String fname, String fpath) throws Exception {
+    final String queryDirectory = cliConfig.getQueryDirectory();
+
+    long startTime = System.currentTimeMillis();
+    try {
+      System.err.println("Begin query: " + fname);
+      // TODO: versions could also be picked at build time.
+      List<String> versionFiles = QTestUtil.getVersionFiles(queryDirectory, tname);
+      if (versionFiles.size() < 2) {
+        fail("Cannot run " + tname + " with only " + versionFiles.size() + " versions");
+      }
+
+      qt.addFile(fpath);
+      for (String versionFile : versionFiles) {
+        qt.addFile(new File(queryDirectory, versionFile), true);
+      }
+
+      if (qt.shouldBeSkipped(fname)) {
+        return;
+      }
+
+      int ecode = 0;
+      List<String> outputs = new ArrayList<>(versionFiles.size());
+      for (String versionFile : versionFiles) {
+        // 1 for "_" after tname; 3 for ".qv" at the end. Version is in between.
+        String versionStr = versionFile.substring(tname.length() + 1, versionFile.length() - 3);
+        outputs.add(qt.cliInit(tname + "." + versionStr, false));
+        // TODO: will this work?
+        ecode = qt.executeClient(versionFile, fname);
+        if (ecode != 0) {
+          qt.failed(ecode, fname, debugHint);
+        }
+      }
+
+      ecode = qt.checkCompareCliDriverResults(fname, outputs);
+      if (ecode != 0) {
+        qt.failedDiff(ecode, fname, debugHint);
+      }
+    }
+    catch (Throwable e) {
+      qt.failed(e, fname, debugHint);
+    }
+
+    long elapsedTime = System.currentTimeMillis() - startTime;
+    System.err.println("Done query: " + fname + " elapsedTime=" + elapsedTime/1000 + "s");
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/1f7e10c0/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreDummy.java
----------------------------------------------------------------------
diff --git a/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreDummy.java b/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreDummy.java
new file mode 100644
index 0000000..b7afb48
--- /dev/null
+++ b/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreDummy.java
@@ -0,0 +1,57 @@
+/**
+ * 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.cli.control;
+
+import static org.junit.Assert.fail;
+
+import java.util.List;
+
+import org.apache.hadoop.hive.ql.QTestUtil;
+
+public class CoreDummy extends CliAdapter {
+
+  public CoreDummy(AbstractCliConfig cliConfig) {
+    super(cliConfig);
+  }
+
+  @Override
+  public void beforeClass() {
+  }
+
+  @Override
+  public void setUp() {
+  }
+
+  @Override
+  public void tearDown() {
+  }
+
+  @Override
+  public void shutdown() throws Exception {
+  }
+
+  @Override
+  public void runTest(String name, String name2, String absolutePath) throws Exception {
+    List<String> versionFiles = QTestUtil.getVersionFiles(cliConfig.getQueryDirectory(), name);
+    if (versionFiles.size() < 2) {
+      fail("Cannot run " + name2 + " with only " + versionFiles.size() + " versions");
+    }
+    fail("x");
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/1f7e10c0/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreHBaseCliDriver.java
----------------------------------------------------------------------
diff --git a/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreHBaseCliDriver.java b/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreHBaseCliDriver.java
new file mode 100644
index 0000000..956a42d
--- /dev/null
+++ b/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreHBaseCliDriver.java
@@ -0,0 +1,137 @@
+/**
+ * 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.cli.control;
+
+import static org.apache.hadoop.hive.cli.control.AbstractCliConfig.HIVE_ROOT;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.apache.hadoop.hive.hbase.HBaseQTestUtil;
+import org.apache.hadoop.hive.hbase.HBaseTestSetup;
+import org.apache.hadoop.hive.ql.QTestUtil.MiniClusterType;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+
+public class CoreHBaseCliDriver extends CliAdapter {
+
+  private HBaseQTestUtil qt;
+  private HBaseTestSetup setup = new HBaseTestSetup();
+
+  public CoreHBaseCliDriver(AbstractCliConfig testCliConfig) {
+    super(testCliConfig);
+  }
+
+  @Override
+  @BeforeClass
+  public void beforeClass() {
+        MiniClusterType miniMR = cliConfig.getClusterType();
+        String initScript = cliConfig.getInitScript();
+        String cleanupScript =cliConfig.getCleanupScript();
+
+        try {
+          qt = new HBaseQTestUtil(cliConfig.getResultsDir(), cliConfig.getLogDir(), miniMR,
+          setup, initScript, cleanupScript);
+          qt.cleanUp(null);
+          qt.createSources(null);
+
+        } catch (Exception e) {
+          System.err.println("Exception: " + e.getMessage());
+          e.printStackTrace();
+          System.err.flush();
+          fail("Unexpected exception in static initialization: "+e.getMessage());
+        }
+
+  }
+
+  @Override
+  @Before
+  public void setUp() {
+    try {
+      qt.clearTestSideEffects();
+    } catch (Exception e) {
+      System.err.println("Exception: " + e.getMessage());
+      e.printStackTrace();
+      System.err.flush();
+      fail("Unexpected exception in setup");
+    }
+  }
+  @Override
+  @After
+  public void tearDown() {
+    try {
+      qt.clearPostTestEffects();
+    } catch (Exception e) {
+      System.err.println("Exception: " + e.getMessage());
+      e.printStackTrace();
+      System.err.flush();
+      fail("Unexpected exception in tearDown");
+    }
+  }
+
+  @Override
+  @AfterClass
+  public void shutdown() throws Exception {
+    try {
+      // FIXME: there were 2 afterclass methods...i guess this is the right order...maybe not
+      qt.shutdown();
+      setup.tearDown();
+    } catch (Exception e) {
+      System.err.println("Exception: " + e.getMessage());
+      e.printStackTrace();
+      System.err.flush();
+      fail("Unexpected exception in shutdown");
+    }
+  }
+
+  @Override
+  public void runTest(String tname, String fname, String fpath) throws Exception {
+    long startTime = System.currentTimeMillis();
+    try {
+      System.err.println("Begin query: " + fname);
+
+      qt.addFile(fpath);
+
+      if (qt.shouldBeSkipped(fname)) {
+        System.err.println("Test " + fname + " skipped");
+        return;
+      }
+
+      qt.cliInit(fname, false);
+
+      int ecode = qt.executeClient(fname);
+      if (ecode != 0) {
+        qt.failed(ecode, fname, null);
+      }
+
+      ecode = qt.checkCliDriverResults(fname);
+      if (ecode != 0) {
+        qt.failedDiff(ecode, fname, null);
+      }
+
+    } catch (Throwable e) {
+      qt.failed(e, fname, null);
+    }
+
+    long elapsedTime = System.currentTimeMillis() - startTime;
+    System.err.println("Done query: " + fname + " elapsedTime=" + elapsedTime/1000 + "s");
+    assertTrue("Test passed", true);
+  }
+}
+

http://git-wip-us.apache.org/repos/asf/hive/blob/1f7e10c0/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreHBaseNegativeCliDriver.java
----------------------------------------------------------------------
diff --git a/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreHBaseNegativeCliDriver.java b/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreHBaseNegativeCliDriver.java
new file mode 100644
index 0000000..6225180
--- /dev/null
+++ b/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreHBaseNegativeCliDriver.java
@@ -0,0 +1,121 @@
+/**
+ * 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.cli.control;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.apache.hadoop.hive.hbase.HBaseQTestUtil;
+import org.apache.hadoop.hive.hbase.HBaseTestSetup;
+import org.apache.hadoop.hive.ql.QTestUtil.MiniClusterType;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+
+public class CoreHBaseNegativeCliDriver extends CliAdapter {
+
+  private HBaseQTestUtil qt;
+  private static HBaseTestSetup setup = new HBaseTestSetup();
+
+  public CoreHBaseNegativeCliDriver(AbstractCliConfig testCliConfig) {
+    super(testCliConfig);
+  }
+
+  @Override
+  public void beforeClass() throws Exception {
+  }
+
+  // hmm..this looks a bit wierd...setup boots qtestutil...this part used to be in beforeclass
+  @Override
+  @Before
+  public void setUp() {
+
+    MiniClusterType miniMR = cliConfig.getClusterType();
+    String initScript = cliConfig.getInitScript();
+    String cleanupScript = cliConfig.getCleanupScript();
+
+    try {
+      qt = new HBaseQTestUtil(cliConfig.getResultsDir(), cliConfig.getLogDir(), miniMR,
+      setup, initScript, cleanupScript);
+    } catch (Exception e) {
+      System.err.println("Exception: " + e.getMessage());
+      e.printStackTrace();
+      System.err.flush();
+      fail("Unexpected exception in setup");
+    }
+  }
+
+  @Override
+  @After
+  public void tearDown() {
+    try {
+      qt.shutdown();
+    } catch (Exception e) {
+      System.err.println("Exception: " + e.getMessage());
+      e.printStackTrace();
+      System.err.flush();
+      fail("Unexpected exception in tearDown");
+    }
+  }
+
+  @Override
+  @AfterClass
+  public void shutdown() throws Exception {
+    // closeHBaseConnections
+    setup.tearDown();
+  }
+
+  @Override
+  public void runTest(String tname, String fname, String fpath) throws Exception {
+    long startTime = System.currentTimeMillis();
+    try {
+      System.err.println("Begin query: " + fname);
+
+      qt.addFile(fpath);
+
+      if (qt.shouldBeSkipped(fname)) {
+        System.err.println("Test " + fname + " skipped");
+        return;
+      }
+
+      qt.cliInit(fname);
+      qt.clearTestSideEffects();
+      int ecode = qt.executeClient(fname);
+      if (ecode == 0) {
+        qt.failed(fname, null);
+      }
+
+      ecode = qt.checkCliDriverResults(fname);
+      if (ecode != 0) {
+        qt.failedDiff(ecode, fname, null);
+      }
+      qt.clearPostTestEffects();
+
+    } catch (Throwable e) {
+      qt.failed(e, fname, null);
+    }
+
+    long elapsedTime = System.currentTimeMillis() - startTime;
+    System.err.println("Done query: " + fname + " elapsedTime=" + elapsedTime/1000 + "s");
+    assertTrue("Test passed", true);
+  }
+
+
+}
+

http://git-wip-us.apache.org/repos/asf/hive/blob/1f7e10c0/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreNegativeCliDriver.java
----------------------------------------------------------------------
diff --git a/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreNegativeCliDriver.java b/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreNegativeCliDriver.java
new file mode 100644
index 0000000..65b2ce7
--- /dev/null
+++ b/itests/util/src/main/java/org/apache/hadoop/hive/cli/control/CoreNegativeCliDriver.java
@@ -0,0 +1,139 @@
+/**
+ * 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.cli.control;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.apache.hadoop.hive.ql.QTestUtil;
+import org.apache.hadoop.hive.ql.QTestUtil.MiniClusterType;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+
+public class CoreNegativeCliDriver extends CliAdapter{
+
+  private QTestUtil qt;
+  public CoreNegativeCliDriver(AbstractCliConfig testCliConfig) {
+    super(testCliConfig);
+  }
+
+  @Override
+  public void beforeClass(){
+    MiniClusterType miniMR = cliConfig.getClusterType();
+    String hiveConfDir = cliConfig.getHiveConfDir();
+    String initScript = cliConfig.getInitScript();
+    String cleanupScript = cliConfig.getCleanupScript();
+
+    try {
+      String hadoopVer = cliConfig.getHadoopVersion();
+      qt = new QTestUtil((cliConfig.getResultsDir()), (cliConfig.getLogDir()), miniMR,
+       hiveConfDir, hadoopVer, initScript, cleanupScript, false, false);
+      // do a one time initialization
+      qt.cleanUp();
+      qt.createSources();
+    } catch (Exception e) {
+      System.err.println("Exception: " + e.getMessage());
+      e.printStackTrace();
+      System.err.flush();
+      fail("Unexpected exception in static initialization");
+    }
+  }
+
+  @Override
+  @Before
+  public void setUp() {
+    try {
+      qt.clearTestSideEffects();
+    } catch (Throwable e) {
+      e.printStackTrace();
+      System.err.flush();
+      fail("Unexpected exception in setup");
+    }
+  }
+
+  @Override
+  @After
+  public void tearDown() {
+    try {
+      qt.clearPostTestEffects();
+    } catch (Exception e) {
+      System.err.println("Exception: " + e.getMessage());
+      e.printStackTrace();
+      System.err.flush();
+      fail("Unexpected exception in tearDown");
+    }
+  }
+
+  @Override
+  @AfterClass
+  public void shutdown() throws Exception {
+    try {
+      qt.shutdown();
+    } catch (Exception e) {
+      System.err.println("Exception: " + e.getMessage());
+      e.printStackTrace();
+      System.err.flush();
+      fail("Unexpected exception in shutdown");
+    }
+  }
+
+  /**
+   * Dummy last test. This is only meant to shutdown qt
+   */
+  public void testNegativeCliDriver_shutdown() {
+    System.err.println ("Cleaning up " + "$className");
+  }
+
+  static String debugHint = "\nSee ./ql/target/tmp/log/hive.log or ./itests/qtest/target/tmp/log/hive.log, "
+     + "or check ./ql/target/surefire-reports or ./itests/qtest/target/surefire-reports/ for specific test cases logs.";
+
+
+  @Override
+  public void runTest(String tname, String fname, String fpath) throws Exception {
+    long startTime = System.currentTimeMillis();
+    try {
+      System.err.println("Begin query: " + fname);
+
+      qt.addFile(fpath);
+
+      if (qt.shouldBeSkipped(fname)) {
+        System.err.println("Test " + fname + " skipped");
+        return;
+      }
+
+      qt.cliInit(fname, false);
+      int ecode = qt.executeClient(fname);
+      if (ecode == 0) {
+        qt.failed(fname, debugHint);
+      }
+
+      ecode = qt.checkCliDriverResults(fname);
+      if (ecode != 0) {
+        qt.failedDiff(ecode, fname, debugHint);
+      }
+    }
+    catch (Throwable e) {
+      qt.failed(e, fname, debugHint);
+    }
+
+    long elapsedTime = System.currentTimeMillis() - startTime;
+    System.err.println("Done query: " + fname + " elapsedTime=" + elapsedTime/1000 + "s");
+    assertTrue("Test passed", true);
+  }
+}