DependencyAnalyzerTest.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517
  1. <?php
  2. /**
  3. * @author Thomas Müller
  4. * @author Lukas Reschke
  5. * @copyright 2014 Thomas Müller deepdiver@owncloud.com
  6. * @copyright 2016 Lukas Reschke <lukas@statuscode.ch>
  7. *
  8. * See the COPYING-README file.
  9. */
  10. namespace Test\App;
  11. use OC\App\DependencyAnalyzer;
  12. use OC\App\Platform;
  13. use OCP\IL10N;
  14. use Test\TestCase;
  15. class DependencyAnalyzerTest extends TestCase {
  16. /** @var Platform|\PHPUnit_Framework_MockObject_MockObject */
  17. private $platformMock;
  18. /** @var IL10N */
  19. private $l10nMock;
  20. /** @var DependencyAnalyzer */
  21. private $analyser;
  22. public function setUp() {
  23. $this->platformMock = $this->getMockBuilder(Platform::class)
  24. ->disableOriginalConstructor()
  25. ->getMock();
  26. $this->platformMock->expects($this->any())
  27. ->method('getPhpVersion')
  28. ->will( $this->returnValue('5.4.3'));
  29. $this->platformMock->expects($this->any())
  30. ->method('getIntSize')
  31. ->will( $this->returnValue('4'));
  32. $this->platformMock->expects($this->any())
  33. ->method('getDatabase')
  34. ->will( $this->returnValue('mysql'));
  35. $this->platformMock->expects($this->any())
  36. ->method('getOS')
  37. ->will( $this->returnValue('Linux'));
  38. $this->platformMock->expects($this->any())
  39. ->method('isCommandKnown')
  40. ->will( $this->returnCallback(function($command) {
  41. return ($command === 'grep');
  42. }));
  43. $this->platformMock->expects($this->any())
  44. ->method('getLibraryVersion')
  45. ->will( $this->returnCallback(function($lib) {
  46. if ($lib === 'curl') {
  47. return "2.3.4";
  48. }
  49. return null;
  50. }));
  51. $this->platformMock->expects($this->any())
  52. ->method('getOcVersion')
  53. ->will( $this->returnValue('8.0.2'));
  54. $this->l10nMock = $this->getMockBuilder('\OCP\IL10N')
  55. ->disableOriginalConstructor()
  56. ->getMock();
  57. $this->l10nMock->expects($this->any())
  58. ->method('t')
  59. ->will($this->returnCallback(function($text, $parameters = array()) {
  60. return vsprintf($text, $parameters);
  61. }));
  62. $this->analyser = new DependencyAnalyzer($this->platformMock, $this->l10nMock);
  63. }
  64. /**
  65. * @dataProvider providesPhpVersion
  66. *
  67. * @param string $expectedMissing
  68. * @param string $minVersion
  69. * @param string $maxVersion
  70. * @param string $intSize
  71. */
  72. public function testPhpVersion($expectedMissing, $minVersion, $maxVersion, $intSize) {
  73. $app = array(
  74. 'dependencies' => array(
  75. 'php' => array()
  76. )
  77. );
  78. if (!is_null($minVersion)) {
  79. $app['dependencies']['php']['@attributes']['min-version'] = $minVersion;
  80. }
  81. if (!is_null($maxVersion)) {
  82. $app['dependencies']['php']['@attributes']['max-version'] = $maxVersion;
  83. }
  84. if (!is_null($intSize)) {
  85. $app['dependencies']['php']['@attributes']['min-int-size'] = $intSize;
  86. }
  87. $missing = $this->analyser->analyze($app);
  88. $this->assertTrue(is_array($missing));
  89. $this->assertEquals($expectedMissing, $missing);
  90. }
  91. /**
  92. * @dataProvider providesDatabases
  93. * @param $expectedMissing
  94. * @param $databases
  95. */
  96. public function testDatabases($expectedMissing, $databases) {
  97. $app = [
  98. 'dependencies' => [
  99. ]
  100. ];
  101. if (!is_null($databases)) {
  102. $app['dependencies']['database'] = $databases;
  103. }
  104. $missing = $this->analyser->analyze($app);
  105. $this->assertTrue(is_array($missing));
  106. $this->assertEquals($expectedMissing, $missing);
  107. }
  108. /**
  109. * @dataProvider providesCommands
  110. *
  111. * @param string $expectedMissing
  112. * @param string|null $commands
  113. */
  114. public function testCommand($expectedMissing, $commands) {
  115. $app = array(
  116. 'dependencies' => array(
  117. )
  118. );
  119. if (!is_null($commands)) {
  120. $app['dependencies']['command'] = $commands;
  121. }
  122. $missing = $this->analyser->analyze($app);
  123. $this->assertTrue(is_array($missing));
  124. $this->assertEquals($expectedMissing, $missing);
  125. }
  126. /**
  127. * @dataProvider providesLibs
  128. * @param $expectedMissing
  129. * @param $libs
  130. */
  131. function testLibs($expectedMissing, $libs) {
  132. $app = array(
  133. 'dependencies' => array(
  134. )
  135. );
  136. if (!is_null($libs)) {
  137. $app['dependencies']['lib'] = $libs;
  138. }
  139. $missing = $this->analyser->analyze($app);
  140. $this->assertTrue(is_array($missing));
  141. $this->assertEquals($expectedMissing, $missing);
  142. }
  143. /**
  144. * @dataProvider providesOS
  145. * @param $expectedMissing
  146. * @param $oss
  147. */
  148. function testOS($expectedMissing, $oss) {
  149. $app = array(
  150. 'dependencies' => array()
  151. );
  152. if (!is_null($oss)) {
  153. $app['dependencies']['os'] = $oss;
  154. }
  155. $missing = $this->analyser->analyze($app);
  156. $this->assertTrue(is_array($missing));
  157. $this->assertEquals($expectedMissing, $missing);
  158. }
  159. /**
  160. * @dataProvider providesOC
  161. * @param $expectedMissing
  162. * @param $oc
  163. */
  164. function testOC($expectedMissing, $oc) {
  165. $app = array(
  166. 'dependencies' => array()
  167. );
  168. if (!is_null($oc)) {
  169. $app['dependencies'] = $oc;
  170. }
  171. $missing = $this->analyser->analyze($app);
  172. $this->assertTrue(is_array($missing));
  173. $this->assertEquals($expectedMissing, $missing);
  174. }
  175. /**
  176. * @return array
  177. */
  178. function providesOC() {
  179. return [
  180. // no version -> no missing dependency
  181. [
  182. [],
  183. null,
  184. ],
  185. [
  186. [],
  187. [
  188. 'nextcloud' => [
  189. '@attributes' => [
  190. 'min-version' => '8',
  191. 'max-version' => '8',
  192. ],
  193. ],
  194. ],
  195. ],
  196. [
  197. [],
  198. [
  199. 'nextcloud' => [
  200. '@attributes' => [
  201. 'min-version' => '8.0',
  202. 'max-version' => '8.0',
  203. ],
  204. ],
  205. ],
  206. ],
  207. [
  208. [],
  209. [
  210. 'nextcloud' => [
  211. '@attributes' => [
  212. 'min-version' => '8.0.2',
  213. 'max-version' => '8.0.2'
  214. ],
  215. ],
  216. ],
  217. ],
  218. [
  219. [
  220. 'Server version 8.0.3 or higher is required.',
  221. ],
  222. [
  223. 'nextcloud' => [
  224. '@attributes' => [
  225. 'min-version' => '8.0.3'
  226. ],
  227. ],
  228. ],
  229. ],
  230. [
  231. [
  232. 'Server version 9 or higher is required.',
  233. ],
  234. [
  235. 'nextcloud' => [
  236. '@attributes' => [
  237. 'min-version' => '9'
  238. ],
  239. ],
  240. ],
  241. ],
  242. [
  243. [
  244. 'Server version 10 or higher is required.',
  245. ],
  246. [
  247. 'nextcloud' => [
  248. '@attributes' => [
  249. 'min-version' => '10'
  250. ],
  251. ],
  252. 'owncloud' => [
  253. '@attributes' => [
  254. 'min-version' => '9'
  255. ],
  256. ],
  257. ],
  258. ],
  259. [
  260. [
  261. 'Server version 10 or higher is required.',
  262. ],
  263. [
  264. 'nextcloud' => [
  265. '@attributes' => [
  266. 'min-version' => '9.1',
  267. ],
  268. ],
  269. ],
  270. ],
  271. [
  272. [
  273. 'Server version 9.2 or higher is required.',
  274. ],
  275. [
  276. 'nextcloud' => [
  277. '@attributes' => [
  278. 'min-version' => '9.2',
  279. ],
  280. ],
  281. ],
  282. ],
  283. [
  284. [
  285. 'Server version 11 or higher is required.',
  286. ],
  287. [
  288. 'nextcloud' => [
  289. '@attributes' => [
  290. 'min-version' => '11',
  291. ],
  292. ],
  293. ],
  294. ],
  295. [
  296. [
  297. 'Server version 8.0.1 or lower is required.',
  298. ],
  299. [
  300. 'nextcloud' => [
  301. '@attributes' => [
  302. 'max-version' => '8.0.1',
  303. ],
  304. ],
  305. ],
  306. ],
  307. [
  308. [],
  309. [
  310. 'owncloud' => [
  311. '@attributes' => [
  312. 'min-version' => '8',
  313. 'max-version' => '8',
  314. ],
  315. ],
  316. ],
  317. ],
  318. [
  319. [],
  320. [
  321. 'owncloud' => [
  322. '@attributes' => [
  323. 'min-version' => '8.0',
  324. 'max-version' => '8.0',
  325. ],
  326. ],
  327. ],
  328. ],
  329. [
  330. [],
  331. [
  332. 'owncloud' => [
  333. '@attributes' => [
  334. 'min-version' => '8.0.2',
  335. 'max-version' => '8.0.2'
  336. ],
  337. ],
  338. ],
  339. ],
  340. [
  341. [
  342. 'Server version 8.0.3 or higher is required.',
  343. ],
  344. [
  345. 'owncloud' => [
  346. '@attributes' => [
  347. 'min-version' => '8.0.3'
  348. ],
  349. ],
  350. ],
  351. ],
  352. [
  353. [
  354. 'Server version 9 or higher is required.',
  355. ],
  356. [
  357. 'owncloud' => [
  358. '@attributes' => [
  359. 'min-version' => '9'
  360. ],
  361. ],
  362. ],
  363. ],
  364. [
  365. [
  366. 'Server version 10 or higher is required.',
  367. ],
  368. [
  369. 'owncloud' => [
  370. '@attributes' => [
  371. 'min-version' => '9.1',
  372. ],
  373. ],
  374. ],
  375. ],
  376. [
  377. [
  378. 'Server version 9.2 or higher is required.',
  379. ],
  380. [
  381. 'owncloud' => [
  382. '@attributes' => [
  383. 'min-version' => '9.2',
  384. ],
  385. ],
  386. ],
  387. ],
  388. [
  389. [
  390. 'Server version 8.0.1 or lower is required.',
  391. ],
  392. [
  393. 'owncloud' => [
  394. '@attributes' => [
  395. 'max-version' => '8.0.1',
  396. ],
  397. ],
  398. ],
  399. ],
  400. ];
  401. }
  402. /**
  403. * @return array
  404. */
  405. function providesOS() {
  406. return array(
  407. array(array(), null),
  408. array(array(), array()),
  409. array(array('Following platforms are supported: ANDROID'), 'ANDROID'),
  410. array(array('Following platforms are supported: WINNT'), array('WINNT'))
  411. );
  412. }
  413. /**
  414. * @return array
  415. */
  416. function providesLibs() {
  417. return [
  418. // we expect curl to exist
  419. [[], 'curl'],
  420. // we expect abcde to exist
  421. [['The library abcde is not available.'], ['abcde']],
  422. // curl in version 100.0 does not exist
  423. [['Library curl with a version higher than 100.0 is required - available version 2.3.4.'],
  424. [['@attributes' => ['min-version' => '100.0'], '@value' => 'curl']]],
  425. // curl in version 100.0 does not exist
  426. [['Library curl with a version lower than 1.0.0 is required - available version 2.3.4.'],
  427. [['@attributes' => ['max-version' => '1.0.0'], '@value' => 'curl']]],
  428. [['Library curl with a version lower than 2.3.3 is required - available version 2.3.4.'],
  429. [['@attributes' => ['max-version' => '2.3.3'], '@value' => 'curl']]],
  430. [['Library curl with a version higher than 2.3.5 is required - available version 2.3.4.'],
  431. [['@attributes' => ['min-version' => '2.3.5'], '@value' => 'curl']]],
  432. [[],
  433. [['@attributes' => ['min-version' => '2.3.4', 'max-version' => '2.3.4'], '@value' => 'curl']]],
  434. [[],
  435. [['@attributes' => ['min-version' => '2.3', 'max-version' => '2.3'], '@value' => 'curl']]],
  436. [[],
  437. [['@attributes' => ['min-version' => '2', 'max-version' => '2'], '@value' => 'curl']]],
  438. [[],
  439. ['@attributes' => ['min-version' => '2', 'max-version' => '2'], '@value' => 'curl']],
  440. ];
  441. }
  442. /**
  443. * @return array
  444. */
  445. function providesCommands() {
  446. return [
  447. [[], null],
  448. // grep is known on linux
  449. [[], [['@attributes' => ['os' => 'Linux'], '@value' => 'grep']]],
  450. // grepp is not known on linux
  451. [['The command line tool grepp could not be found'], [['@attributes' => ['os' => 'Linux'], '@value' => 'grepp']]],
  452. // we don't care about tools on Windows - we are on Linux
  453. [[], [['@attributes' => ['os' => 'Windows'], '@value' => 'grepp']]],
  454. // grep is known on all systems
  455. [[], 'grep'],
  456. [[], ['@attributes' => ['os' => 'Linux'], '@value' => 'grep']],
  457. ];
  458. }
  459. /**
  460. * @return array
  461. */
  462. function providesDatabases() {
  463. return array(
  464. // non BC - in case on databases are defined -> all are supported
  465. array(array(), null),
  466. array(array(), array()),
  467. array(array('Following databases are supported: mongodb'), 'mongodb'),
  468. array(array('Following databases are supported: sqlite, postgres'), array('sqlite', array('@value' => 'postgres'))),
  469. );
  470. }
  471. /**
  472. * @return array
  473. */
  474. function providesPhpVersion() {
  475. return array(
  476. array(array(), null, null, null),
  477. array(array(), '5.4', null, null),
  478. array(array(), null, '5.5', null),
  479. array(array(), '5.4', '5.5', null),
  480. array(array('PHP 5.4.4 or higher is required.'), '5.4.4', null, null),
  481. array(array('PHP with a version lower than 5.4.2 is required.'), null, '5.4.2', null),
  482. array(array('64bit or higher PHP required.'), null, null, 64),
  483. array(array(), '5.4', '5.4', null),
  484. );
  485. }
  486. }