GoogleContainerTools / GoogleContainerTools/container-structure-test

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

Open
#557 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Go
Stars
2.5k
Forks
212
PR merge metrics
No merged PRs in 30d

Description

## 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:

```python
# 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 `.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.

```python
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.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.