From 353977c7bb19d8b38476cf83ccbdd5b169111c87 Mon Sep 17 00:00:00 2001 From: Sergei Shitikov Date: Sun, 29 Sep 2024 18:10:01 +0200 Subject: [PATCH] use FixedPortGenerator for legacy implementations --- src/Container/GenericContainer.php | 14 ++++++++++++-- src/Container/MariaDBContainer.php | 2 ++ src/Container/MySQLContainer.php | 2 ++ src/Container/OpenSearchContainer.php | 2 ++ src/Container/PostgresContainer.php | 2 ++ src/Container/RedisContainer.php | 2 ++ tests/Integration/OldTests/ContainerTest.php | 7 ------- 7 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/Container/GenericContainer.php b/src/Container/GenericContainer.php index 7413c56..4706afc 100644 --- a/src/Container/GenericContainer.php +++ b/src/Container/GenericContainer.php @@ -17,6 +17,7 @@ use Docker\Docker; use Docker\Stream\CreateImageStream; use InvalidArgumentException; use Testcontainers\ContainerClient\DockerContainerClient; +use Testcontainers\Utils\PortGenerator\PortGenerator; use Testcontainers\Utils\PortGenerator\RandomUniquePortGenerator; use Testcontainers\Utils\PortNormalizer; use Testcontainers\Wait\WaitForContainer; @@ -44,6 +45,8 @@ class GenericContainer implements TestContainer protected WaitStrategy $waitStrategy; + protected PortGenerator $portGenerator; + protected bool $isPrivileged = false; protected ?string $networkName = null; @@ -63,6 +66,7 @@ class GenericContainer implements TestContainer $this->image = $image; $this->dockerClient = DockerContainerClient::getDockerClient(); $this->waitStrategy = new WaitForContainer(); + $this->portGenerator = new RandomUniquePortGenerator(); } public function getId(): string @@ -174,6 +178,13 @@ class GenericContainer implements TestContainer return $this; } + public function withPortGenerator(PortGenerator $portGenerator): static + { + $this->portGenerator = $portGenerator; + + return $this; + } + public function start(): StartedGenericContainer { $this->startAttempts++; @@ -266,12 +277,11 @@ class GenericContainer implements TestContainer */ protected function createPortBindings(): array { - $portGenerator = new RandomUniquePortGenerator(); $portBindings = []; foreach ($this->exposedPorts as $port) { $portBinding = new PortBinding(); - $portBinding->setHostPort((string)$portGenerator->generatePort()); + $portBinding->setHostPort((string)$this->portGenerator->generatePort()); $portBinding->setHostIp('0.0.0.0'); $portBindings[$port] = [$portBinding]; } diff --git a/src/Container/MariaDBContainer.php b/src/Container/MariaDBContainer.php index b806783..dfd5dbc 100644 --- a/src/Container/MariaDBContainer.php +++ b/src/Container/MariaDBContainer.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace Testcontainers\Container; +use Testcontainers\Utils\PortGenerator\FixedPortGenerator; use Testcontainers\Wait\WaitForExec; /** @@ -16,6 +17,7 @@ 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([ diff --git a/src/Container/MySQLContainer.php b/src/Container/MySQLContainer.php index a6e7efb..ee8f653 100644 --- a/src/Container/MySQLContainer.php +++ b/src/Container/MySQLContainer.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace Testcontainers\Container; +use Testcontainers\Utils\PortGenerator\FixedPortGenerator; use Testcontainers\Wait\WaitForExec; /** @@ -16,6 +17,7 @@ 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([ diff --git a/src/Container/OpenSearchContainer.php b/src/Container/OpenSearchContainer.php index c3ba7cc..dde44a7 100644 --- a/src/Container/OpenSearchContainer.php +++ b/src/Container/OpenSearchContainer.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace Testcontainers\Container; +use Testcontainers\Utils\PortGenerator\FixedPortGenerator; use Testcontainers\Wait\WaitForLog; /** @@ -16,6 +17,7 @@ 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!'); diff --git a/src/Container/PostgresContainer.php b/src/Container/PostgresContainer.php index 5bb2e0a..073144e 100644 --- a/src/Container/PostgresContainer.php +++ b/src/Container/PostgresContainer.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace Testcontainers\Container; +use Testcontainers\Utils\PortGenerator\FixedPortGenerator; use Testcontainers\Wait\WaitForExec; /** @@ -20,6 +21,7 @@ class PostgresContainer extends Container 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); diff --git a/src/Container/RedisContainer.php b/src/Container/RedisContainer.php index 1ec3f24..8b895ec 100644 --- a/src/Container/RedisContainer.php +++ b/src/Container/RedisContainer.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace Testcontainers\Container; +use Testcontainers\Utils\PortGenerator\FixedPortGenerator; use Testcontainers\Wait\WaitForLog; /** @@ -16,6 +17,7 @@ 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')); } diff --git a/tests/Integration/OldTests/ContainerTest.php b/tests/Integration/OldTests/ContainerTest.php index ed65412..20b86a8 100644 --- a/tests/Integration/OldTests/ContainerTest.php +++ b/tests/Integration/OldTests/ContainerTest.php @@ -17,13 +17,6 @@ use Testcontainers\Container\RedisContainer; */ class ContainerTest extends TestCase { - //TODO: remove after check - //To make it work, fixed port should be first implemented - protected function setUp(): void - { - $this->markTestIncomplete(); - } - public function testMySQL(): void { $container = MySQLContainer::make();