uschindler commented on a change in pull request #470: URL: https://github.com/apache/lucene/pull/470#discussion_r761470809
########## File path: lucene/distribution-tests/src/test/org/apache/lucene/distribution/TestModularLayer.java ########## @@ -108,4 +140,76 @@ public void testAllModulesHaveExpectedVersion() { .isEqualTo(luceneBuildVersion); } } + + /** Ensure SPIs are equal for the module and classpath layer. */ + @Test + public void testModularAndClasspathProvidersAreConsistent() throws IOException { + for (var module : allModules) { + TreeMap<String, TreeSet<String>> modularProviders = getModularServiceProviders(module); + TreeMap<String, TreeSet<String>> classpathProviders = getClasspathServiceProviders(module); + + // Compare services first so that the exception is shorter. + Assertions.assertThat(modularProviders.keySet()) + .as("Modular services in module: " + module.descriptor().name()) + .containsAll(classpathProviders.keySet()); + + // We're sure the services correspond to each other. Now, for each service, compare the + // providers. + for (var service : modularProviders.keySet()) { + Assertions.assertThat(modularProviders.get(service)) + .as( + "Modular providers of service " + + service + + " in module: " + + module.descriptor().name()) + .containsAll(classpathProviders.get(service)); + } + } + } + + private TreeMap<String, TreeSet<String>> getClasspathServiceProviders(ModuleReference module) + throws IOException { + TreeMap<String, TreeSet<String>> services = new TreeMap<>(); + Pattern serviceEntryPattern = Pattern.compile("META-INF/services/(?<serviceName>.+)"); + try (ModuleReader reader = module.open(); + Stream<String> entryStream = reader.list()) { + List<String> serviceProviderEntryList = + entryStream + .filter(entry -> serviceEntryPattern.matcher(entry).find()) + .collect(Collectors.toList()); + + for (String entry : serviceProviderEntryList) { + List<String> implementations; + try (InputStream is = reader.open(entry).get()) { + implementations = + Arrays.stream(new String(is.readAllBytes(), StandardCharsets.UTF_8).split("\n")) Review comment: Should we not use `split("[\r\n]+")`? This would also remove empty lines by default. Or alternatively use `BufferedReader::lines()`. ########## File path: lucene/distribution-tests/src/test/org/apache/lucene/distribution/TestModularLayer.java ########## @@ -108,4 +140,76 @@ public void testAllModulesHaveExpectedVersion() { .isEqualTo(luceneBuildVersion); } } + + /** Ensure SPIs are equal for the module and classpath layer. */ + @Test + public void testModularAndClasspathProvidersAreConsistent() throws IOException { + for (var module : allModules) { + TreeMap<String, TreeSet<String>> modularProviders = getModularServiceProviders(module); + TreeMap<String, TreeSet<String>> classpathProviders = getClasspathServiceProviders(module); + + // Compare services first so that the exception is shorter. + Assertions.assertThat(modularProviders.keySet()) + .as("Modular services in module: " + module.descriptor().name()) + .containsAll(classpathProviders.keySet()); + + // We're sure the services correspond to each other. Now, for each service, compare the + // providers. + for (var service : modularProviders.keySet()) { + Assertions.assertThat(modularProviders.get(service)) + .as( + "Modular providers of service " + + service + + " in module: " + + module.descriptor().name()) + .containsAll(classpathProviders.get(service)); Review comment: same here. ########## File path: lucene/distribution-tests/src/test/org/apache/lucene/distribution/TestModularLayer.java ########## @@ -108,4 +140,76 @@ public void testAllModulesHaveExpectedVersion() { .isEqualTo(luceneBuildVersion); } } + + /** Ensure SPIs are equal for the module and classpath layer. */ + @Test + public void testModularAndClasspathProvidersAreConsistent() throws IOException { + for (var module : allModules) { + TreeMap<String, TreeSet<String>> modularProviders = getModularServiceProviders(module); + TreeMap<String, TreeSet<String>> classpathProviders = getClasspathServiceProviders(module); + + // Compare services first so that the exception is shorter. + Assertions.assertThat(modularProviders.keySet()) + .as("Modular services in module: " + module.descriptor().name()) + .containsAll(classpathProviders.keySet()); Review comment: Should this not be equals, so both treesets should contain exactly same entries. This only checks if one contains the other (as far as I understand AssertJ). -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: issues-unsubscr...@lucene.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: issues-unsubscr...@lucene.apache.org For additional commands, e-mail: issues-h...@lucene.apache.org