| // Copyright 2023 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| //go:build unix |
| |
| package main |
| |
| import ( |
| "os" |
| "path/filepath" |
| "strings" |
| "testing" |
| "time" |
| ) |
| |
| func TestPermissions(t *testing.T) { |
| if os.Getuid() == 0 { |
| t.Skip("skipping permission test when running as root") |
| } |
| |
| dir := t.TempDir() |
| fn := filepath.Join(dir, "perm.go") |
| |
| // Create a file that needs formatting without write permission. |
| if err := os.WriteFile(filepath.Join(fn), []byte(" package main"), 0o400); err != nil { |
| t.Fatal(err) |
| } |
| |
| // Set mtime of the file in the past. |
| past := time.Now().Add(-time.Hour) |
| if err := os.Chtimes(fn, past, past); err != nil { |
| t.Fatal(err) |
| } |
| |
| info, err := os.Stat(fn) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| defer func() { *write = false }() |
| *write = true |
| |
| initParserMode() |
| initRewrite() |
| |
| const maxWeight = 2 << 20 |
| var buf, errBuf strings.Builder |
| s := newSequencer(maxWeight, &buf, &errBuf) |
| s.Add(fileWeight(fn, info), func(r *reporter) error { |
| return processFile(fn, info, nil, r) |
| }) |
| if s.GetExitCode() == 0 { |
| t.Fatal("rewrite of read-only file succeeded unexpectedly") |
| } |
| if errBuf.Len() > 0 { |
| t.Log(errBuf) |
| } |
| |
| info, err = os.Stat(fn) |
| if err != nil { |
| t.Fatal(err) |
| } |
| if !info.ModTime().Equal(past) { |
| t.Errorf("after rewrite mod time is %v, want %v", info.ModTime(), past) |
| } |
| } |