diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/util/SureFireFileManager.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/util/SureFireFileManager.java
index 212f299859..0f414593ad 100644
--- a/surefire-api/src/main/java/org/apache/maven/surefire/api/util/SureFireFileManager.java
+++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/util/SureFireFileManager.java
@@ -20,20 +20,47 @@
*/
import java.io.File;
+import java.util.Objects;
+import java.util.stream.Stream;
/**
- * Centralized file management of surefire.
+ * Centralized file management of temporary files in surefire.
+ * Files are deleted on VM exit.
*
* @author Markus Spann
*/
public final class SureFireFileManager
{
- public static File createTempFile( String prefix, String suffix )
+ private static TempFileManager instance = create();
+
+ private static TempFileManager create()
{
+ String subDirName = "surefire";
- return TempFileManager.instance( "surefire" ).createTempFile( prefix, suffix );
+ // create directory name suffix from legal chars in the current user name
+ // or a millisecond timestamp as fallback
+ String userSuffix = Stream.of( "user.name", "USER", "USERNAME" )
+ .map( System::getProperty )
+ .filter( Objects::nonNull )
+ .findFirst()
+ .map( u -> u.replaceAll( "[^A-Za-z0-9\\-_]", "" ) )
+ .map( u -> u.isEmpty() ? null : u )
+ .orElse( Long.toString( System.currentTimeMillis() ) );
+ if ( userSuffix != null )
+ {
+ subDirName += "-" + userSuffix;
+ }
+
+ TempFileManager tfm = TempFileManager.instance( subDirName );
+ tfm.setDeleteOnExit( true );
+ return tfm;
+ }
+
+ public static File createTempFile( String prefix, String suffix )
+ {
+ return instance.createTempFile( prefix, suffix );
}
}
diff --git a/surefire-api/src/test/java/org/apache/maven/surefire/api/util/SureFireFileManagerTest.java b/surefire-api/src/test/java/org/apache/maven/surefire/api/util/SureFireFileManagerTest.java
new file mode 100644
index 0000000000..cda37d83fd
--- /dev/null
+++ b/surefire-api/src/test/java/org/apache/maven/surefire/api/util/SureFireFileManagerTest.java
@@ -0,0 +1,64 @@
+package org.apache.maven.surefire.api.util;
+
+/*
+ * 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.
+ */
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import junit.framework.TestCase;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.attribute.PosixFilePermission;
+import java.nio.file.attribute.PosixFilePermissions;
+import java.util.Set;
+
+/**
+ * Unit test for the surefire instance of temp file manager.
+ *
+ * @author Markus Spann
+ */
+public class SureFireFileManagerTest extends TestCase
+{
+
+ @Test
+ public void testCreateTempFile() throws IOException
+ {
+
+ File tempFile = SureFireFileManager.createTempFile( "sfprefix", "sfsuffix" );
+ assertThat( tempFile ).isWritable();
+ assertThat( tempFile.getName() ).startsWith( "sfprefix" ).endsWith( "sfsuffix" );
+
+ File tempDir = tempFile.getParentFile();
+ assertThat( tempDir ).isDirectory().isWritable();
+ assertThat( tempDir.getName() ).startsWith( "surefire-" ).doesNotMatch( "[^A-Za-z0-9\\\\-_]" );
+
+ boolean isPosix = FileSystems.getDefault().supportedFileAttributeViews().contains( "posix" );
+ if ( isPosix )
+ {
+ Set permissions = Files.getPosixFilePermissions( tempDir.toPath() );
+ assertEquals( "rwxrwxr-x", PosixFilePermissions.toString( permissions ) );
+ }
+
+ }
+
+}