diff options
Diffstat (limited to 'src/os/executable_test.go')
| -rw-r--r-- | src/os/executable_test.go | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/os/executable_test.go b/src/os/executable_test.go index f25ee0c95a..f682105fa6 100644 --- a/src/os/executable_test.go +++ b/src/os/executable_test.go @@ -86,3 +86,68 @@ func init() { os.Exit(0) } } + +func TestExecutableDeleted(t *testing.T) { + testenv.MustHaveExec(t) + switch runtime.GOOS { + case "windows": + t.Skip("windows does not support deleting running binary") + case "openbsd", "freebsd": + t.Skipf("%v does not support reading deleted binary name", runtime.GOOS) + } + + dir := t.TempDir() + + src := filepath.Join(dir, "testdel.go") + exe := filepath.Join(dir, "testdel.exe") + + err := os.WriteFile(src, []byte(testExecutableDeletion), 0666) + if err != nil { + t.Fatal(err) + } + + out, err := osexec.Command(testenv.GoToolPath(t), "build", "-o", exe, src).CombinedOutput() + t.Logf("build output:\n%s", out) + if err != nil { + t.Fatal(err) + } + + out, err = osexec.Command(exe).CombinedOutput() + t.Logf("exec output:\n%s", out) + if err != nil { + t.Fatal(err) + } +} + +const testExecutableDeletion = `package main + +import ( + "fmt" + "os" +) + +func main() { + before, err := os.Executable() + if err != nil { + fmt.Fprintf(os.Stderr, "failed to read executable name before deletion: %v\n", err) + os.Exit(1) + } + + err = os.Remove(before) + if err != nil { + fmt.Fprintf(os.Stderr, "failed to remove executable: %v\n", err) + os.Exit(1) + } + + after, err := os.Executable() + if err != nil { + fmt.Fprintf(os.Stderr, "failed to read executable name after deletion: %v\n", err) + os.Exit(1) + } + + if before != after { + fmt.Fprintf(os.Stderr, "before and after do not match: %v != %v\n", before, after) + os.Exit(1) + } +} +` |
