# Test block-clone functionality on a temporary ReFS VHD. # # Requires: # - Administrator privileges # - Windows Server, or Windows 10/11 Pro for Workstations (ReFS support) # - Hyper-V PowerShell module (for New-VHD), or diskpart fallback # # Usage: # # From an elevated PowerShell prompt: # .\scripts\test_scripts\block-clone-test-windows.ps1 [-TestBinary ] # # If -TestBinary is not given, defaults to build\windows\x64\debug\zencore-test.exe # relative to the repository root. param( [string]$TestBinary = "" ) $ErrorActionPreference = "Stop" $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Definition $RepoRoot = (Resolve-Path "$ScriptDir\..\..").Path if (-not $TestBinary) { $TestBinary = Join-Path $RepoRoot "build\windows\x64\debug\zencore-test.exe" } $ImageSizeMB = 2048 $TestCases = "TryCloneFile,CopyFile.Clone,SupportsBlockRefCounting,CloneQueryInterface" $VhdPath = "" $MountLetter = "" function Cleanup { $ErrorActionPreference = "SilentlyContinue" if ($MountLetter) { Write-Host "Dismounting VHD ..." Dismount-VHD -Path $VhdPath -ErrorAction SilentlyContinue } if ($VhdPath -and (Test-Path $VhdPath)) { Remove-Item -Force $VhdPath -ErrorAction SilentlyContinue } } trap { Cleanup throw $_ } # --- Preflight checks --- $IsAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole( [Security.Principal.WindowsBuiltInRole]::Administrator) if (-not $IsAdmin) { Write-Error "This script must be run as Administrator (for VHD mount/format)." exit 1 } if (-not (Test-Path $TestBinary)) { Write-Error "Test binary not found: $TestBinary`nHint: build with 'xmake config -m debug && xmake build zencore-test'" exit 1 } # Check that ReFS formatting is available $RefsAvailable = $true try { # A quick check: on non-Server/Workstation SKUs, Format-Volume -FileSystem ReFS will fail $OsCaption = (Get-CimInstance Win32_OperatingSystem).Caption if ($OsCaption -notmatch "Server|Workstation|Enterprise") { Write-Warning "ReFS may not be available on this Windows edition: $OsCaption" Write-Warning "Continuing anyway — format step will fail if unsupported." } } catch { # Non-fatal, just proceed } # --- Create and mount ReFS VHD --- $VhdPath = Join-Path $env:TEMP "refs-clone-test-$([guid]::NewGuid().ToString('N').Substring(0,8)).vhdx" Write-Host "Creating ${ImageSizeMB}MB VHDX at $VhdPath ..." try { # Prefer Hyper-V cmdlet if available New-VHD -Path $VhdPath -SizeBytes ($ImageSizeMB * 1MB) -Fixed | Out-Null } catch { # Fallback to diskpart Write-Host "New-VHD not available, falling back to diskpart ..." $DiskpartScript = @" create vdisk file="$VhdPath" maximum=$ImageSizeMB type=fixed "@ $DiskpartScript | diskpart | Out-Null } Write-Host "Mounting and initializing VHD ..." Mount-VHD -Path $VhdPath $Disk = Get-VHD -Path $VhdPath | Get-Disk # Suppress Explorer's auto-open / "format disk?" prompts for the raw partition Stop-Service ShellHWDetection -ErrorAction SilentlyContinue try { Initialize-Disk -Number $Disk.Number -PartitionStyle GPT -ErrorAction SilentlyContinue $Partition = New-Partition -DiskNumber $Disk.Number -UseMaximumSize -AssignDriveLetter $MountLetter = $Partition.DriveLetter Write-Host "Formatting ${MountLetter}: as ReFS with integrity disabled ..." Format-Volume -DriveLetter $MountLetter -FileSystem ReFS -NewFileSystemLabel "CloneTest" -Confirm:$false | Out-Null # Disable integrity streams (required for block cloning to work on ReFS) Set-FileIntegrity "${MountLetter}:\" -Enable $false -ErrorAction SilentlyContinue } finally { Start-Service ShellHWDetection -ErrorAction SilentlyContinue } $MountRoot = "${MountLetter}:\" # --- Copy test binary and run --- Write-Host "Copying test binary to ReFS volume ..." Copy-Item $TestBinary "$MountRoot\zencore-test.exe" Write-Host "Running block-clone tests ..." Write-Host "---" $proc = Start-Process -FilePath "$MountRoot\zencore-test.exe" ` -ArgumentList "--test-suite=core.filesystem", "--test-case=$TestCases" ` -NoNewWindow -Wait -PassThru Write-Host "---" if ($proc.ExitCode -ne 0) { Write-Error "Tests failed with exit code $($proc.ExitCode)" Cleanup exit $proc.ExitCode } Write-Host "ReFS: all block-clone tests passed." # --- Cleanup --- Cleanup Write-Host "Done."