Skip to content

Windows: structure_test binary missing .exe extension causes "Open With" dialog instead of running tests #557

@peakschris

Description

@peakschris

Problem

On Windows, the structure_test binary downloaded by the Bazel toolchain has no file extension. When the generated .bat launcher script tries to invoke it (via bash.exe calling the binary, or via PowerShell's & operator), Windows does not recognise it as an executable.

Instead of running, Windows displays an "Open With" application picker dialog. The test process then returns exit code 0 (the dialog closes without error), so Bazel marks the test as PASSED without any structure tests having actually run.

Root cause

The Windows toolchain BUILD registers the binary without an extension:

# container/repositories.bzl — generated BUILD for windows_amd64
structure_test_toolchain(
    name = "structure_test_toolchain",
    structure_test = "structure_test"   # no .exe
)

Windows requires an extension to recognise a file as directly executable. The binary is a valid PE (.exe), just named without the extension.

Reproduction

  1. Use container_structure_test with driver = "tar" on a Windows Bazel host.
  2. Run the generated test target.
  3. An "Open With" dialog appears briefly and disappears; the test reports PASSED.
  4. No structure tests were actually executed.

Fix

Symlink the binary to <name>.exe in the Bazel action graph when building on Windows. This is safe — the binary is a valid PE regardless of its name — and the generated launcher scripts use rlocation to resolve the path at runtime, so they automatically pick up the .exe copy.

is_windows = ctx.target_platform_has_constraint(ctx.attr._windows_constraint[...])
if is_windows and not test_bin.basename.endswith(".exe"):
    test_bin_exe = ctx.actions.declare_file(test_bin.basename + ".exe")
    ctx.actions.symlink(output = test_bin_exe, target_file = test_bin)
    test_bin = test_bin_exe

A PR with this fix is attached.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions