<?php
use MediaWiki\Shell\Command;
+use Wikimedia\TestingAccessWrapper;
/**
+ * @covers \MediaWiki\Shell\Command
* @group Shell
*/
-class CommandTest extends PHPUnit_Framework_TestCase {
+class CommandTest extends PHPUnit\Framework\TestCase {
+
+ use MediaWikiCoversValidator;
+
private function requirePosix() {
if ( wfIsWindows() ) {
$this->markTestSkipped( 'This test requires a POSIX environment.' );
$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() {
- $commandLine = wfIsWindows()
- // 333 = 331 + CRLF
- ? ( 'for /l %i in (1, 1, 1001) do @echo ' . str_repeat( '*', 331 ) )
- : 'printf "%-333333s" "*"';
+ if ( wfIsWindows() ) {
+ // T209159: Anonymous pipe under Windows does not support asynchronous read and write,
+ // and the default buffer is too small (~4K), it is easy to be blocked.
+ $this->markTestSkipped(
+ 'T209159: Anonymous pipe under Windows cannot withstand such a large amount of data'
+ );
+ }
// Test several times because it involves a race condition that may randomly succeed or fail
for ( $i = 0; $i < 10; $i++ ) {
$command = new Command();
- $output = $command->unsafeParams( $commandLine )
+ $output = $command->unsafeParams( 'printf "%-333333s" "*"' )
->execute()
->getStdout();
$this->assertEquals( 333333, strlen( $output ) );
$this->assertSame( 1, count( $logger->getBuffer() ) );
$this->assertSame( trim( $logger->getBuffer()[0][2]['error'] ), 'ThisIsStderr' );
}
+
+ public function testInput() {
+ $this->requirePosix();
+
+ $command = new Command();
+ $command->params( 'cat' );
+ $command->input( 'abc' );
+ $result = $command->execute();
+ $this->assertSame( 'abc', $result->getStdout() );
+
+ // now try it with something that does not fit into a single block
+ $command = new Command();
+ $command->params( 'cat' );
+ $command->input( str_repeat( '!', 1000000 ) );
+ $result = $command->execute();
+ $this->assertSame( 1000000, strlen( $result->getStdout() ) );
+
+ // And try it with empty input
+ $command = new Command();
+ $command->params( 'cat' );
+ $command->input( '' );
+ $result = $command->execute();
+ $this->assertSame( '', $result->getStdout() );
+ }
}