Skip to content

Commit e801def

Browse files
committed
Rework warmup of Browser(s)TCIFactory
Fixes #409
1 parent 454be9a commit e801def

3 files changed

Lines changed: 63 additions & 53 deletions

File tree

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
# 2.8.0
2+
* ``selenium``
3+
* Moved warmUp code to correct factory
4+
* Warmup will try to download/pre-pull the recording container image if required (as long as `recordingMode != SKIP`)
5+
* Behavior can be customized with method `withPullVideoRecordingContainerOnWarmUp`
6+
17
# 2.7.2
28
* `LazyNetwork`: Use explicitly defined `ExecutorService`
39
* Updated dependencies

selenium/src/main/java/software/xdev/tci/selenium/factory/BrowserTCIFactory.java

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,20 +34,25 @@
3434
import org.testcontainers.containers.wait.strategy.HostPortWaitStrategy;
3535
import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy;
3636
import org.testcontainers.containers.wait.strategy.WaitAllStrategy;
37+
import org.testcontainers.images.RemoteDockerImage;
3738

3839
import software.xdev.tci.concurrent.TCIExecutorServiceHolder;
3940
import software.xdev.tci.factory.prestart.PreStartableTCIFactory;
4041
import software.xdev.tci.factory.prestart.config.PreStartConfig;
42+
import software.xdev.tci.logging.JULtoSLF4JRedirector;
4143
import software.xdev.tci.misc.ContainerMemory;
4244
import software.xdev.tci.selenium.BrowserTCI;
4345
import software.xdev.tci.selenium.containers.SeleniumBrowserWebDriverContainer;
4446
import software.xdev.tci.selenium.factory.config.BrowserTCIFactoryConfig;
4547
import software.xdev.tci.serviceloading.TCIServiceLoaderHolder;
48+
import software.xdev.testcontainers.selenium.containers.browser.BrowserWebDriverContainer;
4649
import software.xdev.testcontainers.selenium.containers.recorder.SeleniumRecordingContainer;
4750

4851

4952
public class BrowserTCIFactory extends PreStartableTCIFactory<SeleniumBrowserWebDriverContainer, BrowserTCI>
5053
{
54+
protected static boolean warmupRecordingContainerPullStarted;
55+
protected boolean pullVideoRecordingContainerOnWarmUp;
5156
protected final String browserName;
5257

5358
public BrowserTCIFactory(final MutableCapabilities capabilities)
@@ -103,6 +108,8 @@ public BrowserTCIFactory(final MutableCapabilities capabilities, final BrowserTC
103108
"container.browserwebdriver." + capabilities.getBrowserName(),
104109
"Browser-" + capabilities.getBrowserName());
105110
this.browserName = capabilities.getBrowserName();
111+
this.pullVideoRecordingContainerOnWarmUp =
112+
config.recordingMode() != BrowserWebDriverContainer.RecordingMode.SKIP;
106113
}
107114

