blob: a1e23d45e2b436d66a066bac8cfcd69973f34d96 [file] [log] [blame]
/*
* 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.geode;
import static org.apache.geode.test.util.ResourceUtils.createTempFileFromResource;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.jar.JarFile;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.commons.io.FileUtils;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.apache.geode.test.junit.categories.RestAPITest;
import org.apache.geode.test.junit.rules.RequiresGeodeHome;
@Category(RestAPITest.class)
public class BundledJarsJUnitTest {
private static final String VERSION_PATTERN = "[0-9-_.v]{3,}.*\\.jar$";
private static final String GEODE_HOME = System.getenv("GEODE_HOME");
private Set<String> expectedJars;
@Rule
public RequiresGeodeHome requiresGeodeHome = new RequiresGeodeHome();
@Before
public void loadExpectedJars() throws IOException {
String expectedJarFile =
createTempFileFromResource(BundledJarsJUnitTest.class, "/expected_jars.txt")
.getAbsolutePath();
expectedJars = Files.lines(Paths.get(expectedJarFile)).collect(Collectors.toSet());
}
@Test
public void verifyBundledJarsHaveNotChanged() throws IOException {
Map<String, String> sortedJars = getBundledJars();
Stream<String> lines =
sortedJars.entrySet().stream().map(entry -> removeVersion(entry.getKey()));
Set<String> bundledJarNames = new TreeSet<>(lines.collect(Collectors.toSet()));
Files.write(Paths.get("..", "bundled_jars.txt"), bundledJarNames);
Set<String> newJars = new TreeSet<>(bundledJarNames);
newJars.removeAll(expectedJars);
Set<String> missingJars = new TreeSet<>(expectedJars);
missingJars.removeAll(bundledJarNames);
String message =
"The bundled jars have changed. Please make sure you update the licence and notice"
+ System.lineSeparator()
+ "as described in https://cwiki.apache.org/confluence/display/GEODE/License+Guide+for+Contributors"
+ System.lineSeparator()
+ "When fixed, copy geode-assembly/build/integrationTest/bundled_jars.txt"
+ System.lineSeparator()
+ "to geode-assembly/src/integrationTest/resources/expected_jars.txt"
+ System.lineSeparator() + "Removed Jars" + System.lineSeparator() + "--------------"
+ System.lineSeparator() + String.join(System.lineSeparator(), missingJars)
+ System.lineSeparator() + System.lineSeparator() + "Added Jars"
+ System.lineSeparator() + "--------------" + System.lineSeparator()
+ String.join(System.lineSeparator(), newJars) + System.lineSeparator()
+ System.lineSeparator();
assertTrue(message, expectedJars.equals(bundledJarNames));
}
/**
* Find all of the jars bundled with the project. Key is the name of the jar, value is the path.
*/
private Map<String, String> getBundledJars() {
File geodeHomeDirectory = new File(GEODE_HOME);
assertTrue(
"Please set the GEODE_HOME environment variable to the product installation directory.",
geodeHomeDirectory.isDirectory());
Collection<File> jars = FileUtils.listFiles(geodeHomeDirectory, new String[] {"jar"}, true);
Map<String, String> sortedJars = new TreeMap<>();
jars.forEach(jar -> sortedJars.put(jar.getName(), jar.getPath()));
Collection<File> wars = FileUtils.listFiles(geodeHomeDirectory, new String[] {"war"}, true);
Set<File> sortedWars = new TreeSet<>(wars);
sortedWars.stream().flatMap(BundledJarsJUnitTest::extractJarNames)
.forEach(jar -> sortedJars.put(jar.getName(), jar.getPath()));
sortedJars.keySet().removeIf(s -> s.startsWith("geode"));
return sortedJars;
}
private String removeVersion(String name) {
return name.replaceAll(VERSION_PATTERN, "");
}
/**
* Find of of the jar files embedded within a war
*/
private static Stream<File> extractJarNames(File war) {
try (JarFile warContents = new JarFile(war)) {
return warContents.stream()
// Look for jars in the war
.filter(entry -> entry.getName().endsWith(".jar"))
// Create a File with a path that includes the war name
.map(entry -> new File(war.getName(), entry.getName()))
// Materialize the list of files while the war is still open
.collect(Collectors.toList()).stream();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
}