diff --git a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyHandlers.java b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyHandlers.java index 541235784cba..2b404b3ae945 100644 --- a/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyHandlers.java +++ b/examples/embedded/src/main/java/org/eclipse/jetty/embedded/ManyHandlers.java @@ -18,8 +18,9 @@ package org.eclipse.jetty.embedded; -import java.io.File; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -120,8 +121,8 @@ public static Server createServer(int port) throws IOException gzipHandler.addIncludedMimeTypes("text/html"); // configure request logging - File requestLogFile = File.createTempFile("demo", "log"); - CustomRequestLog ncsaLog = new CustomRequestLog(requestLogFile.getAbsolutePath()); + Path requestLogFile = Files.createTempFile("demo", "log"); + CustomRequestLog ncsaLog = new CustomRequestLog(requestLogFile.toString()); server.setRequestLog(ncsaLog); // create the handler collections diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/MultiPartFormInputStream.java b/jetty-http/src/main/java/org/eclipse/jetty/http/MultiPartFormInputStream.java index f1deb18681b7..badefa3e6f1b 100644 --- a/jetty-http/src/main/java/org/eclipse/jetty/http/MultiPartFormInputStream.java +++ b/jetty-http/src/main/java/org/eclipse/jetty/http/MultiPartFormInputStream.java @@ -31,6 +31,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; +import java.nio.file.StandardOpenOption; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -41,6 +42,7 @@ import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.util.ByteArrayOutputStream2; +import org.eclipse.jetty.util.IO; import org.eclipse.jetty.util.LazyList; import org.eclipse.jetty.util.MultiException; import org.eclipse.jetty.util.MultiMap; @@ -67,7 +69,6 @@ public class MultiPartFormInputStream private Throwable _err; private File _tmpDir; private File _contextTmpDir; - private boolean _deleteOnExit; private boolean _writeFilesWithFilenames; private boolean _parsed; private int _bufferSize = 16 * 1024; @@ -151,19 +152,11 @@ protected void write(byte[] bytes, int offset, int length) throws IOException protected void createFile() throws IOException { - /* - * Some statics just to make the code below easier to understand This get optimized away during the compile anyway - */ - final boolean USER = true; - final boolean WORLD = false; + Path parent = MultiPartFormInputStream.this._tmpDir.toPath(); + Path tempFile = Files.createTempFile(parent, "MultiPart", "", IO.getUserOnlyFileAttribute(parent)); + _file = tempFile.toFile(); - _file = File.createTempFile("MultiPart", "", MultiPartFormInputStream.this._tmpDir); - _file.setReadable(false, WORLD); // (reset) disable it for everyone first - _file.setReadable(true, USER); // enable for user only - - if (_deleteOnExit) - _file.deleteOnExit(); - FileOutputStream fos = new FileOutputStream(_file); + OutputStream fos = Files.newOutputStream(tempFile, StandardOpenOption.WRITE); BufferedOutputStream bos = new BufferedOutputStream(fos); if (_size > 0 && _out != null) @@ -757,9 +750,13 @@ public void reset() } } + /** + * @deprecated no replacement provided. + */ + @Deprecated public void setDeleteOnExit(boolean deleteOnExit) { - _deleteOnExit = deleteOnExit; + // does nothing. } public void setWriteFilesWithFilenames(boolean writeFilesWithFilenames) @@ -772,9 +769,13 @@ public boolean isWriteFilesWithFilenames() return _writeFilesWithFilenames; } + /** + * @deprecated no replacement provided + */ + @Deprecated public boolean isDeleteOnExit() { - return _deleteOnExit; + return false; } private static String value(String nameEqualsValue) diff --git a/jetty-io/src/test/java/org/eclipse/jetty/io/IOTest.java b/jetty-io/src/test/java/org/eclipse/jetty/io/IOTest.java index 62da83d81e85..abe2f523a6ed 100644 --- a/jetty-io/src/test/java/org/eclipse/jetty/io/IOTest.java +++ b/jetty-io/src/test/java/org/eclipse/jetty/io/IOTest.java @@ -20,7 +20,6 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; -import java.io.File; import java.io.IOException; import java.net.InetSocketAddress; import java.net.ServerSocket; @@ -35,17 +34,21 @@ import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.StandardOpenOption; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; -import org.eclipse.jetty.toolchain.test.MavenTestingUtils; +import org.eclipse.jetty.toolchain.test.jupiter.WorkDir; +import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension; import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.util.IO; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.OS; +import org.junit.jupiter.api.extension.ExtendWith; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; @@ -54,10 +57,12 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.fail; +@ExtendWith(WorkDirExtension.class) public class IOTest { + public WorkDir workDir; + @Test public void testIO() throws Exception { @@ -96,7 +101,6 @@ public void testHalfClose() throws Exception // but cannot write Assertions.assertThrows(SocketException.class, () -> client.getOutputStream().write(1)); - // but can still write in opposite direction. server.getOutputStream().write(1); assertEquals(1, client.getInputStream().read()); @@ -419,13 +423,9 @@ public void testAsyncSocketChannel() throws Exception @Test public void testGatherWrite() throws Exception { - File dir = MavenTestingUtils.getTargetTestingDir(); - if (!dir.exists()) - dir.mkdir(); - - File file = File.createTempFile("test", ".txt", dir); - file.deleteOnExit(); - FileChannel out = FileChannel.open(file.toPath(), + Path dir = workDir.getEmptyPathDir(); + Path file = Files.createTempFile(dir, "test", ".txt"); + FileChannel out = FileChannel.open(file, StandardOpenOption.CREATE, StandardOpenOption.READ, StandardOpenOption.WRITE, diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java index 4227ad685e40..20486ca84b7a 100644 --- a/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java @@ -27,6 +27,8 @@ import java.io.Reader; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; import java.util.Enumeration; @@ -54,6 +56,8 @@ import org.eclipse.jetty.server.handler.ErrorHandler; import org.eclipse.jetty.toolchain.test.FS; import org.eclipse.jetty.toolchain.test.MavenTestingUtils; +import org.eclipse.jetty.toolchain.test.jupiter.WorkDir; +import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension; import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.util.IO; import org.eclipse.jetty.util.log.Log; @@ -64,6 +68,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; @@ -81,9 +86,11 @@ import static org.junit.jupiter.api.Assertions.fail; // @checkstyle-disable-check : AvoidEscapedUnicodeCharactersCheck +@ExtendWith(WorkDirExtension.class) public class RequestTest { private static final Logger LOG = Log.getLogger(RequestTest.class); + public WorkDir workDir; private Server _server; private LocalConnector _connector; private RequestHandler _handler; @@ -335,20 +342,14 @@ public boolean check(HttpServletRequest request, HttpServletResponse response) t @Test public void testMultiPart() throws Exception { - final File testTmpDir = File.createTempFile("reqtest", null); - if (testTmpDir.exists()) - testTmpDir.delete(); - testTmpDir.mkdir(); - testTmpDir.deleteOnExit(); - assertTrue(testTmpDir.list().length == 0); + Path testTmpDir = workDir.getEmptyPathDir(); ContextHandler contextHandler = new ContextHandler(); contextHandler.setContextPath("/foo"); contextHandler.setResourceBase("."); - contextHandler.setHandler(new MultiPartRequestHandler(testTmpDir)); + contextHandler.setHandler(new MultiPartRequestHandler(testTmpDir.toFile())); contextHandler.addEventListener(new MultiPartCleanerListener() { - @Override public void requestDestroyed(ServletRequestEvent sre) { @@ -356,12 +357,11 @@ public void requestDestroyed(ServletRequestEvent sre) assertNotNull(m); ContextHandler.Context c = m.getContext(); assertNotNull(c); - assertTrue(c == sre.getServletContext()); - assertTrue(!m.isEmpty()); - assertTrue(testTmpDir.list().length == 2); + assertSame(c, sre.getServletContext()); + assertFalse(m.isEmpty()); + assertThat("File count in temp dir", getFileCount(testTmpDir), is(2L)); super.requestDestroyed(sre); - String[] files = testTmpDir.list(); - assertTrue(files.length == 0); + assertThat("File count in temp dir", getFileCount(testTmpDir), is(0L)); } }); _server.stop(); @@ -395,20 +395,14 @@ public void requestDestroyed(ServletRequestEvent sre) @Test public void testUtilMultiPart() throws Exception { - final File testTmpDir = File.createTempFile("reqtest", null); - if (testTmpDir.exists()) - testTmpDir.delete(); - testTmpDir.mkdir(); - testTmpDir.deleteOnExit(); - assertTrue(testTmpDir.list().length == 0); + Path testTmpDir = workDir.getEmptyPathDir(); ContextHandler contextHandler = new ContextHandler(); contextHandler.setContextPath("/foo"); contextHandler.setResourceBase("."); - contextHandler.setHandler(new MultiPartRequestHandler(testTmpDir)); + contextHandler.setHandler(new MultiPartRequestHandler(testTmpDir.toFile())); contextHandler.addEventListener(new MultiPartCleanerListener() { - @Override public void requestDestroyed(ServletRequestEvent sre) { @@ -416,12 +410,11 @@ public void requestDestroyed(ServletRequestEvent sre) assertNotNull(m); ContextHandler.Context c = m.getContext(); assertNotNull(c); - assertTrue(c == sre.getServletContext()); - assertTrue(!m.isEmpty()); - assertTrue(testTmpDir.list().length == 2); + assertSame(c, sre.getServletContext()); + assertFalse(m.isEmpty()); + assertThat("File count in temp dir", getFileCount(testTmpDir), is(2L)); super.requestDestroyed(sre); - String[] files = testTmpDir.list(); - assertTrue(files.length == 0); + assertThat("File count in temp dir", getFileCount(testTmpDir), is(0L)); } }); _server.stop(); @@ -458,17 +451,12 @@ public void requestDestroyed(ServletRequestEvent sre) @Test public void testHttpMultiPart() throws Exception { - final File testTmpDir = File.createTempFile("reqtest", null); - if (testTmpDir.exists()) - testTmpDir.delete(); - testTmpDir.mkdir(); - testTmpDir.deleteOnExit(); - assertTrue(testTmpDir.list().length == 0); + Path testTmpDir = workDir.getEmptyPathDir(); ContextHandler contextHandler = new ContextHandler(); contextHandler.setContextPath("/foo"); contextHandler.setResourceBase("."); - contextHandler.setHandler(new MultiPartRequestHandler(testTmpDir)); + contextHandler.setHandler(new MultiPartRequestHandler(testTmpDir.toFile())); _server.stop(); _server.setHandler(contextHandler); @@ -503,17 +491,12 @@ public void testHttpMultiPart() throws Exception public void testBadMultiPart() throws Exception { //a bad multipart where one of the fields has no name - final File testTmpDir = File.createTempFile("badmptest", null); - if (testTmpDir.exists()) - testTmpDir.delete(); - testTmpDir.mkdir(); - testTmpDir.deleteOnExit(); - assertTrue(testTmpDir.list().length == 0); + Path testTmpDir = workDir.getEmptyPathDir(); ContextHandler contextHandler = new ContextHandler(); contextHandler.setContextPath("/foo"); contextHandler.setResourceBase("."); - contextHandler.setHandler(new BadMultiPartRequestHandler(testTmpDir)); + contextHandler.setHandler(new BadMultiPartRequestHandler(testTmpDir.toFile())); contextHandler.addEventListener(new MultiPartCleanerListener() { @@ -524,10 +507,9 @@ public void requestDestroyed(ServletRequestEvent sre) assertNotNull(m); ContextHandler.Context c = m.getContext(); assertNotNull(c); - assertTrue(c == sre.getServletContext()); + assertSame(c, sre.getServletContext()); super.requestDestroyed(sre); - String[] files = testTmpDir.list(); - assertTrue(files.length == 0); + assertThat("File count in temp dir", getFileCount(testTmpDir), is(0L)); } }); _server.stop(); @@ -1853,6 +1835,18 @@ public void testGetterSafeFromNullPointerException() assertEquals(0, request.getParameterMap().size()); } + private static long getFileCount(Path path) + { + try + { + return Files.list(path).count(); + } + catch (IOException e) + { + throw new RuntimeException("Unable to get file list count: " + path, e); + } + } + interface RequestTester { boolean check(HttpServletRequest request, HttpServletResponse response) throws IOException; diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ContextHandlerTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ContextHandlerTest.java index 63ef72650168..24e1f7d40e91 100644 --- a/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ContextHandlerTest.java +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ContextHandlerTest.java @@ -38,9 +38,12 @@ import org.eclipse.jetty.server.Server; import org.eclipse.jetty.toolchain.test.FS; import org.eclipse.jetty.toolchain.test.MavenTestingUtils; +import org.eclipse.jetty.toolchain.test.jupiter.WorkDir; +import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension; import org.eclipse.jetty.util.resource.Resource; import org.hamcrest.Matchers; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; @@ -50,8 +53,11 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; +@ExtendWith(WorkDirExtension.class) public class ContextHandlerTest { + public WorkDir workDir; + @Test public void testGetResourcePathsWhenSuppliedPathEndsInSlash() throws Exception { @@ -796,24 +802,14 @@ private void checkResourcePathsForExampleWebApp(String root) throws IOException private File setupTestDirectory() throws IOException { - File tmpDir = new File(System.getProperty("basedir", ".") + "/target/tmp/ContextHandlerTest"); - tmpDir = tmpDir.getCanonicalFile(); - if (!tmpDir.exists()) - assertTrue(tmpDir.mkdirs()); - File tmp = File.createTempFile("cht", null, tmpDir); - assertTrue(tmp.delete()); - assertTrue(tmp.mkdir()); - tmp.deleteOnExit(); - File root = new File(tmp, getClass().getName()); - assertTrue(root.mkdir()); - - File webInf = new File(root, "WEB-INF"); - assertTrue(webInf.mkdir()); - - assertTrue(new File(webInf, "jsp").mkdir()); - assertTrue(new File(webInf, "web.xml").createNewFile()); - - return root; + Path root = workDir.getEmptyPathDir(); + + Path webInfDir = root.resolve("WEB-INF"); + FS.ensureDirExists(webInfDir); + FS.ensureDirExists(webInfDir.resolve("jsp")); + FS.touch(webInfDir.resolve("web.xml")); + + return root.toFile(); } private void checkWildcardHost(boolean succeed, Server server, String[] contextHosts, String[] requestHosts) throws Exception diff --git a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletTester.java b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletTester.java index 805d2dbc6eaf..52a945303347 100644 --- a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletTester.java +++ b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ServletTester.java @@ -157,6 +157,11 @@ public Resource getBaseResource() return _context.getBaseResource(); } + public void setBaseResource(Resource resource) + { + _context.setBaseResource(resource); + } + public String getResourceBase() { return _context.getResourceBase(); diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/PutFilter.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/PutFilter.java index aec6392311c0..7bd89b7e6b1d 100644 --- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/PutFilter.java +++ b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/PutFilter.java @@ -25,6 +25,10 @@ import java.io.OutputStream; import java.net.URI; import java.net.URISyntaxException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.nio.file.StandardOpenOption; import java.util.Arrays; import java.util.HashSet; import java.util.Set; @@ -212,8 +216,8 @@ public void handlePut(HttpServletRequest request, HttpServletResponse response, if (_putAtomic) { - File tmp = File.createTempFile(file.getName(), null, _tmpdir); - try (OutputStream out = new FileOutputStream(tmp, false)) + Path tmp = Files.createTempFile(_tmpdir.toPath(), file.getName(), null); + try (OutputStream out = Files.newOutputStream(tmp, StandardOpenOption.WRITE)) { if (toRead >= 0) IO.copy(in, out, toRead); @@ -221,8 +225,7 @@ public void handlePut(HttpServletRequest request, HttpServletResponse response, IO.copy(in, out); } - if (!tmp.renameTo(file)) - throw new IOException("rename from " + tmp + " to " + file + " failed"); + Files.move(tmp, file.toPath(), StandardCopyOption.REPLACE_EXISTING); } else { diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/MultipartFilterTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/MultipartFilterTest.java index d6e2369796e6..0f17f22f5e68 100644 --- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/MultipartFilterTest.java +++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/MultipartFilterTest.java @@ -25,6 +25,7 @@ import java.io.InputStreamReader; import java.io.PrintWriter; import java.nio.charset.StandardCharsets; +import java.nio.file.Path; import java.util.EnumSet; import javax.servlet.DispatcherType; import javax.servlet.Filter; @@ -45,12 +46,16 @@ import org.eclipse.jetty.servlet.FilterMapping; import org.eclipse.jetty.servlet.ServletHandler; import org.eclipse.jetty.servlet.ServletTester; +import org.eclipse.jetty.toolchain.test.jupiter.WorkDir; +import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension; import org.eclipse.jetty.util.IO; import org.eclipse.jetty.util.ReadLineInputStream; import org.eclipse.jetty.util.log.StacklessLogging; +import org.eclipse.jetty.util.resource.PathResource; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; @@ -61,9 +66,10 @@ import static org.junit.jupiter.api.Assertions.assertTrue; // @checkstyle-disable-check : AvoidEscapedUnicodeCharactersCheck +@ExtendWith(WorkDirExtension.class) public class MultipartFilterTest { - private File _dir; + public WorkDir workDir; private ServletTester tester; FilterHolder multipartFilter; @@ -157,16 +163,12 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S @BeforeEach public void setUp() throws Exception { - _dir = File.createTempFile("testmultupart", null); - assertTrue(_dir.delete()); - assertTrue(_dir.mkdir()); - _dir.deleteOnExit(); - assertTrue(_dir.isDirectory()); + Path root = workDir.getEmptyPathDir(); tester = new ServletTester("/context"); - tester.getContext().setResourceBase(_dir.getCanonicalPath()); + tester.getContext().setBaseResource(new PathResource(root)); tester.getContext().addServlet(TestServlet.class, "/"); - tester.getContext().setAttribute("javax.servlet.context.tempdir", _dir); + tester.getContext().setAttribute("javax.servlet.context.tempdir", root.toFile()); multipartFilter = tester.getContext().addFilter(MultiPartFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); multipartFilter.setInitParameter("deleteFiles", "true"); multipartFilter.setInitParameter("fileOutputBuffer", "1"); //write a file if there's more than 1 byte content diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/PutFilterTest.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/PutFilterTest.java index 932c2adac425..2981fd71aff0 100644 --- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/PutFilterTest.java +++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/PutFilterTest.java @@ -18,12 +18,11 @@ package org.eclipse.jetty.servlets; -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.EnumSet; import java.util.HashSet; import java.util.Locale; @@ -34,35 +33,39 @@ import org.eclipse.jetty.http.HttpTester; import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.ServletTester; +import org.eclipse.jetty.toolchain.test.jupiter.WorkDir; +import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension; import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.util.IO; import org.eclipse.jetty.util.StringUtil; +import org.eclipse.jetty.util.resource.PathResource; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import static java.nio.charset.StandardCharsets.UTF_8; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.in; import static org.hamcrest.Matchers.is; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; +@ExtendWith(WorkDirExtension.class) public class PutFilterTest { - private File _dir; + public WorkDir workDir; + private Path root; private ServletTester tester; @BeforeEach public void setUp() throws Exception { - _dir = File.createTempFile("testPutFilter", null); - assertTrue(_dir.delete()); - assertTrue(_dir.mkdir()); - _dir.deleteOnExit(); - assertTrue(_dir.isDirectory()); + root = workDir.getEmptyPathDir(); tester = new ServletTester("/context"); - tester.setResourceBase(_dir.getCanonicalPath()); + tester.setBaseResource(new PathResource(root)); tester.addServlet(org.eclipse.jetty.servlet.DefaultServlet.class, "/"); FilterHolder holder = tester.addFilter(PutFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); holder.setInitParameter("delAllowed", "true"); @@ -76,7 +79,6 @@ public void setUp() throws Exception public void tearDown() throws Exception { tester.stop(); - IO.delete(_dir); } @Test @@ -103,9 +105,9 @@ public void testHandlePut() throws Exception response = HttpTester.parseResponse(tester.getResponses(request.generate())); assertEquals(HttpServletResponse.SC_CREATED, response.getStatus()); - File file = new File(_dir, "file.txt"); - assertTrue(file.exists()); - assertEquals(data0, IO.toString(new FileInputStream(file))); + Path file = root.resolve("file.txt"); + assertTrue(Files.exists(file)); + assertEquals(data0, IO.toString(file, UTF_8)); // test GET1 request.setMethod("GET"); @@ -125,9 +127,9 @@ public void testHandlePut() throws Exception response = HttpTester.parseResponse(tester.getResponses(request.generate())); assertEquals(HttpServletResponse.SC_OK, response.getStatus()); - file = new File(_dir, "file.txt"); - assertTrue(file.exists()); - assertEquals(data1, IO.toString(new FileInputStream(file))); + file = root.resolve("file.txt"); + assertTrue(Files.exists(file)); + assertEquals(data1, IO.toString(file, UTF_8)); // test PUT2 request.setMethod("PUT"); @@ -193,19 +195,16 @@ public void testHandleDelete() throws Exception response = HttpTester.parseResponse(tester.getResponses(request.generate())); assertEquals(HttpServletResponse.SC_CREATED, response.getStatus()); - File file = new File(_dir, "file.txt"); - assertTrue(file.exists()); - try (InputStream fis = new FileInputStream(file)) - { - assertEquals(data1, IO.toString(fis)); - } + Path file = root.resolve("file.txt"); + assertTrue(Files.exists(file)); + assertEquals(data1, IO.toString(file, UTF_8)); request.setMethod("DELETE"); request.setURI("/context/file.txt"); response = HttpTester.parseResponse(tester.getResponses(request.generate())); assertEquals(HttpServletResponse.SC_NO_CONTENT, response.getStatus()); - assertTrue(!file.exists()); + assertFalse(Files.exists(file)); request.setMethod("DELETE"); request.setURI("/context/file.txt"); @@ -232,12 +231,9 @@ public void testHandleMove() throws Exception assertEquals(HttpServletResponse.SC_CREATED, response.getStatus()); - File file = new File(_dir, "file.txt"); - assertTrue(file.exists()); - try (InputStream fis = new FileInputStream(file)) - { - assertEquals(data1, IO.toString(fis)); - } + Path file = root.resolve("file.txt"); + assertTrue(Files.exists(file)); + assertEquals(data1, IO.toString(file, UTF_8)); request.setMethod("MOVE"); request.setURI("/context/file.txt"); @@ -245,10 +241,10 @@ public void testHandleMove() throws Exception response = HttpTester.parseResponse(tester.getResponses(request.generate())); assertEquals(HttpServletResponse.SC_NO_CONTENT, response.getStatus()); - assertTrue(!file.exists()); + assertFalse(Files.exists(file)); - File nFile = new File(_dir, "blah.txt"); - assertTrue(nFile.exists()); + Path nFile = root.resolve("blah.txt"); + assertTrue(Files.exists(nFile)); } @Test diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/IO.java b/jetty-util/src/main/java/org/eclipse/jetty/util/IO.java index d5e416d68201..a4cb3a3cb8ac 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/IO.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/IO.java @@ -34,6 +34,16 @@ import java.nio.ByteBuffer; import java.nio.channels.GatheringByteChannel; import java.nio.charset.Charset; +import java.nio.file.FileStore; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.attribute.DosFileAttributeView; +import java.nio.file.attribute.FileAttribute; +import java.nio.file.attribute.PosixFileAttributeView; +import java.nio.file.attribute.PosixFilePermission; +import java.nio.file.attribute.PosixFilePermissions; +import java.util.HashSet; +import java.util.Objects; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; @@ -47,6 +57,24 @@ public class IO { private static final Logger LOG = Log.getLogger(IO.class); + private static final FileAttribute[] NO_FILE_ATTRIBUTES = new FileAttribute[0]; + private static final FileAttribute[] USER_ONLY_POSIX_FILE_ATTRIBUTES = + new FileAttribute[]{ + PosixFilePermissions.asFileAttribute( + new HashSet() + { + { + add(PosixFilePermission.OWNER_EXECUTE); + add(PosixFilePermission.OWNER_READ); + add(PosixFilePermission.OWNER_WRITE); + // we don't add GROUP or OTHER write perms here. + add(PosixFilePermission.GROUP_READ); + add(PosixFilePermission.OTHERS_READ); + } + } + ) + }; + public static final String CRLF = "\r\n"; @@ -279,6 +307,21 @@ public static void copyFile(File from, File to) throws IOException } } + /** + * Read Path to string. + * + * @param path the path to read from (until EOF) + * @param charset the charset to read with + * @return the String parsed from path (default Charset) + * @throws IOException if unable to read the path (or handle the charset) + */ + public static String toString(Path path, Charset charset) + throws IOException + { + byte[] buf = Files.readAllBytes(path); + return new String(buf, charset); + } + /** * Read input stream to string. * @@ -419,6 +462,58 @@ public static void close(Writer writer) close((Closeable)writer); } + /** + * Get the array of {@link FileAttribute} values for the provided path + * that will set the path to Full Read/Write for the user running Jetty, + * but Readonly for other users. + *

