1
0
mirror of https://github.com/php/pie.git synced 2026-03-23 23:12:17 +01:00
Files
archived-pie/test/unit/Downloading/DownloadUrlMethodTest.php
Gustavo André dos Santos Lopes 02e42dcd7e Allow distribution of musl+glibc binaries
Search for binaries with the anylibc suffix as a fallback candidate.
This allows shipping binaries that work both on glibc and musl without
copying the same binary with two separate names.
2026-03-16 09:09:07 +00:00

291 lines
11 KiB
PHP

<?php
declare(strict_types=1);
namespace Php\PieUnitTest\Downloading;
use Composer\Package\CompletePackage;
use Composer\Package\CompletePackageInterface;
use Php\Pie\DependencyResolver\Package;
use Php\Pie\Downloading\DownloadedPackage;
use Php\Pie\Downloading\DownloadUrlMethod;
use Php\Pie\ExtensionName;
use Php\Pie\ExtensionType;
use Php\Pie\Platform\Architecture;
use Php\Pie\Platform\DebugBuild;
use Php\Pie\Platform\OperatingSystem;
use Php\Pie\Platform\OperatingSystemFamily;
use Php\Pie\Platform\TargetPhp\PhpBinaryPath;
use Php\Pie\Platform\TargetPlatform;
use Php\Pie\Platform\ThreadSafetyMode;
use Php\Pie\Platform\WindowsCompiler;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\TestCase;
use ValueError;
use function array_key_first;
#[CoversClass(DownloadUrlMethod::class)]
final class DownloadUrlMethodTest extends TestCase
{
public function testWindowsPackages(): void
{
$package = new Package(
$this->createMock(CompletePackageInterface::class),
ExtensionType::PhpModule,
ExtensionName::normaliseFromString('foo'),
'foo/foo',
'1.2.3',
null,
);
$phpBinaryPath = $this->createMock(PhpBinaryPath::class);
$phpBinaryPath
->method('majorMinorVersion')
->willReturn('8.1');
$targetPlatform = new TargetPlatform(
OperatingSystem::Windows,
OperatingSystemFamily::Windows,
$phpBinaryPath,
Architecture::x86_64,
ThreadSafetyMode::NonThreadSafe,
1,
WindowsCompiler::VC15,
null,
);
$downloadUrlMethods = DownloadUrlMethod::possibleDownloadUrlMethodsForPackage($package, $targetPlatform);
self::assertCount(1, $downloadUrlMethods);
$downloadUrlMethod = $downloadUrlMethods[array_key_first($downloadUrlMethods)];
self::assertSame(DownloadUrlMethod::WindowsBinaryDownload, $downloadUrlMethod);
self::assertSame(
[
'php_foo-1.2.3-8.1-nts-vc15-x86_64.zip',
'php_foo-1.2.3-8.1-vc15-nts-x86_64.zip',
],
$downloadUrlMethod->possibleAssetNames($package, $targetPlatform),
);
}
public function testPrePackagedSourceDownloads(): void
{
$composerPackage = $this->createMock(CompletePackageInterface::class);
$composerPackage->method('getPrettyName')->willReturn('foo/bar');
$composerPackage->method('getPrettyVersion')->willReturn('1.2.3');
$composerPackage->method('getType')->willReturn('php-ext');
$composerPackage->method('getPhpExt')->willReturn(['download-url-method' => 'pre-packaged-source']);
$package = Package::fromComposerCompletePackage($composerPackage);
$targetPlatform = new TargetPlatform(
OperatingSystem::NonWindows,
OperatingSystemFamily::Linux,
PhpBinaryPath::fromCurrentProcess(),
Architecture::x86_64,
ThreadSafetyMode::NonThreadSafe,
1,
null,
null,
);
$downloadUrlMethods = DownloadUrlMethod::possibleDownloadUrlMethodsForPackage($package, $targetPlatform);
self::assertCount(1, $downloadUrlMethods);
$downloadUrlMethod = $downloadUrlMethods[array_key_first($downloadUrlMethods)];
self::assertSame(DownloadUrlMethod::PrePackagedSourceDownload, $downloadUrlMethod);
self::assertSame(
[
'php_bar-1.2.3-src.tgz',
'php_bar-1.2.3-src.zip',
'bar-1.2.3.tgz',
],
$downloadUrlMethod->possibleAssetNames($package, $targetPlatform),
);
}
public function testPrePackagedBinaryDownloads(): void
{
$composerPackage = $this->createMock(CompletePackageInterface::class);
$composerPackage->method('getPrettyName')->willReturn('foo/bar');
$composerPackage->method('getPrettyVersion')->willReturn('1.2.3');
$composerPackage->method('getType')->willReturn('php-ext');
$composerPackage->method('getPhpExt')->willReturn(['download-url-method' => ['pre-packaged-binary']]);
$package = Package::fromComposerCompletePackage($composerPackage);
$phpBinaryPath = $this->createMock(PhpBinaryPath::class);
$phpBinaryPath
->method('majorMinorVersion')
->willReturn('8.3');
$phpBinaryPath
->method('debugMode')
->willReturn(DebugBuild::Debug);
$targetPlatform = new TargetPlatform(
OperatingSystem::NonWindows,
OperatingSystemFamily::Linux,
$phpBinaryPath,
Architecture::x86_64,
ThreadSafetyMode::ThreadSafe,
1,
null,
null,
);
$downloadUrlMethods = DownloadUrlMethod::possibleDownloadUrlMethodsForPackage($package, $targetPlatform);
self::assertCount(1, $downloadUrlMethods);
$downloadUrlMethod = $downloadUrlMethods[array_key_first($downloadUrlMethods)];
self::assertSame(DownloadUrlMethod::PrePackagedBinary, $downloadUrlMethod);
self::assertSame(
[
'php_bar-1.2.3_php8.3-x86_64-linux-glibc-debug-zts.zip',
'php_bar-1.2.3_php8.3-x86_64-linux-glibc-debug-zts.tgz',
'php_bar-1.2.3_php8.3-x86_64-linux-anylibc-debug-zts.zip',
'php_bar-1.2.3_php8.3-x86_64-linux-anylibc-debug-zts.tgz',
],
$downloadUrlMethod->possibleAssetNames($package, $targetPlatform),
);
}
public function testComposerDefaultDownload(): void
{
$package = new Package(
$this->createMock(CompletePackageInterface::class),
ExtensionType::PhpModule,
ExtensionName::normaliseFromString('foo'),
'foo/foo',
'1.2.3',
null,
);
$targetPlatform = new TargetPlatform(
OperatingSystem::NonWindows,
OperatingSystemFamily::Linux,
PhpBinaryPath::fromCurrentProcess(),
Architecture::x86_64,
ThreadSafetyMode::NonThreadSafe,
1,
null,
null,
);
$downloadUrlMethods = DownloadUrlMethod::possibleDownloadUrlMethodsForPackage($package, $targetPlatform);
self::assertCount(1, $downloadUrlMethods);
$downloadUrlMethod = $downloadUrlMethods[array_key_first($downloadUrlMethods)];
self::assertSame(DownloadUrlMethod::ComposerDefaultDownload, $downloadUrlMethod);
self::assertNull($downloadUrlMethod->possibleAssetNames($package, $targetPlatform));
}
public function testMultipleDownloadUrlMethods(): void
{
$composerPackage = $this->createMock(CompletePackageInterface::class);
$composerPackage->method('getPrettyName')->willReturn('foo/bar');
$composerPackage->method('getPrettyVersion')->willReturn('1.2.3');
$composerPackage->method('getType')->willReturn('php-ext');
$composerPackage->method('getPhpExt')->willReturn(['download-url-method' => ['pre-packaged-binary', 'pre-packaged-source', 'composer-default']]);
$package = Package::fromComposerCompletePackage($composerPackage);
$phpBinaryPath = $this->createMock(PhpBinaryPath::class);
$phpBinaryPath
->method('majorMinorVersion')
->willReturn('8.3');
$phpBinaryPath
->method('debugMode')
->willReturn(DebugBuild::Debug);
$targetPlatform = new TargetPlatform(
OperatingSystem::NonWindows,
OperatingSystemFamily::Linux,
$phpBinaryPath,
Architecture::x86_64,
ThreadSafetyMode::NonThreadSafe,
1,
null,
null,
);
$downloadUrlMethods = DownloadUrlMethod::possibleDownloadUrlMethodsForPackage($package, $targetPlatform);
self::assertCount(3, $downloadUrlMethods);
$firstMethod = $downloadUrlMethods[0];
self::assertSame(DownloadUrlMethod::PrePackagedBinary, $firstMethod);
self::assertSame(
[
'php_bar-1.2.3_php8.3-x86_64-linux-glibc-debug.zip',
'php_bar-1.2.3_php8.3-x86_64-linux-glibc-debug.tgz',
'php_bar-1.2.3_php8.3-x86_64-linux-glibc-debug-nts.zip',
'php_bar-1.2.3_php8.3-x86_64-linux-glibc-debug-nts.tgz',
'php_bar-1.2.3_php8.3-x86_64-linux-anylibc-debug.zip',
'php_bar-1.2.3_php8.3-x86_64-linux-anylibc-debug.tgz',
'php_bar-1.2.3_php8.3-x86_64-linux-anylibc-debug-nts.zip',
'php_bar-1.2.3_php8.3-x86_64-linux-anylibc-debug-nts.tgz',
],
$firstMethod->possibleAssetNames($package, $targetPlatform),
);
$secondMethod = $downloadUrlMethods[1];
self::assertSame(DownloadUrlMethod::PrePackagedSourceDownload, $secondMethod);
self::assertSame(
[
'php_bar-1.2.3-src.tgz',
'php_bar-1.2.3-src.zip',
'bar-1.2.3.tgz',
],
$secondMethod->possibleAssetNames($package, $targetPlatform),
);
$thirdMethod = $downloadUrlMethods[2];
self::assertSame(DownloadUrlMethod::ComposerDefaultDownload, $thirdMethod);
self::assertNull($thirdMethod->possibleAssetNames($package, $targetPlatform));
}
public function testFromComposerPackageWhenPackageKeyWasDefined(): void
{
$composerPackage = new CompletePackage('foo/bar', '1.2.3.0', '1.2.3');
DownloadUrlMethod::PrePackagedBinary->writeToComposerPackage($composerPackage);
self::assertSame(DownloadUrlMethod::PrePackagedBinary, DownloadUrlMethod::fromComposerPackage($composerPackage));
}
public function testFromComposerPackageWhenPackageKeyWasNotDefined(): void
{
$composerPackage = new CompletePackage('foo/bar', '1.2.3.0', '1.2.3');
$this->expectException(ValueError::class);
DownloadUrlMethod::fromComposerPackage($composerPackage);
}
public function testFromDownloadedPackage(): void
{
$composerPackage = new CompletePackage('foo/bar', '1.2.3.0', '1.2.3');
DownloadUrlMethod::PrePackagedSourceDownload->writeToComposerPackage($composerPackage);
$downloaded = DownloadedPackage::fromPackageAndExtractedPath(
new Package(
$composerPackage,
ExtensionType::PhpModule,
ExtensionName::normaliseFromString('foo'),
'foo/bar',
'1.2.3',
null,
),
'/path/to/extracted/source',
);
self::assertSame(DownloadUrlMethod::PrePackagedSourceDownload, DownloadUrlMethod::fromDownloadedPackage($downloaded));
}
}