golang / go

The Go programming language
https://go.dev
BSD 3-Clause "New" or "Revised" License
122.91k stars 17.52k forks source link

net: powershell invocation in tests broken in sysarm32 mode #42858

Open zx2c4 opened 3 years ago

zx2c4 commented 3 years ago

Windows 10 for ARM64 will run ARM32 executables just fine, which is why we're using it for Go builders.

There's currently a bug in which invoking powershell from an arm32 process will fail: image

I've worked around that by grabbing a zip of powershell 7.1, adding the unzipped directory to the builder's PATH, and then copying pwsh.exe to powershell.exe. I'm waiting for some builds to finish, but I think that should work alright.

The reason this matters for Go is that some of the tests use powershell just to invoke a simple command:

func runCmd(args ...string) ([]byte, error) {
        removeUTF8BOM := func(b []byte) []byte {
                if len(b) >= 3 && b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF {
                        return b[3:]
                }
                return b
        }
        f, err := ioutil.TempFile("", "netcmd")
        if err != nil {
                return nil, err
        }
        f.Close()
        defer os.Remove(f.Name())
        cmd := fmt.Sprintf(`%s | Out-File "%s" -encoding UTF8`, strings.Join(args, " "), f.Name())
        out, err := exec.Command("powershell", "-Command", cmd).CombinedOutput()

I'm pretty sure we can come up with something better than powershell -Command for the tests, which would make this problem go away. Or sooner or later Microsoft will probably fix it. Or my workaround will suffice.

Either way, I thought I should at least document this.

CC @alexbrainman @jstarks @cagedmantis

alexbrainman commented 3 years ago

I am happy to get rid of powershell dependency, if possible.

From what I remember we mainly use powershell to be able to read non-ASCII output of Windows commands on non-English versions of Windows.

Including @mattn because he uses non-English Windows.

Alex

mattn commented 3 years ago

One another way to avoid the issue is call chcp 65001 before any commands. it output english. Or call API GetConsoleCP and SetConsoleOutputCP.

cp := windows.GetConsoleCP()
defer windows.SetConsoleOutputCP(cp)
windows.SetConsoleOutputCP(windows.CP_UTF8)

// do something

(But currently internal/syscall/windows does not have the APIs)

gopherbot commented 3 years ago

Change https://golang.org/cl/273673 mentions this issue: net: set and restore console codepage in runCmd

zx2c4 commented 3 years ago

windows.SetConsoleOutputCP(windows.CP_UTF8)

I wonder if Go should call that in the runtime init anyway...

mattn commented 3 years ago

No.

https://dev.to/mattn/please-stop-hack-chcp-65001-27db

zx2c4 commented 3 years ago

No.

https://dev.to/mattn/please-stop-hack-chcp-65001-27db

Good to know. Thanks for the info.