From fb11706ce637c0de705e9ebb7777efd03debcd72 Mon Sep 17 00:00:00 2001 From: Daniel Jun Suguimoto Date: Sat, 11 Jul 2020 17:12:15 -0300 Subject: [PATCH] Escaping version format on docker version checker --- app/Checker.php | 14 +++- tests/Unit/CheckerTest.php | 147 +++++++++++++++++++++++++++++++++++++ 2 files changed, 159 insertions(+), 2 deletions(-) create mode 100644 tests/Unit/CheckerTest.php diff --git a/app/Checker.php b/app/Checker.php index f9302e0..8e69f6f 100644 --- a/app/Checker.php +++ b/app/Checker.php @@ -5,6 +5,7 @@ use App\Builder\Builder; use App\Builder\Docker; use App\Builder\DockerCompose; +use App\Builder\Escaped; class Checker { @@ -33,7 +34,7 @@ public function dockerVersion() { if (is_null($this->dockerVersion)) { $this->dockerVersion = $this->version( - Docker::make("version --format '{{.Server.Version}}'") + $this->dockerVersionCommandBuilder('{{.Server.Version}}') ); } @@ -44,7 +45,7 @@ public function dockerApiVersion() { if (is_null($this->dockerApiVersion)) { $this->dockerApiVersion = $this->version( - Docker::make("version --format '{{.Server.APIVersion}}'") + $this->dockerVersionCommandBuilder('{{.Server.APIVersion}}') ); } @@ -99,6 +100,15 @@ public function checkDockerIsRunning(): bool return $exitCode === 0; } + protected function dockerVersionCommandBuilder(string $format): Builder + { + return Docker::make( + 'version', + '--format', + Escaped::make($format) + ); + } + protected function version(Builder $builder) { $exitCode = $this->commandExecutor->runQuietly($builder); diff --git a/tests/Unit/CheckerTest.php b/tests/Unit/CheckerTest.php new file mode 100644 index 0000000..507f057 --- /dev/null +++ b/tests/Unit/CheckerTest.php @@ -0,0 +1,147 @@ +mockCommandExecutorOutput(0, Checker::DOCKER_MIN_VERSION); + + $checker = resolve(Checker::class); + + $this->assertEquals($checker->dockerVersion(), Checker::DOCKER_MIN_VERSION); + } + + public function testDockerApiVersion() + { + $this->mockCommandExecutorOutput(0, Checker::DOCKER_API_MIN_VERSION); + + $checker = resolve(Checker::class); + + $this->assertEquals($checker->dockerApiVersion(), Checker::DOCKER_API_MIN_VERSION); + } + + public function testDockerComposeVersion() + { + $this->mockCommandExecutorOutput(0, Checker::DOCKER_COMPOSE_MIN_VERSION); + + $checker = resolve(Checker::class); + + $this->assertEquals($checker->dockerComposeVersion(), Checker::DOCKER_COMPOSE_MIN_VERSION); + } + + public function testValidDockerVersion() + { + $this->mockCommandExecutorOutput(0, Checker::DOCKER_MIN_VERSION); + + $checker = resolve(Checker::class); + + $this->assertTrue($checker->checkDocker()); + } + + public function testInvalidDockerVersion() + { + $this->mockCommandExecutorOutput(0, '0.0.0'); + + $checker = resolve(Checker::class); + + $this->assertFalse($checker->checkDocker()); + } + + public function testValidDockerApiVersion() + { + $this->mockCommandExecutorOutput(0, Checker::DOCKER_API_MIN_VERSION); + + $checker = resolve(Checker::class); + + $this->assertTrue($checker->checkDockerApi()); + } + + public function testInvalidDockerApiVersion() + { + $this->mockCommandExecutorOutput(0, '0.0.0'); + + $checker = resolve(Checker::class); + + $this->assertFalse($checker->checkDockerApi()); + } + + public function testValidDockerComposeVersion() + { + $this->mockCommandExecutorOutput(0, Checker::DOCKER_COMPOSE_MIN_VERSION); + + $checker = resolve(Checker::class); + + $this->assertTrue($checker->checkDockerCompose()); + } + + public function testInvalidDockerComposeVersion() + { + $this->mockCommandExecutorOutput(0, '0.0.0'); + + $checker = resolve(Checker::class); + + $this->assertFalse($checker->checkDockerCompose()); + } + + public function testErrorDockerVersionCommand() + { + $this->mockCommandExecutorOutput(1); + + $checker = resolve(Checker::class); + + $this->assertFalse($checker->checkDocker()); + } + + public function testErrorDockerApiVersionCommand() + { + $this->mockCommandExecutorOutput(1); + + $checker = resolve(Checker::class); + + $this->assertFalse($checker->checkDockerApi()); + } + + public function testErrorDockerComposeVersionCommand() + { + $this->mockCommandExecutorOutput(1); + + $checker = resolve(Checker::class); + + $this->assertFalse($checker->checkDockerCompose()); + } + + public function testDockerisRunning() + { + $this->mockCommandExecutorOutput(0); + + $checker = resolve(Checker::class); + + $this->assertTrue($checker->checkDockerIsRunning()); + } + + public function testDockerIsNotRunning() + { + $this->mockCommandExecutorOutput(0); + + $checker = resolve(Checker::class); + + $this->assertTrue($checker->checkDockerIsRunning()); + } + + protected function mockCommandExecutorOutput(int $exitCode, string $output = '') + { + $this->mock(CommandExecutor::class, function ($mock) use ($exitCode, $output) { + $mock->shouldReceive('runQuietly') + ->andReturn($exitCode); + + $mock->shouldReceive('getOutputBuffer') + ->andReturn($output); + }); + } +}