Skip to content

Commit 6620d23

Browse files
ldeckrnorth
authored andcommitted
Add RecordingFileFactory with default implementation (#507)
Add RecordingFileFactory with default implementation By default this returns a file in the given vlc recording directory named '<RESULT>-<TestClassName>-<testMethodName>-<YYYYMMdd-HHmmss>.flv', where RESULT is either 'PASSED' or 'FAILED'. A custom factory can be provided to BrowserWebDriverContainer#withRecordingFileFactory. The factory is only applicable if the BrowserWebDriverContainer#recordingMode enables the retention of recordings. Fixes #500.
1 parent 9f1486e commit 6620d23

File tree

7 files changed

+119
-11
lines changed

7 files changed

+119
-11
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ All notable changes to this project will be documented in this file.
1616
- Use Visible Assertions 2.1.0 for pre-flight test output (eliminating Jansi/JNR-POSIX dependencies for lower likelihood of conflict. JNA is now used internally by Visible Assertions instead).
1717
- Mark all links functionality as deprecated. This is pending removal in a later release. Please see [\#465](https://github.com/testcontainers/testcontainers-java/issues/465). {@link Network} features should be used instead.
1818
- Added support for copying files to/from running containers ([\#378](https://github.com/testcontainers/testcontainers-java/issues/378))
19+
- Added support for customising the recording file name ([\#500](https://github.com/testcontainers/testcontainers-java/issues/500))
1920

2021
## [1.4.3] - 2017-10-14
2122
### Fixed

docs/usage/webdriver_containers.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,15 @@ new BrowserWebDriverContainer()
8080
```
8181
Note that the seconds parameter to `withRecordingMode` should be a directory where recordings can be saved.
8282

83+
If you would like to customise the file name of the recording, or provide a different directory at runtime based on the description of the test and/or its success or failure, you may provide a custom recording file factory as follows:
84+
```java
85+
new BrowserWebDriverContainer()
86+
//...
87+
.withRecordingFileFactory(new CustomRecordingFileFactory())
88+
```
89+
90+
Note the factory must implement `org.testcontainers.containers.RecordingFileFactory`.
91+
8392
## More examples
8493

8594
A few different examples are shown in [ChromeWebDriverContainerTest.java](https://github.com/testcontainers/testcontainers-java/blob/master/modules/selenium/src/test/java/org/testcontainers/junit/ChromeWebDriverContainerTest.java).

modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,9 @@
1717
import java.io.File;
1818
import java.net.MalformedURLException;
1919
import java.net.URL;
20-
import java.text.SimpleDateFormat;
2120
import java.time.Duration;
2221
import java.util.ArrayList;
2322
import java.util.Collection;
24-
import java.util.Date;
2523
import java.util.concurrent.TimeUnit;
2624

2725
import static java.time.temporal.ChronoUnit.SECONDS;
@@ -47,19 +45,20 @@ public class BrowserWebDriverContainer<SELF extends BrowserWebDriverContainer<SE
4745
@Nullable
4846
private RemoteWebDriver driver;
4947
private VncRecordingMode recordingMode = VncRecordingMode.RECORD_FAILING;
48+
private RecordingFileFactory recordingFileFactory;
5049
private File vncRecordingDirectory = new File("/tmp");
5150

5251
private final Collection<VncRecordingSidekickContainer> currentVncRecordings = new ArrayList<>();
5352

5453
private static final Logger LOGGER = LoggerFactory.getLogger(BrowserWebDriverContainer.class);
55-
private static final SimpleDateFormat filenameDateFormat = new SimpleDateFormat("YYYYMMdd-HHmmss");
5654

5755
/**
5856
*/
5957
public BrowserWebDriverContainer() {
6058
this.waitStrategy = new LogMessageWaitStrategy()
6159
.withRegEx(".*(RemoteWebDriver instances should connect to|Selenium Server is up and running).*\n")
6260
.withStartupTimeout(Duration.of(15, SECONDS));
61+
this.withRecordingFileFactory(new DefaultRecordingFileFactory());
6362
}
6463

6564
/**
@@ -183,22 +182,20 @@ public RemoteWebDriver getWebDriver() {
183182

184183
@Override
185184
protected void failed(Throwable e, Description description) {
186-
187185
switch (recordingMode) {
188186
case RECORD_FAILING:
189187
case RECORD_ALL:
190-
stopAndRetainRecording(description);
188+
stopAndRetainRecordingForDescriptionAndSuccessState(description, false);
191189
break;
192190
}
193191
currentVncRecordings.clear();
194192
}
195193

196194
@Override
197195
protected void succeeded(Description description) {
198-
199196
switch (recordingMode) {
200197
case RECORD_ALL:
201-
stopAndRetainRecording(description);
198+
stopAndRetainRecordingForDescriptionAndSuccessState(description, true);
202199
break;
203200
}
204201
currentVncRecordings.clear();
@@ -212,9 +209,8 @@ protected void finished(Description description) {
212209
this.stop();
213210
}
214211

215-
private void stopAndRetainRecording(Description description) {
216-
File recordingFile = new File(vncRecordingDirectory, "recording-" + filenameDateFormat.format(new Date()) + ".flv");
217-
212+
private void stopAndRetainRecordingForDescriptionAndSuccessState(Description description, boolean succeeded) {
213+
File recordingFile = recordingFileFactory.recordingFileForTest(vncRecordingDirectory, description, succeeded);
218214
LOGGER.info("Screen recordings for test {} will be stored at: {}", description.getDisplayName(), recordingFile);
219215

220216
for (VncRecordingSidekickContainer container : currentVncRecordings) {
@@ -244,6 +240,10 @@ public SELF withRecordingMode(VncRecordingMode recordingMode, File vncRecordingD
244240
return self();
245241
}
246242

243+
public SELF withRecordingFileFactory(RecordingFileFactory recordingFileFactory) {
244+
this.recordingFileFactory = recordingFileFactory;
245+
return self();
246+
}
247247

248248
public enum VncRecordingMode {
249249
SKIP, RECORD_ALL, RECORD_FAILING
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package org.testcontainers.containers;
2+
3+
import org.junit.runner.Description;
4+
5+
import java.io.File;
6+
import java.text.SimpleDateFormat;
7+
import java.util.Date;
8+
9+
public class DefaultRecordingFileFactory implements RecordingFileFactory {
10+
11+
private static final SimpleDateFormat filenameDateFormat = new SimpleDateFormat("YYYYMMdd-HHmmss");
12+
private static final String PASSED = "PASSED";
13+
private static final String FAILED = "FAILED";
14+
private static final String FILENAME_FORMAT = "%s-%s-%s-%s.flv";
15+
16+
@Override
17+
public File recordingFileForTest(File vncRecordingDirectory, Description description, boolean succeeded) {
18+
final String prefix = succeeded ? PASSED : FAILED;
19+
final String fileName = String.format(FILENAME_FORMAT,
20+
prefix,
21+
description.getTestClass().getSimpleName(),
22+
description.getMethodName(),
23+
filenameDateFormat.format(new Date())
24+
);
25+
return new File(vncRecordingDirectory, fileName);
26+
}
27+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.testcontainers.containers;
2+
3+
import org.junit.runner.Description;
4+
5+
import java.io.File;
6+
7+
public interface RecordingFileFactory {
8+
File recordingFileForTest(File vncRecordingDirectory, Description description, boolean succeeded);
9+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package org.testcontainers.containers;
2+
3+
import lombok.Value;
4+
import org.junit.Test;
5+
import org.junit.runner.Description;
6+
import org.junit.runner.RunWith;
7+
import org.junit.runners.Parameterized;
8+
9+
import java.io.File;
10+
import java.nio.file.Files;
11+
import java.time.format.DateTimeFormatter;
12+
import java.util.ArrayList;
13+
import java.util.Arrays;
14+
import java.util.Collection;
15+
import java.util.List;
16+
17+
import static java.lang.Boolean.FALSE;
18+
import static java.lang.Boolean.TRUE;
19+
import static java.lang.String.format;
20+
import static java.time.LocalDateTime.now;
21+
import static org.hamcrest.core.IsCollectionContaining.hasItem;
22+
import static org.junit.Assert.assertThat;
23+
import static org.junit.runner.Description.createTestDescription;
24+
25+
@RunWith(Parameterized.class)
26+
@Value
27+
public class DefaultRecordingFileFactoryTest {
28+
29+
private static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern("YYYYMMdd-HHmmss");
30+
31+
private final DefaultRecordingFileFactory factory = new DefaultRecordingFileFactory();
32+
private final String methodName;
33+
private final String prefix;
34+
private final boolean success;
35+
36+
@Parameterized.Parameters
37+
public static Collection<Object[]> data() {
38+
Collection<Object[]> args = new ArrayList<>();
39+
args.add(new Object[]{"testMethod1", "FAILED", FALSE});
40+
args.add(new Object[]{"testMethod2", "PASSED", TRUE});
41+
return args;
42+
}
43+
44+
@Test
45+
public void recordingFileThatShouldDescribeTheTestResultAtThePresentTime() throws Exception {
46+
File vncRecordingDirectory = Files.createTempDirectory("recording").toFile();
47+
Description description = createTestDescription(getClass().getCanonicalName(), methodName, Test.class);
48+
49+
File recordingFile = factory.recordingFileForTest(vncRecordingDirectory, description, success);
50+
51+
String expectedFilePrefix = format("%s-%s-%s", prefix, getClass().getSimpleName(), methodName);
52+
53+
List<File> expectedPossibleFileNames = Arrays.asList(
54+
new File(vncRecordingDirectory, format("%s-%s.flv", expectedFilePrefix, now().format(DATETIME_FORMATTER))),
55+
new File(vncRecordingDirectory, format("%s-%s.flv", expectedFilePrefix, now().minusSeconds(1L).format(DATETIME_FORMATTER)))
56+
);
57+
58+
assertThat(expectedPossibleFileNames, hasItem(recordingFile));
59+
}
60+
}

modules/selenium/src/test/java/org/testcontainers/junit/ChromeRecordingWebDriverContainerTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import org.junit.Test;
55
import org.openqa.selenium.remote.DesiredCapabilities;
66
import org.testcontainers.containers.BrowserWebDriverContainer;
7+
import org.testcontainers.containers.DefaultRecordingFileFactory;
78

89
import java.io.File;
910

@@ -17,7 +18,8 @@ public class ChromeRecordingWebDriverContainerTest extends BaseWebDriverContaine
1718
@Rule
1819
public BrowserWebDriverContainer chromeThatRecordsAllTests = new BrowserWebDriverContainer()
1920
.withDesiredCapabilities(DesiredCapabilities.chrome())
20-
.withRecordingMode(RECORD_ALL, new File("./target/"));
21+
.withRecordingMode(RECORD_ALL, new File("./target/"))
22+
.withRecordingFileFactory(new DefaultRecordingFileFactory());
2123

2224
@Rule
2325
public BrowserWebDriverContainer chromeThatRecordsFailingTests = new BrowserWebDriverContainer()

0 commit comments

Comments
 (0)