FIX DeploymentPackageTest git fixture újrahasznosítás és temp takarítás
A temp git repó eddig tesztenként épült újra 12 git processzel, ami Windowson önmagában ~4 mp volt tesztenként. Mostantól futásonként EGYSZER épül fel, a tesztek pedig másolatot kapnak róla (0,138 mp másolás + 0,177 mp takarítás). Minden teszt saját, írható példányon dolgozik, így a "working tree elrontása" és a builder-tesztek továbbra is írhatnak a repóba. Mérés a teljes fájlon, azonos gépen, 28/28 zölddel: 384,05 mp -> 268,38 mp. A régi deploymentCleanup a Windows read-only .git/objects fájljain elbukott és a hibát csendben elnyelte, ezért árva mappákat hagyott a temp-ben (164 gyűlt össze). Az új, facade nélküli deploymentDeleteDirectory nem hagy maga után semmit, és az afterAll a booteolt alkalmazáson kívül is tud takarítani. A minta útvonalában getmypid() van, hogy a tervezett --parallel futásnál is processzenként külön mintát használjunk. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
2965f231ce
commit
11918b608d
@ -68,13 +68,34 @@ function deploymentGit(string $path, array $arguments): string
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determinisztikus teszt-repó: átnevezés, törlés, ékezetes fájlnév és migráció is van benne.
|
* A minta-repó útvonala. A PID azért van benne, hogy párhuzamos futásnál (paratest)
|
||||||
|
* minden processznek saját mintája legyen.
|
||||||
|
*/
|
||||||
|
function deploymentTemplatePath(): string
|
||||||
|
{
|
||||||
|
return sys_get_temp_dir().DIRECTORY_SEPARATOR.'deployment-package-minta-'.getmypid();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determinisztikus minta-repó: átnevezés, törlés, ékezetes fájlnév és migráció is van benne.
|
||||||
|
*
|
||||||
|
* A 12 git parancs futásonként EGYSZER fut le - Windowson a processzindítás olyan drága,
|
||||||
|
* hogy tesztenként újraépítve ez önmagában ~4 mp lenne. A tesztek másolatot kapnak.
|
||||||
*
|
*
|
||||||
* @return array{path:string, commits:array<int, string>}
|
* @return array{path:string, commits:array<int, string>}
|
||||||
*/
|
*/
|
||||||
function deploymentTestRepository(): array
|
function deploymentRepositoryTemplate(): array
|
||||||
{
|
{
|
||||||
$path = sys_get_temp_dir().DIRECTORY_SEPARATOR.'deployment-package-test-'.uniqid();
|
static $template = null;
|
||||||
|
|
||||||
|
if ($template !== null) {
|
||||||
|
return $template;
|
||||||
|
}
|
||||||
|
|
||||||
|
$path = deploymentTemplatePath();
|
||||||
|
|
||||||
|
// Egy korábbi, megszakadt futás azonos PID-ű maradványa nem szennyezheti a mintát.
|
||||||
|
deploymentDeleteDirectory($path);
|
||||||
|
|
||||||
File::makeDirectory($path.'/app', 0777, true);
|
File::makeDirectory($path.'/app', 0777, true);
|
||||||
File::makeDirectory($path.'/database/migrations', 0777, true);
|
File::makeDirectory($path.'/database/migrations', 0777, true);
|
||||||
@ -106,25 +127,65 @@ function deploymentTestRepository(): array
|
|||||||
|
|
||||||
$log = trim(deploymentGit($path, ['log', '--reverse', '--pretty=format:%H']));
|
$log = trim(deploymentGit($path, ['log', '--reverse', '--pretty=format:%H']));
|
||||||
|
|
||||||
|
// A mintából minden teszt másol, tehát tilos beleírni - a sample hookokat viszont
|
||||||
|
// felesleges körbemásolni, azokra a git nem támaszkodik.
|
||||||
|
deploymentDeleteDirectory($path.'/.git/hooks');
|
||||||
|
|
||||||
|
return $template = ['path' => $path, 'commits' => explode("\n", $log)];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A teszt saját, írható másolata a mintáról: a builder és a "working tree elrontása"
|
||||||
|
* tesztek beleírnak a repóba, ezért nem oszthatnak közös példányt.
|
||||||
|
*
|
||||||
|
* @return array{path:string, commits:array<int, string>}
|
||||||
|
*/
|
||||||
|
function deploymentTestRepository(): array
|
||||||
|
{
|
||||||
|
$template = deploymentRepositoryTemplate();
|
||||||
|
|
||||||
|
$path = sys_get_temp_dir().DIRECTORY_SEPARATOR.'deployment-package-test-'.uniqid();
|
||||||
|
|
||||||
|
File::copyDirectory($template['path'], $path);
|
||||||
|
|
||||||
Config::set('deployment.repo_path', $path);
|
Config::set('deployment.repo_path', $path);
|
||||||
Config::set('deployment.output_path', $path.DIRECTORY_SEPARATOR.'_kimenet');
|
Config::set('deployment.output_path', $path.DIRECTORY_SEPARATOR.'_kimenet');
|
||||||
|
|
||||||
return ['path' => $path, 'commits' => explode("\n", $log)];
|
return ['path' => $path, 'commits' => $template['commits']];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Facade nélküli törlés: az afterAll a booteolt alkalmazáson kívül is fut.
|
||||||
|
*/
|
||||||
|
function deploymentDeleteDirectory(string $path): void
|
||||||
|
{
|
||||||
|
if (! is_dir($path)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$items = new RecursiveIteratorIterator(
|
||||||
|
new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS),
|
||||||
|
RecursiveIteratorIterator::CHILD_FIRST
|
||||||
|
);
|
||||||
|
|
||||||
|
foreach ($items as $item) {
|
||||||
|
// A .git/objects tartalma Windowson csak olvasható, ezért törlés előtt fel kell oldani.
|
||||||
|
@chmod($item->getPathname(), 0777);
|
||||||
|
|
||||||
|
$item->isDir() ? @rmdir($item->getPathname()) : @unlink($item->getPathname());
|
||||||
|
}
|
||||||
|
|
||||||
|
@rmdir($path);
|
||||||
}
|
}
|
||||||
|
|
||||||
function deploymentCleanup(string $path): void
|
function deploymentCleanup(string $path): void
|
||||||
{
|
{
|
||||||
// A .git/objects tartalma Windowson csak olvasható, ezért törlés előtt fel kell oldani.
|
deploymentDeleteDirectory($path);
|
||||||
foreach (File::allFiles($path, true) as $file) {
|
|
||||||
@chmod($file->getPathname(), 0777);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
afterAll(function () {
|
||||||
File::deleteDirectory($path);
|
deploymentDeleteDirectory(deploymentTemplatePath());
|
||||||
} catch (Throwable) {
|
});
|
||||||
// A takarítás nem futtathat el tesztet - a temp mappa maradványa nem befolyásol semmit.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
test('a kikapcsolt env kapcsoló mindenkitől elveszi a hozzáférést', function () {
|
test('a kikapcsolt env kapcsoló mindenkitől elveszi a hozzáférést', function () {
|
||||||
deploymentAllowEnvironment();
|
deploymentAllowEnvironment();
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user