Commit 81475ca2 authored by Diogo Pinela's avatar Diogo Pinela Committed by Brad Fitzpatrick

os: ensure tests pass even if GOROOT is read-only

We achieve this by always running all tests that create files in a
fresh temporary directory, rather than just on darwin/{arm,arm64}.
As a bonus, this lets us simplify the cleanup code for these tests
and assume their working directory starts out empty.

Updates #28387

Change-Id: I952007ae390a2451c9a368da26c7f9f5af64b2ba
Reviewed-on: https://go-review.googlesource.com/c/145283Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 3fe9d4c1
...@@ -178,7 +178,6 @@ func TestStatError(t *testing.T) { ...@@ -178,7 +178,6 @@ func TestStatError(t *testing.T) {
defer chtmpdir(t)() defer chtmpdir(t)()
path := "no-such-file" path := "no-such-file"
Remove(path) // Just in case
fi, err := Stat(path) fi, err := Stat(path)
if err == nil { if err == nil {
...@@ -194,12 +193,10 @@ func TestStatError(t *testing.T) { ...@@ -194,12 +193,10 @@ func TestStatError(t *testing.T) {
testenv.MustHaveSymlink(t) testenv.MustHaveSymlink(t)
link := "symlink" link := "symlink"
Remove(link) // Just in case
err = Symlink(path, link) err = Symlink(path, link)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
defer Remove(link)
fi, err = Stat(link) fi, err = Stat(link)
if err == nil { if err == nil {
...@@ -688,12 +685,10 @@ func TestHardLink(t *testing.T) { ...@@ -688,12 +685,10 @@ func TestHardLink(t *testing.T) {
defer chtmpdir(t)() defer chtmpdir(t)()
from, to := "hardlinktestfrom", "hardlinktestto" from, to := "hardlinktestfrom", "hardlinktestto"
Remove(from) // Just in case.
file, err := Create(to) file, err := Create(to)
if err != nil { if err != nil {
t.Fatalf("open %q failed: %v", to, err) t.Fatalf("open %q failed: %v", to, err)
} }
defer Remove(to)
if err = file.Close(); err != nil { if err = file.Close(); err != nil {
t.Errorf("close %q failed: %v", to, err) t.Errorf("close %q failed: %v", to, err)
} }
...@@ -709,7 +704,6 @@ func TestHardLink(t *testing.T) { ...@@ -709,7 +704,6 @@ func TestHardLink(t *testing.T) {
t.Errorf("link %q, %q failed to return a valid error", none, none) t.Errorf("link %q, %q failed to return a valid error", none, none)
} }
defer Remove(from)
tostat, err := Stat(to) tostat, err := Stat(to)
if err != nil { if err != nil {
t.Fatalf("stat %q failed: %v", to, err) t.Fatalf("stat %q failed: %v", to, err)
...@@ -745,11 +739,8 @@ func TestHardLink(t *testing.T) { ...@@ -745,11 +739,8 @@ func TestHardLink(t *testing.T) {
} }
// chtmpdir changes the working directory to a new temporary directory and // chtmpdir changes the working directory to a new temporary directory and
// provides a cleanup function. Used when PWD is read-only. // provides a cleanup function.
func chtmpdir(t *testing.T) func() { func chtmpdir(t *testing.T) func() {
if runtime.GOOS != "darwin" || (runtime.GOARCH != "arm" && runtime.GOARCH != "arm64") {
return func() {} // only needed on darwin/arm{,64}
}
oldwd, err := Getwd() oldwd, err := Getwd()
if err != nil { if err != nil {
t.Fatalf("chtmpdir: %v", err) t.Fatalf("chtmpdir: %v", err)
...@@ -774,12 +765,10 @@ func TestSymlink(t *testing.T) { ...@@ -774,12 +765,10 @@ func TestSymlink(t *testing.T) {
defer chtmpdir(t)() defer chtmpdir(t)()
from, to := "symlinktestfrom", "symlinktestto" from, to := "symlinktestfrom", "symlinktestto"
Remove(from) // Just in case.
file, err := Create(to) file, err := Create(to)
if err != nil { if err != nil {
t.Fatalf("Create(%q) failed: %v", to, err) t.Fatalf("Create(%q) failed: %v", to, err)
} }
defer Remove(to)
if err = file.Close(); err != nil { if err = file.Close(); err != nil {
t.Errorf("Close(%q) failed: %v", to, err) t.Errorf("Close(%q) failed: %v", to, err)
} }
...@@ -787,7 +776,6 @@ func TestSymlink(t *testing.T) { ...@@ -787,7 +776,6 @@ func TestSymlink(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("Symlink(%q, %q) failed: %v", to, from, err) t.Fatalf("Symlink(%q, %q) failed: %v", to, from, err)
} }
defer Remove(from)
tostat, err := Lstat(to) tostat, err := Lstat(to)
if err != nil { if err != nil {
t.Fatalf("Lstat(%q) failed: %v", to, err) t.Fatalf("Lstat(%q) failed: %v", to, err)
...@@ -841,12 +829,10 @@ func TestLongSymlink(t *testing.T) { ...@@ -841,12 +829,10 @@ func TestLongSymlink(t *testing.T) {
// Long, but not too long: a common limit is 255. // Long, but not too long: a common limit is 255.
s = s + s + s + s + s + s + s + s + s + s + s + s + s + s + s s = s + s + s + s + s + s + s + s + s + s + s + s + s + s + s
from := "longsymlinktestfrom" from := "longsymlinktestfrom"
Remove(from) // Just in case.
err := Symlink(s, from) err := Symlink(s, from)
if err != nil { if err != nil {
t.Fatalf("symlink %q, %q failed: %v", s, from, err) t.Fatalf("symlink %q, %q failed: %v", s, from, err)
} }
defer Remove(from)
r, err := Readlink(from) r, err := Readlink(from)
if err != nil { if err != nil {
t.Fatalf("readlink %q failed: %v", from, err) t.Fatalf("readlink %q failed: %v", from, err)
...@@ -859,9 +845,6 @@ func TestLongSymlink(t *testing.T) { ...@@ -859,9 +845,6 @@ func TestLongSymlink(t *testing.T) {
func TestRename(t *testing.T) { func TestRename(t *testing.T) {
defer chtmpdir(t)() defer chtmpdir(t)()
from, to := "renamefrom", "renameto" from, to := "renamefrom", "renameto"
// Ensure we are not testing the overwrite case here.
Remove(from)
Remove(to)
file, err := Create(from) file, err := Create(from)
if err != nil { if err != nil {
...@@ -874,7 +857,6 @@ func TestRename(t *testing.T) { ...@@ -874,7 +857,6 @@ func TestRename(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("rename %q, %q failed: %v", to, from, err) t.Fatalf("rename %q, %q failed: %v", to, from, err)
} }
defer Remove(to)
_, err = Stat(to) _, err = Stat(to)
if err != nil { if err != nil {
t.Errorf("stat %q failed: %v", to, err) t.Errorf("stat %q failed: %v", to, err)
...@@ -884,9 +866,6 @@ func TestRename(t *testing.T) { ...@@ -884,9 +866,6 @@ func TestRename(t *testing.T) {
func TestRenameOverwriteDest(t *testing.T) { func TestRenameOverwriteDest(t *testing.T) {
defer chtmpdir(t)() defer chtmpdir(t)()
from, to := "renamefrom", "renameto" from, to := "renamefrom", "renameto"
// Just in case.
Remove(from)
Remove(to)
toData := []byte("to") toData := []byte("to")
fromData := []byte("from") fromData := []byte("from")
...@@ -904,7 +883,6 @@ func TestRenameOverwriteDest(t *testing.T) { ...@@ -904,7 +883,6 @@ func TestRenameOverwriteDest(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("rename %q, %q failed: %v", to, from, err) t.Fatalf("rename %q, %q failed: %v", to, from, err)
} }
defer Remove(to)
_, err = Stat(from) _, err = Stat(from)
if err == nil { if err == nil {
...@@ -925,9 +903,6 @@ func TestRenameOverwriteDest(t *testing.T) { ...@@ -925,9 +903,6 @@ func TestRenameOverwriteDest(t *testing.T) {
func TestRenameFailed(t *testing.T) { func TestRenameFailed(t *testing.T) {
defer chtmpdir(t)() defer chtmpdir(t)()
from, to := "renamefrom", "renameto" from, to := "renamefrom", "renameto"
// Ensure we are not testing the overwrite case here.
Remove(from)
Remove(to)
err := Rename(from, to) err := Rename(from, to)
switch err := err.(type) { switch err := err.(type) {
...@@ -943,9 +918,6 @@ func TestRenameFailed(t *testing.T) { ...@@ -943,9 +918,6 @@ func TestRenameFailed(t *testing.T) {
} }
case nil: case nil:
t.Errorf("rename %q, %q: expected error, got nil", from, to) t.Errorf("rename %q, %q: expected error, got nil", from, to)
// cleanup whatever was placed in "renameto"
Remove(to)
default: default:
t.Errorf("rename %q, %q: expected %T, got %T %v", from, to, new(LinkError), err, err) t.Errorf("rename %q, %q: expected %T, got %T %v", from, to, new(LinkError), err, err)
} }
...@@ -956,7 +928,6 @@ func TestRenameNotExisting(t *testing.T) { ...@@ -956,7 +928,6 @@ func TestRenameNotExisting(t *testing.T) {
from, to := "doesnt-exist", "dest" from, to := "doesnt-exist", "dest"
Mkdir(to, 0777) Mkdir(to, 0777)
defer Remove(to)
if err := Rename(from, to); !IsNotExist(err) { if err := Rename(from, to); !IsNotExist(err) {
t.Errorf("Rename(%q, %q) = %v; want an IsNotExist error", from, to, err) t.Errorf("Rename(%q, %q) = %v; want an IsNotExist error", from, to, err)
...@@ -967,12 +938,8 @@ func TestRenameToDirFailed(t *testing.T) { ...@@ -967,12 +938,8 @@ func TestRenameToDirFailed(t *testing.T) {
defer chtmpdir(t)() defer chtmpdir(t)()
from, to := "renamefrom", "renameto" from, to := "renamefrom", "renameto"
Remove(from)
Remove(to)
Mkdir(from, 0777) Mkdir(from, 0777)
Mkdir(to, 0777) Mkdir(to, 0777)
defer Remove(from)
defer Remove(to)
err := Rename(from, to) err := Rename(from, to)
switch err := err.(type) { switch err := err.(type) {
...@@ -988,9 +955,6 @@ func TestRenameToDirFailed(t *testing.T) { ...@@ -988,9 +955,6 @@ func TestRenameToDirFailed(t *testing.T) {
} }
case nil: case nil:
t.Errorf("rename %q, %q: expected error, got nil", from, to) t.Errorf("rename %q, %q: expected error, got nil", from, to)
// cleanup whatever was placed in "renameto"
Remove(to)
default: default:
t.Errorf("rename %q, %q: expected %T, got %T %v", from, to, new(LinkError), err, err) t.Errorf("rename %q, %q: expected %T, got %T %v", from, to, new(LinkError), err, err)
} }
...@@ -1702,7 +1666,6 @@ func writeFile(t *testing.T, fname string, flag int, text string) string { ...@@ -1702,7 +1666,6 @@ func writeFile(t *testing.T, fname string, flag int, text string) string {
func TestAppend(t *testing.T) { func TestAppend(t *testing.T) {
defer chtmpdir(t)() defer chtmpdir(t)()
const f = "append.txt" const f = "append.txt"
defer Remove(f)
s := writeFile(t, f, O_CREATE|O_TRUNC|O_RDWR, "new") s := writeFile(t, f, O_CREATE|O_TRUNC|O_RDWR, "new")
if s != "new" { if s != "new" {
t.Fatalf("writeFile: have %q want %q", s, "new") t.Fatalf("writeFile: have %q want %q", s, "new")
...@@ -1769,13 +1732,11 @@ func TestSameFile(t *testing.T) { ...@@ -1769,13 +1732,11 @@ func TestSameFile(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("Create(a): %v", err) t.Fatalf("Create(a): %v", err)
} }
defer Remove(fa.Name())
fa.Close() fa.Close()
fb, err := Create("b") fb, err := Create("b")
if err != nil { if err != nil {
t.Fatalf("Create(b): %v", err) t.Fatalf("Create(b): %v", err)
} }
defer Remove(fb.Name())
fb.Close() fb.Close()
ia1, err := Stat("a") ia1, err := Stat("a")
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment