Source file src/os/read_test.go

     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  
     5  package os_test
     6  
     7  import (
     8  	"bytes"
     9  	"errors"
    10  	. "os"
    11  	"path/filepath"
    12  	"runtime"
    13  	"syscall"
    14  	"testing"
    15  )
    16  
    17  func checkNamedSize(t *testing.T, path string, size int64) {
    18  	dir, err := Stat(path)
    19  	if err != nil {
    20  		t.Fatalf("Stat %q (looking for size %d): %s", path, size, err)
    21  	}
    22  	if dir.Size() != size {
    23  		t.Errorf("Stat %q: size %d want %d", path, dir.Size(), size)
    24  	}
    25  }
    26  
    27  func TestReadFile(t *testing.T) {
    28  	t.Parallel()
    29  
    30  	filename := "rumpelstilzchen"
    31  	contents, err := ReadFile(filename)
    32  	if err == nil {
    33  		t.Fatalf("ReadFile %s: error expected, none found", filename)
    34  	}
    35  
    36  	filename = "read_test.go"
    37  	contents, err = ReadFile(filename)
    38  	if err != nil {
    39  		t.Fatalf("ReadFile %s: %v", filename, err)
    40  	}
    41  
    42  	checkNamedSize(t, filename, int64(len(contents)))
    43  }
    44  
    45  func TestWriteFile(t *testing.T) {
    46  	t.Parallel()
    47  
    48  	f, err := CreateTemp("", "os-test")
    49  	if err != nil {
    50  		t.Fatal(err)
    51  	}
    52  	defer f.Close()
    53  	defer Remove(f.Name())
    54  
    55  	msg := "Programming today is a race between software engineers striving to " +
    56  		"build bigger and better idiot-proof programs, and the Universe trying " +
    57  		"to produce bigger and better idiots. So far, the Universe is winning."
    58  
    59  	if err := WriteFile(f.Name(), []byte(msg), 0644); err != nil {
    60  		t.Fatalf("WriteFile %s: %v", f.Name(), err)
    61  	}
    62  
    63  	data, err := ReadFile(f.Name())
    64  	if err != nil {
    65  		t.Fatalf("ReadFile %s: %v", f.Name(), err)
    66  	}
    67  
    68  	if string(data) != msg {
    69  		t.Fatalf("ReadFile: wrong data:\nhave %q\nwant %q", string(data), msg)
    70  	}
    71  }
    72  
    73  func TestReadOnlyWriteFile(t *testing.T) {
    74  	if Getuid() == 0 {
    75  		t.Skipf("Root can write to read-only files anyway, so skip the read-only test.")
    76  	}
    77  	if runtime.GOOS == "wasip1" {
    78  		t.Skip("no support for file permissions on " + runtime.GOOS)
    79  	}
    80  	t.Parallel()
    81  
    82  	// We don't want to use CreateTemp directly, since that opens a file for us as 0600.
    83  	filename := filepath.Join(t.TempDir(), "blurp.txt")
    84  
    85  	shmorp := []byte("shmorp")
    86  	florp := []byte("florp")
    87  	err := WriteFile(filename, shmorp, 0444)
    88  	if err != nil {
    89  		t.Fatalf("WriteFile %s: %v", filename, err)
    90  	}
    91  	err = WriteFile(filename, florp, 0444)
    92  	if err == nil {
    93  		t.Fatalf("Expected an error when writing to read-only file %s", filename)
    94  	}
    95  	got, err := ReadFile(filename)
    96  	if err != nil {
    97  		t.Fatalf("ReadFile %s: %v", filename, err)
    98  	}
    99  	if !bytes.Equal(got, shmorp) {
   100  		t.Fatalf("want %s, got %s", shmorp, got)
   101  	}
   102  }
   103  
   104  func TestReadDir(t *testing.T) {
   105  	t.Parallel()
   106  
   107  	dirname := "rumpelstilzchen"
   108  	if _, err := ReadDir(dirname); err == nil {
   109  		t.Fatalf("ReadDir %s: error expected, none found", dirname)
   110  	}
   111  
   112  	filename := filepath.Join(t.TempDir(), "foo")
   113  	f, err := Create(filename)
   114  	if err != nil {
   115  		t.Fatal(err)
   116  	}
   117  	f.Close()
   118  	if list, err := ReadDir(filename); list != nil || !errors.Is(err, syscall.ENOTDIR) {
   119  		t.Fatalf("ReadDir %s: (nil, ENOTDIR) expected, got (%v, %v)", filename, list, err)
   120  	}
   121  
   122  	dirname = "."
   123  	list, err := ReadDir(dirname)
   124  	if err != nil {
   125  		t.Fatalf("ReadDir %s: %v", dirname, err)
   126  	}
   127  
   128  	foundFile := false
   129  	foundSubDir := false
   130  	for _, dir := range list {
   131  		switch {
   132  		case !dir.IsDir() && dir.Name() == "read_test.go":
   133  			foundFile = true
   134  		case dir.IsDir() && dir.Name() == "exec":
   135  			foundSubDir = true
   136  		}
   137  	}
   138  	if !foundFile {
   139  		t.Fatalf("ReadDir %s: read_test.go file not found", dirname)
   140  	}
   141  	if !foundSubDir {
   142  		t.Fatalf("ReadDir %s: exec directory not found", dirname)
   143  	}
   144  }
   145  

View as plain text