Introduce check for names of test classes

patch by Stefan Miklosovic; reviewed by Berenguer Blasi and David Capwell for CASSANDRA-17943
This commit is contained in:
Stefan Miklosovic 2023-01-28 16:18:51 +01:00
parent 9a64be3234
commit 4c8e9097bd
No known key found for this signature in database
GPG Key ID: 32F35CB2F546D93E
7 changed files with 106 additions and 6 deletions

View File

@ -1,4 +1,5 @@
3.0.29
* Introduce check for names of test classes (CASSANDRA-17964)
* Suppress CVE-2021-1471, CVE-2021-3064, CVE-2021-4235 (CASSANDRA-18149)
* Switch to snakeyaml's SafeConstructor (CASSANDRA-18150)
* Expand build.dir property in rat targets (CASSANDRA-18183)

View File

@ -67,6 +67,7 @@
<property name="test.classlistfile" value="testlist.txt"/>
<property name="test.classlistprefix" value="unit"/>
<property name="benchmark.name" value=""/>
<property name="test.anttasks.src" value="${test.dir}/anttasks"/>
<property name="test.methods" value=""/>
<property name="test.unit.src" value="${test.dir}/unit"/>
<property name="test.long.src" value="${test.dir}/long"/>
@ -360,7 +361,7 @@
</dependency>
<dependency groupId="org.mockito" artifactId="mockito-core" version="3.2.4" scope="test"/>
<dependency groupId="org.apache.cassandra" artifactId="dtest-api" version="0.0.13" scope="test"/>
<dependency groupId="org.reflections" artifactId="reflections" version="0.9.12" scope="test"/>
<dependency groupId="org.reflections" artifactId="reflections" version="0.10.2" scope="test"/>
<dependency groupId="org.quicktheories" artifactId="quicktheories" version="0.25" scope="test"/>
<dependency groupId="org.apache.hadoop" artifactId="hadoop-core" version="1.0.3" scope="provided">
<exclusion groupId="org.mortbay.jetty" artifactId="servlet-api"/>
@ -1097,6 +1098,7 @@
<path refid="cassandra.classpath.test"/>
</classpath>
<compilerarg value="-XDignore.symbol.file"/>
<src path="${test.anttasks.src}"/>
<src path="${test.unit.src}"/>
<src path="${test.long.src}"/>
<src path="${test.burn.src}"/>
@ -1104,12 +1106,25 @@
<src path="${test.distributed.src}"/>
</javac>
<checktestnameshelper/>
<!-- Non-java resources needed by the test suite -->
<copy todir="${test.classes}">
<fileset dir="${test.resources}"/>
</copy>
</target>
<macrodef name="checktestnameshelper">
<sequential>
<taskdef name="test-name-check_" classname="org.apache.cassandra.anttasks.TestNameCheckTask" classpath="${test.classes}">
<classpath>
<path refid="cassandra.classpath.test"/>
</classpath>
</taskdef>
<test-name-check_/>
</sequential>
</macrodef>
<!-- Run tests separately and report errors after and generate a junit report -->
<macrodef name="testhelper">
<attribute name="testdelegate"/>

View File

@ -0,0 +1,85 @@
/*
* 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.cassandra.anttasks;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.List;
import java.util.Set;
import java.util.stream.Stream;
import org.junit.Test;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
import org.reflections.Reflections;
import org.reflections.scanners.Scanners;
import org.reflections.util.ConfigurationBuilder;
import static java.util.stream.Collectors.toList;
public class TestNameCheckTask extends Task
{
private static final Reflections reflections = new Reflections(new ConfigurationBuilder()
.forPackage("org.apache.cassandra")
.setScanners(Scanners.MethodsAnnotated, Scanners.SubTypes)
.setExpandSuperTypes(true)
.setParallel(true));
public TestNameCheckTask()
{
}
@Override
public void execute() throws BuildException
{
Set<Method> methodsAnnotatedWith = reflections.getMethodsAnnotatedWith(Test.class);
List<String> testFiles = methodsAnnotatedWith.stream().map(Method::getDeclaringClass).distinct()
.flatMap(TestNameCheckTask::expand)
.map(TestNameCheckTask::normalize)
.map(Class::getCanonicalName)
.filter(s -> !s.endsWith("Test"))
.distinct().sorted()
.collect(toList());
if (!testFiles.isEmpty())
throw new BuildException("Detected tests that have a bad naming convention. All tests have to end on 'Test': \n" + String.join("\n", testFiles));
}
private static Class<?> normalize(Class<?> klass)
{
for (; klass.getEnclosingClass() != null; klass = klass.getEnclosingClass())
{
}
return klass;
}
private static Stream<Class<?>> expand(Class<?> klass)
{
Set<? extends Class<?>> subTypes = reflections.getSubTypesOf(klass);
if (subTypes == null || subTypes.isEmpty())
return Stream.of(klass);
Stream<Class<?>> subs = (Stream<Class<?>>) subTypes.stream();
// assume we include if not abstract
if (!Modifier.isAbstract(klass.getModifiers()))
subs = Stream.concat(Stream.of(klass), subs);
return subs;
}
}

View File

@ -41,7 +41,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
public class ByteBuddyExamples extends TestBaseImpl
public class ByteBuddyExamplesTest extends TestBaseImpl
{
@Test
public void writeFailureTest() throws Throwable

View File

@ -30,7 +30,7 @@ import static org.apache.cassandra.distributed.api.Feature.GOSSIP;
import static org.apache.cassandra.distributed.api.Feature.NATIVE_PROTOCOL;
import static org.apache.cassandra.distributed.api.Feature.NETWORK;
public class ReprepareTestOldBehaviour extends ReprepareTestBase
public class ReprepareOldBehaviourTest extends ReprepareTestBase
{
@Test
public void testReprepareMixedVersion() throws Throwable

View File

@ -30,7 +30,7 @@ import org.junit.Test;
import java.io.IOException;
public class BatchTests extends CQLTester
public class BatchTest extends CQLTester
{
private static EmbeddedCassandraService cassandra;

View File

@ -27,10 +27,9 @@ import java.util.UUID;
import org.junit.Test;
import org.apache.cassandra.db.marshal.TimeUUIDType;
import org.apache.cassandra.utils.UUIDGen;
public class UUIDTests
public class UUIDTest
{
@Test
public void verifyType1()