Browse Source

Merge remote-tracking branch 'OfficineSoftware/master'

Jordi Boggiano 13 years ago
parent
commit
b68eb3317b

+ 9 - 1
src/Composer/Script/EventDispatcher.php

@@ -88,7 +88,15 @@ class EventDispatcher
                 throw new \UnexpectedValueException('Method '.$callable.' is not callable, can not call '.$event->getName().' script');
             }
 
-            $className::$methodName($event);
+            try {
+                $className::$methodName($event);
+            } catch (\Exception $e) {
+                $message = "%s terminated with an exception.\n[%s] %s";
+                throw new \RuntimeException(sprintf($message,
+                                                    $callable,
+                                                    get_class($e),
+                                                    $e->getMessage()));
+            }
         }
     }
 

+ 62 - 0
tests/Composer/Test/Script/EventDispatcherTest.php

@@ -0,0 +1,62 @@
+<?php
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Test\Script;
+
+use Composer\Test\TestCase;
+use Composer\Script\Event;
+use Composer\Script\EventDispatcher;
+
+/**
+ * Event Dispatcher Test Case
+ *
+ * @group event-dispatcher
+ * @ticket #693
+ * @author Andrea Turso <turso@officinesoftware.co.uk>
+ */
+class EventDispatcherTest extends TestCase
+{
+    /**
+     * Test the doDispatch method properly catches any exception
+     * thrown from the listener invocation, i.e., <code>$className::$methodName($event)</code>,
+     * and replaces it with a \RuntimeException.
+     *
+     * @expectedException \RuntimeException
+     */
+    public function testListenerExceptionsAreSuppressed()
+    {
+        $dispatcher = $this->getDispatcherStubForListenersTest(array(
+                "Composer\Test\Script\EventDispatcherTest::call"
+            ));
+        $dispatcher->dispatchCommandEvent("post-install-cmd");
+    }
+
+    private function getDispatcherStubForListenersTest($listeners)
+    {
+        $dispatcher = $this->getMockBuilder('Composer\Script\EventDispatcher')
+                           ->setConstructorArgs(array(
+                               $this->getMock('Composer\Composer'),
+                               $this->getMock('Composer\IO\IOInterface')))
+                           ->setMethods(array('getListeners'))
+                           ->getMock();
+
+        $dispatcher->expects($this->atLeastOnce())
+                   ->method('getListeners')
+                   ->will($this->returnValue($listeners));
+
+        return $dispatcher;
+    }
+
+    public static function call()
+    {
+        throw new \Exception();
+    }
+}