Skip to content

Commit 7592483

Browse files
committed
Add Test to Report Missing serialVersionUID
Issue gh-16276
1 parent f7b9b72 commit 7592483

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

config/spring-security-config.gradle

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,17 @@ configure(project.tasks.withType(Test)) {
172172
}
173173
}
174174

175+
test {
176+
onOutput { descriptor, event ->
177+
if (!project.hasProperty('serialization')) {
178+
return
179+
}
180+
if (descriptor.name=='listClassesMissingSerialVersion()') {
181+
logger.lifecycle(event.message)
182+
}
183+
}
184+
}
185+
175186
tasks.register("opensaml5Test", Test) {
176187
filter {
177188
includeTestsMatching "org.springframework.security.config.annotation.web.configurers.saml2.*"

config/src/test/java/org/springframework/security/SpringSecurityCoreVersionSerializableTests.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.io.ObjectOutputStream;
2626
import java.io.ObjectStreamClass;
2727
import java.io.Serializable;
28+
import java.lang.reflect.Field;
2829
import java.lang.reflect.Modifier;
2930
import java.nio.file.Files;
3031
import java.nio.file.Path;
@@ -36,6 +37,7 @@
3637
import java.util.List;
3738
import java.util.Map;
3839
import java.util.Set;
40+
import java.util.stream.Collectors;
3941
import java.util.stream.Stream;
4042

4143
import org.apereo.cas.client.validation.AssertionImpl;
@@ -44,6 +46,7 @@
4446
import org.instancio.Select;
4547
import org.instancio.generator.Generator;
4648
import org.junit.jupiter.api.Disabled;
49+
import org.junit.jupiter.api.Test;
4750
import org.junit.jupiter.params.ParameterizedTest;
4851
import org.junit.jupiter.params.provider.MethodSource;
4952

@@ -289,6 +292,39 @@ static Stream<Path> getFilesToDeserialize() throws IOException {
289292
return Files.list(previousVersionFolder);
290293
}
291294

295+
@Test
296+
void listClassesMissingSerialVersion() throws Exception {
297+
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
298+
provider.addIncludeFilter(new AssignableTypeFilter(Serializable.class));
299+
List<Class<?>> classes = new ArrayList<>();
300+
301+
Set<BeanDefinition> components = provider.findCandidateComponents("org/springframework/security");
302+
for (BeanDefinition component : components) {
303+
Class<?> clazz = Class.forName(component.getBeanClassName());
304+
boolean isAbstract = Modifier.isAbstract(clazz.getModifiers());
305+
if (isAbstract) {
306+
continue;
307+
}
308+
if (clazz.isEnum()) {
309+
continue;
310+
}
311+
if (clazz.getName().contains("Tests")) {
312+
continue;
313+
}
314+
boolean hasSerialVersion = Stream.of(clazz.getDeclaredFields())
315+
.map(Field::getName)
316+
.anyMatch((n) -> n.equals("serialVersionUID"));
317+
if (!hasSerialVersion) {
318+
classes.add(clazz);
319+
}
320+
}
321+
if (!classes.isEmpty()) {
322+
System.out
323+
.println("Found " + classes.size() + " Serializable classes that don't declare a seriallVersionUID");
324+
System.out.println(classes.stream().map(Class::getName).collect(Collectors.joining("\r\n")));
325+
}
326+
}
327+
292328
static Stream<Class<?>> getClassesToSerialize() throws Exception {
293329
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
294330
provider.addIncludeFilter(new AssignableTypeFilter(Serializable.class));

0 commit comments

Comments
 (0)