Skip to content

Commit 2ef8d38

Browse files
committed
refactor: catch errors instead of probing the file system beforehand
1 parent 425c587 commit 2ef8d38

File tree

2 files changed

+32
-17
lines changed

2 files changed

+32
-17
lines changed

src/main/kotlin/de/joshuagleitze/test/spek/testfiles/DefaultTestFiles.kt

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,15 @@ import org.spekframework.spek2.lifecycle.TestScope
1414
import org.spekframework.spek2.runtime.scope.ScopeImpl
1515
import java.io.IOException
1616
import java.lang.Integer.MAX_VALUE
17+
import java.nio.file.DirectoryNotEmptyException
1718
import java.nio.file.FileVisitResult
1819
import java.nio.file.FileVisitResult.CONTINUE
1920
import java.nio.file.FileVisitResult.SKIP_SUBTREE
2021
import java.nio.file.Files.createDirectories
2122
import java.nio.file.Files.createDirectory
2223
import java.nio.file.Files.createFile
2324
import java.nio.file.Files.delete
24-
import java.nio.file.Files.exists
2525
import java.nio.file.Files.isDirectory
26-
import java.nio.file.Files.list
2726
import java.nio.file.Files.walkFileTree
2827
import java.nio.file.Path
2928
import java.nio.file.Paths
@@ -147,31 +146,34 @@ class DefaultTestFiles internal constructor(): LifecycleListener, TestFiles {
147146
*/
148147
fun Root.testFiles(): TestFiles = DefaultTestFiles().also { this.registerListener(it) }
149148

150-
private fun clear(path: Path) {
151-
when {
152-
isDirectory(path) -> deleteNonGroupFilesRecursively(path)
153-
exists(path) -> delete(path)
154-
}
155-
}
156-
157-
private fun deleteNonGroupFilesRecursively(rootDirectory: Path) {
158-
walkFileTree(rootDirectory, object: SimpleFileVisitor<Path>() {
149+
private fun clear(path: Path) = tolerateDoesNotExist(path) {
150+
walkFileTree(path, object: SimpleFileVisitor<Path>() {
159151
override fun preVisitDirectory(dir: Path?, attrs: BasicFileAttributes?): FileVisitResult {
160152
checkNotNull(dir) { "dir was null" }
161-
return if (dir != rootDirectory && SCOPE_DIRECTORY_PATTERN.matches(dir.fileName.toString())) SKIP_SUBTREE
153+
return if (dir != path && SCOPE_DIRECTORY_PATTERN.matches(dir.fileName.toString())) SKIP_SUBTREE
162154
else CONTINUE
163155
}
164156

165157
override fun postVisitDirectory(dir: Path, exc: IOException?) =
166-
super.postVisitDirectory(dir, exc).also { if (dir != rootDirectory) deleteIfEmpty(dir) }
158+
super.postVisitDirectory(dir, exc).also { if (dir != path) deleteIfEmpty(dir) }
167159

168160
override fun visitFile(file: Path, attrs: BasicFileAttributes?) =
169-
super.visitFile(file, attrs).also { delete(file) }
161+
super.visitFile(file, attrs).also { tolerateDoesNotExist(file) { delete(file) } }
170162
})
171163
}
172164

173-
private fun deleteIfEmpty(path: Path) {
174-
if (!list(path).findAny().isPresent) {
175-
delete(path)
165+
private fun deleteIfEmpty(directory: Path) = tolerateDoesNotExist(directory) {
166+
try {
167+
delete(directory)
168+
} catch (notEmpty: DirectoryNotEmptyException) {
169+
// swallow
170+
}
171+
}
172+
173+
private inline fun tolerateDoesNotExist(path: Path, block: (Path) -> Unit) {
174+
try {
175+
block(path)
176+
} catch (noSuchFile: java.nio.file.NoSuchFileException) {
177+
// swallow
176178
}
177179
}

src/test/kotlin/DefaultTestFilesSpec.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import org.spekframework.spek2.style.specification.describe
2727
import java.nio.file.Files.createDirectories
2828
import java.nio.file.Files.createDirectory
2929
import java.nio.file.Files.createFile
30+
import java.nio.file.Files.delete
3031

3132
object DefaultTestFilesSpec: Spek({
3233
val fileRoot = freezeFileRoot()
@@ -356,6 +357,18 @@ object DefaultTestFilesSpec: Spek({
356357
testFiles.afterExecuteTest(mockTest, Failure(IllegalStateException()))
357358
expect(failureTestfile).exists()
358359
}
360+
361+
it("tolerates deletion of created files") {
362+
val mockTest = mockScope<TestScopeImpl>("deletion toleration")
363+
364+
testFiles.beforeExecuteTest(mockTest)
365+
delete(testFiles.createFile(delete = ALWAYS))
366+
delete(testFiles.createDirectory(delete = ALWAYS))
367+
368+
expect {
369+
testFiles.afterExecuteTest(mockTest, Success)
370+
}.notToThrow()
371+
}
359372
}
360373
}
361374
})

0 commit comments

Comments
 (0)