GoogleContainerTools / GoogleContainerTools/container-structure-test
Windows: structure_test binary missing .exe extension causes "Open With" dialog instead of running tests
- 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
Assessment
This issue has not been assessed yet.