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