2012-04-15 19:00:50 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
// It would be great if we were able to use PHPUnit's getMockForAbstractClass
|
|
|
|
|
// instead of the MaintenanceFixup hack below. However, we cannot do
|
|
|
|
|
// without changing the visibility and without working around hacks in
|
|
|
|
|
// Maintenance.php
|
|
|
|
|
//
|
|
|
|
|
// For the same reason, we cannot just use FakeMaintenance.
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* makes parts of the API of Maintenance that is hidden by protected visibily
|
|
|
|
|
* visible for testing, and makes up for a stream closing hack in Maintenance.php.
|
|
|
|
|
*
|
|
|
|
|
* This class is solely used for being able to test Maintenance right now
|
|
|
|
|
* without having to apply major refactorings to fix some design issues in
|
|
|
|
|
* Maintenance.php. Before adding more functions here, please consider whether
|
|
|
|
|
* this approach is correct, or a refactoring Maintenance to separate concers
|
|
|
|
|
* is more appropriate.
|
|
|
|
|
*
|
|
|
|
|
* Upon refactoring, keep in mind that besides the maintenance scrits themselves
|
|
|
|
|
* and tests right here, also at least Extension:Maintenance make use of
|
|
|
|
|
* Maintenance.
|
|
|
|
|
*
|
|
|
|
|
* Due to a hack in Maintenance.php using register_shutdown_function, be sure to
|
|
|
|
|
* finally call simulateShutdown on MaintenanceFixup instance before a test
|
|
|
|
|
* ends.
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
class MaintenanceFixup extends Maintenance {
|
|
|
|
|
|
|
|
|
|
// --- Making up for the register_shutdown_function hack in Maintenance.php
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* The test case that generated this instance.
|
|
|
|
|
*
|
|
|
|
|
* This member is motivated by allowing the destructor to check whether or not
|
|
|
|
|
* the test failed, in order to avoid unnecessary nags about omitted shutdown
|
|
|
|
|
* simulation.
|
|
|
|
|
* But as it is already available, we also usi it to flagging tests as failed
|
|
|
|
|
*
|
|
|
|
|
* @var MediaWikiTestCase
|
|
|
|
|
*/
|
|
|
|
|
private $testCase;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* shutdownSimulated === true iff simulateShutdown has done it's work
|
|
|
|
|
*
|
|
|
|
|
* @var bool
|
|
|
|
|
*/
|
|
|
|
|
private $shutdownSimulated = false;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Simulates what Maintenance wants to happen at script's end.
|
|
|
|
|
*/
|
|
|
|
|
public function simulateShutdown() {
|
|
|
|
|
|
|
|
|
|
if ( $this->shutdownSimulated ) {
|
|
|
|
|
$this->testCase->fail( __METHOD__ . " called more than once" );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// The cleanup action.
|
|
|
|
|
$this->outputChanneled( false );
|
|
|
|
|
|
|
|
|
|
// Bookkeeping that we simulated the clean up.
|
|
|
|
|
$this->shutdownSimulated = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Note that the "public" here does not change visibility
|
|
|
|
|
public function outputChanneled( $msg, $channel = null ) {
|
|
|
|
|
if ( $this->shutdownSimulated ) {
|
|
|
|
|
if ( $msg !== false ) {
|
|
|
|
|
$this->testCase->fail( "Already past simulated shutdown, but msg is "
|
|
|
|
|
. "not false. Did the hack in Maintenance.php change? Please "
|
|
|
|
|
. "adapt the test case or Maintenance.php" );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// The current call is the one registered via register_shutdown_function.
|
|
|
|
|
// We can safely ignore it, as we simulated this one via simulateShutdown
|
|
|
|
|
// before (if we did not, the destructor of this instance will warn about
|
|
|
|
|
// it)
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return call_user_func_array ( array( "parent", __FUNCTION__ ), func_get_args() );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Safety net around register_shutdown_function of Maintenance.php
|
|
|
|
|
*/
|
|
|
|
|
public function __destruct() {
|
2012-12-07 16:08:15 +00:00
|
|
|
if ( ! $this->shutdownSimulated ) {
|
2012-04-15 19:00:50 +00:00
|
|
|
// Someone generated a MaintenanceFixup instance without calling
|
|
|
|
|
// simulateShutdown. We'd have to raise a PHPUnit exception to correctly
|
|
|
|
|
// flag this illegal usage. However, we are already in a destruktor, which
|
|
|
|
|
// would trigger undefined behaviour. Hence, we can only report to the
|
|
|
|
|
// error output :( Hopefully people read the PHPUnit output.
|
2012-12-07 16:08:15 +00:00
|
|
|
$name = $this->testCase->getName();
|
|
|
|
|
fwrite( STDERR, "ERROR! Instance of " . __CLASS__ . " for test $name "
|
|
|
|
|
. "destructed without calling simulateShutdown method. Call "
|
|
|
|
|
. "simulateShutdown on the instance before it gets destructed." );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// The following guard is required, as PHP does not offer default destructors :(
|
|
|
|
|
if ( is_callable( "parent::__destruct" ) ) {
|
|
|
|
|
parent::__destruct();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function __construct( MediaWikiTestCase $testCase ) {
|
|
|
|
|
parent::__construct();
|
|
|
|
|
$this->testCase = $testCase;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// --- Making protected functions visible for test
|
|
|
|
|
|
|
|
|
|
public function output( $out, $channel = null ) {
|
|
|
|
|
// Just to make PHP not nag about signature mismatches, we copied
|
|
|
|
|
// Maintenance::output signature. However, we do not use (or rely on)
|
|
|
|
|
// those variables. Instead we pass to Maintenance::output whatever we
|
|
|
|
|
// receive at runtime.
|
|
|
|
|
return call_user_func_array ( array( "parent", __FUNCTION__ ), func_get_args() );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// --- Requirements for getting instance of abstract class
|
|
|
|
|
|
|
|
|
|
public function execute() {
|
|
|
|
|
$this->testCase->fail( __METHOD__ . " called unexpectedly" );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class MaintenanceTest extends MediaWikiTestCase {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* The main Maintenance instance that is used for testing.
|
|
|
|
|
*
|
|
|
|
|
* @var MaintenanceFixup
|
|
|
|
|
*/
|
|
|
|
|
private $m;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected function setUp() {
|
|
|
|
|
parent::setUp();
|
|
|
|
|
$this->m = new MaintenanceFixup( $this );
|
|
|
|
|
}
|
|
|
|
|
|
2012-12-07 16:08:15 +00:00
|
|
|
protected function tearDown() {
|
|
|
|
|
if ( $this->m ) {
|
|
|
|
|
$this->m->simulateShutdown();
|
|
|
|
|
$this->m = null;
|
|
|
|
|
}
|
|
|
|
|
parent::tearDown();
|
|
|
|
|
}
|
|
|
|
|
|
2012-04-15 19:00:50 +00:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* asserts the output before and after simulating shutdown
|
|
|
|
|
*
|
|
|
|
|
* This function simulates shutdown of self::m.
|
|
|
|
|
*
|
|
|
|
|
* @param $preShutdownOutput string: expected output before simulating shutdown
|
|
|
|
|
* @param $expectNLAppending bool: Whether or not shutdown simulation is expected
|
|
|
|
|
* to add a newline to the output. If false, $preShutdownOutput is the
|
|
|
|
|
* expected output after shutdown simulation. Otherwise,
|
|
|
|
|
* $preShutdownOutput with an appended newline is the expected output
|
|
|
|
|
* after shutdown simulation.
|
|
|
|
|
*/
|
|
|
|
|
private function assertOutputPrePostShutdown( $preShutdownOutput, $expectNLAppending ) {
|
|
|
|
|
|
|
|
|
|
$this->assertEquals( $preShutdownOutput, $this->getActualOutput(),
|
|
|
|
|
"Output before shutdown simulation" );
|
|
|
|
|
|
|
|
|
|
$this->m->simulateShutdown();
|
2012-12-07 16:08:15 +00:00
|
|
|
$this->m = null;
|
2012-04-15 19:00:50 +00:00
|
|
|
|
|
|
|
|
$postShutdownOutput = $preShutdownOutput . ( $expectNLAppending ? "\n" : "" );
|
|
|
|
|
$this->expectOutputString( $postShutdownOutput );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Although the following tests do not seem to be too consistent (compare for
|
|
|
|
|
// example the newlines within the test.*StringString tests, or the
|
|
|
|
|
// test.*Intermittent.* tests), the objective of these tests is not to describe
|
|
|
|
|
// consistent behaviour, but rather currently existing behaviour.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function testOutputEmpty() {
|
|
|
|
|
$this->m->output( "" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputString() {
|
|
|
|
|
$this->m->output( "foo" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputStringString() {
|
|
|
|
|
$this->m->output( "foo" );
|
|
|
|
|
$this->m->output( "bar" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foobar", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputStringNL() {
|
|
|
|
|
$this->m->output( "foo\n" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputStringNLNL() {
|
|
|
|
|
$this->m->output( "foo\n\n" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\n\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputStringNLString() {
|
|
|
|
|
$this->m->output( "foo\nbar" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputStringNLStringNL() {
|
|
|
|
|
$this->m->output( "foo\nbar\n" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputStringNLStringNLLinewise() {
|
|
|
|
|
$this->m->output( "foo\n" );
|
|
|
|
|
$this->m->output( "bar\n" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputStringNLStringNLArbitrary() {
|
|
|
|
|
$this->m->output( "" );
|
|
|
|
|
$this->m->output( "foo" );
|
|
|
|
|
$this->m->output( "" );
|
|
|
|
|
$this->m->output( "\n" );
|
|
|
|
|
$this->m->output( "ba" );
|
|
|
|
|
$this->m->output( "" );
|
|
|
|
|
$this->m->output( "r\n" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputStringNLStringNLArbitraryAgain() {
|
|
|
|
|
$this->m->output( "" );
|
|
|
|
|
$this->m->output( "foo" );
|
|
|
|
|
$this->m->output( "" );
|
|
|
|
|
$this->m->output( "\nb" );
|
|
|
|
|
$this->m->output( "a" );
|
|
|
|
|
$this->m->output( "" );
|
|
|
|
|
$this->m->output( "r\n" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputWNullChannelEmpty() {
|
|
|
|
|
$this->m->output( "", null );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputWNullChannelString() {
|
|
|
|
|
$this->m->output( "foo", null );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputWNullChannelStringString() {
|
|
|
|
|
$this->m->output( "foo", null );
|
|
|
|
|
$this->m->output( "bar", null );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foobar", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputWNullChannelStringNL() {
|
|
|
|
|
$this->m->output( "foo\n", null );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputWNullChannelStringNLNL() {
|
|
|
|
|
$this->m->output( "foo\n\n", null );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\n\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputWNullChannelStringNLString() {
|
|
|
|
|
$this->m->output( "foo\nbar", null );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputWNullChannelStringNLStringNL() {
|
|
|
|
|
$this->m->output( "foo\nbar\n", null );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputWNullChannelStringNLStringNLLinewise() {
|
|
|
|
|
$this->m->output( "foo\n", null );
|
|
|
|
|
$this->m->output( "bar\n", null );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputWNullChannelStringNLStringNLArbitrary() {
|
|
|
|
|
$this->m->output( "", null );
|
|
|
|
|
$this->m->output( "foo", null );
|
|
|
|
|
$this->m->output( "", null );
|
|
|
|
|
$this->m->output( "\n", null );
|
|
|
|
|
$this->m->output( "ba", null );
|
|
|
|
|
$this->m->output( "", null );
|
|
|
|
|
$this->m->output( "r\n", null );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputWNullChannelStringNLStringNLArbitraryAgain() {
|
|
|
|
|
$this->m->output( "", null );
|
|
|
|
|
$this->m->output( "foo", null );
|
|
|
|
|
$this->m->output( "", null );
|
|
|
|
|
$this->m->output( "\nb", null );
|
|
|
|
|
$this->m->output( "a", null );
|
|
|
|
|
$this->m->output( "", null );
|
|
|
|
|
$this->m->output( "r\n", null );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputWChannelString() {
|
|
|
|
|
$this->m->output( "foo", "bazChannel" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputWChannelStringNL() {
|
|
|
|
|
$this->m->output( "foo\n", "bazChannel" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputWChannelStringNLNL() {
|
|
|
|
|
// If this test fails, note that output takes strings with double line
|
|
|
|
|
// endings (although output's implementation in this situation calls
|
|
|
|
|
// outputChanneled with a string ending in a nl ... which is not allowed
|
|
|
|
|
// according to the documentation of outputChanneled)
|
|
|
|
|
$this->m->output( "foo\n\n", "bazChannel" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\n", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputWChannelStringNLString() {
|
|
|
|
|
$this->m->output( "foo\nbar", "bazChannel" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputWChannelStringNLStringNL() {
|
|
|
|
|
$this->m->output( "foo\nbar\n", "bazChannel" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputWChannelStringNLStringNLLinewise() {
|
|
|
|
|
$this->m->output( "foo\n", "bazChannel" );
|
|
|
|
|
$this->m->output( "bar\n", "bazChannel" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foobar", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputWChannelStringNLStringNLArbitrary() {
|
|
|
|
|
$this->m->output( "", "bazChannel" );
|
|
|
|
|
$this->m->output( "foo", "bazChannel" );
|
|
|
|
|
$this->m->output( "", "bazChannel" );
|
|
|
|
|
$this->m->output( "\n", "bazChannel" );
|
|
|
|
|
$this->m->output( "ba", "bazChannel" );
|
|
|
|
|
$this->m->output( "", "bazChannel" );
|
|
|
|
|
$this->m->output( "r\n", "bazChannel" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foobar", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputWChannelStringNLStringNLArbitraryAgain() {
|
|
|
|
|
$this->m->output( "", "bazChannel" );
|
|
|
|
|
$this->m->output( "foo", "bazChannel" );
|
|
|
|
|
$this->m->output( "", "bazChannel" );
|
|
|
|
|
$this->m->output( "\nb", "bazChannel" );
|
|
|
|
|
$this->m->output( "a", "bazChannel" );
|
|
|
|
|
$this->m->output( "", "bazChannel" );
|
|
|
|
|
$this->m->output( "r\n", "bazChannel" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputWMultipleChannelsChannelChange() {
|
|
|
|
|
$this->m->output( "foo", "bazChannel" );
|
|
|
|
|
$this->m->output( "bar", "bazChannel" );
|
|
|
|
|
$this->m->output( "qux", "quuxChannel" );
|
|
|
|
|
$this->m->output( "corge", "bazChannel" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foobar\nqux\ncorge", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputWMultipleChannelsChannelChangeNL() {
|
|
|
|
|
$this->m->output( "foo", "bazChannel" );
|
|
|
|
|
$this->m->output( "bar\n", "bazChannel" );
|
|
|
|
|
$this->m->output( "qux\n", "quuxChannel" );
|
|
|
|
|
$this->m->output( "corge", "bazChannel" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foobar\nqux\ncorge", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputWAndWOChannelStringStartWO() {
|
|
|
|
|
$this->m->output( "foo" );
|
|
|
|
|
$this->m->output( "bar", "bazChannel" );
|
|
|
|
|
$this->m->output( "qux" );
|
|
|
|
|
$this->m->output( "quux", "bazChannel" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foobar\nquxquux", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputWAndWOChannelStringStartW() {
|
|
|
|
|
$this->m->output( "foo", "bazChannel" );
|
|
|
|
|
$this->m->output( "bar" );
|
|
|
|
|
$this->m->output( "qux", "bazChannel" );
|
|
|
|
|
$this->m->output( "quux" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbarqux\nquux", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputWChannelTypeSwitch() {
|
|
|
|
|
$this->m->output( "foo", 1 );
|
|
|
|
|
$this->m->output( "bar", 1.0 );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputIntermittentEmpty() {
|
|
|
|
|
$this->m->output( "foo" );
|
|
|
|
|
$this->m->output( "" );
|
|
|
|
|
$this->m->output( "bar" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foobar", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputIntermittentFalse() {
|
|
|
|
|
$this->m->output( "foo" );
|
|
|
|
|
$this->m->output( false );
|
|
|
|
|
$this->m->output( "bar" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foobar", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputIntermittentFalseAfterOtherChannel() {
|
|
|
|
|
$this->m->output( "qux", "quuxChannel" );
|
|
|
|
|
$this->m->output( "foo" );
|
|
|
|
|
$this->m->output( false );
|
|
|
|
|
$this->m->output( "bar" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "qux\nfoobar", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputWNullChannelIntermittentEmpty() {
|
|
|
|
|
$this->m->output( "foo", null );
|
|
|
|
|
$this->m->output( "", null );
|
|
|
|
|
$this->m->output( "bar", null );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foobar", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputWNullChannelIntermittentFalse() {
|
|
|
|
|
$this->m->output( "foo", null );
|
|
|
|
|
$this->m->output( false, null );
|
|
|
|
|
$this->m->output( "bar", null );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foobar", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputWChannelIntermittentEmpty() {
|
|
|
|
|
$this->m->output( "foo", "bazChannel" );
|
|
|
|
|
$this->m->output( "", "bazChannel" );
|
|
|
|
|
$this->m->output( "bar", "bazChannel" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foobar", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputWChannelIntermittentFalse() {
|
|
|
|
|
$this->m->output( "foo", "bazChannel" );
|
|
|
|
|
$this->m->output( false, "bazChannel" );
|
|
|
|
|
$this->m->output( "bar", "bazChannel" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foobar", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Note that (per documentation) outputChanneled does take strings that end
|
|
|
|
|
// in \n, hence we do not test such strings.
|
|
|
|
|
|
|
|
|
|
function testOutputChanneledEmpty() {
|
|
|
|
|
$this->m->outputChanneled( "" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputChanneledString() {
|
|
|
|
|
$this->m->outputChanneled( "foo" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputChanneledStringString() {
|
|
|
|
|
$this->m->outputChanneled( "foo" );
|
|
|
|
|
$this->m->outputChanneled( "bar" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputChanneledStringNLString() {
|
|
|
|
|
$this->m->outputChanneled( "foo\nbar" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputChanneledStringNLStringNLArbitraryAgain() {
|
|
|
|
|
$this->m->outputChanneled( "" );
|
|
|
|
|
$this->m->outputChanneled( "foo" );
|
|
|
|
|
$this->m->outputChanneled( "" );
|
|
|
|
|
$this->m->outputChanneled( "\nb" );
|
|
|
|
|
$this->m->outputChanneled( "a" );
|
|
|
|
|
$this->m->outputChanneled( "" );
|
|
|
|
|
$this->m->outputChanneled( "r" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "\nfoo\n\n\nb\na\n\nr\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputChanneledWNullChannelEmpty() {
|
|
|
|
|
$this->m->outputChanneled( "", null );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputChanneledWNullChannelString() {
|
|
|
|
|
$this->m->outputChanneled( "foo", null );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputChanneledWNullChannelStringString() {
|
|
|
|
|
$this->m->outputChanneled( "foo", null );
|
|
|
|
|
$this->m->outputChanneled( "bar", null );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputChanneledWNullChannelStringNLString() {
|
|
|
|
|
$this->m->outputChanneled( "foo\nbar", null );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputChanneledWNullChannelStringNLStringNLArbitraryAgain() {
|
|
|
|
|
$this->m->outputChanneled( "", null );
|
|
|
|
|
$this->m->outputChanneled( "foo", null );
|
|
|
|
|
$this->m->outputChanneled( "", null );
|
|
|
|
|
$this->m->outputChanneled( "\nb", null );
|
|
|
|
|
$this->m->outputChanneled( "a", null );
|
|
|
|
|
$this->m->outputChanneled( "", null );
|
|
|
|
|
$this->m->outputChanneled( "r", null );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "\nfoo\n\n\nb\na\n\nr\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputChanneledWChannelString() {
|
|
|
|
|
$this->m->outputChanneled( "foo", "bazChannel" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputChanneledWChannelStringNLString() {
|
|
|
|
|
$this->m->outputChanneled( "foo\nbar", "bazChannel" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputChanneledWChannelStringString() {
|
|
|
|
|
$this->m->outputChanneled( "foo", "bazChannel" );
|
|
|
|
|
$this->m->outputChanneled( "bar", "bazChannel" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foobar", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputChanneledWChannelStringNLStringNLArbitraryAgain() {
|
|
|
|
|
$this->m->outputChanneled( "", "bazChannel" );
|
|
|
|
|
$this->m->outputChanneled( "foo", "bazChannel" );
|
|
|
|
|
$this->m->outputChanneled( "", "bazChannel" );
|
|
|
|
|
$this->m->outputChanneled( "\nb", "bazChannel" );
|
|
|
|
|
$this->m->outputChanneled( "a", "bazChannel" );
|
|
|
|
|
$this->m->outputChanneled( "", "bazChannel" );
|
|
|
|
|
$this->m->outputChanneled( "r", "bazChannel" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputChanneledWMultipleChannelsChannelChange() {
|
|
|
|
|
$this->m->outputChanneled( "foo", "bazChannel" );
|
|
|
|
|
$this->m->outputChanneled( "bar", "bazChannel" );
|
|
|
|
|
$this->m->outputChanneled( "qux", "quuxChannel" );
|
|
|
|
|
$this->m->outputChanneled( "corge", "bazChannel" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foobar\nqux\ncorge", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputChanneledWMultipleChannelsChannelChangeEnclosedNull() {
|
|
|
|
|
$this->m->outputChanneled( "foo", "bazChannel" );
|
|
|
|
|
$this->m->outputChanneled( "bar", null );
|
|
|
|
|
$this->m->outputChanneled( "qux", null );
|
|
|
|
|
$this->m->outputChanneled( "corge", "bazChannel" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar\nqux\ncorge", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputChanneledWMultipleChannelsChannelAfterNullChange() {
|
|
|
|
|
$this->m->outputChanneled( "foo", "bazChannel" );
|
|
|
|
|
$this->m->outputChanneled( "bar", null );
|
|
|
|
|
$this->m->outputChanneled( "qux", null );
|
|
|
|
|
$this->m->outputChanneled( "corge", "quuxChannel" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar\nqux\ncorge", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputChanneledWAndWOChannelStringStartWO() {
|
|
|
|
|
$this->m->outputChanneled( "foo" );
|
|
|
|
|
$this->m->outputChanneled( "bar", "bazChannel" );
|
|
|
|
|
$this->m->outputChanneled( "qux" );
|
|
|
|
|
$this->m->outputChanneled( "quux", "bazChannel" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar\nqux\nquux", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputChanneledWAndWOChannelStringStartW() {
|
|
|
|
|
$this->m->outputChanneled( "foo", "bazChannel" );
|
|
|
|
|
$this->m->outputChanneled( "bar" );
|
|
|
|
|
$this->m->outputChanneled( "qux", "bazChannel" );
|
|
|
|
|
$this->m->outputChanneled( "quux" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar\nqux\nquux\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputChanneledWChannelTypeSwitch() {
|
|
|
|
|
$this->m->outputChanneled( "foo", 1 );
|
|
|
|
|
$this->m->outputChanneled( "bar", 1.0 );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputChanneledWOChannelIntermittentEmpty() {
|
|
|
|
|
$this->m->outputChanneled( "foo" );
|
|
|
|
|
$this->m->outputChanneled( "" );
|
|
|
|
|
$this->m->outputChanneled( "bar" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\n\nbar\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputChanneledWOChannelIntermittentFalse() {
|
|
|
|
|
$this->m->outputChanneled( "foo" );
|
|
|
|
|
$this->m->outputChanneled( false );
|
|
|
|
|
$this->m->outputChanneled( "bar" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputChanneledWNullChannelIntermittentEmpty() {
|
|
|
|
|
$this->m->outputChanneled( "foo", null );
|
|
|
|
|
$this->m->outputChanneled( "", null );
|
|
|
|
|
$this->m->outputChanneled( "bar", null );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\n\nbar\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputChanneledWNullChannelIntermittentFalse() {
|
|
|
|
|
$this->m->outputChanneled( "foo", null );
|
|
|
|
|
$this->m->outputChanneled( false, null );
|
|
|
|
|
$this->m->outputChanneled( "bar", null );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputChanneledWChannelIntermittentEmpty() {
|
|
|
|
|
$this->m->outputChanneled( "foo", "bazChannel" );
|
|
|
|
|
$this->m->outputChanneled( "", "bazChannel" );
|
|
|
|
|
$this->m->outputChanneled( "bar", "bazChannel" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foobar", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testOutputChanneledWChannelIntermittentFalse() {
|
|
|
|
|
$this->m->outputChanneled( "foo", "bazChannel" );
|
|
|
|
|
$this->m->outputChanneled( false, "bazChannel" );
|
|
|
|
|
$this->m->outputChanneled( "bar", "bazChannel" );
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testCleanupChanneledClean() {
|
|
|
|
|
$this->m->cleanupChanneled();
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testCleanupChanneledAfterOutput() {
|
|
|
|
|
$this->m->output( "foo" );
|
|
|
|
|
$this->m->cleanupChanneled();
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testCleanupChanneledAfterOutputWNullChannel() {
|
|
|
|
|
$this->m->output( "foo", null );
|
|
|
|
|
$this->m->cleanupChanneled();
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testCleanupChanneledAfterOutputWChannel() {
|
|
|
|
|
$this->m->output( "foo", "bazChannel" );
|
|
|
|
|
$this->m->cleanupChanneled();
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testCleanupChanneledAfterNLOutput() {
|
|
|
|
|
$this->m->output( "foo\n" );
|
|
|
|
|
$this->m->cleanupChanneled();
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testCleanupChanneledAfterNLOutputWNullChannel() {
|
|
|
|
|
$this->m->output( "foo\n", null );
|
|
|
|
|
$this->m->cleanupChanneled();
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testCleanupChanneledAfterNLOutputWChannel() {
|
|
|
|
|
$this->m->output( "foo\n", "bazChannel" );
|
|
|
|
|
$this->m->cleanupChanneled();
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testCleanupChanneledAfterOutputChanneledWOChannel() {
|
|
|
|
|
$this->m->outputChanneled( "foo" );
|
|
|
|
|
$this->m->cleanupChanneled();
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testCleanupChanneledAfterOutputChanneledWNullChannel() {
|
|
|
|
|
$this->m->outputChanneled( "foo", null );
|
|
|
|
|
$this->m->cleanupChanneled();
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testCleanupChanneledAfterOutputChanneledWChannel() {
|
|
|
|
|
$this->m->outputChanneled( "foo", "bazChannel" );
|
|
|
|
|
$this->m->cleanupChanneled();
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testMultipleMaintenanceObjectsInteractionOutput() {
|
|
|
|
|
$m2 = new MaintenanceFixup( $this );
|
|
|
|
|
|
|
|
|
|
$this->m->output( "foo" );
|
|
|
|
|
$m2->output( "bar" );
|
|
|
|
|
|
|
|
|
|
$this->assertEquals( "foobar", $this->getActualOutput(),
|
|
|
|
|
"Output before shutdown simulation (m2)" );
|
|
|
|
|
$m2->simulateShutdown();
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foobar", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testMultipleMaintenanceObjectsInteractionOutputWNullChannel() {
|
|
|
|
|
$m2 = new MaintenanceFixup( $this );
|
|
|
|
|
|
|
|
|
|
$this->m->output( "foo", null );
|
|
|
|
|
$m2->output( "bar", null );
|
|
|
|
|
|
|
|
|
|
$this->assertEquals( "foobar", $this->getActualOutput(),
|
|
|
|
|
"Output before shutdown simulation (m2)" );
|
|
|
|
|
$m2->simulateShutdown();
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foobar", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testMultipleMaintenanceObjectsInteractionOutputWChannel() {
|
|
|
|
|
$m2 = new MaintenanceFixup( $this );
|
|
|
|
|
|
|
|
|
|
$this->m->output( "foo", "bazChannel" );
|
|
|
|
|
$m2->output( "bar", "bazChannel" );
|
|
|
|
|
|
|
|
|
|
$this->assertEquals( "foobar", $this->getActualOutput(),
|
|
|
|
|
"Output before shutdown simulation (m2)" );
|
|
|
|
|
$m2->simulateShutdown();
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foobar\n", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testMultipleMaintenanceObjectsInteractionOutputWNullChannelNL() {
|
|
|
|
|
$m2 = new MaintenanceFixup( $this );
|
|
|
|
|
|
|
|
|
|
$this->m->output( "foo\n", null );
|
|
|
|
|
$m2->output( "bar\n", null );
|
|
|
|
|
|
|
|
|
|
$this->assertEquals( "foo\nbar\n", $this->getActualOutput(),
|
|
|
|
|
"Output before shutdown simulation (m2)" );
|
|
|
|
|
$m2->simulateShutdown();
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testMultipleMaintenanceObjectsInteractionOutputWChannelNL() {
|
|
|
|
|
$m2 = new MaintenanceFixup( $this );
|
|
|
|
|
|
|
|
|
|
$this->m->output( "foo\n", "bazChannel" );
|
|
|
|
|
$m2->output( "bar\n", "bazChannel" );
|
|
|
|
|
|
|
|
|
|
$this->assertEquals( "foobar", $this->getActualOutput(),
|
|
|
|
|
"Output before shutdown simulation (m2)" );
|
|
|
|
|
$m2->simulateShutdown();
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foobar\n", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testMultipleMaintenanceObjectsInteractionOutputChanneled() {
|
|
|
|
|
$m2 = new MaintenanceFixup( $this );
|
|
|
|
|
|
|
|
|
|
$this->m->outputChanneled( "foo" );
|
|
|
|
|
$m2->outputChanneled( "bar" );
|
|
|
|
|
|
|
|
|
|
$this->assertEquals( "foo\nbar\n", $this->getActualOutput(),
|
|
|
|
|
"Output before shutdown simulation (m2)" );
|
|
|
|
|
$m2->simulateShutdown();
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testMultipleMaintenanceObjectsInteractionOutputChanneledWNullChannel() {
|
|
|
|
|
$m2 = new MaintenanceFixup( $this );
|
|
|
|
|
|
|
|
|
|
$this->m->outputChanneled( "foo", null );
|
|
|
|
|
$m2->outputChanneled( "bar", null );
|
|
|
|
|
|
|
|
|
|
$this->assertEquals( "foo\nbar\n", $this->getActualOutput(),
|
|
|
|
|
"Output before shutdown simulation (m2)" );
|
|
|
|
|
$m2->simulateShutdown();
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foo\nbar\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testMultipleMaintenanceObjectsInteractionOutputChanneledWChannel() {
|
|
|
|
|
$m2 = new MaintenanceFixup( $this );
|
|
|
|
|
|
|
|
|
|
$this->m->outputChanneled( "foo", "bazChannel" );
|
|
|
|
|
$m2->outputChanneled( "bar", "bazChannel" );
|
|
|
|
|
|
|
|
|
|
$this->assertEquals( "foobar", $this->getActualOutput(),
|
|
|
|
|
"Output before shutdown simulation (m2)" );
|
|
|
|
|
$m2->simulateShutdown();
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foobar\n", true );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testMultipleMaintenanceObjectsInteractionCleanupChanneledWChannel() {
|
|
|
|
|
$m2 = new MaintenanceFixup( $this );
|
|
|
|
|
|
|
|
|
|
$this->m->outputChanneled( "foo", "bazChannel" );
|
|
|
|
|
$m2->outputChanneled( "bar", "bazChannel" );
|
|
|
|
|
|
|
|
|
|
$this->assertEquals( "foobar", $this->getActualOutput(),
|
|
|
|
|
"Output before first cleanup" );
|
|
|
|
|
$this->m->cleanupChanneled();
|
|
|
|
|
$this->assertEquals( "foobar\n", $this->getActualOutput(),
|
|
|
|
|
"Output after first cleanup" );
|
|
|
|
|
$m2->cleanupChanneled();
|
|
|
|
|
$this->assertEquals( "foobar\n\n", $this->getActualOutput(),
|
|
|
|
|
"Output after second cleanup" );
|
|
|
|
|
|
|
|
|
|
$m2->simulateShutdown();
|
2013-01-28 10:27:15 +00:00
|
|
|
$this->assertOutputPrePostShutdown( "foobar\n\n", false );
|
2012-04-15 19:00:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2012-12-07 16:08:15 +00:00
|
|
|
}
|