mirror of
https://github.com/stan220/testcontainers-php.git
synced 2026-09-08 17:29:29 +00:00
Merge branch '0.2' into fix-linux-builds
This commit is contained in:
+1
-2
@@ -41,8 +41,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"integration": "paratest tests/ --exclude-group=legacy --bootstrap vendor/autoload.php -f",
|
"integration": "paratest tests/ --bootstrap vendor/autoload.php -f",
|
||||||
"integration:old": "phpunit tests/Integration/OldTests --bootstrap vendor/autoload.php",
|
|
||||||
"cs": "php-cs-fixer fix --dry-run",
|
"cs": "php-cs-fixer fix --dry-run",
|
||||||
"cs:fix": "php-cs-fixer fix",
|
"cs:fix": "php-cs-fixer fix",
|
||||||
"phpstan": "phpstan analyse --memory-limit=256M"
|
"phpstan": "phpstan analyse --memory-limit=256M"
|
||||||
|
|||||||
@@ -1,172 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace Testcontainers\Container;
|
|
||||||
|
|
||||||
use Testcontainers\Utils\PortGenerator\FixedPortGenerator;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Added for backward compatibility.
|
|
||||||
* @deprecated Use GenericContainer instead.
|
|
||||||
* TODO: Remove in next major release.
|
|
||||||
*/
|
|
||||||
class Container extends GenericContainer
|
|
||||||
{
|
|
||||||
protected ?StartedTestContainer $startedContainer = null;
|
|
||||||
|
|
||||||
protected ?StoppedTestContainer $stoppedContainer = null;
|
|
||||||
|
|
||||||
public static function make(string $image): self
|
|
||||||
{
|
|
||||||
return new self($image);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use `withCommand` instead
|
|
||||||
* @param array<string> $cmd
|
|
||||||
*/
|
|
||||||
public function withCmd(array $cmd): self
|
|
||||||
{
|
|
||||||
return $this->withCommand($cmd);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use `withPrivilegedMode` instead
|
|
||||||
*/
|
|
||||||
public function withPrivileged(bool $privileged = true): self
|
|
||||||
{
|
|
||||||
return $this->withPrivilegedMode($privileged);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use `withExposedPorts` instead
|
|
||||||
*/
|
|
||||||
public function withPort(string $localPort, string $containerPort): self
|
|
||||||
{
|
|
||||||
$this->withPortGenerator(new FixedPortGenerator([(int)$localPort]));
|
|
||||||
return $this->withExposedPorts($containerPort);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated there will be no replacement
|
|
||||||
*/
|
|
||||||
public function withImage(string $image): self
|
|
||||||
{
|
|
||||||
$this->image = $image;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use `start` instead
|
|
||||||
*/
|
|
||||||
public function run(): self
|
|
||||||
{
|
|
||||||
$this->startedContainer = $this->start();
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array<string> $commandAsArray
|
|
||||||
* @deprecated Use 'exec' from StartedTestContainer instead
|
|
||||||
*/
|
|
||||||
public function execute(array $commandAsArray): string
|
|
||||||
{
|
|
||||||
if ($this->startedContainer === null) {
|
|
||||||
throw new \RuntimeException('Container is not started');
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->startedContainer->exec($commandAsArray);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use 'logs' from StartedTestContainer instead
|
|
||||||
*/
|
|
||||||
public function logs(): string
|
|
||||||
{
|
|
||||||
if ($this->startedContainer === null) {
|
|
||||||
throw new \RuntimeException('Container is not started');
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->startedContainer->logs();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use 'getHost' from StartedTestContainer instead
|
|
||||||
*/
|
|
||||||
public function getAddress(): string
|
|
||||||
{
|
|
||||||
if ($this->startedContainer === null) {
|
|
||||||
throw new \RuntimeException('Container is not started');
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->startedContainer->getHost();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use 'getFirstMappedPort' from StartedTestContainer instead
|
|
||||||
*/
|
|
||||||
public function getPort(): int
|
|
||||||
{
|
|
||||||
if ($this->startedContainer === null) {
|
|
||||||
throw new \RuntimeException('Container is not started');
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->startedContainer->getFirstMappedPort();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use 'stop' from StartedTestContainer instead
|
|
||||||
*/
|
|
||||||
public function kill(): self
|
|
||||||
{
|
|
||||||
$this->dockerClient->containerKill($this->id);
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use `stop` from StartedTestContainer instead
|
|
||||||
*/
|
|
||||||
public function stop(): self
|
|
||||||
{
|
|
||||||
if ($this->startedContainer === null) {
|
|
||||||
throw new \RuntimeException('Container is not started');
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->stoppedContainer = $this->startedContainer->stop();
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use 'restart' method from StartedTestContainer instead
|
|
||||||
*/
|
|
||||||
public function restart(): self
|
|
||||||
{
|
|
||||||
if ($this->startedContainer === null) {
|
|
||||||
throw new \RuntimeException('Container is not started');
|
|
||||||
}
|
|
||||||
|
|
||||||
$restartedTestContainer = $this->startedContainer->restart();
|
|
||||||
$this->startedContainer = $restartedTestContainer;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use 'stop' method from StartedTestContainer instead
|
|
||||||
*/
|
|
||||||
public function remove(): self
|
|
||||||
{
|
|
||||||
if ($this->startedContainer === null) {
|
|
||||||
throw new \RuntimeException('Container is not started');
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->startedContainer->stop();
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -154,25 +154,13 @@ class GenericContainer implements TestContainer
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* To support temporarily backwards compatibility, the method supports two formats:
|
* @param array<string, string> $env An array of key-value pairs: $object->withEnvironment(['key1' => 'value1', 'key2' => 'value2']);
|
||||||
* 1. A single key-value pair (deprecated): $object->withEnvironment('key', 'value');
|
|
||||||
* 2. An array of key-value pairs: $object->withEnvironment(['key1' => 'value1', 'key2' => 'value2']);
|
|
||||||
*
|
|
||||||
* @param string | array<string, string> $env An array of environment variables or the name of a single variable.
|
|
||||||
* @param string|null $value The value of the environment variable if a single variable is passed.
|
|
||||||
* @return static Returns itself for chaining purposes.
|
* @return static Returns itself for chaining purposes.
|
||||||
*/
|
*/
|
||||||
public function withEnvironment(string | array $env, ?string $value = null): static
|
public function withEnvironment(array $env): static
|
||||||
{
|
{
|
||||||
if (is_array($env)) {
|
foreach ($env as $key => $val) {
|
||||||
foreach ($env as $key => $val) {
|
$this->env[$key] = $val;
|
||||||
$this->env[$key] = $val;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ($value === null) {
|
|
||||||
throw new InvalidArgumentException("Value cannot be null when setting a single environment variable.");
|
|
||||||
}
|
|
||||||
$this->env[$env] = $value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
@@ -267,7 +255,6 @@ class GenericContainer implements TestContainer
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: not yet implemented
|
|
||||||
public function withNetwork(string $networkName): static
|
public function withNetwork(string $networkName): static
|
||||||
{
|
{
|
||||||
$this->networkName = $networkName;
|
$this->networkName = $networkName;
|
||||||
|
|||||||
@@ -1,49 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace Testcontainers\Container;
|
|
||||||
|
|
||||||
use Testcontainers\Utils\PortGenerator\FixedPortGenerator;
|
|
||||||
use Testcontainers\Wait\WaitForExec;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Left for namespace backward compatibility
|
|
||||||
* @deprecated Use \Testcontainers\Modules\MariaDBContainer instead.
|
|
||||||
* TODO: Remove in next major release.
|
|
||||||
*/
|
|
||||||
class MariaDBContainer extends Container
|
|
||||||
{
|
|
||||||
public function __construct(string $version = 'latest', string $mysqlRootPassword = 'root')
|
|
||||||
{
|
|
||||||
parent::__construct('mariadb:' . $version);
|
|
||||||
$this->withPortGenerator(new FixedPortGenerator([3306]));
|
|
||||||
$this->withExposedPorts(3306);
|
|
||||||
$this->withEnvironment('MARIADB_ROOT_PASSWORD', $mysqlRootPassword);
|
|
||||||
$this->withWait(new WaitForExec([
|
|
||||||
"mariadb-admin",
|
|
||||||
"ping",
|
|
||||||
"-h", "127.0.0.1",
|
|
||||||
]));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function make(string $version = 'latest', string $mysqlRootPassword = 'root'): self
|
|
||||||
{
|
|
||||||
return new self($version, $mysqlRootPassword);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function withMariaDBUser(string $username, string $password): self
|
|
||||||
{
|
|
||||||
$this->withEnvironment('MARIADB_USER', $username);
|
|
||||||
$this->withEnvironment('MARIADB_PASSWORD', $password);
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function withMariaDBDatabase(string $database): self
|
|
||||||
{
|
|
||||||
$this->withEnvironment('MARIADB_DATABASE', $database);
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace Testcontainers\Container;
|
|
||||||
|
|
||||||
use Testcontainers\Utils\PortGenerator\FixedPortGenerator;
|
|
||||||
use Testcontainers\Wait\WaitForExec;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Left for namespace backward compatibility
|
|
||||||
* @deprecated Use \Testcontainers\Modules\MySQLContainer instead.
|
|
||||||
* TODO: Remove in next major release.
|
|
||||||
*/
|
|
||||||
class MySQLContainer extends Container
|
|
||||||
{
|
|
||||||
public function __construct(string $version = 'latest', string $mysqlRootPassword = 'root')
|
|
||||||
{
|
|
||||||
parent::__construct('mysql:' . $version);
|
|
||||||
$this->withPortGenerator(new FixedPortGenerator([3306]));
|
|
||||||
$this->withExposedPorts(3306);
|
|
||||||
$this->withEnvironment('MYSQL_ROOT_PASSWORD', $mysqlRootPassword);
|
|
||||||
$this->withWait(new WaitForExec([
|
|
||||||
"mysqladmin",
|
|
||||||
"ping",
|
|
||||||
"-h", "127.0.0.1",
|
|
||||||
]));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function make(string $version = 'latest', string $mysqlRootPassword = 'root'): self
|
|
||||||
{
|
|
||||||
return new self($version, $mysqlRootPassword);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function withMySQLUser(string $username, string $password): self
|
|
||||||
{
|
|
||||||
$this->withEnvironment('MYSQL_USER', $username);
|
|
||||||
$this->withEnvironment('MYSQL_PASSWORD', $password);
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function withMySQLDatabase(string $database): self
|
|
||||||
{
|
|
||||||
$this->withEnvironment('MYSQL_DATABASE', $database);
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace Testcontainers\Container;
|
|
||||||
|
|
||||||
use Testcontainers\Utils\PortGenerator\FixedPortGenerator;
|
|
||||||
use Testcontainers\Wait\WaitForLog;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Left for namespace backward compatibility
|
|
||||||
* @deprecated Use \Testcontainers\Modules\OpenSearchContainer instead.
|
|
||||||
* TODO: Remove in next major release.
|
|
||||||
*/
|
|
||||||
class OpenSearchContainer extends Container
|
|
||||||
{
|
|
||||||
public function __construct(string $version = 'latest')
|
|
||||||
{
|
|
||||||
parent::__construct('opensearchproject/opensearch:' . $version);
|
|
||||||
$this->withPortGenerator(new FixedPortGenerator([9200]));
|
|
||||||
$this->withExposedPorts(9200);
|
|
||||||
$this->withEnvironment('discovery.type', 'single-node');
|
|
||||||
$this->withEnvironment('OPENSEARCH_INITIAL_ADMIN_PASSWORD', 'c3o_ZPHo!');
|
|
||||||
$this->withWait(new WaitForLog(
|
|
||||||
'/\]\s+started\?\[/',
|
|
||||||
true,
|
|
||||||
30000
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function make(string $version = 'latest'): self
|
|
||||||
{
|
|
||||||
return new self($version);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function disableSecurityPlugin(): self
|
|
||||||
{
|
|
||||||
$this->withEnvironment('plugins.security.disabled', 'true');
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace Testcontainers\Container;
|
|
||||||
|
|
||||||
use Testcontainers\Utils\PortGenerator\FixedPortGenerator;
|
|
||||||
use Testcontainers\Wait\WaitForExec;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Left for namespace backward compatibility
|
|
||||||
* @deprecated Use \Testcontainers\Modules\PostgresContainer instead.
|
|
||||||
* TODO: Remove in next major release.
|
|
||||||
*/
|
|
||||||
class PostgresContainer extends Container
|
|
||||||
{
|
|
||||||
public function __construct(
|
|
||||||
string $version = 'latest',
|
|
||||||
public readonly string $username = 'test',
|
|
||||||
public readonly string $password = 'test',
|
|
||||||
public readonly string $database = 'test'
|
|
||||||
) {
|
|
||||||
parent::__construct('postgres:' . $version);
|
|
||||||
$this->withPortGenerator(new FixedPortGenerator([5432]));
|
|
||||||
$this->withExposedPorts(5432);
|
|
||||||
$this->withEnvironment('POSTGRES_USER', $this->username);
|
|
||||||
$this->withEnvironment('POSTGRES_PASSWORD', $this->password);
|
|
||||||
$this->withEnvironment('POSTGRES_DB', $this->database);
|
|
||||||
$this->withWait(new WaitForExec(["pg_isready", "-h", "127.0.0.1", "-U", $this->username]));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function make(string $version = 'latest', string $dbPassword = 'root'): self
|
|
||||||
{
|
|
||||||
return new self(
|
|
||||||
version: $version,
|
|
||||||
password: $dbPassword
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function withPostgresUser(string $username): self
|
|
||||||
{
|
|
||||||
$this->withEnvironment('POSTGRES_USER', $username);
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function withPostgresDatabase(string $database): self
|
|
||||||
{
|
|
||||||
$this->withEnvironment('POSTGRES_DB', $database);
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace Testcontainers\Container;
|
|
||||||
|
|
||||||
use Testcontainers\Utils\PortGenerator\FixedPortGenerator;
|
|
||||||
use Testcontainers\Wait\WaitForLog;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Left for namespace backward compatibility
|
|
||||||
* @deprecated Use \Testcontainers\Modules\RedisContainer instead.
|
|
||||||
* TODO: Remove in next major release.
|
|
||||||
*/
|
|
||||||
class RedisContainer extends Container
|
|
||||||
{
|
|
||||||
public function __construct(string $version = 'latest')
|
|
||||||
{
|
|
||||||
parent::__construct('redis:' . $version);
|
|
||||||
$this->withPortGenerator(new FixedPortGenerator([6379]));
|
|
||||||
$this->withExposedPorts(6379);
|
|
||||||
$this->withWait(new WaitForLog('Ready to accept connections'));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function make(string $version = 'latest'): self
|
|
||||||
{
|
|
||||||
return new self($version);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -19,10 +19,9 @@ interface TestContainer
|
|||||||
public function withEntrypoint(string $entryPoint): static;
|
public function withEntrypoint(string $entryPoint): static;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO: replace with array after deprecated implementation is removed
|
* @param array<string, string> $env An array of key-value pairs
|
||||||
* @param array<string, string>|string $env
|
|
||||||
*/
|
*/
|
||||||
public function withEnvironment(array | string $env, ?string $value): static;
|
public function withEnvironment(array $env): static;
|
||||||
|
|
||||||
/** @param int|string|array<int|string> $ports One or more ports to expose. */
|
/** @param int|string|array<int|string> $ports One or more ports to expose. */
|
||||||
public function withExposedPorts(...$ports): static;
|
public function withExposedPorts(...$ports): static;
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class MariaDBContainer extends GenericContainer
|
|||||||
{
|
{
|
||||||
parent::__construct('mariadb:' . $version);
|
parent::__construct('mariadb:' . $version);
|
||||||
$this->withExposedPorts(3306);
|
$this->withExposedPorts(3306);
|
||||||
$this->withEnvironment('MARIADB_ROOT_PASSWORD', $mysqlRootPassword);
|
$this->withEnvironment(['MARIADB_ROOT_PASSWORD' => $mysqlRootPassword]);
|
||||||
$this->withWait(new WaitForExec([
|
$this->withWait(new WaitForExec([
|
||||||
"mariadb-admin",
|
"mariadb-admin",
|
||||||
"ping",
|
"ping",
|
||||||
@@ -23,15 +23,15 @@ class MariaDBContainer extends GenericContainer
|
|||||||
|
|
||||||
public function withMariaDBUser(string $username, string $password): self
|
public function withMariaDBUser(string $username, string $password): self
|
||||||
{
|
{
|
||||||
$this->withEnvironment('MARIADB_USER', $username);
|
$this->withEnvironment(['MARIADB_USER' => $username]);
|
||||||
$this->withEnvironment('MARIADB_PASSWORD', $password);
|
$this->withEnvironment(['MARIADB_PASSWORD' => $password]);
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function withMariaDBDatabase(string $database): self
|
public function withMariaDBDatabase(string $database): self
|
||||||
{
|
{
|
||||||
$this->withEnvironment('MARIADB_DATABASE', $database);
|
$this->withEnvironment(['MARIADB_DATABASE' => $database]);
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class MySQLContainer extends GenericContainer
|
|||||||
{
|
{
|
||||||
parent::__construct('mysql:' . $version);
|
parent::__construct('mysql:' . $version);
|
||||||
$this->withExposedPorts(3306);
|
$this->withExposedPorts(3306);
|
||||||
$this->withEnvironment('MYSQL_ROOT_PASSWORD', $mysqlRootPassword);
|
$this->withEnvironment(['MYSQL_ROOT_PASSWORD' => $mysqlRootPassword]);
|
||||||
$this->withWait(new WaitForExec([
|
$this->withWait(new WaitForExec([
|
||||||
"mysqladmin",
|
"mysqladmin",
|
||||||
"ping",
|
"ping",
|
||||||
@@ -23,15 +23,15 @@ class MySQLContainer extends GenericContainer
|
|||||||
|
|
||||||
public function withMySQLUser(string $username, string $password): self
|
public function withMySQLUser(string $username, string $password): self
|
||||||
{
|
{
|
||||||
$this->withEnvironment('MYSQL_USER', $username);
|
$this->withEnvironment(['MYSQL_USER' => $username]);
|
||||||
$this->withEnvironment('MYSQL_PASSWORD', $password);
|
$this->withEnvironment(['MYSQL_PASSWORD' => $password]);
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function withMySQLDatabase(string $database): self
|
public function withMySQLDatabase(string $database): self
|
||||||
{
|
{
|
||||||
$this->withEnvironment('MYSQL_DATABASE', $database);
|
$this->withEnvironment(['MYSQL_DATABASE' => $database]);
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,8 +13,11 @@ class OpenSearchContainer extends GenericContainer
|
|||||||
{
|
{
|
||||||
parent::__construct('opensearchproject/opensearch:' . $version);
|
parent::__construct('opensearchproject/opensearch:' . $version);
|
||||||
$this->withExposedPorts(9200);
|
$this->withExposedPorts(9200);
|
||||||
$this->withEnvironment('discovery.type', 'single-node');
|
$this->withEnvironment([
|
||||||
$this->withEnvironment('OPENSEARCH_INITIAL_ADMIN_PASSWORD', 'c3o_ZPHo!');
|
'discovery.type' => 'single-node',
|
||||||
|
'OPENSEARCH_INITIAL_ADMIN_PASSWORD' => 'c3o_ZPHo!',
|
||||||
|
]);
|
||||||
|
|
||||||
$this->withWait(new WaitForLog(
|
$this->withWait(new WaitForLog(
|
||||||
'/\]\s+started\?\[/',
|
'/\]\s+started\?\[/',
|
||||||
true,
|
true,
|
||||||
@@ -24,7 +27,7 @@ class OpenSearchContainer extends GenericContainer
|
|||||||
|
|
||||||
public function withDisabledSecurityPlugin(): self
|
public function withDisabledSecurityPlugin(): self
|
||||||
{
|
{
|
||||||
$this->withEnvironment('plugins.security.disabled', 'true');
|
$this->withEnvironment(['plugins.security.disabled' => 'true']);
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,29 +17,31 @@ class PostgresContainer extends GenericContainer
|
|||||||
) {
|
) {
|
||||||
parent::__construct('postgres:' . $version);
|
parent::__construct('postgres:' . $version);
|
||||||
$this->withExposedPorts(5432);
|
$this->withExposedPorts(5432);
|
||||||
$this->withEnvironment('POSTGRES_USER', $this->username);
|
$this->withEnvironment([
|
||||||
$this->withEnvironment('POSTGRES_PASSWORD', $this->password);
|
'POSTGRES_USER' => $this->username,
|
||||||
$this->withEnvironment('POSTGRES_DB', $this->database);
|
'POSTGRES_PASSWORD' => $this->password,
|
||||||
|
'POSTGRES_DB' => $this->database,
|
||||||
|
]);
|
||||||
$this->withWait(new WaitForExec(["pg_isready", "-h", "127.0.0.1", "-U", $this->username]));
|
$this->withWait(new WaitForExec(["pg_isready", "-h", "127.0.0.1", "-U", $this->username]));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function withPostgresUser(string $username): self
|
public function withPostgresUser(string $username): self
|
||||||
{
|
{
|
||||||
$this->withEnvironment('POSTGRES_USER', $username);
|
$this->withEnvironment(['POSTGRES_USER' => $username]);
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function withPostgresPassword(string $password): self
|
public function withPostgresPassword(string $password): self
|
||||||
{
|
{
|
||||||
$this->withEnvironment('POSTGRES_PASSWORD', $password);
|
$this->withEnvironment(['POSTGRES_PASSWORD' => $password]);
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function withPostgresDatabase(string $database): self
|
public function withPostgresDatabase(string $database): self
|
||||||
{
|
{
|
||||||
$this->withEnvironment('POSTGRES_DB', $database);
|
$this->withEnvironment(['POSTGRES_DB' => $database]);
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,26 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace Testcontainers\Wait;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use WaitForHostPort instead
|
|
||||||
* Kept for backward compatibility
|
|
||||||
* Should be removed in next major version
|
|
||||||
*/
|
|
||||||
final class WaitForTcpPortOpen extends WaitForHostPort
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @phpstan-ignore-next-line
|
|
||||||
*/
|
|
||||||
public function __construct(int $port, string $network = null)
|
|
||||||
{
|
|
||||||
parent::__construct($port);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function make(int $port, ?string $network = null): self
|
|
||||||
{
|
|
||||||
return new self($port);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -112,9 +112,6 @@ class GenericContainerTest extends TestCase
|
|||||||
$container->stop();
|
$container->stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @throws \JsonException
|
|
||||||
*/
|
|
||||||
public function testShouldReturnFirstMappedPort(): void
|
public function testShouldReturnFirstMappedPort(): void
|
||||||
{
|
{
|
||||||
$container = (new GenericContainer('nginx'))
|
$container = (new GenericContainer('nginx'))
|
||||||
|
|||||||
@@ -1,142 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace Testcontainers\Tests\Integration\OldTests;
|
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
use Predis\Client;
|
|
||||||
use Testcontainers\Container\MariaDBContainer;
|
|
||||||
use Testcontainers\Container\MySQLContainer;
|
|
||||||
use Testcontainers\Container\OpenSearchContainer;
|
|
||||||
use Testcontainers\Container\PostgresContainer;
|
|
||||||
use Testcontainers\Container\RedisContainer;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @group legacy
|
|
||||||
* Old test classes kept to check backward compatibility
|
|
||||||
*/
|
|
||||||
class ContainerTest extends TestCase
|
|
||||||
{
|
|
||||||
public function testMySQL(): void
|
|
||||||
{
|
|
||||||
$container = MySQLContainer::make();
|
|
||||||
$container->withMySQLDatabase('foo');
|
|
||||||
$container->withMySQLUser('bar', 'baz');
|
|
||||||
|
|
||||||
$container->run();
|
|
||||||
|
|
||||||
$pdo = new \PDO(
|
|
||||||
sprintf('mysql:host=%s;port=3306', $container->getAddress()),
|
|
||||||
'bar',
|
|
||||||
'baz',
|
|
||||||
);
|
|
||||||
|
|
||||||
$query = $pdo->query('SHOW databases');
|
|
||||||
|
|
||||||
$this->assertInstanceOf(\PDOStatement::class, $query);
|
|
||||||
|
|
||||||
$databases = $query->fetchAll(\PDO::FETCH_COLUMN);
|
|
||||||
|
|
||||||
$this->assertContains('foo', $databases);
|
|
||||||
|
|
||||||
$container->stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testMariaDB(): void
|
|
||||||
{
|
|
||||||
$container = MariaDBContainer::make();
|
|
||||||
$container->withMariaDBDatabase('foo');
|
|
||||||
$container->withMariaDBUser('bar', 'baz');
|
|
||||||
|
|
||||||
$container->run();
|
|
||||||
|
|
||||||
$pdo = new \PDO(
|
|
||||||
sprintf('mysql:host=%s;port=3306', $container->getAddress()),
|
|
||||||
'bar',
|
|
||||||
'baz',
|
|
||||||
);
|
|
||||||
|
|
||||||
$query = $pdo->query('SHOW databases');
|
|
||||||
|
|
||||||
$this->assertInstanceOf(\PDOStatement::class, $query);
|
|
||||||
|
|
||||||
$databases = $query->fetchAll(\PDO::FETCH_COLUMN);
|
|
||||||
|
|
||||||
$this->assertContains('foo', $databases);
|
|
||||||
|
|
||||||
$container->stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testRedis(): void
|
|
||||||
{
|
|
||||||
$container = RedisContainer::make();
|
|
||||||
|
|
||||||
$container->run();
|
|
||||||
|
|
||||||
$redis = new Client([
|
|
||||||
'scheme' => 'tcp',
|
|
||||||
'host' => $container->getAddress(),
|
|
||||||
'port' => 6379,
|
|
||||||
]);
|
|
||||||
|
|
||||||
$redis->ping();
|
|
||||||
|
|
||||||
$this->assertTrue($redis->isConnected());
|
|
||||||
|
|
||||||
$container->stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @throws \JsonException
|
|
||||||
*/
|
|
||||||
public function testOpenSearch(): void
|
|
||||||
{
|
|
||||||
$container = OpenSearchContainer::make();
|
|
||||||
$container->disableSecurityPlugin();
|
|
||||||
|
|
||||||
$container->run();
|
|
||||||
|
|
||||||
$ch = curl_init();
|
|
||||||
curl_setopt($ch, CURLOPT_URL, sprintf('http://%s:%d', $container->getAddress(), 9200));
|
|
||||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
||||||
|
|
||||||
$response = (string) curl_exec($ch);
|
|
||||||
|
|
||||||
$this->assertNotEmpty($response);
|
|
||||||
|
|
||||||
/** @var array{cluster_name: string} $data */
|
|
||||||
$data = json_decode($response, true, JSON_THROW_ON_ERROR, JSON_THROW_ON_ERROR);
|
|
||||||
|
|
||||||
$this->assertArrayHasKey('cluster_name', $data);
|
|
||||||
|
|
||||||
$this->assertEquals('docker-cluster', $data['cluster_name']);
|
|
||||||
|
|
||||||
$container->stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testPostgreSQLContainer(): void
|
|
||||||
{
|
|
||||||
$container = PostgresContainer::make('latest', 'test')
|
|
||||||
->withPostgresUser('test')
|
|
||||||
->withPostgresDatabase('foo')
|
|
||||||
->run();
|
|
||||||
|
|
||||||
|
|
||||||
$pdo = new \PDO(
|
|
||||||
sprintf('pgsql:host=%s;port=5432;dbname=foo', $container->getAddress()),
|
|
||||||
'test',
|
|
||||||
'test',
|
|
||||||
);
|
|
||||||
|
|
||||||
$query = $pdo->query('SELECT datname FROM pg_database');
|
|
||||||
|
|
||||||
$this->assertInstanceOf(\PDOStatement::class, $query);
|
|
||||||
|
|
||||||
$databases = $query->fetchAll(\PDO::FETCH_COLUMN);
|
|
||||||
|
|
||||||
$this->assertContains('foo', $databases);
|
|
||||||
|
|
||||||
$container->stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,138 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace Testcontainers\Tests\Integration\OldTests;
|
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
use Predis\Client;
|
|
||||||
use Predis\Connection\ConnectionException;
|
|
||||||
use Testcontainers\Container\Container;
|
|
||||||
use Testcontainers\Container\MySQLContainer;
|
|
||||||
use Testcontainers\Container\RedisContainer;
|
|
||||||
use Testcontainers\Wait\WaitForExec;
|
|
||||||
use Testcontainers\Wait\WaitForHealthCheck;
|
|
||||||
use Testcontainers\Wait\WaitForHttp;
|
|
||||||
use Testcontainers\Wait\WaitForLog;
|
|
||||||
use Testcontainers\Wait\WaitForTcpPortOpen;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @group legacy
|
|
||||||
* Old test classes kept to check backward compatibility
|
|
||||||
*/
|
|
||||||
class WaitStrategyTest extends TestCase
|
|
||||||
{
|
|
||||||
public function testWaitForExec(): void
|
|
||||||
{
|
|
||||||
$container = MySQLContainer::make()
|
|
||||||
->withEnvironment('MYSQL_ROOT_PASSWORD', 'root')
|
|
||||||
->withWait(
|
|
||||||
new WaitForExec([
|
|
||||||
'mysqladmin', 'ping',
|
|
||||||
'-h', '127.0.0.1',
|
|
||||||
])
|
|
||||||
);
|
|
||||||
|
|
||||||
$container->run();
|
|
||||||
|
|
||||||
$pdo = new \PDO(
|
|
||||||
sprintf('mysql:host=%s;port=3306', $container->getAddress()),
|
|
||||||
'root',
|
|
||||||
'root'
|
|
||||||
);
|
|
||||||
|
|
||||||
$query = $pdo->query('select version()');
|
|
||||||
|
|
||||||
$this->assertInstanceOf(\PDOStatement::class, $query);
|
|
||||||
|
|
||||||
$version = $query->fetchColumn();
|
|
||||||
|
|
||||||
$this->assertNotEmpty($version);
|
|
||||||
|
|
||||||
$container->stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testWaitForLog(): void
|
|
||||||
{
|
|
||||||
$container = RedisContainer::make()
|
|
||||||
->withWait(new WaitForLog('Ready to accept connections'));
|
|
||||||
|
|
||||||
$container->run();
|
|
||||||
|
|
||||||
$redis = new Client([
|
|
||||||
'scheme' => 'tcp',
|
|
||||||
'host' => $container->getAddress(),
|
|
||||||
'port' => 6379,
|
|
||||||
]);
|
|
||||||
|
|
||||||
$redis->set('foo', 'bar');
|
|
||||||
|
|
||||||
$this->assertEquals('bar', $redis->get('foo'));
|
|
||||||
|
|
||||||
$container->stop();
|
|
||||||
|
|
||||||
$this->expectException(ConnectionException::class);
|
|
||||||
|
|
||||||
$redis->get('foo');
|
|
||||||
|
|
||||||
$container->remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testWaitForHTTP(): void
|
|
||||||
{
|
|
||||||
$container = Container::make('nginx:alpine')
|
|
||||||
->withWait(WaitForHttp::make(3000))
|
|
||||||
->withPort('3000', '80');
|
|
||||||
|
|
||||||
$container->run();
|
|
||||||
|
|
||||||
$ch = curl_init();
|
|
||||||
curl_setopt($ch, CURLOPT_URL, sprintf('http://%s:%d', $container->getAddress(), $container->getPort()));
|
|
||||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
||||||
|
|
||||||
$response = (string) curl_exec($ch);
|
|
||||||
|
|
||||||
curl_close($ch);
|
|
||||||
|
|
||||||
$this->assertNotEmpty($response);
|
|
||||||
|
|
||||||
$container->stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testWaitForTcpPortOpen(): void
|
|
||||||
{
|
|
||||||
$container = Container::make('nginx:alpine')
|
|
||||||
->withWait(WaitForTcpPortOpen::make(80))
|
|
||||||
->withPort('80', '80');
|
|
||||||
|
|
||||||
$container->run();
|
|
||||||
|
|
||||||
static::assertIsResource(fsockopen($container->getAddress(), 80), 'Failed to connect to container');
|
|
||||||
|
|
||||||
$container->stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testWaitForHealthCheck(): void
|
|
||||||
{
|
|
||||||
$container = Container::make('nginx')
|
|
||||||
->withHealthCheckCommand('curl --fail http://localhost')
|
|
||||||
->withPort('80', '80')
|
|
||||||
->withWait(new WaitForHealthCheck());
|
|
||||||
|
|
||||||
$container->run();
|
|
||||||
|
|
||||||
$ch = curl_init();
|
|
||||||
|
|
||||||
curl_setopt($ch, CURLOPT_URL, sprintf('http://%s:%d', $container->getAddress(), 80));
|
|
||||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
||||||
|
|
||||||
$response = curl_exec($ch);
|
|
||||||
|
|
||||||
$this->assertNotEmpty($response);
|
|
||||||
$this->assertIsString($response);
|
|
||||||
|
|
||||||
$this->assertStringContainsString('Welcome to nginx!', $response);
|
|
||||||
|
|
||||||
$container->stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user