Merge "ApiFeedWatchlist: Use guessSectionNameFromWikiText()"
[lhc/web/wiklou.git] / tests / phpunit / includes / shell / CommandTest.php
index 33a7f44..f7275e1 100644 (file)
@@ -1,22 +1,12 @@
 <?php
 
 use MediaWiki\Shell\Command;
+use Wikimedia\TestingAccessWrapper;
 
 /**
  * @group Shell
  */
 class CommandTest extends PHPUnit_Framework_TestCase {
-       /**
-        * @expectedException PHPUnit_Framework_Error_Notice
-        */
-       public function testDestruct() {
-               if ( defined( 'HHVM_VERSION' ) ) {
-                       $this->markTestSkipped( 'destructors are unreliable in HHVM' );
-               }
-               $command = new Command();
-               $command->params( 'true' );
-       }
-
        private function requirePosix() {
                if ( wfIsWindows() ) {
                        $this->markTestSkipped( 'This test requires a POSIX environment.' );
@@ -57,23 +47,71 @@ class CommandTest extends PHPUnit_Framework_TestCase {
                $this->assertSame( "bar\n", $result->getStdout() );
        }
 
+       public function testStdout() {
+               $this->requirePosix();
+
+               $command = new Command();
+
+               $result = $command
+                       ->params( 'bash', '-c', 'echo ThisIsStderr 1>&2' )
+                       ->execute();
+
+               $this->assertNotContains( 'ThisIsStderr', $result->getStdout() );
+               $this->assertEquals( "ThisIsStderr\n", $result->getStderr() );
+       }
+
+       public function testStdoutRedirection() {
+               $this->requirePosix();
+
+               $command = new Command();
+
+               $result = $command
+                       ->params( 'bash', '-c', 'echo ThisIsStderr 1>&2' )
+                       ->includeStderr( true )
+                       ->execute();
+
+               $this->assertEquals( "ThisIsStderr\n", $result->getStdout() );
+               $this->assertNull( $result->getStderr() );
+       }
+
        public function testOutput() {
                global $IP;
 
                $this->requirePosix();
+               chdir( $IP );
 
                $command = new Command();
                $result = $command
-                       ->params( [ 'ls', "$IP/index.php" ] )
+                       ->params( [ 'ls', 'index.php' ] )
                        ->execute();
-               $this->assertSame( "$IP/index.php", trim( $result->getStdout() ) );
+               $this->assertRegExp( '/^index.php$/m', $result->getStdout() );
+               $this->assertSame( null, $result->getStderr() );
 
                $command = new Command();
                $result = $command
                        ->params( [ 'ls', 'index.php', 'no-such-file' ] )
                        ->includeStderr()
                        ->execute();
+               $this->assertRegExp( '/^index.php$/m', $result->getStdout() );
                $this->assertRegExp( '/^.+no-such-file.*$/m', $result->getStdout() );
+               $this->assertSame( null, $result->getStderr() );
+
+               $command = new Command();
+               $result = $command
+                       ->params( [ 'ls', 'index.php', 'no-such-file' ] )
+                       ->execute();
+               $this->assertRegExp( '/^index.php$/m', $result->getStdout() );
+               $this->assertRegExp( '/^.+no-such-file.*$/m', $result->getStderr() );
+       }
+
+       /**
+        * Test that null values are skipped by params() and unsafeParams()
+        */
+       public function testNullsAreSkipped() {
+               $command = TestingAccessWrapper::newFromObject( new Command );
+               $command->params( 'echo', 'a', null, 'b' );
+               $command->unsafeParams( 'c', null, 'd' );
+               $this->assertEquals( "'echo' 'a' 'b' c d", $command->command );
        }
 
        public function testT69870() {
@@ -91,4 +129,25 @@ class CommandTest extends PHPUnit_Framework_TestCase {
                        $this->assertEquals( 333333, strlen( $output ) );
                }
        }
+
+       public function testLogStderr() {
+               $this->requirePosix();
+
+               $logger = new TestLogger( true, function ( $message, $level, $context ) {
+                       return $level === Psr\Log\LogLevel::ERROR ? '1' : null;
+               }, true );
+               $command = new Command();
+               $command->setLogger( $logger );
+               $command->params( 'bash', '-c', 'echo ThisIsStderr 1>&2' );
+               $command->execute();
+               $this->assertEmpty( $logger->getBuffer() );
+
+               $command = new Command();
+               $command->setLogger( $logger );
+               $command->logStderr();
+               $command->params( 'bash', '-c', 'echo ThisIsStderr 1>&2' );
+               $command->execute();
+               $this->assertSame( 1, count( $logger->getBuffer() ) );
+               $this->assertSame( trim( $logger->getBuffer()[0][2]['error'] ), 'ThisIsStderr' );
+       }
 }