blob: 46cd84be8939adeded56a68f63034e81ce0db394 [file] [log] [blame]
/*
* 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.tinkerpop.gremlin;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
import java.net.URL;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static org.junit.Assert.assertTrue;
/**
* @author Stephen Mallette (http://stephen.genoprime.com)
*/
public final class TestHelper {
private static final String SEP = File.separator;
public static final String TEST_DATA_RELATIVE_DIR = "test-case-data";
private TestHelper() {}
public static void assertIsUtilityClass(final Class<?> utilityClass) throws Exception {
final Constructor constructor = utilityClass.getDeclaredConstructor();
assertTrue(Modifier.isFinal(utilityClass.getModifiers()));
assertTrue(Modifier.isPrivate(constructor.getModifiers()));
constructor.setAccessible(true);
constructor.newInstance();
}
/**
* See {@code TestHelper} in gremlin-test for the official version.
*/
public static File makeTestDataPath(final Class clazz, final String... childPath) {
final File root = getRootOfBuildDirectory(clazz);
final List<String> cleanedPaths = Stream.of(childPath).map(TestHelper::cleanPathSegment).collect(Collectors.toList());
// use the class name in the directory structure
cleanedPaths.add(0, cleanPathSegment(clazz.getSimpleName()));
final File f = new File(root, TEST_DATA_RELATIVE_DIR + SEP + String.join(SEP, cleanedPaths));
if (!f.exists()) f.mkdirs();
return f;
}
/**
* See {@code TestHelper} in gremlin-test for the official version.
*/
public static String makeTestDataDirectory(final Class clazz, final String... childPath) {
return makeTestDataPath(clazz, childPath).getAbsolutePath() + SEP;
}
/**
* See {@code TestHelper} in gremlin-test for the official version.
*/
public static File getRootOfBuildDirectory(final Class clazz) {
// build.dir gets sets during runs of tests with maven via the surefire configuration in the pom.xml
// if that is not set as an environment variable, then the path is computed based on the location of the
// requested class. the computed version at least as far as intellij is concerned comes drops it into
// /target/test-classes. the build.dir had to be added because maven doesn't seem to like a computed path
// as it likes to find that path in the .m2 directory and other weird places......
final String buildDirectory = System.getProperty("build.dir");
final File root = null == buildDirectory ? new File(computePath(clazz)).getParentFile() : new File(buildDirectory);
if (!root.exists()) root.mkdirs();
return root;
}
private static String computePath(final Class clazz) {
final String clsUri = clazz.getName().replace('.', SEP.charAt(0)) + ".class";
final URL url = clazz.getClassLoader().getResource(clsUri);
final String clsPath = url.getPath();
return clsPath.substring(0, clsPath.length() - clsUri.length());
}
/**
* See {@code TestHelper} in gremlin-test for the official version.
*/
public static File generateTempFile(final Class clazz, final String fileName, final String fileNameSuffix) throws IOException {
final File path = makeTestDataPath(clazz, "temp");
if (!path.exists()) path.mkdirs();
return File.createTempFile(fileName, fileNameSuffix, path);
}
/**
* See {@code TestHelper} in gremlin-test for the official version.
*/
public static File generateTempFileFromResource(final Class resourceClass, final String resourceName, final String extension) throws IOException {
return generateTempFileFromResource(resourceClass, resourceClass, resourceName, extension);
}
/**
* See {@code TestHelper} in gremlin-test for the official version.
*/
public static File generateTempFileFromResource(final Class graphClass, final Class resourceClass, final String resourceName, final String extension) throws IOException {
final File temp = makeTestDataPath(graphClass, "resources");
if (!temp.exists()) temp.mkdirs();
final File tempFile = new File(temp, resourceName + extension);
final FileOutputStream outputStream = new FileOutputStream(tempFile);
int data;
final InputStream inputStream = resourceClass.getResourceAsStream(resourceName);
while ((data = inputStream.read()) != -1) {
outputStream.write(data);
}
outputStream.close();
inputStream.close();
return tempFile;
}
/**
* See {@code TestHelper} in gremlin-test for the official version.
*/
public static String convertPackageToResourcePath(final Class clazz) {
final String packageName = clazz.getPackage().getName();
return String.format("/%s/", packageName.replaceAll("\\.", "\\/"));
}
/**
* See {@code TestHelper} in gremlin-test for the official version.
*/
public static String cleanPathSegment(final String toClean) {
final String cleaned = toClean.replaceAll("[.\\\\/:*?\"<>|\\[\\]\\(\\)]", "");
if (cleaned.length() == 0)
throw new IllegalStateException("Path segment " + toClean + " has not valid characters and is thus empty");
return cleaned;
}
}