Anonymous pipe under Windows does not support asynchronous read and write[1],
and the default buffer is too small (~4K), the test will definitely block it.
Before T69870, anonymous pipe for Windows can no longer hold more than 4K of data.
[1] https://docs.microsoft.com/en-us/windows/desktop/ipc/anonymous-pipe-operations
Bug: T209159
Change-Id: Ie9de36b1e6b68db95c35a0044c5b0d86c0050d33
*/
class WfShellExecTest extends MediaWikiTestCase {
public function testT69870() {
*/
class WfShellExecTest extends MediaWikiTestCase {
public function testT69870() {
- $command = 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++ ) {
// Test several times because it involves a race condition that may randomly succeed or fail
for ( $i = 0; $i < 10; $i++ ) {
- $output = wfShellExec( $command );
+ $output = wfShellExec( 'printf "%-333333s" "*"' );
$this->assertEquals( 333333, strlen( $output ) );
}
}
$this->assertEquals( 333333, strlen( $output ) );
}
}
}
public function testT69870() {
}
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();
// 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 ) );
->execute()
->getStdout();
$this->assertEquals( 333333, strlen( $output ) );