diff --git a/it-testbook/src/test/java/io/github/giulong/spectrum/it_testbook/TestBookSessionListener.java b/it-testbook/src/test/java/io/github/giulong/spectrum/it_testbook/TestBookSessionListener.java index 029f3c18..5b3565e9 100644 --- a/it-testbook/src/test/java/io/github/giulong/spectrum/it_testbook/TestBookSessionListener.java +++ b/it-testbook/src/test/java/io/github/giulong/spectrum/it_testbook/TestBookSessionListener.java @@ -23,75 +23,114 @@ @Slf4j public class TestBookSessionListener implements LauncherSessionListener { + private final List fakeExtentReportsDirectories = List.of("fakeExtentReport1", "fakeExtentReport2", "fakeExtentReport3"); + private final List fakeExtentReports = List.of("fakeExtentReport1.html", "fakeExtentReport2.html", "fakeExtentReport3.html"); private final List fakeHtmlTestBooks = List.of("fakeTestBook1.html", "fakeTestBook2.html", "fakeTestBook3.html"); private final List fakeTxtTestBooks = List.of("fakeTestBook1.txt", "fakeTestBook2.txt", "fakeTestBook3.txt"); private final FileUtils fileUtils = FileUtils.getInstance(); private final YamlUtils yamlUtils = YamlUtils.getInstance(); + private Path extentReportsDirectory; private Path htmlTestBooksDirectory; private Path txtTestBooksDirectory; + private int extentTotalRetention; private int txtTestBookTotalRetention; @Override @SneakyThrows public void launcherSessionOpened(final LauncherSession session) { final Configuration configuration = yamlUtils.readInternal("configuration.yaml", Configuration.class); + final Configuration.Extent extent = configuration.getExtent(); final FileTestBookReporter htmlTestBookReporter = getReporterFrom(configuration, HtmlTestBookReporter.class); final FileTestBookReporter txtTestBookReporter = getReporterFrom(configuration, TxtTestBookReporter.class); + extentReportsDirectory = Path.of("target/spectrum/reports"); htmlTestBooksDirectory = Path.of(htmlTestBookReporter.getOutput()).getParent(); txtTestBooksDirectory = Path.of(txtTestBookReporter.getOutput()).getParent(); + fileUtils.deleteDirectory(extentReportsDirectory); fileUtils.deleteDirectory(htmlTestBooksDirectory); fileUtils.deleteDirectory(txtTestBooksDirectory); + Files.createDirectories(extentReportsDirectory); Files.createDirectories(htmlTestBooksDirectory); Files.createDirectories(txtTestBooksDirectory); + extentTotalRetention = extent.getRetention().getTotal(); + assertEquals(3, extentTotalRetention); txtTestBookTotalRetention = txtTestBookReporter.getRetention().getTotal(); assertEquals(2, txtTestBookTotalRetention); - createTestBooks(fakeHtmlTestBooks, htmlTestBooksDirectory); - createTestBooks(fakeTxtTestBooks, txtTestBooksDirectory); + createDirectories(fakeExtentReportsDirectories, extentReportsDirectory); + createFiles(fakeExtentReports, extentReportsDirectory); + createFiles(fakeHtmlTestBooks, htmlTestBooksDirectory); + createFiles(fakeTxtTestBooks, txtTestBooksDirectory); } @Override public void launcherSessionClosed(LauncherSession session) { - final List remainingHtmlTestBooks = getRemainingTestBooksFrom(htmlTestBooksDirectory.toFile().listFiles(), "html"); + final List remainingExtentReportsDirectories = getRemainingDirectoriesFrom(extentReportsDirectory.toFile().listFiles()); + final List remainingExtentReportsDirectoriesNames = getNamesOf(remainingExtentReportsDirectories); + assertEquals(extentTotalRetention, remainingExtentReportsDirectories.size()); + assertFalse(remainingExtentReportsDirectoriesNames.contains(fakeExtentReportsDirectories.get(0)), "The first extent report directory should have been deleted due to retention policies"); + final List remainingExtentReports = getRemainingFilesFrom(extentReportsDirectory.toFile().listFiles(), "html"); + final List remainingExtentReportsNames = getNamesOf(remainingExtentReports); + assertEquals(extentTotalRetention, remainingExtentReports.size()); + assertFalse(remainingExtentReportsNames.contains(fakeExtentReports.get(0)), "The first extent report should have been deleted due to retention policies"); + + final List remainingHtmlTestBooks = getRemainingFilesFrom(htmlTestBooksDirectory.toFile().listFiles(), "html"); assertTrue(getNamesOf(remainingHtmlTestBooks).containsAll(fakeHtmlTestBooks), "Html reporter should have the default total retention of Integer.MAX_VALUE, so no one should be deleted"); - final List remainingTxtTestBooks = getRemainingTestBooksFrom(htmlTestBooksDirectory.toFile().listFiles(), "txt"); + final List remainingTxtTestBooks = getRemainingFilesFrom(htmlTestBooksDirectory.toFile().listFiles(), "txt"); final List remainingTxtTestBooksNames = getNamesOf(remainingTxtTestBooks); assertEquals(txtTestBookTotalRetention, remainingTxtTestBooks.size()); assertFalse(remainingTxtTestBooksNames.contains(fakeTxtTestBooks.get(0)), "The first txt testbook should have been deleted due to retention policies"); assertFalse(remainingTxtTestBooksNames.contains(fakeTxtTestBooks.get(1)), "The second txt testbook should have been deleted due to retention policies"); - deleteTestBooks(fakeHtmlTestBooks, htmlTestBooksDirectory); - deleteTestBooks(fakeTxtTestBooks, txtTestBooksDirectory); + deleteDirectories(fakeExtentReportsDirectories, extentReportsDirectory); + deleteFiles(fakeExtentReports, extentReportsDirectory); + deleteFiles(fakeHtmlTestBooks, htmlTestBooksDirectory); + deleteFiles(fakeTxtTestBooks, txtTestBooksDirectory); + } + + @SneakyThrows + private void createFiles(final List fileNames, final Path directory) { + for (String fileName : fileNames) { + assertTrue(Files.createFile(directory.resolve(fileName)).toFile().exists()); + Thread.sleep(10); // just to be sure files have different creation dates + } } @SneakyThrows - private void createTestBooks(final List testBooks, final Path directory) { - for (String testBook : testBooks) { - assertTrue(Files.createFile(directory.resolve(testBook)).toFile().exists()); + private void createDirectories(final List directoryNames, final Path parentDirectory) { + for (String fileName : directoryNames) { + assertTrue(Files.createDirectories(parentDirectory.resolve(fileName)).toFile().exists()); Thread.sleep(10); // just to be sure files have different creation dates } } - private List getNamesOf(final List testBooks) { - return testBooks.stream().map(File::getName).toList(); + private List getNamesOf(final List files) { + return files.stream().map(File::getName).toList(); } - private void deleteTestBooks(final List testBooks, final Path directory) { - for (String testBook : testBooks) { - final File testBookFile = directory.resolve(testBook).toFile(); + private void deleteFiles(final List fileNames, final Path directory) { + for (String fileName : fileNames) { + final File file = directory.resolve(fileName).toFile(); - if (testBookFile.exists()) { - testBookFile.deleteOnExit(); + if (file.exists()) { + file.deleteOnExit(); } } } + private void deleteDirectories(final List directoryNames, final Path parentDirectory) { + directoryNames + .stream() + .map(Path::of) + .map(parentDirectory::resolve) + .forEach(fileUtils::deleteDirectory); + } + private FileTestBookReporter getReporterFrom(final Configuration configuration, final Class clazz) { return (FileTestBookReporter) configuration .getTestBook() @@ -102,7 +141,7 @@ private FileTestBookReporter getReporterFrom(final Configuration configuration, .orElseThrow(); } - private List getRemainingTestBooksFrom(final File[] files, final String extension) { + private List getRemainingFilesFrom(final File[] files, final String extension) { return Arrays .stream(files) .filter(file -> !file.isDirectory()) @@ -110,4 +149,12 @@ private List getRemainingTestBooksFrom(final File[] files, final String ex .sorted(comparingLong(File::lastModified)) .toList(); } + + private List getRemainingDirectoriesFrom(final File[] files) { + return Arrays + .stream(files) + .filter(File::isDirectory) + .sorted(comparingLong(File::lastModified)) + .toList(); + } } diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java index f5c349ad..91cb360b 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java @@ -74,15 +74,18 @@ public String removeExtensionFrom(final String fileName) { @SneakyThrows public void deleteDirectory(final Path directory) { - if (Files.exists(directory)) { - log.debug("About to delete directory '{}'", directory); - - try (Stream files = Files.walk(directory)) { - files - .sorted(reverseOrder()) - .map(Path::toFile) - .forEach(f -> log.trace("File '{}' deleted? {}", f, f.delete())); - } + if (!Files.exists(directory)) { + log.debug("Avoid deleting non-existing directory '{}'", directory); + return; + } + + log.debug("About to delete directory '{}'", directory); + + try (Stream files = Files.walk(directory)) { + files + .sorted(reverseOrder()) + .map(Path::toFile) + .forEach(f -> log.trace("File '{}' deleted? {}", f, f.delete())); } } }