Home / Class/ ApplicationResourceLoaderTests Class — spring-boot Architecture

ApplicationResourceLoaderTests Class — spring-boot Architecture

Architecture documentation for the ApplicationResourceLoaderTests class in ApplicationResourceLoaderTests.java from the spring-boot codebase.

Entity Profile

Source Code

core/spring-boot/src/test/java/org/springframework/boot/io/ApplicationResourceLoaderTests.java lines 49–365

class ApplicationResourceLoaderTests {

	private static final String SPRING_FACTORIES = "META-INF/spring.factories";

	private static final String TEST_PROTOCOL_RESOLVERS_FACTORIES = "META-INF/spring-test-protocol-resolvers.factories";

	private static final String TEST_BASE_64_VALUE = Base64.getEncoder().encodeToString("test".getBytes());

	@Test
	void getIncludesProtocolResolvers() throws IOException {
		ResourceLoader loader = ApplicationResourceLoader.get();
		Resource resource = loader.getResource("base64:" + TEST_BASE_64_VALUE);
		assertThat(contentAsString(resource)).isEqualTo("test");
	}

	@Test
	void shouldLoadAbsolutePath() throws IOException {
		Resource resource = ApplicationResourceLoader.get().getResource("/root/file.txt");
		assertThat(resource.isFile()).isTrue();
		assertThat(resource.getFile()).hasParent("/root").hasName("file.txt");
	}

	@Test
	void shouldLoadAbsolutePathWithWorkingDirectory() throws IOException {
		ClassLoader classLoader = getClass().getClassLoader();
		Resource resource = ApplicationResourceLoader
			.get(classLoader, SpringFactoriesLoader.forDefaultResourceLocation(classLoader),
					Path.of("/working-directory"))
			.getResource("/root/file.txt");
		assertThat(resource.isFile()).isTrue();
		assertThat(resource.getFile()).hasParent("/root").hasName("file.txt");
	}

	@Test
	void shouldLoadRelativeFilename() throws IOException {
		Resource resource = ApplicationResourceLoader.get().getResource("file.txt");
		assertThat(resource.isFile()).isTrue();
		assertThat(resource.getFile()).hasNoParent().hasName("file.txt");
	}

	@Test
	void shouldLoadRelativeFilenameWithWorkingDirectory() throws IOException {
		ClassLoader classLoader = getClass().getClassLoader();
		Resource resource = ApplicationResourceLoader
			.get(classLoader, SpringFactoriesLoader.forDefaultResourceLocation(classLoader),
					Path.of("/working-directory"))
			.getResource("file.txt");
		assertThat(resource.isFile()).isTrue();
		assertThat(resource.getFile()).hasParent("/working-directory").hasName("file.txt");
	}

	@Test
	void shouldLoadRelativePathWithWorkingDirectory() throws IOException {
		ClassLoader classLoader = getClass().getClassLoader();
		Resource resource = ApplicationResourceLoader
			.get(classLoader, SpringFactoriesLoader.forDefaultResourceLocation(classLoader),
					Path.of("/working-directory"))
			.getResource("a/file.txt");
		assertThat(resource.isFile()).isTrue();
		assertThat(resource.getFile()).hasParent("/working-directory/a").hasName("file.txt");
	}

	@Test
	@WithResource(name = "a-file")
	void shouldLoadClasspathLocations() {
		Resource resource = ApplicationResourceLoader.get().getResource("classpath:a-file");
		assertThat(resource.exists()).isTrue();
	}

	@Test
	void shouldLoadNonExistentClasspathLocations() {
		Resource resource = ApplicationResourceLoader.get().getResource("classpath:doesnt-exist");
		assertThat(resource.exists()).isFalse();
	}

	@Test
	@WithResource(name = "a-file", content = "some content")
	void shouldLoadClasspathLocationsWithWorkingDirectory() {
		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
		Resource resource = ApplicationResourceLoader
			.get(classLoader, SpringFactoriesLoader.forDefaultResourceLocation(classLoader),
					Path.of("/working-directory"))
			.getResource("classpath:a-file");
		assertThat(resource.exists()).isTrue();
	}

	@Test
	void shouldLoadNonExistentClasspathLocationsWithWorkingDirectory() {
		ClassLoader classLoader = getClass().getClassLoader();
		Resource resource = ApplicationResourceLoader
			.get(classLoader, SpringFactoriesLoader.forDefaultResourceLocation(classLoader),
					Path.of("/working-directory"))
			.getResource("classpath:doesnt-exist");
		assertThat(resource.exists()).isFalse();
	}

	@Test
	void shouldLoadRelativeFileUris() throws IOException {
		Resource resource = ApplicationResourceLoader.get().getResource("file:file.txt");
		assertThat(resource.isFile()).isTrue();
		assertThat(resource.getFile()).hasNoParent().hasName("file.txt");
	}

	@Test
	void shouldLoadAbsoluteFileUris() throws IOException {
		Resource resource = ApplicationResourceLoader.get().getResource("file:/file.txt");
		assertThat(resource.isFile()).isTrue();
		assertThat(resource.getFile()).hasParent("/").hasName("file.txt");
	}

