Make sure we don't use objects by ref in setMwGlobals
authoraddshore <addshorewiki@gmail.com>
Wed, 5 Mar 2014 13:25:07 +0000 (14:25 +0100)
committerBartosz Dziewoński <matma.rex@gmail.com>
Wed, 5 Mar 2014 18:31:49 +0000 (18:31 +0000)
If we copy am object by ref into our temporary array
then this doesn't really make this method very useful
as the same object would be restored, with any changes
after the test has run.

Thus objects should be cloned when being dumped in
here, we use unserialize() and serialize() instead as
we would also want to clone the objects within the
object to avoid changes in there!

These is no point in adding an if is_object call so
we just serialize and deserialize everything!

Change-Id: I5e4ef114405888932014edae6b44afc6ee2c4863

tests/phpunit/MediaWikiTestCase.php

index 87e214c..9ca1cab 100644 (file)
@@ -312,7 +312,10 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        // setMwGlobals() on the same global would override the original
                        // value.
                        if ( !array_key_exists( $key, $this->mwGlobals ) ) {
-                               $this->mwGlobals[$key] = $GLOBALS[$key];
+                               // NOTE: we serialize then unserialize the value in case it is an object
+                               // this stops any objects being passed by reference. We could use clone
+                               // and if is_object but this does account for objects within objects!
+                               $this->mwGlobals[$key] = unserialize( serialize( $GLOBALS[$key] ) );
                        }
 
                        // Override the global