|
5 | 5 | package os_test
|
6 | 6 |
|
7 | 7 | import (
|
| 8 | + "errors" |
8 | 9 | "fmt"
|
9 | 10 | "internal/poll"
|
10 | 11 | "internal/syscall/windows"
|
@@ -1003,3 +1004,46 @@ func TestStatOfInvalidName(t *testing.T) {
|
1003 | 1004 | t.Fatal(`os.Stat("*.go") unexpectedly succeeded`)
|
1004 | 1005 | }
|
1005 | 1006 | }
|
| 1007 | + |
| 1008 | +// findUnusedDriveLetter searches mounted drive list on the system |
| 1009 | +// (starting from Z: and ending at D:) for unused drive letter. |
| 1010 | +// It returns path to the found drive root directory (like Z:\) or error. |
| 1011 | +func findUnusedDriveLetter() (string, error) { |
| 1012 | + // Do not use A: and B:, because they are reserved for floppy drive. |
| 1013 | + // Do not use C:, becasue it is normally used for main drive. |
| 1014 | + for l := 'Z'; l >= 'D'; l-- { |
| 1015 | + p := string(l) + `:\` |
| 1016 | + _, err := os.Stat(p) |
| 1017 | + if os.IsNotExist(err) { |
| 1018 | + return p, nil |
| 1019 | + } |
| 1020 | + } |
| 1021 | + return "", errors.New("Could not find unused drive letter.") |
| 1022 | +} |
| 1023 | + |
| 1024 | +func TestRootDirAsTemp(t *testing.T) { |
| 1025 | + testenv.MustHaveExec(t) |
| 1026 | + |
| 1027 | + if os.Getenv("GO_WANT_HELPER_PROCESS") == "1" { |
| 1028 | + fmt.Print(os.TempDir()) |
| 1029 | + os.Exit(0) |
| 1030 | + } |
| 1031 | + |
| 1032 | + newtmp, err := findUnusedDriveLetter() |
| 1033 | + if err != nil { |
| 1034 | + t.Fatal(err) |
| 1035 | + } |
| 1036 | + |
| 1037 | + cmd := osexec.Command(os.Args[0], "-test.run=TestRootDirAsTemp") |
| 1038 | + cmd.Env = os.Environ() |
| 1039 | + cmd.Env = append(cmd.Env, "GO_WANT_HELPER_PROCESS=1") |
| 1040 | + cmd.Env = append(cmd.Env, "TMP="+newtmp) |
| 1041 | + cmd.Env = append(cmd.Env, "TEMP="+newtmp) |
| 1042 | + output, err := cmd.CombinedOutput() |
| 1043 | + if err != nil { |
| 1044 | + t.Fatalf("Failed to spawn child process: %v %q", err, string(output)) |
| 1045 | + } |
| 1046 | + if want, have := newtmp, string(output); have != want { |
| 1047 | + t.Fatalf("unexpected child process output %q, want %q", have, want) |
| 1048 | + } |
| 1049 | +} |
0 commit comments