	@Test
	void shouldLoadRelativeFileUrisWithWorkingDirectory() throws IOException {
		ClassLoader classLoader = getClass().getClassLoader();
		Resource resource = ApplicationResourceLoader
			.get(classLoader, SpringFactoriesLoader.forDefaultResourceLocation(classLoader),
					Path.of("/working-directory"))
			.getResource("file:file.txt");
		assertThat(resource.isFile()).isTrue();
		assertThat(resource.getFile()).hasParent("/working-directory").hasName("file.txt");
	}

	@Test
	void shouldLoadAbsoluteFileUrisWithWorkingDirectory() throws IOException {
		ClassLoader classLoader = getClass().getClassLoader();
		Resource resource = ApplicationResourceLoader
			.get(classLoader, SpringFactoriesLoader.forDefaultResourceLocation(classLoader),
					Path.of("/working-directory"))
			.getResource("file:/file.txt");
		assertThat(resource.isFile()).isTrue();
		assertThat(resource.getFile()).hasParent("/").hasName("file.txt");
	}

	@Test
	@WithResource(name = TEST_PROTOCOL_RESOLVERS_FACTORIES,
			content = "org.springframework.core.io.ProtocolResolver=org.springframework.boot.io.ReverseStringProtocolResolver")
	void getWithClassPathIncludesProtocolResolvers() throws IOException {
		ClassLoader classLoader = new TestClassLoader(this::useTestProtocolResolversFactories);
		ResourceLoader loader = ApplicationResourceLoader.get(classLoader);
		Resource resource = loader.getResource("reverse:test");
		assertThat(contentAsString(resource)).isEqualTo("tset");
	}

	@Test
	void getWithClassPathWhenClassPathIsNullIncludesProtocolResolvers() throws IOException {
		ResourceLoader loader = ApplicationResourceLoader.get((ClassLoader) null);
		Resource resource = loader.getResource("base64:" + TEST_BASE_64_VALUE);
		assertThat(contentAsString(resource)).isEqualTo("test");
	}

	@Test
	@WithResource(name = TEST_PROTOCOL_RESOLVERS_FACTORIES,
			content = "org.springframework.core.io.ProtocolResolver=org.springframework.boot.io.ReverseStringProtocolResolver")
	void getWithClassPathAndSpringFactoriesLoaderIncludesProtocolResolvers() throws IOException {
		SpringFactoriesLoader springFactoriesLoader = SpringFactoriesLoader
			.forResourceLocation(TEST_PROTOCOL_RESOLVERS_FACTORIES, Thread.currentThread().getContextClassLoader());
		ResourceLoader loader = ApplicationResourceLoader.get((ClassLoader) null, springFactoriesLoader);
		Resource resource = loader.getResource("reverse:test");
		assertThat(contentAsString(resource)).isEqualTo("tset");
	}

	@Test
	@SuppressWarnings("NullAway") // Test null check
	void getWithClassPathAndSpringFactoriesLoaderWhenSpringFactoriesLoaderIsNullThrowsException() {
		assertThatIllegalArgumentException().isThrownBy(() -> ApplicationResourceLoader.get((ClassLoader) null, null))
			.withMessage("'springFactoriesLoader' must not be null");
	}

	@Test
	void getWithResourceLoaderIncludesProtocolResolvers() throws IOException {
		ResourceLoader loader = ApplicationResourceLoader.get(new DefaultResourceLoader());
		Resource resource = loader.getResource("base64:" + TEST_BASE_64_VALUE);
		assertThat(contentAsString(resource)).isEqualTo("test");
	}

	@Test
	void getWithResourceLoaderDelegatesLoading() throws IOException {
		DefaultResourceLoader delegate = new TestResourceLoader();
		ResourceLoader loader = ApplicationResourceLoader.get(delegate);
		assertThat(contentAsString(loader.getResource("spring"))).isEqualTo("boot");
	}

	@Test
	@SuppressWarnings("NullAway") // Test null check
	void getWithResourceLoaderWhenResourceLoaderIsNullThrowsException() {
		assertThatIllegalArgumentException().isThrownBy(() -> ApplicationResourceLoader.get((ResourceLoader) null))
			.withMessage("'resourceLoader' must not be null");
	}

	@Test
	void getWithResourceLoaderAndSpringFactoriesLoaderIncludesProtocolResolvers() throws IOException {
		DefaultResourceLoader delegate = new TestResourceLoader();
		ResourceLoader loader = ApplicationResourceLoader.get(delegate);
		Resource resource = loader.getResource("base64:" + TEST_BASE_64_VALUE);
		assertThat(contentAsString(resource)).isEqualTo("test");
	}

	@Test
	@SuppressWarnings("NullAway") // Test null check
	void getWithResourceLoaderAndSpringFactoriesLoaderWhenResourceLoaderIsNullThrowsException() {
		SpringFactoriesLoader springFactoriesLoader = SpringFactoriesLoader
			.forResourceLocation(TEST_PROTOCOL_RESOLVERS_FACTORIES);
		assertThatIllegalArgumentException()
			.isThrownBy(() -> ApplicationResourceLoader.get((ResourceLoader) null, springFactoriesLoader))
			.withMessage("'resourceLoader' must not be null");
	}

