Skip to content

Commit e7b5076

Browse files
authored
Adding testUsedMaxMindResponseClassesAreAccountedFor back to MaxMindSupportTests (elastic#115706) (elastic#115780)
1 parent 8197df9 commit e7b5076

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed

modules/ingest-geoip/src/test/java/org/elasticsearch/ingest/geoip/MaxMindSupportTests.java

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@
2424
import com.maxmind.geoip2.record.MaxMind;
2525

2626
import org.elasticsearch.common.util.set.Sets;
27+
import org.elasticsearch.core.SuppressForbidden;
2728
import org.elasticsearch.test.ESTestCase;
2829

2930
import java.lang.reflect.Method;
31+
import java.lang.reflect.Modifier;
3032
import java.lang.reflect.ParameterizedType;
3133
import java.lang.reflect.Type;
3234
import java.net.InetAddress;
@@ -479,6 +481,36 @@ public void testUnknownMaxMindResponseClassess() {
479481
);
480482
}
481483

484+
/*
485+
* This tests that this test has a mapping in TYPE_TO_MAX_MIND_CLASS for all MaxMind classes exposed through GeoIpDatabase.
486+
*/
487+
public void testUsedMaxMindResponseClassesAreAccountedFor() {
488+
Set<Class<? extends AbstractResponse>> usedMaxMindResponseClasses = getUsedMaxMindResponseClasses();
489+
Set<Class<? extends AbstractResponse>> supportedMaxMindClasses = new HashSet<>(TYPE_TO_MAX_MIND_CLASS.values());
490+
Set<Class<? extends AbstractResponse>> usedButNotSupportedMaxMindResponseClasses = Sets.difference(
491+
usedMaxMindResponseClasses,
492+
supportedMaxMindClasses
493+
);
494+
assertThat(
495+
"MaxmindIpDataLookups exposes MaxMind response classes that this test does not know what to do with. Add mappings to "
496+
+ "TYPE_TO_MAX_MIND_CLASS for the following: "
497+
+ usedButNotSupportedMaxMindResponseClasses,
498+
usedButNotSupportedMaxMindResponseClasses,
499+
empty()
500+
);
501+
Set<Class<? extends AbstractResponse>> supportedButNotUsedMaxMindClasses = Sets.difference(
502+
supportedMaxMindClasses,
503+
usedMaxMindResponseClasses
504+
);
505+
assertThat(
506+
"This test claims to support MaxMind response classes that are not exposed in GeoIpDatabase. Remove the following from "
507+
+ "TYPE_TO_MAX_MIND_CLASS: "
508+
+ supportedButNotUsedMaxMindClasses,
509+
supportedButNotUsedMaxMindClasses,
510+
empty()
511+
);
512+
}
513+
482514
/*
483515
* This is the list of field types that causes us to stop recursing. That is, fields of these types are the lowest-level fields that
484516
* we care about.
@@ -597,4 +629,34 @@ private static String getFormattedList(Set<String> fields) {
597629
}
598630
return result.toString();
599631
}
632+
633+
/*
634+
* This returns all AbstractResponse classes that are declared in transform methods in classes defined in MaxmindIpDataLookups.
635+
*/
636+
@SuppressWarnings("unchecked")
637+
@SuppressForbidden(reason = "Need declared classes and methods")
638+
private static Set<Class<? extends AbstractResponse>> getUsedMaxMindResponseClasses() {
639+
Set<Class<? extends AbstractResponse>> result = new HashSet<>();
640+
Class<?>[] declaredClasses = MaxmindIpDataLookups.class.getDeclaredClasses();
641+
for (Class<?> declaredClass : declaredClasses) {
642+
if (Modifier.isAbstract(declaredClass.getModifiers())) {
643+
continue;
644+
}
645+
Method[] declaredMethods = declaredClass.getDeclaredMethods();
646+
Optional<Method> nonAbstractTransformMethod = Arrays.stream(declaredMethods)
647+
.filter(
648+
method -> method.getName().equals("transform")
649+
&& method.getParameterTypes().length == 1
650+
&& Modifier.isAbstract(method.getParameterTypes()[0].getModifiers()) == false
651+
)
652+
.findAny();
653+
if (nonAbstractTransformMethod.isPresent()) {
654+
Class<?> responseClass = nonAbstractTransformMethod.get().getParameterTypes()[0];
655+
if (AbstractResponse.class.isAssignableFrom(responseClass)) {
656+
result.add((Class<? extends AbstractResponse>) responseClass);
657+
}
658+
}
659+
}
660+
return result;
661+
}
600662
}

0 commit comments

Comments
 (0)