blob: 991b91e13b5878976d146676a09cda6c45e8fadf [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.tuweni.io;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.apache.tuweni.junit.TempDirectory;
import org.apache.tuweni.junit.TempDirectoryExtension;
import java.io.File;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.net.URI;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import javax.annotation.Nonnull;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@ExtendWith(TempDirectoryExtension.class)
class ResourcesTest {
@Test
void shouldSplitGlob() {
assertEquals(Arrays.asList("foo", "*.bar"), Arrays.asList(Resources.globRoot("foo/*.bar")));
assertEquals(Arrays.asList("foo", "bar.?"), Arrays.asList(Resources.globRoot("foo/bar.?")));
assertEquals(Arrays.asList("foo/baz", "*.bar"), Arrays.asList(Resources.globRoot("foo/baz/*.bar")));
assertEquals(Arrays.asList("foo/baz", "bar.?"), Arrays.asList(Resources.globRoot("foo/baz/bar.?")));
assertEquals(Collections.singletonList("foo/*.bar"), Arrays.asList(Resources.globRoot("foo/\\*.bar")));
assertEquals(Arrays.asList("foo/*.bar", "*.baz"), Arrays.asList(Resources.globRoot("foo/\\*.bar/*.baz")));
assertEquals(Arrays.asList("", "*.bar"), Arrays.asList(Resources.globRoot("*.bar")));
assertEquals(Arrays.asList("", "**/*.bar"), Arrays.asList(Resources.globRoot("**/*.bar")));
}
private void copy(Path source, Path dest) {
try {
if (!dest.toString().equals("")) {
Files.copy(source, dest, StandardCopyOption.REPLACE_EXISTING);
}
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
@Test
@SuppressWarnings({"MustBeClosedChecker", "StreamResourceLeak"})
void shouldIterateResourcesOnFileSystemAndInJars(@TempDirectory Path folder) throws Exception {
Files.createDirectories(folder.resolve("org/apache/tuweni/io/file/resourceresolver"));
Files.createDirectory(folder.resolve("org/apache/tuweni/io/file/resourceresolver/subdir"));
Files.createFile(folder.resolve("org/apache/tuweni/io/file/resourceresolver/test.txt"));
Files.createFile(folder.resolve("org/apache/tuweni/io/file/resourceresolver/test1.txt"));
Files.createFile(folder.resolve("org/apache/tuweni/io/file/resourceresolver/test2.txt"));
Files.createFile(folder.resolve("org/apache/tuweni/io/file/resourceresolver/subdir/test3.yaml"));
Files.createDirectory(folder.resolve("org/apache/tuweni/io/file/resourceresolver/anotherdir"));
Files.createFile(folder.resolve("org/apache/tuweni/io/file/resourceresolver/anotherdir/test6.yaml"));
Files.createFile(folder.resolve("org/apache/tuweni/io/file/resourceresolver/anotherdir/test5.txt"));
URI jarFile = URI.create("jar:" + folder.resolve("resourceresolvertest.jar").toUri());
try (FileSystem zipfs = FileSystems.newFileSystem(jarFile, Collections.singletonMap("create", "true"));) {
Files.walk(folder).forEach(source -> copy(source, zipfs.getPath(folder.relativize(source).toString())));
}
Files
.walk(folder.resolve("org/apache/tuweni/io/file/resourceresolver/anotherdir"))
.sorted(Comparator.reverseOrder())
.map(Path::toFile)
.forEach(File::delete);
URLClassLoader classLoader = new URLClassLoader(
new URL[] {
new URL("file:" + folder.toString() + "/"),
new URL("file:" + folder.resolve("resourceresolvertest.jar").toString())});
List<URL> all =
Resources.find(classLoader, "/org/apache/tuweni/io/file/resourceresolver/**").collect(Collectors.toList());
assertEquals(14, all.size(), () -> describeExpectation(14, all));
List<URL> txtFiles = Resources.find(classLoader, "org/**/test*.txt").collect(Collectors.toList());
assertEquals(7, txtFiles.size(), () -> describeExpectation(7, txtFiles));
List<URL> txtFilesFromRoot = Resources.find(classLoader, "/**/test?.txt").collect(Collectors.toList());
assertEquals(5, txtFilesFromRoot.size(), () -> describeExpectation(5, txtFilesFromRoot));
List<URL> txtFilesFromRoot2 = Resources.find(classLoader, "//**/test*.txt").collect(Collectors.toList());
assertEquals(7, txtFilesFromRoot2.size(), () -> describeExpectation(7, txtFilesFromRoot2));
List<URL> txtFilesFromRoot3 = Resources.find(classLoader, "///**/test*.txt").collect(Collectors.toList());
assertEquals(7, txtFilesFromRoot3.size(), () -> describeExpectation(7, txtFilesFromRoot3));
List<URL> txtFilesInDir = Resources.find(classLoader, "**/anotherdir/*.txt").collect(Collectors.toList());
assertEquals(1, txtFilesInDir.size(), () -> describeExpectation(1, txtFilesInDir));
}
@Nonnull
private String describeExpectation(int count, List<URL> urls) {
return "Should have contained "
+ count
+ " items, but got "
+ urls.size()
+ ": \n "
+ urls.stream().map(URL::toString).collect(Collectors.joining("\n "));
}
}