PageRenderTime 92ms CodeModel.GetById 27ms RepoModel.GetById 1ms app.codeStats 0ms

/test/unit/plugin/sfPluginManagerTest.php

https://github.com/bheneka/gitta
PHP | 267 lines | 206 code | 48 blank | 13 comment | 7 complexity | a38d15459b04c111103477c43465c9df MD5 | raw file
  1. <?php
  2. /*
  3. * This file is part of the symfony package.
  4. * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
  5. *
  6. * For the full copyright and license information, please view the LICENSE
  7. * file that was distributed with this source code.
  8. */
  9. error_reporting(error_reporting() & ~E_STRICT);
  10. require_once(dirname(__FILE__).'/../../bootstrap/unit.php');
  11. $t = new lime_test(40);
  12. @include_once('PEAR.php');
  13. if (!class_exists('PEAR'))
  14. {
  15. $t->skip('PEAR must be installed', 40);
  16. return;
  17. }
  18. require_once dirname(__FILE__).'/sfPearDownloaderTest.class.php';
  19. require_once dirname(__FILE__).'/sfPearRestTest.class.php';
  20. require_once dirname(__FILE__).'/sfPluginTestHelper.class.php';
  21. // setup
  22. $temp = tempnam('/tmp/sf_plugin_test', 'tmp');
  23. unlink($temp);
  24. mkdir($temp, 0777, true);
  25. define('SF_PLUGIN_TEST_DIR', $temp);
  26. $options = array(
  27. 'plugin_dir' => $temp.'/plugins',
  28. 'cache_dir' => $temp.'/cache',
  29. 'preferred_state' => 'stable',
  30. 'rest_base_class' => 'sfPearRestTest',
  31. 'downloader_base_class' => 'sfPearDownloaderTest',
  32. );
  33. $dispatcher = new sfEventDispatcher();
  34. class myPluginManager extends sfPluginManager
  35. {
  36. protected
  37. $mainPackageVersion = '1.0.0';
  38. public function setMainPackageVersion($version)
  39. {
  40. $this->mainPackageVersion = $version;
  41. $this->configure();
  42. }
  43. public function configure()
  44. {
  45. $this->environment->registerChannel('pear.example.com', true);
  46. $mainPackage = new PEAR_PackageFile_v2_rw();
  47. $mainPackage->setPackage('sfMainPackage');
  48. $mainPackage->setChannel('pear.example.com');
  49. $mainPackage->setConfig($this->environment->getConfig());
  50. $mainPackage->setPackageType('php');
  51. $mainPackage->setAPIVersion('1.0.0');
  52. $mainPackage->setAPIStability('stable');
  53. $mainPackage->setReleaseVersion($this->mainPackageVersion);
  54. $mainPackage->setReleaseStability('stable');
  55. $mainPackage->setDate(date('Y-m-d'));
  56. $mainPackage->setDescription('sfMainPackage');
  57. $mainPackage->setSummary('sfMainPackage');
  58. $mainPackage->setLicense('MIT License');
  59. $mainPackage->clearContents();
  60. $mainPackage->resetFilelist();
  61. $mainPackage->addMaintainer('lead', 'fabpot', 'Fabien Potencier', 'fabien.potencier@symfony-project.com');
  62. $mainPackage->setNotes('-');
  63. $mainPackage->setPearinstallerDep('1.4.3');
  64. $mainPackage->setPhpDep('5.1.0');
  65. $this->environment->getRegistry()->deletePackage('sfMainPackage', 'pear.example.com');
  66. if (!$this->environment->getRegistry()->addPackage2($mainPackage))
  67. {
  68. throw new sfException('Unable to register our sfMainPackage');
  69. }
  70. }
  71. protected function isPluginCompatibleWithDependency($dependency)
  72. {
  73. if (isset($dependency['channel']) && 'sfMainPackage' == $dependency['name'] && 'pear.example.com' == $dependency['channel'])
  74. {
  75. return $this->checkDependency($dependency);
  76. }
  77. return true;
  78. }
  79. }
  80. // ->initialize()
  81. $t->diag('->initialize()');
  82. $environment = new sfPearEnvironment($dispatcher, $options);
  83. $pluginManager = new myPluginManager($dispatcher, $environment);
  84. $t->is($pluginManager->getEnvironment(), $environment, '->initialize() takes a sfPearEnvironment as its second argument');
  85. // ->installPlugin() ->uninstallPlugin()
  86. $t->diag('->installPlugin() ->uninstallPlugin');
  87. $pluginManager->installPlugin('sfTestPlugin');
  88. $t->is(file_get_contents($temp.'/plugins/sfTestPlugin/VERSION'), '1.0.3', '->installPlugin() installs the latest stable version');
  89. $t->ok($pluginManager->uninstallPlugin('sfTestPlugin'), '->uninstallPlugin() returns true if the plugin is properly uninstalled');
  90. $t->ok(!is_file($temp.'/plugins/sfTestPlugin/VERSION'), '->uninstallPlugin() uninstalls a plugin');
  91. $pluginManager->installPlugin('sfTestPlugin', array('stability' => 'beta'));
  92. $t->is(file_get_contents($temp.'/plugins/sfTestPlugin/VERSION'), '1.0.4', '->installPlugin() can take a stability option');
  93. $t->ok($pluginManager->uninstallPlugin('sfTestPlugin'), '->uninstallPlugin() returns true if the plugin is properly uninstalled');
  94. $t->ok(!is_file($temp.'/plugins/sfTestPlugin/VERSION'), '->uninstallPlugin() uninstalls a plugin');
  95. $pluginManager->installPlugin('sfTestPlugin', array('version' => '1.0.0'));
  96. $t->is(file_get_contents($temp.'/plugins/sfTestPlugin/VERSION'), '1.0.0', '->installPlugin() can take a version option');
  97. $t->ok($pluginManager->uninstallPlugin('sfTestPlugin'), '->uninstallPlugin() returns true if the plugin is properly uninstalled');
  98. $t->ok(!is_file($temp.'/plugins/sfTestPlugin/VERSION'), '->uninstallPlugin() uninstalls a plugin');
  99. $t->diag('Try to install a version that won\'t work with our main package');
  100. try
  101. {
  102. $pluginManager->installPlugin('sfTestPlugin', array('version' => '1.1.3'));
  103. $t->fail('->installPlugin() throws an exception if you try to install a version that is not compatible with our main package');
  104. }
  105. catch (sfPluginDependencyException $e)
  106. {
  107. $t->pass('->installPlugin() throws an exception if you try to install a version that is not compatible with our main package');
  108. }
  109. $t->diag('Upgrade our main package to 1.1.0');
  110. $pluginManager->setMainPackageVersion('1.1.0');
  111. $pluginManager->installPlugin('sfTestPlugin');
  112. $t->is(file_get_contents($temp.'/plugins/sfTestPlugin/VERSION'), '1.1.3', '->installPlugin() installs the latest stable version');
  113. $t->ok($pluginManager->uninstallPlugin('sfTestPlugin'), '->uninstallPlugin() returns true if the plugin is properly uninstalled');
  114. $t->ok(!is_file($temp.'/plugins/sfTestPlugin/VERSION'), '->uninstallPlugin() uninstalls a plugin');
  115. $pluginManager->installPlugin('sfTestPlugin', array('stability' => 'beta'));
  116. $t->is(file_get_contents($temp.'/plugins/sfTestPlugin/VERSION'), '1.1.4', '->installPlugin() takes a stability as its 4th argument');
  117. $t->ok($pluginManager->uninstallPlugin('sfTestPlugin'), '->uninstallPlugin() returns true if the plugin is properly uninstalled');
  118. $t->ok(!is_file($temp.'/plugins/sfTestPlugin/VERSION'), '->uninstallPlugin() uninstalls a plugin');
  119. $t->diag('try to uninstall a non installed plugin');
  120. $t->ok(!$pluginManager->uninstallPlugin('sfFooPlugin'), '->uninstallPlugin() returns false if the plugin is not installed');
  121. $t->diag('try to install a non existant plugin');
  122. try
  123. {
  124. $pluginManager->installPlugin('sfBarPlugin');
  125. $t->fail('->installPlugin() throws an exception if the plugin does not exist');
  126. }
  127. catch (sfPluginException $e)
  128. {
  129. $t->pass('->installPlugin() throws an exception if the plugin does not exist');
  130. }
  131. $pluginManager->installPlugin('http://pear.example.com/get/sfTestPlugin/sfTestPlugin-1.1.4.tgz');
  132. $t->is(file_get_contents($temp.'/plugins/sfTestPlugin/VERSION'), '1.1.4', '->installPlugin() can install a PEAR package hosted on a website');
  133. $t->ok($pluginManager->uninstallPlugin('sfTestPlugin'), '->uninstallPlugin() returns true if the plugin is properly uninstalled');
  134. $t->ok(!is_file($temp.'/plugins/sfTestPlugin/VERSION'), '->uninstallPlugin() uninstalls a plugin');
  135. $pluginManager->installPlugin(dirname(__FILE__).'/fixtures/http/pear.example.com/get/sfTestPlugin/sfTestPlugin-1.1.4.tgz');
  136. $t->is(file_get_contents($temp.'/plugins/sfTestPlugin/VERSION'), '1.1.4', '->installPlugin() can install a local PEAR package');
  137. $t->ok($pluginManager->uninstallPlugin('sfTestPlugin'), '->uninstallPlugin() returns true if the plugin is properly uninstalled');
  138. $t->ok(!is_file($temp.'/plugins/sfTestPlugin/VERSION'), '->uninstallPlugin() uninstalls a plugin');
  139. // ->getPluginVersion()
  140. $t->diag('->getPluginVersion()');
  141. $pluginManager->setMainPackageVersion('1.0.0');
  142. $t->is($pluginManager->getPluginVersion('sfTestPlugin'), '1.0.3', '->getPluginVersion() returns the latest version available for the plugin');
  143. $t->is($pluginManager->getPluginVersion('sfTestPlugin', 'beta'), '1.0.4', '->getPluginVersion() takes a stability as its second argument');
  144. $pluginManager->setMainPackageVersion('1.1.0');
  145. $t->is($pluginManager->getPluginVersion('sfTestPlugin'), '1.1.3', '->getPluginVersion() returns the latest version available for the plugin');
  146. $t->is($pluginManager->getPluginVersion('sfTestPlugin', 'beta'), '1.1.4', '->getPluginVersion() takes a stability as its second argument');
  147. $t->is($pluginManager->getPluginVersion('sfTestPlugin', 'alpha'), '1.1.4', '->getPluginVersion() takes a stability as its second argument');
  148. // ->getInstalledPlugins()
  149. $t->diag('->getInstalledPlugins()');
  150. $pluginManager->installPlugin('sfTestPlugin');
  151. $installed = $pluginManager->getInstalledPlugins();
  152. $a = array($installed[0]->getName(), $installed[1]->getName());
  153. $b = array('sfTestPlugin', 'sfMainPackage');
  154. sort($a);
  155. sort($b);
  156. $t->is($a, $b, '->getInstalledPlugin() returns an array of installed packages');
  157. $t->is(count($installed), 2, '->getInstalledPlugin() returns an array of installed packages');
  158. $pluginManager->uninstallPlugin('sfTestPlugin');
  159. $t->diag('install a plugin with a dependency must fail');
  160. try
  161. {
  162. $pluginManager->installPlugin('sfFooPlugin');
  163. $t->fail('->installPlugin() throws an exception if the plugin needs a dependency to be installed');
  164. }
  165. catch (sfPluginDependencyException $e)
  166. {
  167. $t->pass('->installPlugin() throws an exception if the plugin needs a dependency to be installed');
  168. }
  169. $t->diag('install a plugin with a dependency and force installation of all dependencies');
  170. $pluginManager->installPlugin('sfFooPlugin', array('install_deps' => true));
  171. $t->is(file_get_contents($temp.'/plugins/sfFooPlugin/VERSION'), '1.0.0', '->installPlugin() can take a install_deps option');
  172. $t->is(file_get_contents($temp.'/plugins/sfTestPlugin/VERSION'), '1.1.3', '->installPlugin() can take a install_deps option');
  173. $pluginManager->uninstallPlugin('sfFooPlugin');
  174. $pluginManager->uninstallPlugin('sfTestPlugin');
  175. $pluginManager->installPlugin('sfTestPlugin', array('version' => '1.1.4'));
  176. $pluginManager->installPlugin('sfFooPlugin');
  177. $t->is(file_get_contents($temp.'/plugins/sfFooPlugin/VERSION'), '1.0.0', '->installPlugin() installs a plugin if all dependencies are installed');
  178. $t->is(file_get_contents($temp.'/plugins/sfTestPlugin/VERSION'), '1.1.4', '->installPlugin() installs a plugin if all dependencies are installed');
  179. $pluginManager->uninstallPlugin('sfFooPlugin');
  180. $pluginManager->uninstallPlugin('sfTestPlugin');
  181. $t->diag('try to uninstall a plugin with a depedency must fail');
  182. $pluginManager->installPlugin('sfTestPlugin', array('version' => '1.1.4'));
  183. $pluginManager->installPlugin('sfFooPlugin');
  184. try
  185. {
  186. $pluginManager->uninstallPlugin('sfTestPlugin');
  187. $t->fail('->uninstallPlugin() throws an exception if you try to uninstall a plugin that is needed for another one');
  188. }
  189. catch (sfPluginException $e)
  190. {
  191. $t->pass('->uninstallPlugin() throws an exception if you try to uninstall a plugin that is needed for another one');
  192. }
  193. $pluginManager->uninstallPlugin('sfFooPlugin');
  194. $pluginManager->uninstallPlugin('sfTestPlugin');
  195. $t->diag('install a plugin with a dependency which is installed by with a too old version');
  196. $pluginManager->setMainPackageVersion('1.0.0');
  197. $pluginManager->installPlugin('sfTestPlugin', array('version' => '1.0.4'));
  198. $pluginManager->setMainPackageVersion('1.1.0');
  199. try
  200. {
  201. $pluginManager->installPlugin('sfFooPlugin');
  202. $t->fail('->installPlugin() throws an exception if you try to install a plugin with a dependency that is installed but not in the right version');
  203. }
  204. catch (sfPluginDependencyException $e)
  205. {
  206. $t->pass('->installPlugin() throws an exception if you try to install a plugin with a dependency that is installed but not in the right version');
  207. }
  208. $pluginManager->uninstallPlugin('sfTestPlugin');
  209. $t->diag('install a plugin with a dependency which is installed with a too old version and you want automatic upgrade');
  210. $pluginManager->setMainPackageVersion('1.0.0');
  211. $pluginManager->installPlugin('sfTestPlugin', array('version' => '1.0.4'));
  212. $pluginManager->setMainPackageVersion('1.1.0');
  213. $pluginManager->installPlugin('sfFooPlugin', array('install_deps' => true));
  214. $t->is(file_get_contents($temp.'/plugins/sfFooPlugin/VERSION'), '1.0.0', '->installPlugin() installs a plugin if all dependencies are installed');
  215. $pluginManager->uninstallPlugin('sfFooPlugin');
  216. $pluginManager->uninstallPlugin('sfTestPlugin');
  217. // teardown
  218. sfToolkit::clearDirectory($temp);
  219. rmdir($temp);