read_test.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. // Copyright 2009 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package os_test
  5. import (
  6. "bytes"
  7. . "os"
  8. "path/filepath"
  9. "runtime"
  10. "testing"
  11. )
  12. func checkNamedSize(t *testing.T, path string, size int64) {
  13. dir, err := Stat(path)
  14. if err != nil {
  15. t.Fatalf("Stat %q (looking for size %d): %s", path, size, err)
  16. }
  17. if dir.Size() != size {
  18. t.Errorf("Stat %q: size %d want %d", path, dir.Size(), size)
  19. }
  20. }
  21. func TestReadFile(t *testing.T) {
  22. filename := "rumpelstilzchen"
  23. contents, err := ReadFile(filename)
  24. if err == nil {
  25. t.Fatalf("ReadFile %s: error expected, none found", filename)
  26. }
  27. filename = "read_test.go"
  28. contents, err = ReadFile(filename)
  29. if err != nil {
  30. t.Fatalf("ReadFile %s: %v", filename, err)
  31. }
  32. checkNamedSize(t, filename, int64(len(contents)))
  33. }
  34. func TestWriteFile(t *testing.T) {
  35. f, err := CreateTemp("", "ioutil-test")
  36. if err != nil {
  37. t.Fatal(err)
  38. }
  39. defer f.Close()
  40. defer Remove(f.Name())
  41. msg := "Programming today is a race between software engineers striving to " +
  42. "build bigger and better idiot-proof programs, and the Universe trying " +
  43. "to produce bigger and better idiots. So far, the Universe is winning."
  44. if err := WriteFile(f.Name(), []byte(msg), 0644); err != nil {
  45. t.Fatalf("WriteFile %s: %v", f.Name(), err)
  46. }
  47. data, err := ReadFile(f.Name())
  48. if err != nil {
  49. t.Fatalf("ReadFile %s: %v", f.Name(), err)
  50. }
  51. if string(data) != msg {
  52. t.Fatalf("ReadFile: wrong data:\nhave %q\nwant %q", string(data), msg)
  53. }
  54. }
  55. func TestReadOnlyWriteFile(t *testing.T) {
  56. if Getuid() == 0 {
  57. t.Skipf("Root can write to read-only files anyway, so skip the read-only test.")
  58. }
  59. // We don't want to use CreateTemp directly, since that opens a file for us as 0600.
  60. tempDir, err := MkdirTemp("", t.Name())
  61. if err != nil {
  62. t.Fatal(err)
  63. }
  64. defer RemoveAll(tempDir)
  65. filename := filepath.Join(tempDir, "blurp.txt")
  66. shmorp := []byte("shmorp")
  67. florp := []byte("florp")
  68. err = WriteFile(filename, shmorp, 0444)
  69. if err != nil {
  70. t.Fatalf("WriteFile %s: %v", filename, err)
  71. }
  72. err = WriteFile(filename, florp, 0444)
  73. if err == nil {
  74. t.Fatalf("Expected an error when writing to read-only file %s", filename)
  75. }
  76. got, err := ReadFile(filename)
  77. if err != nil {
  78. t.Fatalf("ReadFile %s: %v", filename, err)
  79. }
  80. if !bytes.Equal(got, shmorp) {
  81. t.Fatalf("want %s, got %s", shmorp, got)
  82. }
  83. }
  84. func TestReadDir(t *testing.T) {
  85. dirname := "rumpelstilzchen"
  86. _, err := ReadDir(dirname)
  87. if err == nil {
  88. t.Fatalf("ReadDir %s: error expected, none found", dirname)
  89. }
  90. dirname = "."
  91. list, err := ReadDir(dirname)
  92. if err != nil {
  93. t.Fatalf("ReadDir %s: %v", dirname, err)
  94. }
  95. foundFile := false
  96. foundSubDir := false
  97. for _, dir := range list {
  98. switch {
  99. case !dir.IsDir() && dir.Name() == "read_test.go":
  100. foundFile = true
  101. case dir.IsDir() && dir.Name() == "exec":
  102. foundSubDir = true
  103. }
  104. }
  105. if !foundFile {
  106. t.Fatalf("ReadDir %s: read_test.go file not found", dirname)
  107. }
  108. if !foundSubDir {
  109. // This doesn't work in the gofrontend testsuite framework.
  110. if runtime.Compiler == "gc" {
  111. t.Fatalf("ReadDir %s: exec directory not found", dirname)
  112. }
  113. }
  114. }