Chris@18
|
1 <?php
|
Chris@18
|
2
|
Chris@18
|
3 namespace DrupalFinder\Tests;
|
Chris@18
|
4
|
Chris@18
|
5 use DrupalFinder\DrupalFinder;
|
Chris@18
|
6 use Exception;
|
Chris@18
|
7 use PHPUnit_Framework_TestCase;
|
Chris@18
|
8
|
Chris@18
|
9 abstract class DrupalFinderTestBase extends PHPUnit_Framework_TestCase
|
Chris@18
|
10 {
|
Chris@18
|
11 /**
|
Chris@18
|
12 * @var \DrupalFinder\DrupalFinder
|
Chris@18
|
13 */
|
Chris@18
|
14 protected $finder;
|
Chris@18
|
15
|
Chris@18
|
16 protected function setUp()
|
Chris@18
|
17 {
|
Chris@18
|
18 parent::setUp();
|
Chris@18
|
19 $this->finder = new DrupalFinder();
|
Chris@18
|
20 }
|
Chris@18
|
21
|
Chris@18
|
22 protected function dumpToFileSystem($fileStructure, $root)
|
Chris@18
|
23 {
|
Chris@18
|
24 $fileStructure = $this->prepareFileStructure($fileStructure);
|
Chris@18
|
25 foreach ($fileStructure as $name => $content) {
|
Chris@18
|
26 if (is_array($content)) {
|
Chris@18
|
27 mkdir($root . '/' . $name);
|
Chris@18
|
28 $this->dumpToFileSystem($content, $root . '/' . $name);
|
Chris@18
|
29 } else {
|
Chris@18
|
30 file_put_contents($root . '/' . $name, $content);
|
Chris@18
|
31 }
|
Chris@18
|
32 }
|
Chris@18
|
33 }
|
Chris@18
|
34
|
Chris@18
|
35 protected function prepareFileStructure($fileStructure)
|
Chris@18
|
36 {
|
Chris@18
|
37 foreach ($fileStructure as $name => $content) {
|
Chris@18
|
38 if (($name === 'composer.json' || $name === 'composer.lock') && is_array($content)) {
|
Chris@18
|
39 $fileStructure[$name] = json_encode($content, JSON_UNESCAPED_SLASHES);
|
Chris@18
|
40 } elseif (is_array($content)) {
|
Chris@18
|
41 $fileStructure[$name] = $this->prepareFileStructure($content);
|
Chris@18
|
42 }
|
Chris@18
|
43 }
|
Chris@18
|
44 return $fileStructure;
|
Chris@18
|
45 }
|
Chris@18
|
46
|
Chris@18
|
47 protected function tempdir($dir, $prefix = '', $mode = 0700)
|
Chris@18
|
48 {
|
Chris@18
|
49 if (substr($dir, -1) != '/') {
|
Chris@18
|
50 $dir .= '/';
|
Chris@18
|
51 }
|
Chris@18
|
52 do {
|
Chris@18
|
53 $path = $dir . $prefix . mt_rand(0, 9999999);
|
Chris@18
|
54 } while (!mkdir($path, $mode));
|
Chris@18
|
55 register_shutdown_function(
|
Chris@18
|
56 [get_called_class(), 'tempdir_remove'],
|
Chris@18
|
57 $path
|
Chris@18
|
58 );
|
Chris@18
|
59
|
Chris@18
|
60 return realpath($path);
|
Chris@18
|
61 }
|
Chris@18
|
62
|
Chris@18
|
63 public static function tempdir_remove($path)
|
Chris@18
|
64 {
|
Chris@18
|
65 if (is_link($path)) {
|
Chris@18
|
66 if (defined('PHP_WINDOWS_VERSION_BUILD')) {
|
Chris@18
|
67 rmdir($path);
|
Chris@18
|
68 } else {
|
Chris@18
|
69 unlink($path);
|
Chris@18
|
70 }
|
Chris@18
|
71
|
Chris@18
|
72 return;
|
Chris@18
|
73 }
|
Chris@18
|
74
|
Chris@18
|
75 foreach (scandir($path) as $child) {
|
Chris@18
|
76 if (in_array($child, ['.', '..'])) {
|
Chris@18
|
77 continue;
|
Chris@18
|
78 }
|
Chris@18
|
79 $child = "$path/$child";
|
Chris@18
|
80 is_dir($child) ? static::tempdir_remove($child) : unlink($child);
|
Chris@18
|
81 }
|
Chris@18
|
82 rmdir($path);
|
Chris@18
|
83 }
|
Chris@18
|
84
|
Chris@18
|
85 /**
|
Chris@18
|
86 * @param $target
|
Chris@18
|
87 * @param $link
|
Chris@18
|
88 *
|
Chris@18
|
89 * @throws \PHPUnit_Framework_SkippedTestError
|
Chris@18
|
90 */
|
Chris@18
|
91 protected function symlink($target, $link)
|
Chris@18
|
92 {
|
Chris@18
|
93 try {
|
Chris@18
|
94 return symlink($target, $link);
|
Chris@18
|
95 } catch (Exception $e) {
|
Chris@18
|
96 if (defined('PHP_WINDOWS_VERSION_BUILD')
|
Chris@18
|
97 && strstr($e->getMessage(), WIN_ERROR_PRIVILEGE_NOT_HELD)
|
Chris@18
|
98 ) {
|
Chris@18
|
99 $this->markTestSkipped(<<<'MESSAGE'
|
Chris@18
|
100 No privilege to create symlinks. Run test as Administrator (elevated process).
|
Chris@18
|
101 MESSAGE
|
Chris@18
|
102 );
|
Chris@18
|
103 }
|
Chris@18
|
104 throw $e;
|
Chris@18
|
105 }
|
Chris@18
|
106 }
|
Chris@18
|
107 }
|
Chris@18
|
108
|
Chris@18
|
109 define('WIN_ERROR_PRIVILEGE_NOT_HELD', '1314');
|