1 package com.atlassian.webdriver.rule.test;
2
3 import org.apache.commons.io.FileUtils;
4 import org.junit.rules.TemporaryFolder;
5 import org.junit.rules.TestWatcher;
6 import org.junit.runner.Description;
7
8 import javax.annotation.Nonnull;
9 import java.io.File;
10 import java.io.IOException;
11
12 import static com.google.common.base.Preconditions.checkState;
13 import static org.mockito.internal.util.Checks.checkNotNull;
14
15
16
17
18 public class TemporaryFolderPreservingOnFailure extends TestWatcher
19 {
20
21 private final TemporaryFolder temporaryFolder;
22 private final File targetDir;
23
24 public TemporaryFolderPreservingOnFailure(@Nonnull File targetDir)
25 {
26 checkNotNull(targetDir, "targetDir");
27 checkState(targetDir.isDirectory() || targetDir.getParentFile().isDirectory(),
28 "target dir or its parent must be an existing directory: " + targetDir.getAbsolutePath());
29 this.targetDir = targetDir;
30 this.temporaryFolder = new TemporaryFolder();
31 }
32
33 public TemporaryFolder getFolder()
34 {
35 return temporaryFolder;
36 }
37
38 @Override
39 protected void starting(Description description)
40 {
41 try
42 {
43 temporaryFolder.create();
44 }
45 catch (IOException e)
46 {
47 throw new RuntimeException(e);
48 }
49 }
50
51 @Override
52 protected void failed(Throwable e, Description description)
53 {
54 try
55 {
56 FileUtils.copyDirectory(temporaryFolder.getRoot(), new File(targetDir, temporaryFolder.getRoot().getName()));
57 } catch (IOException ioe)
58 {
59 throw new RuntimeException(ioe);
60 }
61 }
62
63 @Override
64 protected void finished(Description description)
65 {
66 temporaryFolder.delete();
67 }
68 }