	@Test
	@SuppressWarnings("NullAway") // Test null check
	void getWithResourceLoaderAndSpringFactoriesLoaderWhenSpringFactoriesLoaderIsNullThrowsException() {
		assertThatIllegalArgumentException()
			.isThrownBy(() -> ApplicationResourceLoader.get(new TestResourceLoader(), null))
			.withMessage("'springFactoriesLoader' must not be null");
	}

	@Test
	void getResourceWhenPathIsRelative() throws IOException {
		ResourceLoader loader = ApplicationResourceLoader.get();
		String name = "relative/path/file.txt";
		Resource resource = loader.getResource(name);
		File resourceFile = resource.getFile();
		assertThat(resourceFile).isRelative();
		assertThat(resourceFile).isEqualTo(new File(name));
	}

	@Test
	@WithResource(name = TEST_PROTOCOL_RESOLVERS_FACTORIES,
			content = "org.springframework.core.io.ProtocolResolver=org.springframework.boot.io.ReverseStringProtocolResolver")
	void getResourceWhenPathIsAbsolute(@ResourcePath(TEST_PROTOCOL_RESOLVERS_FACTORIES) File file) throws IOException {
		ResourceLoader loader = ApplicationResourceLoader.get();
		Resource resource = loader.getResource(file.getAbsolutePath());
		assertThat(resource.getFile()).hasSameBinaryContentAs(file);
	}

	@Test
	@SuppressWarnings("NullAway") // Test null check
	void getResourceWhenPathIsNull() {
		ResourceLoader loader = ApplicationResourceLoader.get();
		assertThatIllegalArgumentException().isThrownBy(() -> loader.getResource(null))
			.withMessage("Location must not be null");
	}

	@Test
	void getResourceWithPreferFileResolutionWhenFullPathWithClassPathResource() throws Exception {
		File file = new File("src/main/resources/a-file");
		ResourceLoader loader = ApplicationResourceLoader.get(new DefaultResourceLoader(), true);
		Resource resource = loader.getResource(file.getAbsolutePath());
		assertThat(resource).isInstanceOf(FileSystemResource.class);
		assertThat(resource.getFile().getAbsoluteFile()).isEqualTo(file.getAbsoluteFile());
		ResourceLoader regularLoader = ApplicationResourceLoader.get(new DefaultResourceLoader(), false);
		assertThat(regularLoader.getResource(file.getAbsolutePath())).isInstanceOf(ClassPathResource.class);
	}

	@Test
	void getResourceWithPreferFileResolutionWhenRelativePathWithClassPathResource() throws Exception {
		ResourceLoader loader = ApplicationResourceLoader.get(new DefaultResourceLoader(), true);
		Resource resource = loader.getResource("src/main/resources/a-file");
		assertThat(resource).isInstanceOf(FileSystemResource.class);
		assertThat(resource.getFile().getAbsoluteFile())
			.isEqualTo(new File("src/main/resources/a-file").getAbsoluteFile());
		ResourceLoader regularLoader = ApplicationResourceLoader.get(new DefaultResourceLoader(), false);
		assertThat(regularLoader.getResource("src/main/resources/a-file")).isInstanceOf(ClassPathResource.class);
	}

	@Test
	void getResourceWithPreferFileResolutionWhenExplicitClassPathPrefix() {
		ResourceLoader loader = ApplicationResourceLoader.get(new DefaultResourceLoader(), true);
		Resource resource = loader.getResource("classpath:a-file");
		assertThat(resource).isInstanceOf(ClassPathResource.class);
	}

	@Test
	void getClassLoaderReturnsDelegateClassLoader() {
		ClassLoader classLoader = new TestClassLoader(this::useTestProtocolResolversFactories);
		ResourceLoader loader = ApplicationResourceLoader.get(new DefaultResourceLoader(classLoader));
		assertThat(loader.getClassLoader()).isSameAs(classLoader);
	}

	private String contentAsString(Resource resource) throws IOException {
		return resource.getContentAsString(StandardCharsets.UTF_8);
	}

	private String useTestProtocolResolversFactories(String name) {
		return (!SPRING_FACTORIES.equals(name)) ? name : TEST_PROTOCOL_RESOLVERS_FACTORIES;
	}

	static class TestClassLoader extends ClassLoader {

		private final UnaryOperator<String> mapper;

		TestClassLoader(UnaryOperator<String> mapper) {
			super(Thread.currentThread().getContextClassLoader());
			this.mapper = mapper;
		}

		@Override
		public URL getResource(String name) {
			return super.getResource(this.mapper.apply(name));
		}

		@Override
		public Enumeration<URL> getResources(String name) throws IOException {
			return super.getResources(this.mapper.apply(name));
		}

	}

	static class TestResourceLoader extends DefaultResourceLoader {

		@Override
		public Resource getResource(String location) {
			return (!"spring".equals(location)) ? super.getResource(location)
					: new ByteArrayResource("boot".getBytes(StandardCharsets.UTF_8));
		}

	}

}

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free