Преглед изворни кода

Merge pull request #1928 from Jose-Tejera/agent/reject-ambiguous-administration-options

Reject ambiguous administration options
El RIDO пре 1 месец
родитељ
комит
f3ee73577a
2 измењених фајлова са 48 додато и 2 уклоњено
  1. 6 2
      bin/administration
  2. 42 0
      tst/AdministrationOptionsTest.php

+ 6 - 2
bin/administration

@@ -233,9 +233,13 @@ EOT, PHP_EOL;
             self::_help(2);
         }
 
-        $this->_opts = getopt('hd:elps', array('help', 'delete:', 'delete-all', 'delete-v1', 'empty-dirs', 'list-ids', 'purge', 'statistics'));
+        $this->_opts = getopt(
+            'hd:elps',
+            array('help', 'delete:', 'delete-all', 'delete-v1', 'empty-dirs', 'list-ids', 'purge', 'statistics'),
+            $restIndex
+        );
 
-        if (!$this->_opts) {
+        if (!$this->_opts || count($this->_opts) !== 1 || $restIndex < $arguments) {
             self::_error_echo('unsupported arguments given');
             echo PHP_EOL;
             self::_help(3);

+ 42 - 0
tst/AdministrationOptionsTest.php

@@ -0,0 +1,42 @@
+<?php declare(strict_types=1);
+use PHPUnit\Framework\TestCase;
+
+class AdministrationOptionsTest extends TestCase
+{
+    public function testAcceptsSingleAction()
+    {
+        [$exitCode, $output] = $this->runAdministration('--help');
+
+        $this->assertSame(0, $exitCode, $output);
+        $this->assertStringContainsString('Usage:', $output);
+    }
+
+    /**
+     * @dataProvider invalidArgumentsProvider
+     */
+    public function testRejectsAmbiguousArguments($arguments)
+    {
+        [$exitCode, $output] = $this->runAdministration($arguments);
+
+        $this->assertSame(3, $exitCode, $output);
+        $this->assertStringContainsString('Error: unsupported arguments given', $output);
+    }
+
+    private function runAdministration($arguments)
+    {
+        $command = escapeshellarg(PHP_BINARY) . ' ' .
+            escapeshellarg(realpath(PATH . 'bin' . DIRECTORY_SEPARATOR . 'administration')) .
+            ' ' . $arguments . ' 2>&1';
+        exec($command, $output, $exitCode);
+
+        return [$exitCode, implode(PHP_EOL, $output)];
+    }
+
+    public function invalidArgumentsProvider()
+    {
+        return [
+            'trailing positional argument' => ['--help unexpected'],
+            'multiple actions'             => ['--help --delete-all'],
+        ];
+    }
+}