[TESTS] Make sure test end with ..Tests
This commit adds a simple testcase that ensures all our tests end with the right naming. Closes #9945
This commit is contained in:
parent
68da7c05ee
commit
df8206853b
|
@ -0,0 +1,172 @@
|
||||||
|
/*
|
||||||
|
* Licensed to Elasticsearch under one or more contributor
|
||||||
|
* license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright
|
||||||
|
* ownership. Elasticsearch 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.elasticsearch;
|
||||||
|
|
||||||
|
import com.google.common.base.Joiner;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
import org.apache.lucene.util.LuceneTestCase;
|
||||||
|
import org.elasticsearch.test.ElasticsearchLuceneTestCase;
|
||||||
|
import org.elasticsearch.test.ElasticsearchTestCase;
|
||||||
|
import org.elasticsearch.test.ElasticsearchTokenStreamTestCase;
|
||||||
|
import org.junit.Ignore;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.lang.reflect.Modifier;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.nio.file.*;
|
||||||
|
import java.nio.file.attribute.BasicFileAttributes;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple class that ensures that all subclasses concrete of ElasticsearchTestCase end with either Test | Tests
|
||||||
|
*/
|
||||||
|
public class NamingConventionTests extends ElasticsearchTestCase {
|
||||||
|
|
||||||
|
// see https://github.com/elasticsearch/elasticsearch/issues/9945
|
||||||
|
public void testNamingConventions()
|
||||||
|
throws ClassNotFoundException, IOException, URISyntaxException {
|
||||||
|
final Set<Class> notImplementing = new HashSet<>();
|
||||||
|
final Set<Class> pureUnitTest = new HashSet<>();
|
||||||
|
final Set<Class> missingSuffix = new HashSet<>();
|
||||||
|
String[] packages = {"org.elasticsearch", "org.apache.lucene"};
|
||||||
|
for (final String packageName : packages) {
|
||||||
|
final String path = "/" + packageName.replace('.', '/');
|
||||||
|
final Path startPath = Paths.get(NamingConventionTests.class.getResource(path).toURI());
|
||||||
|
final Set<Path> ignore = Sets.newHashSet(Paths.get("/org/elasticsearch/stresstest"), Paths.get("/org/elasticsearch/benchmark/stress"));
|
||||||
|
Files.walkFileTree(startPath, new FileVisitor<Path>() {
|
||||||
|
private Path pkgPrefix = Paths.get(path).getParent();
|
||||||
|
@Override
|
||||||
|
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
|
||||||
|
Path next = pkgPrefix.resolve(dir.getFileName());
|
||||||
|
if (ignore.contains(next)) {
|
||||||
|
return FileVisitResult.SKIP_SUBTREE;
|
||||||
|
}
|
||||||
|
pkgPrefix = next;
|
||||||
|
return FileVisitResult.CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
|
||||||
|
try {
|
||||||
|
String filename = file.getFileName().toString();
|
||||||
|
if (filename.endsWith(".class")) {
|
||||||
|
Class<?> clazz = loadClass(filename);
|
||||||
|
if (Modifier.isAbstract(clazz.getModifiers()) == false && Modifier.isInterface(clazz.getModifiers()) == false) {
|
||||||
|
if ((clazz.getName().endsWith("Tests") || clazz.getName().endsWith("Test"))) { // don't worry about the ones that match the pattern
|
||||||
|
if (isTestCase(clazz) == false) {
|
||||||
|
notImplementing.add(clazz);
|
||||||
|
}
|
||||||
|
} else if (isTestCase(clazz)) {
|
||||||
|
missingSuffix.add(clazz);
|
||||||
|
} else if (junit.framework.Test.class.isAssignableFrom(clazz) || hasTestAnnotation(clazz)) {
|
||||||
|
pureUnitTest.add(clazz);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
return FileVisitResult.CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean hasTestAnnotation(Class<?> clazz) {
|
||||||
|
for (Method method : clazz.getDeclaredMethods()) {
|
||||||
|
if (method.getAnnotation(Test.class) != null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isTestCase(Class<?> clazz) {
|
||||||
|
return ElasticsearchTestCase.class.isAssignableFrom(clazz) || ElasticsearchLuceneTestCase.class.isAssignableFrom(clazz) || ElasticsearchTokenStreamTestCase.class.isAssignableFrom(clazz) || LuceneTestCase.class.isAssignableFrom(clazz);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Class<?> loadClass(String filename) throws ClassNotFoundException {
|
||||||
|
StringBuilder pkg = new StringBuilder();
|
||||||
|
for (Path p : pkgPrefix) {
|
||||||
|
pkg.append(p.getFileName().toString()).append(".");
|
||||||
|
}
|
||||||
|
pkg.append(filename.substring(0, filename.length() - 6));
|
||||||
|
|
||||||
|
return Class.forName(pkg.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
|
||||||
|
throw exc;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
|
||||||
|
pkgPrefix = pkgPrefix.getParent();
|
||||||
|
return FileVisitResult.CONTINUE;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
assertTrue(missingSuffix.remove(WrongName.class));
|
||||||
|
assertTrue(missingSuffix.remove(WrongNameTheSecond.class));
|
||||||
|
assertTrue(notImplementing.remove(NotImplementingTests.class));
|
||||||
|
assertTrue(notImplementing.remove(NotImplementingTest.class));
|
||||||
|
assertTrue(pureUnitTest.remove(PlainUnit.class));
|
||||||
|
assertTrue(pureUnitTest.remove(PlainUnitTheSecond.class));
|
||||||
|
|
||||||
|
String classesToSubclass = Joiner.on(',').join(
|
||||||
|
ElasticsearchTestCase.class.getSimpleName(),
|
||||||
|
ElasticsearchLuceneTestCase.class.getSimpleName(),
|
||||||
|
ElasticsearchTokenStreamTestCase.class.getSimpleName(),
|
||||||
|
LuceneTestCase.class.getSimpleName());
|
||||||
|
assertTrue("Not all subclasses of " + ElasticsearchTestCase.class.getSimpleName() +
|
||||||
|
" match the naming convention. Concrete classes must end with [Test|Tests]: " + missingSuffix.toString(),
|
||||||
|
missingSuffix.isEmpty());
|
||||||
|
assertTrue("Pure Unit-Test found must subclass one of [" + classesToSubclass +"] " + pureUnitTest.toString(),
|
||||||
|
pureUnitTest.isEmpty());
|
||||||
|
assertTrue("Classes ending with Test|Tests] must subclass [" + classesToSubclass +"] " + notImplementing.toString(),
|
||||||
|
notImplementing.isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Some test the test classes
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Ignore
|
||||||
|
public static final class NotImplementingTests {}
|
||||||
|
@Ignore
|
||||||
|
public static final class NotImplementingTest {}
|
||||||
|
|
||||||
|
public static final class WrongName extends ElasticsearchTestCase {}
|
||||||
|
|
||||||
|
public static final class WrongNameTheSecond extends ElasticsearchLuceneTestCase {}
|
||||||
|
|
||||||
|
public static final class PlainUnit extends TestCase {}
|
||||||
|
|
||||||
|
public static final class PlainUnitTheSecond {
|
||||||
|
@Test
|
||||||
|
public void foo() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -22,6 +22,7 @@ package org.elasticsearch.common.cli;
|
||||||
import org.elasticsearch.ExceptionsHelper;
|
import org.elasticsearch.ExceptionsHelper;
|
||||||
import org.elasticsearch.common.Strings;
|
import org.elasticsearch.common.Strings;
|
||||||
import org.elasticsearch.test.ElasticsearchTestCase;
|
import org.elasticsearch.test.ElasticsearchTestCase;
|
||||||
|
import org.junit.Ignore;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
|
@ -33,7 +34,8 @@ import java.util.Locale;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class CliToolTestCase extends ElasticsearchTestCase {
|
@Ignore
|
||||||
|
public abstract class CliToolTestCase extends ElasticsearchTestCase {
|
||||||
|
|
||||||
protected static String[] args(String command) {
|
protected static String[] args(String command) {
|
||||||
if (!Strings.hasLength(command)) {
|
if (!Strings.hasLength(command)) {
|
||||||
|
|
|
@ -28,7 +28,7 @@ import org.apache.lucene.util.LuceneTestCase.SuppressCodecs;
|
||||||
import org.elasticsearch.test.ElasticsearchLuceneTestCase;
|
import org.elasticsearch.test.ElasticsearchLuceneTestCase;
|
||||||
|
|
||||||
@SuppressCodecs({ "Lucene3x", "Lucene40", "Lucene41", "Lucene42" }) // these codecs dont support missing values
|
@SuppressCodecs({ "Lucene3x", "Lucene40", "Lucene41", "Lucene42" }) // these codecs dont support missing values
|
||||||
public class TestReplaceMissing extends ElasticsearchLuceneTestCase {
|
public class ReplaceMissingTests extends ElasticsearchLuceneTestCase {
|
||||||
|
|
||||||
public void test() throws Exception {
|
public void test() throws Exception {
|
||||||
Directory dir = newDirectory();
|
Directory dir = newDirectory();
|
|
@ -37,7 +37,7 @@ import org.elasticsearch.test.ElasticsearchLuceneTestCase;
|
||||||
* segments is not longer needed.
|
* segments is not longer needed.
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public class TestLegacyVerification extends ElasticsearchLuceneTestCase {
|
public class LegacyVerificationTests extends ElasticsearchLuceneTestCase {
|
||||||
|
|
||||||
public void testAdler32() throws Exception {
|
public void testAdler32() throws Exception {
|
||||||
Adler32 expected = new Adler32();
|
Adler32 expected = new Adler32();
|
Loading…
Reference in New Issue