Files
buildkit/client/client_test.go
CrazyMax 409c8da50f exporter: revert attestation manifest push order
This reverts the change from #7012.

Referrer manifests may be pushed before their subject, and the OCI distribution spec requires registries to initially accept a manifest whose subject does not exist yet. Keep BuildKit's default push order aligned with that behavior instead of working around registries that reject this flow.

Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2026-08-04 00:03:02 +02:00

379 lines
10 KiB
Go

package client
import (
"testing"
"github.com/moby/buildkit/util/testutil/integration"
"github.com/moby/buildkit/util/testutil/workers"
)
func init() {
if workers.IsTestDockerd() {
workers.InitDockerdWorker()
} else {
workers.InitOCIWorker()
workers.InitContainerdWorker()
}
}
var allTests = []func(t *testing.T, sb integration.Sandbox){
// client_cache_test.go
testBasicAzblobCacheImportExport,
testBasicInlineCacheImportExport,
testBasicLocalCacheImportExport,
testBasicRegistryCacheImportExport,
testBasicS3CacheImportExport,
testCacheExportCacheDeletedContent,
testCacheExportCacheKeyLoop,
testCacheExportIgnoreError,
testImageManifestRegistryCacheImportExport,
testLocalCacheExportReset,
testMultipleCacheExports,
testMultipleRecordsWithSameLayersCacheImportExport,
testMultipleRegistryCacheImportExport,
testRegistryEmptyCacheExport,
testSnapshotWithMultipleBlobs,
testUncompressedLocalCacheImportExport,
testUncompressedRegistryCacheImportExport,
testZstdLocalCacheExport,
testZstdLocalCacheImportExport,
testZstdRegistryCacheImportExport,
testStargzLazyInlineCacheImportExport,
testStargzLazyRegistryCacheImportExport,
// client_control_test.go
testCallInfo,
testClientCustomGRPCOpts,
testListenBuildHistoryExcludesSoftDeletedRecords,
// client_diskusage_test.go
testCallDiskUsage,
// client_exec_test.go
testCgroupParent,
testLinuxResources,
testPassthroughOp,
testRelativeMountpoint,
testRelativeWorkDir,
testRunValidExitCodes,
testShmSize,
testStdinClosed,
testUlimit,
testUser,
// client_export_image_test.go
testBuildExportScratch,
testBuildExportWithForeignLayer,
testBuildExportWithUncompressed,
testBuildExportZstd,
testBuildPushAndValidate,
testExportBusyboxLocal,
testExportedImageLabels,
testImageResolveConfigDefaultLocalFallback,
testInvalidExporter,
testLazyImagePush,
testOCIExporter,
testOCIExporterContentStore,
testPullWithDigestCheck,
testPullZstdImage,
testPushByDigest,
testPushProgressSameVertex,
testStargzLazyPull,
// client_export_local_test.go
testExportLocalForcePlatformSplit,
testExportLocalModeCopyKeepsStaleDestinationFiles,
testExportLocalModeCopyMultiPlatformKeepsAllPlatforms,
testExportLocalModeDeleteRemovesStaleDestinationFiles,
testExportLocalModeDeleteMultiPlatformKeepsAllPlatforms,
testExportLocalNoPlatformSplit,
testExportLocalNoPlatformSplitOverwrite,
testExporterTargetExists,
testMultipleExporters,
testSessionExporter,
testSessionExporterFinalizeExport,
testTarExporterSymlink,
testTarExporterWithSocket,
testTarExporterWithSocketCopy,
// client_export_metadata_test.go
testAttestationBundle,
testAttestationDefaultSubject,
testExportAnnotations,
testExportAnnotationsMediaTypes,
testExportAttestationsDefaultOCIArtifact,
testExportAttestationsImageManifest,
testExportAttestationsOCIArtifact,
testImageResolveAttestationChainLocal,
testImageResolveAttestationChainRequiresNetwork,
testImageResolveProvenanceAttestation,
testSBOMScan,
testSBOMScanSingleRef,
testSBOMSupplements,
testSourceDateEpochClamp,
testSourceDateEpochImageExporter,
testSourceDateEpochLayerTimestamps,
testSourceDateEpochLocalExporter,
testSourceDateEpochReset,
testSourceDateEpochTarExporter,
// client_fileop_test.go
testCopyFromEmptyImage,
testDuplicateWhiteouts,
testFileOpCopyAlwaysReplaceExistingDestPaths,
testFileOpCopyChmodText,
testFileOpCopyIncludeExclude,
testFileOpCopyRm,
testFileOpCopyUIDCache,
testFileOpInputSwap,
testFileOpMkdirMkfile,
testFileOpRmWildcard,
testFileOpSymlink,
testMoveParentDir,
testRmSymlink,
testWhiteoutParentDir,
// client_frontend_test.go
testFrontendImageNaming,
testFrontendLintSkipVerifyPlatforms,
testFrontendMetadataReturn,
testFrontendUseSolveResults,
testFrontendVerifyPlatforms,
// client_git_source_test.go
testGitBundleRoundTrip,
testGitBundleRoundTripRegistry,
testGitResolveMutatedSource,
testGitResolveSourceMetadata,
// client_http_source_test.go
testBuildHTTPSource,
testBuildHTTPSourceAuthHeaderSecret,
testBuildHTTPSourceEtagScope,
testBuildHTTPSourceHeader,
testBuildHTTPSourceHostTokenSecret,
testBuildHTTPSourcePGPSignatureVerify,
testBuildHTTPSourceUnauthorizedChecksumRace,
testHTTPPruneAfterCacheKey,
testHTTPPruneAfterResolveMeta,
testHTTPResolveMetaReuse,
testHTTPResolveMultiBuild,
testHTTPResolveSourceMetadata,
// client_image_source_test.go
testClientGatewayCanceledCredentialsCallbackReturns,
testPullWithLayerLimit,
testValidateDigestOrigin,
// client_local_source_test.go
testLocalSourceDiffer,
testLocalSourceWithHardlinksFilter,
testLocalSymlinkEscape,
testMetadataOnlyLocal,
testParallelLocalBuilds,
// client_mergeop_test.go
testMergeOp,
testMergeOpCacheInline,
testMergeOpCacheMax,
testMergeOpCacheMin,
// client_mount_test.go
testBuildMultiMount,
testCachedMounts,
testCacheMountNoCache,
testDuplicateCacheMount,
testLayerLimitOnMounts,
testLLBMountPerformance,
testLockedCacheMounts,
testMountStubsDirectory,
testMountStubsTimestamp,
testMountWithNoSource,
testRawSocketMount,
testReadonlyRootFS,
testRunCacheWithMounts,
testSecretEnv,
testSecretMounts,
testSharedCacheMounts,
testSharedCacheMountsNoScratch,
testSSHMount,
testTmpfsMounts,
// client_network_test.go
testBridgeNetworking,
testExtraHosts,
testHostnameLookup,
testHostnameSpecifying,
testNetworkMode,
testProxyEnv,
testResolveAndHosts,
// client_oci_source_test.go
testImageBlobSource,
testNoTarOCIIndexMediaType,
testOCIIndexMediatype,
testOCILayoutBlobSource,
testOCILayoutPlatformSource,
testOCILayoutSource,
// client_session_test.go
testSessionHealthMonitorFailsBlockedSecretResponse,
// client_source_map_test.go
testSourceMap,
testSourceMapFromRef,
// client_warnings_test.go
testWarnings,
// policy_test.go
testSourcePolicySession,
testSourcePolicySessionDenyMessages,
testSourceMetaPolicySession,
testSourceMetaPolicySessionResolveAttestations,
testSourcePolicyParallelSession,
testSourcePolicySignedCommit,
testSourcePolicySessionConvert,
testSourcePolicySessionHTTPChecksumAssist,
testSourcePolicy,
}
func TestIntegration(t *testing.T) {
testIntegration(t, append(allTests, validationTests...)...)
}
func TestClientGatewayIntegration(t *testing.T) {
integration.Run(t, integration.TestFuncs(
// gateway_container_exec_test.go
testClientGatewayContainerCancelExecTty,
testClientGatewayContainerCancelOnRelease,
testClientGatewayContainerCancelPID1Tty,
testClientGatewayContainerExecPipe,
testClientGatewayContainerExecPipeRelease,
testClientGatewayContainerExecPipeSignalKill,
testClientGatewayContainerExecTty,
testClientGatewayContainerPID1Exit,
testClientGatewayContainerPID1Fail,
testClientGatewayContainerPID1Tty,
testClientGatewayContainerSignal,
testClientGatewayExecError,
testClientGatewayExecFileActionError,
testClientGatewaySlowCacheExecError,
// gateway_container_mount_test.go
testClientGatewayContainerMounts,
testClientGatewayContainerPlatformPATH,
testClientGatewayContainerSecretEnv,
// gateway_container_network_test.go
testClientGatewayContainerExtraHosts,
// gateway_container_security_test.go
testClientGatewayContainerInvalidSecurityMode,
// gateway_solve_test.go
testClientGatewayEmptyImageExec,
testClientGatewayEmptySolve,
testClientGatewayFailedSolve,
testClientGatewayNilResult,
testClientGatewaySolve,
testClientSlowCacheRootfsRef,
testNoBuildID,
testUnknownBuildID,
), integration.WithMirroredImages(integration.OfficialImages("busybox:latest")))
integration.Run(t, integration.TestFuncs(
// gateway_container_security_test.go
testClientGatewayContainerSecurityModeCaps,
testClientGatewayContainerSecurityModeValidation,
), integration.WithMirroredImages(integration.OfficialImages("busybox:latest")),
integration.WithMatrix("secmode", map[string]any{
"sandbox": securitySandbox,
"insecure": securityInsecure,
}),
)
integration.Run(t, integration.TestFuncs(
// gateway_container_network_test.go
testClientGatewayContainerHostNetworkingAccess,
testClientGatewayContainerHostNetworkingValidation,
),
integration.WithMirroredImages(integration.OfficialImages("busybox:latest")),
integration.WithMatrix("netmode", map[string]any{
"default": defaultNetwork,
"host": hostNetwork,
}),
)
}
func testIntegration(t *testing.T, funcs ...func(t *testing.T, sb integration.Sandbox)) {
mirroredImagesUnix := integration.OfficialImages("busybox:latest", "alpine:latest")
mirroredImagesUnix["tonistiigi/test:nolayers"] = "docker.io/tonistiigi/test:nolayers"
mirroredImagesUnix["cpuguy83/buildkit-foreign:latest"] = "docker.io/cpuguy83/buildkit-foreign:latest"
mirroredImagesWin := integration.OfficialImages("nanoserver:latest", "nanoserver:plus")
mirroredImages := integration.UnixOrWindows(mirroredImagesUnix, mirroredImagesWin)
mirrors := integration.WithMirroredImages(mirroredImages)
tests := integration.TestFuncs(funcs...)
tests = append(tests, diffOpTestCases()...)
integration.Run(t, tests, mirrors)
// the rest of the tests are meant for non-Windows, skipping on Windows.
integration.SkipOnPlatform(t, "windows")
integration.Run(t, integration.TestFuncs(
// client_exec_test.go
testSecurityMode,
testSecurityModeSysfs,
testSecurityModeErrors,
),
mirrors,
integration.WithMatrix("secmode", map[string]any{
"sandbox": securitySandbox,
"insecure": securityInsecure,
}),
)
integration.Run(t, integration.TestFuncs(
// client_network_test.go
testHostNetworking,
),
mirrors,
integration.WithMatrix("netmode", map[string]any{
"default": defaultNetwork,
"host": hostNetwork,
}),
)
integration.Run(t, integration.TestFuncs(
// policy_test.go
testProxyNetworkNoRootless,
testProxyNetworkModesNoRootless,
testProxyNetworkDefaultEgressNoRootless,
),
mirrors,
integration.WithMatrix("netmode", map[string]any{
"default": proxyDefaultNetwork,
"host": proxyHostNetwork,
"bridge": proxyBridgeNetwork,
"default-no-cni": proxyDefaultNetworkNoCNI,
}),
)
integration.Run(
t,
integration.TestFuncs(
// client_network_test.go
testBridgeNetworkingDNSNoRootless,
),
mirrors,
integration.WithMatrix("netmode", map[string]any{
"dns": bridgeDNSNetwork,
}),
)
// client_cdi_test.go
integration.Run(t, integration.TestFuncs(cdiTests...), mirrors)
}