/** * 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; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.hadoop.hive.ql.QTestUtil.MiniClusterType; /** * Suite for testing location. e.g. if "alter table alter partition * location" is run, do the partitions end up in the correct location. * * This is a special case of the regular queries as paths are typically * ignored. */ public class TestLocationQueries extends BaseTestQueries { public TestLocationQueries() { File logDirFile = new File(logDir); if (!(logDirFile.exists() || logDirFile.mkdirs())) { fail("Could not create " + logDir); } } /** * Our own checker - validate the location of the partition. */ public static class CheckResults extends QTestUtil { private final String locationSubdir; /** * Validate only that the location is correct. * @return non-zero if it failed */ @Override public QTestProcessExecResult checkCliDriverResults(String tname) throws Exception { File logFile = new File(logDir, tname + ".out"); int failedCount = 0; StringBuilder fileNames = new StringBuilder("Files failing the location check:"); FileReader fr = new FileReader(logFile); BufferedReader in = new BufferedReader(fr); try { String line; int locationCount = 0; Pattern p = Pattern.compile("location:([^,)]+)"); while((line = in.readLine()) != null) { Matcher m = p.matcher(line); if (m.find()) { File f = new File(m.group(1)); if (!f.getName().equals(locationSubdir)) { failedCount++; fileNames.append(f.getName()).append("\r\n"); } locationCount++; } } // we always have to find at least one location, otw the test is useless if (locationCount == 0) { return QTestProcessExecResult.create(Integer.MAX_VALUE, "0 locations tested"); } } finally { in.close(); } return QTestProcessExecResult.create(failedCount, fileNames.toString()); } public CheckResults(String outDir, String logDir, MiniClusterType miniMr, String hadoopVer, String locationSubdir) throws Exception { super(outDir, logDir, miniMr, null, hadoopVer, "", "", false, false); this.locationSubdir = locationSubdir; } } /** * Verify that the location of the partition is valid. In this case * the path should end in "parta" and not "dt=a" (the default). * */ public void testAlterTablePartitionLocation_alter5() throws Exception { String[] testNames = new String[] {"alter5.q"}; File[] qfiles = setupQFiles(testNames); QTestUtil[] qt = new QTestUtil[qfiles.length]; for (int i = 0; i < qfiles.length; i++) { qt[i] = new CheckResults(resDir, logDir, MiniClusterType.none, "0.20", "parta"); qt[i].addFile(qfiles[i]); qt[i].clearTestSideEffects(); } boolean success = QTestUtil.queryListRunnerSingleThreaded(qfiles, qt); if (!success) { fail("One or more queries failed"); } } }