From 85c0b44dcbbe4d201f8b7fd72a97c31c2d07a3ec Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Thu, 18 Aug 2016 12:03:05 +0100 Subject: [PATCH] Test that LaunchedURLClassLoader works when thread is interrupted Previously, RandomAccessDataFile used a semaphore and acquired it interruptibly. This meant that an interrupted thread was unable to access the file. Notably, this would prevent LaunchedURLClassLoader from loading classes or resources on an interrupted thread. The previous commit (937f857) updates RandomAccessDataFile to acquire the semaphore uninterruptibly. This commit adds a test to LaunchedURLClassLoader to verify that it can now load a resource from an interrupted thread. Closes gh-6683 --- .../loader/LaunchedURLClassLoaderTests.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/LaunchedURLClassLoaderTests.java b/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/LaunchedURLClassLoaderTests.java index 498796e7d92..8733a15051a 100644 --- a/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/LaunchedURLClassLoaderTests.java +++ b/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/LaunchedURLClassLoaderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2014 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,6 +36,7 @@ import static org.junit.Assert.assertTrue; * * @author Dave Syer * @author Phillip Webb + * @author Andy Wilkinson */ @SuppressWarnings("resource") public class LaunchedURLClassLoaderTests { @@ -101,4 +102,23 @@ public class LaunchedURLClassLoaderTests { assertThat(resource.openConnection().getInputStream().read(), equalTo(3)); } + @Test + public void resolveFromNestedWhileThreadIsInterrupted() throws Exception { + File file = this.temporaryFolder.newFile(); + TestJarCreator.createTestJar(file); + JarFile jarFile = new JarFile(file); + URL url = jarFile.getUrl(); + LaunchedURLClassLoader loader = new LaunchedURLClassLoader(new URL[] { url }, + null); + try { + Thread.currentThread().interrupt(); + URL resource = loader.getResource("nested.jar!/3.dat"); + assertThat(resource.toString(), equalTo(url + "nested.jar!/3.dat")); + assertThat(resource.openConnection().getInputStream().read(), equalTo(3)); + } + finally { + Thread.interrupted(); + } + } + }