From 1e4048f8aaeb6efe893de900a854c8f50381fc9b Mon Sep 17 00:00:00 2001 From: Dmitry Misharov Date: Thu, 24 Sep 2026 14:24:58 +0200 Subject: [PATCH 1/8] CI: build and test x86 installers Co-Authored-By: Claude Opus 5.5 (1M context) --- .github/workflows/test-installer.yml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-installer.yml b/.github/workflows/test-installer.yml index e0b82f3..37fb753 100644 --- a/.github/workflows/test-installer.yml +++ b/.github/workflows/test-installer.yml @@ -30,6 +30,8 @@ jobs: matrix: include: - { arch: x64, runner: windows-2025, target: VC-WIN64A, vcvars: vcvars64.bat } + # x64-hosted cross compiler first, x86-hosted toolset as fallback. + - { arch: x86, runner: windows-2025, target: VC-WIN32, vcvars: "vcvarsamd64_x86.bat vcvars32.bat" } # Native arm64-hosted toolset first, x86-hosted cross compiler as fallback. - { arch: arm64, runner: windows-11-arm, target: VC-WIN64-ARM, vcvars: "vcvarsarm64.bat vcvarsx86_arm64.bat" } steps: @@ -80,7 +82,7 @@ jobs: - name: install nasm # x86-only assembler; the ARM64 target assembles with MSVC's armasm64. - if: steps.fips_cache.outputs.cache-hit != 'true' && matrix.arch == 'x64' + if: steps.fips_cache.outputs.cache-hit != 'true' && matrix.arch != 'arm64' shell: pwsh run: | $installer = "nasm-3.01-installer-x64.exe" @@ -132,6 +134,8 @@ jobs: crt: - { arch: x64, runner: windows-2025, vcvars: vcvars64.bat, flavor: vs, target: VC-WIN64A, exe_build: ExeBuild, msi_build: MsiBuild, keep: OpenSSL-x64-VS-* } - { arch: x64, runner: windows-2025, vcvars: vcvars64.bat, flavor: hybrid, target: VC-WIN64A-HYBRIDCRT, exe_build: ExeBuild_hybrid, msi_build: MsiBuild_hybrid, keep: OpenSSL-x64-hybridCRT-* } + - { arch: x86, runner: windows-2025, vcvars: "vcvarsamd64_x86.bat vcvars32.bat", flavor: vs, target: VC-WIN32, exe_build: ExeBuild_x86, msi_build: MsiBuild_x86, keep: OpenSSL-x86-VS-* } + - { arch: x86, runner: windows-2025, vcvars: "vcvarsamd64_x86.bat vcvars32.bat", flavor: hybrid, target: VC-WIN32-HYBRIDCRT, exe_build: ExeBuild_x86_hybrid, msi_build: MsiBuild_x86_hybrid, keep: OpenSSL-x86-hybridCRT-* } # Hybrid flavor only: every arm64 Windows release ships the Universal CRT. - { arch: arm64, runner: windows-11-arm, vcvars: "vcvarsarm64.bat vcvarsx86_arm64.bat", flavor: hybrid, target: VC-WIN64-ARM-HYBRIDCRT, exe_build: ExeBuild_arm64_hybrid, msi_build: MsiBuild_arm64_hybrid, keep: OpenSSL-arm64-hybridCRT-* } steps: @@ -199,7 +203,7 @@ jobs: - name: install nasm # x86-only assembler; the ARM64 target assembles with MSVC's armasm64. - if: steps.openssl_cache.outputs.cache-hit != 'true' && matrix.crt.arch == 'x64' + if: steps.openssl_cache.outputs.cache-hit != 'true' && matrix.crt.arch != 'arm64' shell: pwsh run: | $installer = "nasm-3.01-installer-x64.exe" @@ -276,6 +280,10 @@ jobs: - OpenSSL-x64-VS-*.msi - OpenSSL-x64-hybridCRT-*.exe - OpenSSL-x64-hybridCRT-*.msi + - OpenSSL-x86-VS-*.exe + - OpenSSL-x86-VS-*.msi + - OpenSSL-x86-hybridCRT-*.exe + - OpenSSL-x86-hybridCRT-*.msi include: # ARM64 packages only install on ARM64 Windows. - { os: windows-11-arm, openssl-ref: openssl-4.1, installer: OpenSSL-arm64-hybridCRT-*.exe } From db0a6a9d7221063f3a5a60c0a456c4c1d9b0a188 Mon Sep 17 00:00:00 2001 From: Dmitry Misharov Date: Thu, 24 Sep 2026 14:29:22 +0200 Subject: [PATCH 2/8] Extract x86 vcruntime140.dll for silent FIPS installs Co-Authored-By: Claude Opus 5.5 (1M context) --- windows-installer/openssl.aip | 1 + .../resources/x86/vcruntime140.dll | Bin 0 -> 123328 bytes 2 files changed, 1 insertion(+) create mode 100644 windows-installer/resources/x86/vcruntime140.dll diff --git a/windows-installer/openssl.aip b/windows-installer/openssl.aip index 9510237..ba856cc 100644 --- a/windows-installer/openssl.aip +++ b/windows-installer/openssl.aip @@ -845,6 +845,7 @@ + diff --git a/windows-installer/resources/x86/vcruntime140.dll b/windows-installer/resources/x86/vcruntime140.dll new file mode 100644 index 0000000000000000000000000000000000000000..a14bfc0a9954e10d1a30f7fe30bbd354a87d73ac GIT binary patch literal 123328 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

