Packages
testcontainers
0.9.0
2.3.1
2.3.0
2.2.0
2.1.0
2.1.0-rc1
2.0.0
2.0.0-rc3
2.0.0-rc2
2.0.0-rc
1.14.1
1.14.0
1.13.5
1.13.4
1.13.3
1.13.2
1.13.1
1.13.0
1.12.0
1.11.8
1.11.7
1.11.6
1.11.5
1.11.4
1.11.3
1.11.2
1.11.1
1.11.0
1.10.5
1.10.4
1.10.3
1.10.2
1.10.1
1.10.0
1.9.0
1.8.4
1.8.3
1.8.2
1.8.1
1.8.0
1.7.0
1.6.0
1.5.1
1.5.0
1.4.2
1.4.1
1.4.0
1.3.1
1.3.0
1.2.11
1.2.10
1.2.9
1.2.8
1.2.7
1.2.6
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.3
1.1.2
1.1.1
1.1.0
1.0.1
1.0.0
1.0.0-beta.1
1.0.0-beta
0.9.3
0.9.2
0.9.1
0.9.0
Testcontainers is an Elixir library that supports ExUnit tests, providing lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container.
Current section
Files
Jump to
Current section
Files
lib/wait_strategy/log_wait_strategy.ex
# SPDX-License-Identifier: MIT
defmodule Testcontainers.WaitStrategy.LogWaitStrategy do
@moduledoc """
Considers container as ready as soon as a command runs successfully inside the container.
"""
defstruct [:log_regex, :timeout]
@doc """
Creates a new CommandWaitStrategy to wait until the given command executes successfully inside the container.
"""
def new(log_regex, timeout \\ 5000),
do: %__MODULE__{log_regex: log_regex, timeout: timeout}
end
defimpl Testcontainers.WaitStrategy, for: Testcontainers.WaitStrategy.LogWaitStrategy do
alias Testcontainers.Docker
@impl true
def wait_until_container_is_ready(wait_strategy, id_or_name) do
case wait_for_log(id_or_name, wait_strategy.log_regex, wait_strategy.timeout) do
{:ok, :log_is_ready} ->
:ok
_ ->
:timer.sleep(100)
wait_until_container_is_ready(wait_strategy, id_or_name)
end
end
def wait_for_log(container_id, log_regex, timeout)
when is_binary(container_id) and is_integer(timeout) do
wait_for_log(
container_id,
log_regex,
timeout,
:os.system_time(:millisecond)
)
end
defp wait_for_log(container_id, log_regex, timeout, start_time)
when is_binary(container_id) and is_integer(timeout) and is_integer(start_time) do
if timeout + start_time < :os.system_time(:millisecond) do
{:error, :timeout}
else
if log_comparison(container_id, log_regex) do
{:ok, :log_is_ready}
else
# Sleep for 500 ms, then retry
:timer.sleep(500)
wait_for_log(container_id, log_regex, timeout, start_time)
end
end
end
defp log_comparison(container_id, log_regex) do
with {:ok, stdout_log} when is_binary(stdout_log) <-
Docker.Exec.stdout_logs(container_id) do
Regex.match?(log_regex, stdout_log)
else
_ ->
false
end
end
end