+ * For Unix, that's means {@link java.nio.file.attribute.PosixFileAttributes} + * where the World and Other groups have their read / write flags removed. + *

+ *

+ * For Windows / Dos, that means {@link java.nio.file.attribute.DosFileAttributes} + *

+ */ + public static FileAttribute[] getUserOnlyFileAttribute(Path path) + { + FileStore fileStore = null; + try + { + // Obtain a reference to the FileStore to know what kind of read-only we are capable of. + fileStore = Files.getFileStore(Objects.requireNonNull(path)); + + if (fileStore == null) + { + // Not on a properly implemented FileStore (seen with 3rd party FileStore implementations) + // We cannot do anything in this case, so just return. + return NO_FILE_ATTRIBUTES; + } + + if (fileStore.supportsFileAttributeView(DosFileAttributeView.class)) + { + // We are on a Windows / DOS filesystem. + // It might support ACL, but we don't attempt to support that here. + return NO_FILE_ATTRIBUTES; + } + + if (fileStore.supportsFileAttributeView(PosixFileAttributeView.class)) + { + // We are on a Unix / Linux / OSX system + return USER_ONLY_POSIX_FILE_ATTRIBUTES; + } + + // If we reached this point, we have a Path on a FileSystem / FileStore that we cannot control. + // So skip the attempt to set readable. + } + catch (IOException e) + { + if (LOG.isDebugEnabled()) + LOG.debug("Unable to determine attribute types on path: {}", path, e); + } + + return NO_FILE_ATTRIBUTES; + } + public static byte[] readBytes(InputStream in) throws IOException { diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartInputStreamParser.java b/jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartInputStreamParser.java index 41acf72b461b..97e5ec7563a4 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartInputStreamParser.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartInputStreamParser.java @@ -33,6 +33,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; +import java.nio.file.StandardOpenOption; import java.util.ArrayList; import java.util.Base64; import java.util.Collection; @@ -72,7 +73,6 @@ public class MultiPartInputStreamParser protected Exception _err; protected File _tmpDir; protected File _contextTmpDir; - protected boolean _deleteOnExit; protected boolean _writeFilesWithFilenames; protected boolean _parsed; @@ -190,18 +190,11 @@ protected void write(byte[] bytes, int offset, int length) protected void createFile() throws IOException { - /* Some statics just to make the code below easier to understand - * This get optimized away during the compile anyway */ - final boolean USER = true; - final boolean WORLD = false; + Path parent = MultiPartInputStreamParser.this._tmpDir.toPath(); + Path tempFile = Files.createTempFile(parent, "MultiPart", "", IO.getUserOnlyFileAttribute(parent)); + _file = tempFile.toFile(); - _file = File.createTempFile("MultiPart", "", MultiPartInputStreamParser.this._tmpDir); - _file.setReadable(false, WORLD); // (reset) disable it for everyone first - _file.setReadable(true, USER); // enable for user only - - if (_deleteOnExit) - _file.deleteOnExit(); - FileOutputStream fos = new FileOutputStream(_file); + OutputStream fos = Files.newOutputStream(tempFile, StandardOpenOption.WRITE); BufferedOutputStream bos = new BufferedOutputStream(fos); if (_size > 0 && _out != null) @@ -864,9 +857,13 @@ public int read() throws IOException } } + /** + * @deprecated no replacement offered. + */ + @Deprecated public void setDeleteOnExit(boolean deleteOnExit) { - _deleteOnExit = deleteOnExit; + // does nothing } public void setWriteFilesWithFilenames(boolean writeFilesWithFilenames) @@ -879,9 +876,13 @@ public boolean isWriteFilesWithFilenames() return _writeFilesWithFilenames; } + /** + * @deprecated no replacement offered. + */ + @Deprecated public boolean isDeleteOnExit() { - return _deleteOnExit; + return false; } private String value(String nameEqualsValue) diff --git a/tests/test-sessions/test-file-sessions/src/test/java/org/eclipse/jetty/server/session/ClusteredOrphanedSessionTest.java b/tests/test-sessions/test-file-sessions/src/test/java/org/eclipse/jetty/server/session/ClusteredOrphanedSessionTest.java index 5012b0e86872..315de066832d 100644 --- a/tests/test-sessions/test-file-sessions/src/test/java/org/eclipse/jetty/server/session/ClusteredOrphanedSessionTest.java +++ b/tests/test-sessions/test-file-sessions/src/test/java/org/eclipse/jetty/server/session/ClusteredOrphanedSessionTest.java @@ -18,26 +18,18 @@ package org.eclipse.jetty.server.session; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; +import org.eclipse.jetty.toolchain.test.jupiter.WorkDir; +import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; /** * ClusteredOrphanedSessionTest */ +@ExtendWith(WorkDirExtension.class) public class ClusteredOrphanedSessionTest extends AbstractClusteredOrphanedSessionTest { - @BeforeEach - public void before() throws Exception - { - FileTestHelper.setup(); - } - - @AfterEach - public void after() - { - FileTestHelper.teardown(); - } + public WorkDir workDir; /** * @see org.eclipse.jetty.server.session.AbstractTestBase#createSessionDataStoreFactory() @@ -45,7 +37,7 @@ public void after() @Override public SessionDataStoreFactory createSessionDataStoreFactory() { - return FileTestHelper.newSessionDataStoreFactory(); + return FileTestHelper.newSessionDataStoreFactory(workDir); } @Test diff --git a/tests/test-sessions/test-file-sessions/src/test/java/org/eclipse/jetty/server/session/FileSessionDataStoreTest.java b/tests/test-sessions/test-file-sessions/src/test/java/org/eclipse/jetty/server/session/FileSessionDataStoreTest.java index 0019eeadcacc..9c6819e8dde2 100644 --- a/tests/test-sessions/test-file-sessions/src/test/java/org/eclipse/jetty/server/session/FileSessionDataStoreTest.java +++ b/tests/test-sessions/test-file-sessions/src/test/java/org/eclipse/jetty/server/session/FileSessionDataStoreTest.java @@ -18,44 +18,36 @@ package org.eclipse.jetty.server.session; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; +import org.eclipse.jetty.toolchain.test.jupiter.WorkDir; +import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; /** * FileSessionDataStoreTest */ +@ExtendWith(WorkDirExtension.class) public class FileSessionDataStoreTest extends AbstractSessionDataStoreTest { - @BeforeEach - public void before() throws Exception - { - FileTestHelper.setup(); - } - - @AfterEach - public void after() - { - FileTestHelper.teardown(); - } + public WorkDir workDir; @Override public SessionDataStoreFactory createSessionDataStoreFactory() { - return FileTestHelper.newSessionDataStoreFactory(); + return FileTestHelper.newSessionDataStoreFactory(workDir); } @Override public void persistSession(SessionData data) throws Exception { - FileTestHelper.createFile(data.getId(), data.getContextPath(), data.getVhost(), data.getLastNode(), data.getCreated(), + FileTestHelper.createFile(workDir, data.getId(), data.getContextPath(), data.getVhost(), data.getLastNode(), data.getCreated(), data.getAccessed(), data.getLastAccessed(), data.getMaxInactiveMs(), data.getExpiry(), data.getCookieSet(), data.getAllAttributes()); } @Override public void persistUnreadableSession(SessionData data) throws Exception { - FileTestHelper.createFile(data.getId(), data.getContextPath(), data.getVhost(), data.getLastNode(), data.getCreated(), + FileTestHelper.createFile(workDir, data.getId(), data.getContextPath(), data.getVhost(), data.getLastNode(), data.getCreated(), data.getAccessed(), data.getLastAccessed(), data.getMaxInactiveMs(), data.getExpiry(), data.getCookieSet(), null); } @@ -66,7 +58,7 @@ public boolean checkSessionExists(SessionData data) throws Exception Thread.currentThread().setContextClassLoader(_contextClassLoader); try { - return (FileTestHelper.getFile(data.getId()) != null); + return (FileTestHelper.getFile(workDir, data.getId()) != null); } finally { @@ -84,7 +76,7 @@ public boolean checkSessionPersisted(SessionData data) throws Exception Thread.currentThread().setContextClassLoader(_contextClassLoader); try { - return FileTestHelper.checkSessionPersisted(data); + return FileTestHelper.checkSessionPersisted(workDir, data); } catch (Throwable e) { diff --git a/tests/test-sessions/test-file-sessions/src/test/java/org/eclipse/jetty/server/session/FileTestHelper.java b/tests/test-sessions/test-file-sessions/src/test/java/org/eclipse/jetty/server/session/FileTestHelper.java index 6919f40d40f1..a46322b59688 100644 --- a/tests/test-sessions/test-file-sessions/src/test/java/org/eclipse/jetty/server/session/FileTestHelper.java +++ b/tests/test-sessions/test-file-sessions/src/test/java/org/eclipse/jetty/server/session/FileTestHelper.java @@ -21,19 +21,23 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.ObjectOutputStream; +import java.io.OutputStream; import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; +import org.eclipse.jetty.toolchain.test.FS; +import org.eclipse.jetty.toolchain.test.jupiter.WorkDir; import org.eclipse.jetty.util.ClassLoadingObjectInputStream; -import org.eclipse.jetty.util.IO; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; /** @@ -42,116 +46,54 @@ public class FileTestHelper { static int __workers = 0; - static File _tmpDir; - public static void setup() - throws Exception - { - - _tmpDir = File.createTempFile("file", null); - _tmpDir.delete(); - _tmpDir.mkdirs(); - _tmpDir.deleteOnExit(); - } - - public static void teardown() + public static File getFile(WorkDir workDir, String sessionId) throws IOException { - IO.delete(_tmpDir); - _tmpDir = null; - } - - public static void assertStoreDirEmpty(boolean isEmpty) - { - assertNotNull(_tmpDir); - assertTrue(_tmpDir.exists()); - String[] files = _tmpDir.list(); - if (isEmpty) - { - if (files != null) - assertEquals(0, files.length); - } - else - { - assertNotNull(files); - assertFalse(files.length == 0); - } - } - - public static File getFile(String sessionId) - { - assertNotNull(_tmpDir); - assertTrue(_tmpDir.exists()); - String[] files = _tmpDir.list(); - assertNotNull(files); - String fname = null; - for (String name : files) - { - if (name.contains(sessionId)) - { - fname = name; - break; - } - } - - if (fname != null) - return new File(_tmpDir, fname); + Optional sessionPath = Files.list(workDir.getPath()) + .filter((path) -> path.getFileName().toString().contains(sessionId)) + .findFirst(); + if (sessionPath.isPresent()) + return sessionPath.get().toFile(); return null; } - public static void assertSessionExists(String sessionId, boolean exists) + public static void assertSessionExists(WorkDir workDir, String sessionId, boolean exists) throws IOException { - assertNotNull(_tmpDir); - assertTrue(_tmpDir.exists()); - String[] files = _tmpDir.list(); - assertNotNull(files); - if (exists) - assertFalse(files.length == 0); - boolean found = false; - for (String name : files) - { - if (name.contains(sessionId)) - { - found = true; - break; - } - } + Optional sessionPath = Files.list(workDir.getPath()) + .filter((path) -> path.getFileName().toString().contains(sessionId)) + .findFirst(); if (exists) - assertTrue(found); + assertTrue(sessionPath.isPresent()); else - assertFalse(found); + assertFalse(sessionPath.isPresent()); } - public static void assertFileExists(String filename, boolean exists) + public static void assertFileExists(WorkDir workDir, String filename, boolean exists) { - assertNotNull(_tmpDir); - assertTrue(_tmpDir.exists()); - File file = new File(_tmpDir, filename); + Path path = workDir.getPath().resolve(filename); if (exists) - assertTrue(file.exists()); + assertTrue(Files.exists(path), "File should exist: " + path); else - assertFalse(file.exists()); + assertFalse(Files.exists(path), "File should NOT exist: " + path); } - public static void createFile(String filename) + public static void createFile(WorkDir workDir, String filename) throws IOException { - assertNotNull(_tmpDir); - assertTrue(_tmpDir.exists()); - - File file = new File(_tmpDir, filename); - Files.deleteIfExists(file.toPath()); - file.createNewFile(); + Path path = workDir.getPath().resolve(filename); + Files.deleteIfExists(path); + FS.touch(path); } - public static void createFile(String id, String contextPath, String vhost, + public static void createFile(WorkDir workDir, String id, String contextPath, String vhost, String lastNode, long created, long accessed, long lastAccessed, long maxIdle, long expiry, long cookieSet, Map attributes) throws Exception { String filename = "" + expiry + "_" + contextPath + "_" + vhost + "_" + id; - File file = new File(_tmpDir, filename); - try (FileOutputStream fos = new FileOutputStream(file, false); + Path path = workDir.getPath().resolve(filename); + try (OutputStream fos = Files.newOutputStream(path); DataOutputStream out = new DataOutputStream(fos)) { out.writeUTF(id); @@ -174,14 +116,15 @@ public static void createFile(String id, String contextPath, String vhost, } } - public static boolean checkSessionPersisted(SessionData data) + public static boolean checkSessionPersisted(WorkDir workDir, SessionData data) throws Exception { String filename = "" + data.getExpiry() + "_" + data.getContextPath() + "_" + data.getVhost() + "_" + data.getId(); - File file = new File(_tmpDir, filename); - assertTrue(file.exists()); + Path file = workDir.getPath().resolve(filename); - try (FileInputStream in = new FileInputStream(file); + assertTrue(Files.exists(file)); + + try (InputStream in = Files.newInputStream(file); DataInputStream di = new DataInputStream(in)) { String id = di.readUTF(); @@ -213,44 +156,35 @@ public static boolean checkSessionPersisted(SessionData data) //same number of attributes assertEquals(data.getAllAttributes().size(), tmp.getAllAttributes().size()); //same keys - assertTrue(data.getKeys().equals(tmp.getAllAttributes().keySet())); + assertEquals(tmp.getAllAttributes().keySet(), data.getKeys()); //same values for (String name : data.getKeys()) { - assertTrue(data.getAttribute(name).equals(tmp.getAttribute(name))); + assertEquals(tmp.getAttribute(name), data.getAttribute(name)); } } return true; } - public static void deleteFile(String sessionId) + public static void deleteFile(WorkDir workDir, String sessionId) throws IOException { - assertNotNull(_tmpDir); - assertTrue(_tmpDir.exists()); - String[] files = _tmpDir.list(); - assertNotNull(files); - assertFalse(files.length == 0); - String filename = null; - for (String name : files) - { - if (name.contains(sessionId)) - { - filename = name; - break; - } - } - if (filename != null) + // Collect + List matches = Files.list(workDir.getPath()) + .filter((path) -> path.getFileName().toString().contains(sessionId)) + .collect(Collectors.toList()); + + // Delete outside of lambda + for (Path path : matches) { - File f = new File(_tmpDir, filename); - assertTrue(f.delete()); + FS.deleteFile(path); } } - public static FileSessionDataStoreFactory newSessionDataStoreFactory() + public static FileSessionDataStoreFactory newSessionDataStoreFactory(WorkDir workDir) { FileSessionDataStoreFactory storeFactory = new FileSessionDataStoreFactory(); - storeFactory.setStoreDir(_tmpDir); + storeFactory.setStoreDir(workDir.getPath().toFile()); return storeFactory; } } diff --git a/tests/test-sessions/test-file-sessions/src/test/java/org/eclipse/jetty/server/session/TestFileSessions.java b/tests/test-sessions/test-file-sessions/src/test/java/org/eclipse/jetty/server/session/TestFileSessions.java index 0b2428db3060..539ccb8304c5 100644 --- a/tests/test-sessions/test-file-sessions/src/test/java/org/eclipse/jetty/server/session/TestFileSessions.java +++ b/tests/test-sessions/test-file-sessions/src/test/java/org/eclipse/jetty/server/session/TestFileSessions.java @@ -21,11 +21,12 @@ import java.util.concurrent.TimeUnit; import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.toolchain.test.jupiter.WorkDir; +import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.StacklessLogging; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -36,24 +37,15 @@ /** * TestFileSessions */ +@ExtendWith(WorkDirExtension.class) public class TestFileSessions extends AbstractTestBase { - @BeforeEach - public void before() throws Exception - { - FileTestHelper.setup(); - } - - @AfterEach - public void after() - { - FileTestHelper.teardown(); - } + public WorkDir workDir; @Override public SessionDataStoreFactory createSessionDataStoreFactory() { - return FileTestHelper.newSessionDataStoreFactory(); + return FileTestHelper.newSessionDataStoreFactory(workDir); } /** @@ -74,7 +66,7 @@ public void testLoadForeignContext() throws Exception store.initialize(sessionContext); //make a file for foobar context - FileTestHelper.createFile((System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1)) + "__foobar_0.0.0.0_1234"); + FileTestHelper.createFile(workDir, (System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1)) + "__foobar_0.0.0.0_1234"); store.start(); @@ -208,7 +200,6 @@ public void testFilenamesWithDefaultContext() throws Exception @Test public void testSweep() throws Exception { - //create the SessionDataStore ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/test"); @@ -221,41 +212,41 @@ public void testSweep() throws Exception store.start(); //create file not for our context that expired long ago and should be removed by sweep - FileTestHelper.createFile("101__foobar_0.0.0.0_sessiona"); - FileTestHelper.assertSessionExists("sessiona", true); + FileTestHelper.createFile(workDir, "101__foobar_0.0.0.0_sessiona"); + FileTestHelper.assertSessionExists(workDir, "sessiona", true); //create a file not for our context that is not expired and should be ignored String nonExpiredForeign = (System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1)) + "__foobar_0.0.0.0_sessionb"; - FileTestHelper.createFile(nonExpiredForeign); - FileTestHelper.assertFileExists(nonExpiredForeign, true); + FileTestHelper.createFile(workDir, nonExpiredForeign); + FileTestHelper.assertFileExists(workDir, nonExpiredForeign, true); //create a file not for our context that is recently expired, a thus ignored by sweep String expiredForeign = (System.currentTimeMillis() - TimeUnit.SECONDS.toMillis(1)) + "__foobar_0.0.0.0_sessionc"; - FileTestHelper.createFile(expiredForeign); - FileTestHelper.assertFileExists(expiredForeign, true); + FileTestHelper.createFile(workDir, expiredForeign); + FileTestHelper.assertFileExists(workDir, expiredForeign, true); //create a file that is not a session file, it should be ignored - FileTestHelper.createFile("whatever.txt"); - FileTestHelper.assertFileExists("whatever.txt", true); + FileTestHelper.createFile(workDir, "whatever.txt"); + FileTestHelper.assertFileExists(workDir, "whatever.txt", true); //create a file that is not a valid session filename, should be ignored - FileTestHelper.createFile("nonNumber__0.0.0.0_spuriousFile"); - FileTestHelper.assertFileExists("nonNumber__0.0.0.0_spuriousFile", true); + FileTestHelper.createFile(workDir, "nonNumber__0.0.0.0_spuriousFile"); + FileTestHelper.assertFileExists(workDir, "nonNumber__0.0.0.0_spuriousFile", true); //create a file that is a non-expired session file for our context that should be ignored String nonExpired = (System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1)) + "__test_0.0.0.0_sessionb"; - FileTestHelper.createFile(nonExpired); - FileTestHelper.assertFileExists(nonExpired, true); + FileTestHelper.createFile(workDir, nonExpired); + FileTestHelper.assertFileExists(workDir, nonExpired, true); //create a file that is a never-expire session file for our context that should be ignored String neverExpired = "0__test_0.0.0.0_sessionc"; - FileTestHelper.createFile(neverExpired); - FileTestHelper.assertFileExists(neverExpired, true); + FileTestHelper.createFile(workDir, neverExpired); + FileTestHelper.assertFileExists(workDir, neverExpired, true); //create a file that is a never-expire session file for another context that should be ignored String foreignNeverExpired = "0__other_0.0.0.0_sessionc"; - FileTestHelper.createFile(foreignNeverExpired); - FileTestHelper.assertFileExists(foreignNeverExpired, true); + FileTestHelper.createFile(workDir, foreignNeverExpired); + FileTestHelper.assertFileExists(workDir, foreignNeverExpired, true); //sweep - we're expecting a debug log with exception stacktrace due to file named //nonNumber__0.0.0.0_spuriousFile so suppress it @@ -265,14 +256,14 @@ public void testSweep() throws Exception } //check results - FileTestHelper.assertSessionExists("sessiona", false); - FileTestHelper.assertFileExists("whatever.txt", true); - FileTestHelper.assertFileExists("nonNumber__0.0.0.0_spuriousFile", true); - FileTestHelper.assertFileExists(nonExpired, true); - FileTestHelper.assertFileExists(nonExpiredForeign, true); - FileTestHelper.assertFileExists(expiredForeign, true); - FileTestHelper.assertFileExists(neverExpired, true); - FileTestHelper.assertFileExists(foreignNeverExpired, true); + FileTestHelper.assertSessionExists(workDir, "sessiona", false); + FileTestHelper.assertFileExists(workDir, "whatever.txt", true); + FileTestHelper.assertFileExists(workDir, "nonNumber__0.0.0.0_spuriousFile", true); + FileTestHelper.assertFileExists(workDir, nonExpired, true); + FileTestHelper.assertFileExists(workDir, nonExpiredForeign, true); + FileTestHelper.assertFileExists(workDir, expiredForeign, true); + FileTestHelper.assertFileExists(workDir, neverExpired, true); + FileTestHelper.assertFileExists(workDir, foreignNeverExpired, true); } /** @@ -292,54 +283,54 @@ public void testInitialize() store.initialize(sessionContext); //create file not for our context that expired long ago and should be removed - FileTestHelper.createFile("101_foobar_0.0.0.0_sessiona"); - FileTestHelper.assertSessionExists("sessiona", true); + FileTestHelper.createFile(workDir, "101_foobar_0.0.0.0_sessiona"); + FileTestHelper.assertSessionExists(workDir, "sessiona", true); //create a file not for our context that is not expired and should be ignored String nonExpiredForeign = (System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1)) + "_foobar_0.0.0.0_sessionb"; - FileTestHelper.createFile(nonExpiredForeign); - FileTestHelper.assertFileExists(nonExpiredForeign, true); + FileTestHelper.createFile(workDir, nonExpiredForeign); + FileTestHelper.assertFileExists(workDir, nonExpiredForeign, true); //create a file not for our context that is recently expired, a thus ignored String expiredForeign = (System.currentTimeMillis() - TimeUnit.SECONDS.toMillis(1)) + "_foobar_0.0.0.0_sessionc"; - FileTestHelper.createFile(expiredForeign); - FileTestHelper.assertFileExists(expiredForeign, true); + FileTestHelper.createFile(workDir, expiredForeign); + FileTestHelper.assertFileExists(workDir, expiredForeign, true); //create a file that is not a session file, it should be ignored - FileTestHelper.createFile("whatever.txt"); - FileTestHelper.assertFileExists("whatever.txt", true); + FileTestHelper.createFile(workDir, "whatever.txt"); + FileTestHelper.assertFileExists(workDir, "whatever.txt", true); //create a file that is not a valid session filename, should be ignored - FileTestHelper.createFile("nonNumber_0.0.0.0_spuriousFile"); - FileTestHelper.assertFileExists("nonNumber_0.0.0.0_spuriousFile", true); + FileTestHelper.createFile(workDir, "nonNumber_0.0.0.0_spuriousFile"); + FileTestHelper.assertFileExists(workDir, "nonNumber_0.0.0.0_spuriousFile", true); //create a file that is a non-expired session file for our context that should be ignored String nonExpired = (System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1)) + "_test_0.0.0.0_sessionb"; - FileTestHelper.createFile(nonExpired); - FileTestHelper.assertFileExists(nonExpired, true); + FileTestHelper.createFile(workDir, nonExpired); + FileTestHelper.assertFileExists(workDir, nonExpired, true); //create a file that is a never-expire session file for our context that should be ignored String neverExpired = "0_test_0.0.0.0_sessionc"; - FileTestHelper.createFile(neverExpired); - FileTestHelper.assertFileExists(neverExpired, true); + FileTestHelper.createFile(workDir, neverExpired); + FileTestHelper.assertFileExists(workDir, neverExpired, true); //create a file that is a never-expire session file for another context that should be ignored String foreignNeverExpired = "0_test_0.0.0.0_sessionc"; - FileTestHelper.createFile(foreignNeverExpired); - FileTestHelper.assertFileExists(foreignNeverExpired, true); + FileTestHelper.createFile(workDir, foreignNeverExpired); + FileTestHelper.assertFileExists(workDir, foreignNeverExpired, true); //walk all files in the store ((FileSessionDataStore)store).initializeStore(); //check results - FileTestHelper.assertSessionExists("sessiona", false); - FileTestHelper.assertFileExists("whatever.txt", true); - FileTestHelper.assertFileExists("nonNumber_0.0.0.0_spuriousFile", true); - FileTestHelper.assertFileExists(nonExpired, true); - FileTestHelper.assertFileExists(nonExpiredForeign, true); - FileTestHelper.assertFileExists(expiredForeign, true); - FileTestHelper.assertFileExists(neverExpired, true); - FileTestHelper.assertFileExists(foreignNeverExpired, true); + FileTestHelper.assertSessionExists(workDir, "sessiona", false); + FileTestHelper.assertFileExists(workDir, "whatever.txt", true); + FileTestHelper.assertFileExists(workDir, "nonNumber_0.0.0.0_spuriousFile", true); + FileTestHelper.assertFileExists(workDir, nonExpired, true); + FileTestHelper.assertFileExists(workDir, nonExpiredForeign, true); + FileTestHelper.assertFileExists(workDir, expiredForeign, true); + FileTestHelper.assertFileExists(workDir, neverExpired, true); + FileTestHelper.assertFileExists(workDir, foreignNeverExpired, true); } /** @@ -361,8 +352,8 @@ public void testDeleteUnrestorableFiles() store.initialize(sessionContext); String expectedFilename = (System.currentTimeMillis() + 10000) + "__test_0.0.0.0_validFile123"; - FileTestHelper.createFile(expectedFilename); - FileTestHelper.assertFileExists(expectedFilename, true); + FileTestHelper.createFile(workDir, expectedFilename); + FileTestHelper.assertFileExists(workDir, expectedFilename, true); store.start(); @@ -376,7 +367,7 @@ public void testDeleteUnrestorableFiles() //expected exception } - FileTestHelper.assertFileExists(expectedFilename, false); + FileTestHelper.assertFileExists(workDir, expectedFilename, false); } /** @@ -403,22 +394,22 @@ public void testLoadOnlyMostRecentFiles() //create a file for session abc that expired 5sec ago long exp = now - 5000L; String name1 = Long.toString(exp) + "__test_0.0.0.0_abc"; - FileTestHelper.createFile(name1); + FileTestHelper.createFile(workDir, name1); //create a file for same session that expired 4 sec ago exp = now - 4000L; String name2 = Long.toString(exp) + "__test_0.0.0.0_abc"; - FileTestHelper.createFile(name2); + FileTestHelper.createFile(workDir, name2); //make a file for same session that expired 3 sec ago exp = now - 3000L; String name3 = Long.toString(exp) + "__test_0.0.0.0_abc"; - FileTestHelper.createFile(name3); + FileTestHelper.createFile(workDir, name3); store.start(); - FileTestHelper.assertFileExists(name1, false); - FileTestHelper.assertFileExists(name2, false); - FileTestHelper.assertFileExists(name3, true); + FileTestHelper.assertFileExists(workDir, name1, false); + FileTestHelper.assertFileExists(workDir, name2, false); + FileTestHelper.assertFileExists(workDir, name3, true); } } diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/InfinispanTestSupport.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/InfinispanTestSupport.java index cb12972ced6f..bf822dd7e7e2 100644 --- a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/InfinispanTestSupport.java +++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/InfinispanTestSupport.java @@ -20,9 +20,13 @@ import java.io.File; import java.lang.annotation.ElementType; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Properties; -import org.eclipse.jetty.toolchain.test.MavenTestingUtils; +import org.eclipse.jetty.toolchain.test.FS; +import org.eclipse.jetty.toolchain.test.jupiter.WorkDir; +import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension; import org.eclipse.jetty.util.IO; import org.hibernate.search.cfg.Environment; import org.hibernate.search.cfg.SearchMapping; @@ -33,6 +37,7 @@ import org.infinispan.configuration.global.GlobalConfigurationBuilder; import org.infinispan.manager.DefaultCacheManager; import org.infinispan.manager.EmbeddedCacheManager; +import org.junit.jupiter.api.extension.ExtendWith; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -40,8 +45,10 @@ /** * InfinispanTestSupport */ +@ExtendWith(WorkDirExtension.class) public class InfinispanTestSupport { + public WorkDir workDir; public static final String DEFAULT_CACHE_NAME = "session_test_cache"; public Cache _cache; @@ -95,22 +102,20 @@ public Cache getCache() public void setup() throws Exception { - File testdir = MavenTestingUtils.getTargetTestingDir(); - File tmp = new File(testdir, "indexes"); - IO.delete(tmp); - tmp.mkdirs(); + Path root = workDir.getEmptyPathDir(); + Path indexesDir = root.resolve("indexes"); + FS.ensureDirExists(indexesDir); SearchMapping mapping = new SearchMapping(); mapping.entity(SessionData.class).indexed().providedId().property("expiry", ElementType.FIELD).field(); Properties properties = new Properties(); properties.put(Environment.MODEL_MAPPING, mapping); - properties.put("hibernate.search.default.indexBase", tmp.getAbsolutePath()); + properties.put("hibernate.search.default.indexBase", indexesDir.toString()); if (_useFileStore) { - _tmpdir = File.createTempFile("infini", "span"); - _tmpdir.delete(); - _tmpdir.mkdir(); + Path tmpDir = Files.createTempDirectory("infinispan"); + _tmpdir = tmpDir.toFile(); ConfigurationChildBuilder b = _builder.indexing() .index(Index.ALL) diff --git a/tests/test-webapps/test-jetty-webapp/src/test/java/org/eclipse/jetty/TestServer.java b/tests/test-webapps/test-jetty-webapp/src/test/java/org/eclipse/jetty/TestServer.java index 8ae623725962..28fd6547db47 100644 --- a/tests/test-webapps/test-jetty-webapp/src/test/java/org/eclipse/jetty/TestServer.java +++ b/tests/test-webapps/test-jetty-webapp/src/test/java/org/eclipse/jetty/TestServer.java @@ -18,7 +18,6 @@ package org.eclipse.jetty; -import java.io.File; import java.io.IOException; import java.lang.management.ManagementFactory; import java.nio.file.FileSystems; @@ -116,8 +115,8 @@ public static void main(String[] args) throws Exception login.setConfig(jettyRoot.resolve("tests/test-webapps/test-jetty-webapp/src/main/config/demo-base/etc/realm.properties").toString()); server.addBean(login); - File log = File.createTempFile("jetty-yyyy_mm_dd", "log"); - CustomRequestLog requestLog = new CustomRequestLog(log.toString()); + Path logPath = Files.createTempFile("jetty-yyyy_mm_dd", "log"); + CustomRequestLog requestLog = new CustomRequestLog(logPath.toString()); server.setRequestLog(requestLog); server.setStopAtShutdown(true); @@ -127,15 +126,11 @@ public static void main(String[] args) throws Exception webapp.setParentLoaderPriority(true); webapp.setResourceBase(jettyRoot.resolve("tests/test-webapps/test-jetty-webapp/src/main/webapp").toString()); webapp.setAttribute("testAttribute", "testValue"); - File sessiondir = File.createTempFile("sessions", null); - if (sessiondir.exists()) - sessiondir.delete(); - sessiondir.mkdir(); - sessiondir.deleteOnExit(); + Path sessionDir = Files.createTempDirectory("sessions"); DefaultSessionCache ss = new DefaultSessionCache(webapp.getSessionHandler()); FileSessionDataStore sds = new FileSessionDataStore(); ss.setSessionDataStore(sds); - sds.setStoreDir(sessiondir); + sds.setStoreDir(sessionDir.toFile()); webapp.getSessionHandler().setSessionCache(ss); contexts.addHandler(webapp);