t<^b);@lG4eB)0-*uy;^)gy$zoV!`H%-10&z~ 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 mw)eZ+#q$^5)#{wLLwZt0g}7V%i Date: Thu, 24 Sep 2026 15:40:10 +0200 Subject: [PATCH 3/8] Build x86 installers as 32-bit packages Co-Authored-By: Claude Opus 5.5 (1M context) --- windows-installer/openssl.aip | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/windows-installer/openssl.aip b/windows-installer/openssl.aip index ba856cc..a37344a 100644 --- a/windows-installer/openssl.aip +++ b/windows-installer/openssl.aip @@ -245,10 +245,10 @@ - - - - + + + + From 79ddabb5c6b1d37ceb76f64d7cb2881f1c5b15f1 Mon Sep 17 00:00:00 2001 From: Dmitry Misharov Date: Fri, 25 Sep 2026 00:06:44 +0200 Subject: [PATCH 4/8] Give the x86 builds their own 32-bit components Co-Authored-By: Claude Opus 5.5 (1M context) --- windows-installer/openssl.aip | 268 ++++++++++++++++++++-------------- 1 file changed, 158 insertions(+), 110 deletions(-) diff --git a/windows-installer/openssl.aip b/windows-installer/openssl.aip index a37344a..0de6c8b 100644 --- a/windows-installer/openssl.aip +++ b/windows-installer/openssl.aip @@ -75,104 +75,89 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - + + - - - - - + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - + - - - + + @@ -207,12 +192,22 @@ - + - - + + + + + + + + + + + + @@ -242,12 +237,12 @@ - - - + + + @@ -540,6 +535,7 @@ + @@ -641,6 +637,8 @@ + + @@ -654,46 +652,69 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -777,30 +798,48 @@ + + + + + + + + + + + + + + + - + + + + @@ -820,7 +859,6 @@ - @@ -832,7 +870,7 @@ - + @@ -856,9 +894,19 @@ + + + + + + + + + + From 6e235345a02eade194cfb3de85bec26aee50cb8d Mon Sep 17 00:00:00 2001 From: Dmitry Misharov Date: Fri, 25 Sep 2026 00:06:44 +0200 Subject: [PATCH 5/8] Restore newer-version detection, x86 redist search and SDK feature states Co-Authored-By: Claude Opus 5.5 (1M context) --- windows-installer/openssl.aip | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/windows-installer/openssl.aip b/windows-installer/openssl.aip index 0de6c8b..64ffe9f 100644 --- a/windows-installer/openssl.aip +++ b/windows-installer/openssl.aip @@ -336,6 +336,8 @@ + + @@ -859,6 +861,7 @@ + @@ -870,7 +873,7 @@ - + From 016e59167b7afdcd1a5f4b08df056e78fafc8c05 Mon Sep 17 00:00:00 2001 From: Dmitry Misharov Date: Fri, 25 Sep 2026 00:16:47 +0200 Subject: [PATCH 6/8] Tests: check MSI platform, bitness, upgrades and SDK dialog Co-Authored-By: Claude Opus 5.5 (1M context) --- tests/conftest.py | 54 +++++++++++++++++++--- tests/msi_package.ps1 | 85 ++++++++++++++++++++++++++++++++++ tests/test_package.py | 105 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 238 insertions(+), 6 deletions(-) create mode 100644 tests/msi_package.ps1 create mode 100644 tests/test_package.py diff --git a/tests/conftest.py b/tests/conftest.py index 3f9b510..b3702a1 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -616,12 +616,8 @@ def check_openssl_crypto(install_dir: Path): # AES-256-CBC encrypt → decrypt must round-trip. pass_args = ["-aes-256-cbc", "-pbkdf2", "-pass", "pass:installer-test"] - ciphertext = subprocess.run( - [str(exe), "enc", "-e", *pass_args], input=data, check=True, capture_output=True - ).stdout - roundtrip = subprocess.run( - [str(exe), "enc", "-d", *pass_args], input=ciphertext, check=True, capture_output=True - ).stdout + ciphertext = subprocess.run([str(exe), "enc", "-e", *pass_args], input=data, check=True, capture_output=True).stdout + roundtrip = subprocess.run([str(exe), "enc", "-d", *pass_args], input=ciphertext, check=True, capture_output=True).stdout assert roundtrip == data, "AES-256-CBC encrypt/decrypt did not round-trip to the original plaintext" @@ -821,3 +817,49 @@ def validated_option_disabled(facts: dict[str, str | None]) -> bool: """ quoted = f'"{facts["build_name"]}"' return quoted in (facts["hide_condition"] or "") + + +# --- MSI package structure (platform, bitness, upgrades, SDK dialog) -------- +# +# Facts a silent install can't observe, read straight from the package's MSI +# database by msi_package.ps1 (see test_package.py). An .exe bootstrapper's +# inner MSI is pulled out with the bootstrapper's own `/extract ` +# switch, so these tests never install anything. + +_MSI_PACKAGE_SCRIPT = Path(__file__).parent / "msi_package.ps1" + + +@pytest.fixture(scope="session") +def package_msi(installer: InstallerInfo, tmp_path_factory) -> Path: + """The installer's MSI database: the .msi itself, or the MSI extracted from + the .exe bootstrapper.""" + if installer.path.suffix.lower() == ".msi": + return installer.path + folder = tmp_path_factory.mktemp("extracted-msi") + subprocess.run([str(installer.path), "/extract", str(folder)], check=True, capture_output=True, text=True) + msis = sorted(folder.glob("*.msi")) + if len(msis) != 1: + pytest.fail(f"expected one MSI from '{installer.path.name} /extract', found {[m.name for m in msis]}") + return msis[0] + + +@pytest.fixture(scope="session") +def package_facts(package_msi: Path) -> dict: + """Template, component bitness, Upgrade rows, features with conditions and + the SDK dialog's feature list, as reported by msi_package.ps1.""" + res = subprocess.run( + [ + "powershell", + "-NoProfile", + "-ExecutionPolicy", + "Bypass", + "-File", + str(_MSI_PACKAGE_SCRIPT), + "-MsiPath", + str(package_msi), + ], + check=True, + capture_output=True, + text=True, + ) + return json.loads(res.stdout) diff --git a/tests/msi_package.ps1 b/tests/msi_package.ps1 new file mode 100644 index 0000000..b6b3c63 --- /dev/null +++ b/tests/msi_package.ps1 @@ -0,0 +1,85 @@ +# Dump the package-structure facts of an MSI database as JSON. +# Consumed by tests/test_package.py through conftest.msi_package_facts(). +# +# Reports what a silent install cannot observe: the platform the package +# declares, the bitness of every component, the upgrade detection rows and the +# feature list the SDK dialog hands to UpdateFeaturesInstallStates. +# +# Driven through reflection (InvokeMember), like msi_query.ps1: that is the +# reliable way to reach MSI's parameterized properties from PowerShell. +[CmdletBinding()] +param( + [Parameter(Mandatory = $true)][string]$MsiPath +) +$ErrorActionPreference = "Stop" + +$installer = New-Object -ComObject WindowsInstaller.Installer + +function Invoke-Get($obj, [string]$name, [object[]]$argv) { + return $obj.GetType().InvokeMember($name, "GetProperty", $null, $obj, $argv) +} +function Invoke-Call($obj, [string]$name, [object[]]$argv) { + return $obj.GetType().InvokeMember($name, "InvokeMethod", $null, $obj, $argv) +} + +# OpenDatabase(path, 0): 0 = msiOpenDatabaseModeReadOnly +$database = Invoke-Call $installer "OpenDatabase" @($MsiPath, 0) + +function Get-Rows { + # Rows of a query as arrays of strings. [int] casts matter: COM rejects the + # PSObject-wrapped integers PowerShell would otherwise pass. + param($db, [string]$sql) + $view = Invoke-Call $db "OpenView" @($sql) + [void](Invoke-Call $view "Execute" $null) + $rows = New-Object System.Collections.ArrayList + while ($true) { + $record = Invoke-Call $view "Fetch" $null + if ($null -eq $record) { break } + $count = [int](Invoke-Get $record "FieldCount" $null) + $values = @() + for ($i = 1; $i -le $count; $i++) { $values += [string](Invoke-Get $record "StringData" @([int]$i)) } + [void]$rows.Add($values) + } + [void](Invoke-Call $view "Close" $null) + return $rows # enumerated into the pipeline one row (string[]) at a time +} + +function Test-Table { + param($db, [string]$name) + $state = [int](Invoke-Get $db "TablePersistent" @($name)) # a parameterized property + return ($state -eq 1) # 1 = MSICONDITION_TRUE, the table exists +} + +# Summary information property 7 is the Template: ";". +$summary = Invoke-Get $installer "SummaryInformation" @($MsiPath, 0) +$template = [string](Invoke-Get $summary "Property" @([int]7)) + +# Backticks quote MSI SQL identifiers; doubled (``) in a double-quoted string. +$components = @(Get-Rows $database "SELECT ``Component``, ``Attributes`` FROM ``Component``" | + ForEach-Object { [ordered]@{ name = $_[0]; attributes = [int]$_[1] } }) + +$upgrade = @() +if (Test-Table $database "Upgrade") { + $upgrade = @(Get-Rows $database "SELECT ``ActionProperty``, ``Attributes``, ``VersionMin``, ``VersionMax`` FROM ``Upgrade``" | + ForEach-Object { [ordered]@{ action_property = $_[0]; attributes = [int]$_[1]; version_min = $_[2]; version_max = $_[3] } }) +} + +$features = @(Get-Rows $database "SELECT ``Feature`` FROM ``Feature``" | ForEach-Object { $_[0] }) + +$conditions = @() +if (Test-Table $database "Condition") { + $conditions = @(Get-Rows $database "SELECT ``Feature_``, ``Level``, ``Condition`` FROM ``Condition``" | + ForEach-Object { [ordered]@{ feature = $_[0]; level = [int]$_[1]; condition = $_[2] } }) +} + +$sdkFeatureLists = @(Get-Rows $database "SELECT ``Argument`` FROM ``ControlEvent`` WHERE ``Dialog_``='SDKDlg' AND ``Control_``='Next' AND ``Event``='[CustomActionData]'" | + ForEach-Object { $_[0] }) + +[ordered]@{ + template = $template + components = $components + upgrade = $upgrade + features = $features + feature_conditions = $conditions + sdk_next_custom_action_data = $sdkFeatureLists +} | ConvertTo-Json -Compress -Depth 4 diff --git a/tests/test_package.py b/tests/test_package.py new file mode 100644 index 0000000..0b40871 --- /dev/null +++ b/tests/test_package.py @@ -0,0 +1,105 @@ +# Package-structure tests: facts about the installer's MSI database that a +# silent install can't observe. They read the package (or the MSI extracted +# from the .exe bootstrapper) and never install it. +from __future__ import annotations + +import re +from pathlib import Path + +import pytest +from conftest import InstallerInfo + +# Component table: msidbComponentAttributes64bit +_COMPONENT_64BIT = 0x100 +# Upgrade table: msidbUpgradeAttributesOnlyDetect +_UPGRADE_ONLY_DETECT = 0x2 + +# Platform field of the Template summary property per installer architecture. +# Advanced Installer leaves it empty for 32-bit packages, which Windows +# Installer reads as Intel. +_EXPECTED_PLATFORMS = {"x64": {"x64"}, "arm64": {"Arm64"}, "x86": {"", "Intel"}} + +_AIP = Path(__file__).parent.parent / "windows-installer" / "openssl.aip" + + +def test_platform_matches_architecture(installer: InstallerInfo, package_facts: dict) -> None: + """The package must declare the platform its binaries are built for. + Windows Installer rejects an unknown platform with error 1633 before + running anything (an Advanced Installer build once wrote "x86").""" + template = package_facts["template"] + platform = template.split(";", 1)[0] + expected = _EXPECTED_PLATFORMS[installer.arch] + assert platform in expected, f"{installer.arch} package declares Template {template!r}, expected platform {sorted(expected)}" + + +def test_x86_package_has_no_64bit_components(installer: InstallerInfo, package_facts: dict) -> None: + """A 32-bit package must not contain 64-bit components: 32-bit Windows + refuses them, and on 64-bit Windows their registry values land in the + 64-bit view instead of Wow6432Node.""" + if installer.arch != "x86": + pytest.skip("64-bit packages may legitimately contain 32-bit components") + offenders = sorted(c["name"] for c in package_facts["components"] if c["attributes"] & _COMPONENT_64BIT) + assert not offenders, f"x86 package contains 64-bit components: {offenders}" + + +def test_detects_newer_installed_version(installer: InstallerInfo, package_facts: dict) -> None: + """The Upgrade table must detect an installed newer version, so an older + package cannot silently install over it. Advanced Installer's GUI has + dropped this row before without any visible change in the project.""" + rows = [u for u in package_facts["upgrade"] if u["action_property"] == "AI_NEWERPRODUCTFOUND"] + assert rows, f"no AI_NEWERPRODUCTFOUND row in the Upgrade table: {package_facts['upgrade']}" + assert any( + u["attributes"] & _UPGRADE_ONLY_DETECT and u["version_min"] == installer.version for u in rows + ), f"AI_NEWERPRODUCTFOUND must be a detect-only row starting at {installer.version}, got {rows}" + + +def test_sdk_dialog_updates_every_conditioned_feature(package_facts: dict) -> None: + """The SDK dialog's Next button hands UpdateFeaturesInstallStates the list + of features whose install level depends on INSTALL_APP / INSTALL_SDK. + Advanced Installer silently omits that list when a sub-feature of a + conditioned feature has no condition of its own, and then the dialog's + choices stop applying. GUI tests don't run in CI, so check the table. + (Prerequisite features carry Advanced Installer's own conditions and are + not driven by the dialog, hence the property filter.)""" + present = set(package_facts["features"]) + conditioned = sorted( + {c["feature"] for c in package_facts["feature_conditions"] if re.search(r"\bINSTALL_(APP|SDK)\b", c["condition"])} + & present + ) + assert conditioned, "no features conditioned on INSTALL_APP / INSTALL_SDK; the SDK dialog has nothing to drive" + lists = package_facts["sdk_next_custom_action_data"] + assert lists, f"SDKDlg Next passes no feature list to UpdateFeaturesInstallStates; conditioned features: {conditioned}" + listed = set(" ".join(lists).split()) + missing = [f for f in conditioned if f not in listed] + assert not missing, f"conditioned features missing from the SDK dialog's feature list: {missing}" + + +def test_prerequisite_searches_read_their_runtime_registry_view() -> None: + """A VC++ redistributable prerequisite is installed when its registry + search finds no runtime. The x86 runtime records its version in the 32-bit + registry view and the x64 runtime in the 64-bit one, so each search must + read the view of the runtime it detects (Platform="1" = Advanced + Installer's "Use 64-bit locations" option). A 64-bit search for the x86 + runtime finds the x64 runtime instead and skips a needed install. This + lives in the bootstrapper configuration, not the MSI, so it is read from + the project file.""" + src = _AIP.read_text(encoding="utf-8") + runtime_arch = {} + for row in re.findall(r"]*>", src): + arch = re.search(r"VC_redist\.(x86|x64|arm64)\.exe", row) + key = re.search(r'PrereqKey="([^"]*)"', row) + if arch and key: + runtime_arch[key.group(1)] = arch.group(1) + assert runtime_arch, f"no VC++ redistributable prerequisites found in {_AIP}" + problems = [] + for row in re.findall(r"]*>", src): + match = re.search(r'Prereq="([^"]*)"', row) + prereq = match.group(1) if match else "" + if prereq not in runtime_arch: + continue + wants_64bit = runtime_arch[prereq] != "x86" + reads_64bit = 'Platform="1"' in row + if wants_64bit != reads_64bit: + view = "64-bit" if reads_64bit else "32-bit" + problems.append(f"{prereq} ({runtime_arch[prereq]} runtime) searches the {view} registry view") + assert not problems, "; ".join(problems) From c64b5d207ab134416bd4c3f421a3c4f7f0113367 Mon Sep 17 00:00:00 2001 From: Dmitry Misharov Date: Fri, 25 Sep 2026 08:23:55 +0200 Subject: [PATCH 7/8] Keep AI_ExePath a single 32-bit component Co-Authored-By: Claude Opus 5.5 (1M context) --- windows-installer/openssl.aip | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/windows-installer/openssl.aip b/windows-installer/openssl.aip index 64ffe9f..cf04adb 100644 --- a/windows-installer/openssl.aip +++ b/windows-installer/openssl.aip @@ -81,8 +81,7 @@ - - + @@ -678,7 +677,6 @@ - @@ -694,7 +692,7 @@ - + @@ -716,7 +714,6 @@ - @@ -800,18 +797,14 @@ - - - - @@ -829,10 +822,8 @@ - - From 31cd4a5f05250e7feacc94b7e16ca717830055be Mon Sep 17 00:00:00 2001 From: Dmitry Misharov Date: Fri, 25 Sep 2026 08:44:41 +0200 Subject: [PATCH 8/8] Tests: expect Program Files (x86) in the x86 wizard Co-Authored-By: Claude Opus 5.5 (1M context) --- tests/test_gui.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/test_gui.py b/tests/test_gui.py index f353709..6f50e7a 100644 --- a/tests/test_gui.py +++ b/tests/test_gui.py @@ -228,8 +228,9 @@ def _wait_until(predicate: Any, *, timeout: float, what: str, poll: float = 2.0) time.sleep(poll) raise AssertionError(f"timed out after {timeout:.0f}s waiting for {what}") + @pytest.mark.skipif(os.getenv("CI") == "true", reason="GUI tests require interactive session") -def test_wizard_dialog_walk(wizard: Wizard, installer: InstallerInfo) -> None: +def test_wizard_dialog_walk(wizard: Wizard, installer: InstallerInfo, install_dir: Path) -> None: """Walk the wizard from license through the additional-options dialog, asserting expected state (defaults, path, the 'at least one option' validation popup) at each step. @@ -245,7 +246,8 @@ def test_wizard_dialog_walk(wizard: Wizard, installer: InstallerInfo) -> None: # ---- 2. Install path ---- assert _current_static(dlg) == "Choose install location", f"unexpected dialog title: {_current_static(dlg)!r}" - expected_path = f"C:\\Program Files\\OpenSSL Library\\openssl-{installer.short}\\" + # Per-architecture default: x86 packages offer Program Files (x86). + expected_path = f"{install_dir}\\" actual_path = dlg.Edit.get_value() assert actual_path == expected_path, f"install path: expected {expected_path!r}, got {actual_path!r}" dlg = _click_and_advance(dlg, app)