Skip to content

Commit

Permalink
Add RecordingFileFactory with default implementation
Browse files Browse the repository at this point in the history
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 testcontainers#500.
  • Loading branch information
ldeck committed Nov 27, 2017
1 parent b7e7d52 commit b08541e
Show file tree
Hide file tree
Showing 5 changed files with 103 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,9 @@
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.concurrent.TimeUnit;

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

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

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

/**
*/
public BrowserWebDriverContainer() {
this.waitStrategy = new LogMessageWaitStrategy()
.withRegEx(".*(RemoteWebDriver instances should connect to|Selenium Server is up and running).*\n")
.withStartupTimeout(Duration.of(15, SECONDS));
this.withRecordingFileFactory(new DefaultRecordingFileFactory());
}

/**
Expand Down Expand Up @@ -187,7 +186,7 @@ protected void failed(Throwable e, Description description) {
switch (recordingMode) {
case RECORD_FAILING:
case RECORD_ALL:
stopAndRetainRecording(description);
stopAndRetainRecording(description, false);
break;
}
currentVncRecordings.clear();
Expand All @@ -198,7 +197,7 @@ protected void succeeded(Description description) {

switch (recordingMode) {
case RECORD_ALL:
stopAndRetainRecording(description);
stopAndRetainRecording(description, true);
break;
}
currentVncRecordings.clear();
Expand All @@ -212,9 +211,8 @@ protected void finished(Description description) {
this.stop();
}

private void stopAndRetainRecording(Description description) {
File recordingFile = new File(vncRecordingDirectory, "recording-" + filenameDateFormat.format(new Date()) + ".flv");

private void stopAndRetainRecording(Description description, boolean succeeded) {
File recordingFile = recordingFileFactory.recordingFileForTest(vncRecordingDirectory, description, succeeded);
LOGGER.info("Screen recordings for test {} will be stored at: {}", description.getDisplayName(), recordingFile);

for (VncRecordingSidekickContainer container : currentVncRecordings) {
Expand Down Expand Up @@ -244,6 +242,10 @@ public SELF withRecordingMode(VncRecordingMode recordingMode, File vncRecordingD
return self();
}

public SELF withRecordingFileFactory(RecordingFileFactory recordingFileFactory) {
this.recordingFileFactory = recordingFileFactory;
return self();
}

public enum VncRecordingMode {
SKIP, RECORD_ALL, RECORD_FAILING
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.testcontainers.containers;

import org.junit.runner.Description;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DefaultRecordingFileFactory implements RecordingFileFactory {

private static final SimpleDateFormat filenameDateFormat = new SimpleDateFormat("YYYYMMdd-HHmmss");

@Override
public File recordingFileForTest(File vncRecordingDirectory, Description description, boolean succeeded) {
final String prefix = succeeded ? "PASSED" : "FAILED";
final String fileName = String.format("%s-%s-%s-%s.flv",
prefix,
description.getTestClass().getSimpleName(),
description.getMethodName(),
filenameDateFormat.format(new Date())
);
return new File(vncRecordingDirectory, fileName);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.testcontainers.containers;

import org.junit.runner.Description;

import java.io.File;

public interface RecordingFileFactory {
File recordingFileForTest(File vncRecordingDirectory, Description description, boolean succeeded);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package org.testcontainers.containers;

import lombok.Value;
import org.junit.Test;
import org.junit.runner.Description;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.text.SimpleDateFormat;
import java.util.*;

import static java.lang.Boolean.FALSE;
import static java.lang.Boolean.TRUE;
import static java.lang.String.format;
import static org.junit.Assert.assertEquals;
import static org.junit.runner.Description.createTestDescription;

@RunWith(Parameterized.class)
@Value
public class DefaultRecordingFileFactoryTest {

private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("YYYYMMdd-HHmmss");


@Parameterized.Parameters
public static Collection<Object[]> data() {
Random random = new Random();
return new ArrayList<Object[]>() {{
add(new Object[]{format("testMethodName%d", random.nextInt()), "FAILED", FALSE});
add(new Object[]{format("testMethodName%d", random.nextInt()), "PASSED", TRUE});
}};
}

private final DefaultRecordingFileFactory factory = new DefaultRecordingFileFactory();
private final String methodName;
private final String prefix;
private final boolean success;

@Test
public void recordingFileThatShouldDescribeTheTestResultAtThePresentTime() throws Exception {
File vncRecordingDirectory = Files.createTempDirectory("recording").toFile();
Description description = createTestDescription(getClass().getCanonicalName(), methodName, Test.class);

File recordingFile = factory.recordingFileForTest(vncRecordingDirectory, description, success);

File expectedFile = new File(vncRecordingDirectory, format("%s-%s-%s-%s.flv",
prefix,
getClass().getSimpleName(),
methodName,
DATE_FORMAT.format(new Date()))
);
assertEquals(expectedFile, recordingFile);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import org.junit.Test;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testcontainers.containers.BrowserWebDriverContainer;
import org.testcontainers.containers.DefaultRecordingFileFactory;

import java.io.File;

Expand All @@ -17,7 +18,8 @@ public class ChromeRecordingWebDriverContainerTest extends BaseWebDriverContaine
@Rule
public BrowserWebDriverContainer chromeThatRecordsAllTests = new BrowserWebDriverContainer()
.withDesiredCapabilities(DesiredCapabilities.chrome())
.withRecordingMode(RECORD_ALL, new File("./target/"));
.withRecordingMode(RECORD_ALL, new File("./target/"))
.withRecordingFileFactory(new DefaultRecordingFileFactory());

@Rule
public BrowserWebDriverContainer chromeThatRecordsFailingTests = new BrowserWebDriverContainer()
Expand Down

0 comments on commit b08541e

Please sign in to comment.