108115
public BrowserTCIFactory(
@@ -132,6 +139,53 @@ public BrowserTCIFactory(
132139
this.browserName = browserName;
133140
}
134141

142+
public BrowserTCIFactory withPullVideoRecordingContainerOnWarmUp(final boolean pull)
143+
{
144+
this.pullVideoRecordingContainerOnWarmUp = pull;
145+
return this;
146+
}
147+
148+
@Override
149+
protected void warmUpInternal()
150+
{
151+
// Selenium uses JUL
152+
JULtoSLF4JRedirector.redirect();
153+
154+
this.pullRecordingContainerOnWarmUpAsync();
155+
}
156+
157+
protected void pullRecordingContainerOnWarmUpAsync()
158+
{
159+
if(this.pullVideoRecordingContainerOnWarmUp)
160+
{
161+
pullRecordingContainerOnWarmUpAsyncDefault();
162+
}
163+
}
164+
165+
protected static synchronized void pullRecordingContainerOnWarmUpAsyncDefault()
166+
{
167+
if(warmupRecordingContainerPullStarted)
168+
{
169+
return;
170+
}
171+
172+
CompletableFuture.runAsync(
173+
() -> {
174+
try
175+
{
176+
new RemoteDockerImage(SeleniumRecordingContainer.DEFAULT_IMAGE).get(10, TimeUnit.MINUTES);
177+
}
178+
catch(final Exception e)
179+
{
180+
LoggerFactory.getLogger(BrowserTCIFactory.class)
181+
.warn("Failed to pull {}", SeleniumRecordingContainer.DEFAULT_IMAGE, e);
182+
}
183+
},
184+
TCIExecutorServiceHolder.instance());
185+
186+
warmupRecordingContainerPullStarted = true;
187+
}
188+
135189
protected static Consumer<String> logBrowserConsoleConsumer(final BrowserConsoleLogLevel level)
136190
{
137191
if(!level.active())

selenium/src/main/java/software/xdev/tci/selenium/factory/BrowsersTCIFactory.java

Lines changed: 3 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -21,32 +21,24 @@
2121
import java.util.Map;
2222
import java.util.concurrent.CompletableFuture;
2323
import java.util.concurrent.ConcurrentHashMap;
24-
import java.util.concurrent.TimeUnit;
2524
import java.util.function.Supplier;
2625
import java.util.stream.Collectors;
2726
import java.util.stream.Stream;
2827

2928
import org.openqa.selenium.MutableCapabilities;
30-
import org.slf4j.LoggerFactory;
3129
import org.testcontainers.containers.Network;
32-
import org.testcontainers.images.RemoteDockerImage;
3330

3431
import software.xdev.tci.concurrent.TCIExecutorServiceHolder;
3532
import software.xdev.tci.factory.TCIFactory;
36-
import software.xdev.tci.logging.JULtoSLF4JRedirector;
3733
import software.xdev.tci.selenium.BrowserTCI;
3834
import software.xdev.tci.selenium.TestBrowser;
3935
import software.xdev.tci.selenium.containers.SeleniumBrowserWebDriverContainer;
4036
import software.xdev.tci.tracing.TCITracer;
41-
import software.xdev.testcontainers.selenium.containers.recorder.SeleniumRecordingContainer;
4237

4338

4439
public class BrowsersTCIFactory implements TCIFactory<SeleniumBrowserWebDriverContainer, BrowserTCI>
4540
{
4641
protected final Map<String, BrowserTCIFactory> browserFactories = new ConcurrentHashMap<>();
47-
protected boolean pullVideoRecordingContainer;
48-
49-
protected boolean alreadyWarmedUp;
5042

5143
public BrowsersTCIFactory()
5244
{
@@ -65,58 +57,16 @@ public BrowsersTCIFactory(final Map<String, BrowserTCIFactory> browserFactories)
6557
this.browserFactories.putAll(browserFactories);
6658
}
6759

68-
public BrowsersTCIFactory withPullVideoRecordingContainer(final boolean pullVideoRecordingContainer)
60+
public BrowsersTCIFactory withPullVideoRecordingContainerOnWarmUp(final boolean pull)
6961
{
70-
this.pullVideoRecordingContainer = pullVideoRecordingContainer;
62+
this.browserFactories.values().forEach(f -> f.withPullVideoRecordingContainerOnWarmUp(pull));
7163
return this;
7264
}
7365

7466
@Override
7567
public void warmUp()
7668
{
77-
if(this.alreadyWarmedUp)
78-
{
79-
return;
80-
}
81-
82-
this.warmUpInternal();
83-
}
84-
85-
protected synchronized void warmUpInternal()
86-
{
87-
if(this.alreadyWarmedUp)
88-
{
89-
return;
90-
}
91-
92-
// Selenium uses JUL
93-
JULtoSLF4JRedirector.redirect();
94-
95-
this.browserFactories.values().forEach(BrowserTCIFactory::warmUp);
96-
97-
if(this.pullVideoRecordingContainer)
98-
{
99-
this.pullRecordingContainerAsync();
100-
}
101-
102-
this.alreadyWarmedUp = true;
103-
}
104-
105-
protected void pullRecordingContainerAsync()
106-
{
107-
CompletableFuture.runAsync(
108-
() -> {
109-
try
110-
{
111-
new RemoteDockerImage(SeleniumRecordingContainer.DEFAULT_IMAGE).get(10, TimeUnit.MINUTES);
112-
}
113-
catch(final Exception e)
114-
{
115-
LoggerFactory.getLogger(this.getClass())
116-
.warn("Failed to pull {}", SeleniumRecordingContainer.DEFAULT_IMAGE, e);
117-
}
118-
},
119-
TCIExecutorServiceHolder.instance());
69+
// No effect - Done in downstream factories
12070
}
12171

12272
@SuppressWarnings("resource")

0 commit comments

Comments
 (0)