diff --git a/allure-java-commons/build.gradle.kts b/allure-java-commons/build.gradle.kts index 34a9a2ed..ad83d3fb 100644 --- a/allure-java-commons/build.gradle.kts +++ b/allure-java-commons/build.gradle.kts @@ -6,6 +6,7 @@ description = "Allure Java Commons" dependencies { api("org.slf4j:slf4j-api") + api("commons-io:commons-io") api(project(":allure-model")) compileOnly("org.aspectj:aspectjrt") internal("com.fasterxml.jackson.core:jackson-databind") diff --git a/allure-java-commons/src/main/java/io/qameta/allure/FileSystemResultsWriter.java b/allure-java-commons/src/main/java/io/qameta/allure/FileSystemResultsWriter.java index 187f39dc..f9b64e81 100644 --- a/allure-java-commons/src/main/java/io/qameta/allure/FileSystemResultsWriter.java +++ b/allure-java-commons/src/main/java/io/qameta/allure/FileSystemResultsWriter.java @@ -19,6 +19,7 @@ import io.qameta.allure.internal.Allure2ModelJackson; import io.qameta.allure.model.TestResult; import io.qameta.allure.model.TestResultContainer; +import org.apache.commons.io.FileUtils; import java.io.IOException; import java.io.InputStream; @@ -26,6 +27,7 @@ import java.nio.file.Path; import java.util.Objects; import java.util.UUID; +import java.util.concurrent.atomic.AtomicBoolean; /** * @author charlie (Dmitry Baev). @@ -36,6 +38,8 @@ public class FileSystemResultsWriter implements AllureResultsWriter { private final ObjectMapper mapper; + private final AtomicBoolean isOutputCleaned = new AtomicBoolean(false); + public FileSystemResultsWriter(final Path outputDirectory) { this.outputDirectory = outputDirectory; this.mapper = Allure2ModelJackson.createMapper(); @@ -46,6 +50,7 @@ public void write(final TestResult testResult) { final String testResultName = Objects.isNull(testResult.getUuid()) ? generateTestResultName() : generateTestResultName(testResult.getUuid()); + cleanDirectoriesIfNeeded(outputDirectory); createDirectories(outputDirectory); final Path file = outputDirectory.resolve(testResultName); try { @@ -60,6 +65,7 @@ public void write(final TestResultContainer testResultContainer) { final String testResultContainerName = Objects.isNull(testResultContainer.getUuid()) ? generateTestResultContainerName() : generateTestResultContainerName(testResultContainer.getUuid()); + cleanDirectoriesIfNeeded(outputDirectory); createDirectories(outputDirectory); final Path file = outputDirectory.resolve(testResultContainerName); try { @@ -71,6 +77,7 @@ public void write(final TestResultContainer testResultContainer) { @Override public void write(final String source, final InputStream attachment) { + cleanDirectoriesIfNeeded(outputDirectory); createDirectories(outputDirectory); final Path file = outputDirectory.resolve(source); try (InputStream is = attachment) { @@ -80,6 +87,17 @@ public void write(final String source, final InputStream attachment) { } } + private void cleanDirectoriesIfNeeded(final Path directory) { + if (isOutputCleaned.compareAndSet(false, true)) { + try { + FileUtils.deleteDirectory(directory.toFile()); + } catch (IOException e) { + throw new AllureResultsWriteException("Could not clean Allure results directory", e); + } + } + + } + private void createDirectories(final Path directory) { try { Files.createDirectories(directory); diff --git a/allure-java-commons/src/test/java/io/qameta/allure/FileSystemResultsWriterTest.java b/allure-java-commons/src/test/java/io/qameta/allure/FileSystemResultsWriterTest.java index d4bc5bda..4b8bcdd6 100644 --- a/allure-java-commons/src/test/java/io/qameta/allure/FileSystemResultsWriterTest.java +++ b/allure-java-commons/src/test/java/io/qameta/allure/FileSystemResultsWriterTest.java @@ -19,6 +19,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; +import java.io.File; +import java.io.IOException; import java.nio.file.Path; import java.util.UUID; @@ -53,4 +55,25 @@ void shouldWriteTestResult(@TempDir final Path folder) { assertThat(folder.resolve(fileName)) .isRegularFile(); } + + @Test + void shouldCleanResultsDirectoryBeforeFirstTestResult(@TempDir final Path folder) throws IOException { + final String existingFileName = "existing-file.json"; + final File existingFile = new File(folder.toFile(), existingFileName); + existingFile.createNewFile(); + + assertThat(folder).isDirectory(); + assertThat(folder.resolve(existingFile.getName())).isRegularFile(); + + FileSystemResultsWriter writer = new FileSystemResultsWriter(folder); + final String uuid = UUID.randomUUID().toString(); + final TestResult testResult = current().nextObject(TestResult.class, "steps").setUuid(uuid); + writer.write(testResult); + + final String fileName = generateTestResultName(uuid); + assertThat(folder).isDirectory(); + assertThat(folder.resolve(fileName)).isRegularFile(); + assertThat(folder.resolve(existingFileName)).doesNotExist(); + } + }