package syscall_test
import (
+ "fmt"
+ "internal/testenv"
"os"
+ "os/exec"
"path/filepath"
+ "strings"
"syscall"
"testing"
)
t.Errorf("TOKEN_ALL_ACCESS = %x, want 0xF01FF", syscall.TOKEN_ALL_ACCESS)
}
}
+
+func TestStdioAreInheritable(t *testing.T) {
+ testenv.MustHaveGoBuild(t)
+ testenv.MustHaveExecPath(t, "gcc")
+
+ tmpdir := t.TempDir()
+
+ // build go dll
+ const dlltext = `
+package main
+
+import "C"
+import (
+ "fmt"
+)
+
+//export HelloWorld
+func HelloWorld() {
+ fmt.Println("Hello World")
+}
+
+func main() {}
+`
+ dllsrc := filepath.Join(tmpdir, "helloworld.go")
+ err := os.WriteFile(dllsrc, []byte(dlltext), 0644)
+ if err != nil {
+ t.Fatal(err)
+ }
+ dll := filepath.Join(tmpdir, "helloworld.dll")
+ cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", dll, "-buildmode", "c-shared", dllsrc)
+ out, err := testenv.CleanCmdEnv(cmd).CombinedOutput()
+ if err != nil {
+ t.Fatalf("failed to build go library: %s\n%s", err, out)
+ }
+
+ // run powershell script
+ psscript := fmt.Sprintf(`
+hostname;
+$signature = " [DllImport("%q")] public static extern void HelloWorld(); ";
+Add-Type -MemberDefinition $signature -Name World -Namespace Hello;
+[Hello.World]::HelloWorld();
+hostname;
+`, dll)
+ psscript = strings.ReplaceAll(psscript, "\n", "")
+ out, err = exec.Command("powershell", "-Command", psscript).CombinedOutput()
+ if err != nil {
+ t.Fatalf("Powershell command failed: %v: %v", err, string(out))
+ }
+
+ hostname, err := os.Hostname()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ have := strings.ReplaceAll(string(out), "\n", "")
+ have = strings.ReplaceAll(have, "\r", "")
+ want := fmt.Sprintf("%sHello World%s", hostname, hostname)
+ if have != want {
+ t.Fatalf("Powershell command output is wrong: got %q, want %q", have, want)
+ }
+}