Source file src/io/fs/readlink_test.go

     1  // Copyright 2023 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 fs_test
     6  
     7  import (
     8  	. "io/fs"
     9  	"testing"
    10  	"testing/fstest"
    11  )
    12  
    13  func TestReadLink(t *testing.T) {
    14  	testFS := fstest.MapFS{
    15  		"foo": {
    16  			Data: []byte("bar"),
    17  			Mode: ModeSymlink | 0o777,
    18  		},
    19  		"bar": {
    20  			Data: []byte("Hello, World!\n"),
    21  			Mode: 0o644,
    22  		},
    23  
    24  		"dir/parentlink": {
    25  			Data: []byte("../bar"),
    26  			Mode: ModeSymlink | 0o777,
    27  		},
    28  		"dir/link": {
    29  			Data: []byte("file"),
    30  			Mode: ModeSymlink | 0o777,
    31  		},
    32  		"dir/file": {
    33  			Data: []byte("Hello, World!\n"),
    34  			Mode: 0o644,
    35  		},
    36  	}
    37  
    38  	check := func(fsys FS, name string, want string) {
    39  		t.Helper()
    40  		got, err := ReadLink(fsys, name)
    41  		if got != want || err != nil {
    42  			t.Errorf("ReadLink(%q) = %q, %v; want %q, <nil>", name, got, err, want)
    43  		}
    44  	}
    45  
    46  	check(testFS, "foo", "bar")
    47  	check(testFS, "dir/parentlink", "../bar")
    48  	check(testFS, "dir/link", "file")
    49  
    50  	// Test that ReadLink on Sub works.
    51  	sub, err := Sub(testFS, "dir")
    52  	if err != nil {
    53  		t.Fatal(err)
    54  	}
    55  
    56  	check(sub, "link", "file")
    57  	check(sub, "parentlink", "../bar")
    58  }
    59  
    60  func TestLstat(t *testing.T) {
    61  	testFS := fstest.MapFS{
    62  		"foo": {
    63  			Data: []byte("bar"),
    64  			Mode: ModeSymlink | 0o777,
    65  		},
    66  		"bar": {
    67  			Data: []byte("Hello, World!\n"),
    68  			Mode: 0o644,
    69  		},
    70  
    71  		"dir/parentlink": {
    72  			Data: []byte("../bar"),
    73  			Mode: ModeSymlink | 0o777,
    74  		},
    75  		"dir/link": {
    76  			Data: []byte("file"),
    77  			Mode: ModeSymlink | 0o777,
    78  		},
    79  		"dir/file": {
    80  			Data: []byte("Hello, World!\n"),
    81  			Mode: 0o644,
    82  		},
    83  	}
    84  
    85  	check := func(fsys FS, name string, want FileMode) {
    86  		t.Helper()
    87  		info, err := Lstat(fsys, name)
    88  		var got FileMode
    89  		if err == nil {
    90  			got = info.Mode()
    91  		}
    92  		if got != want || err != nil {
    93  			t.Errorf("Lstat(%q) = %v, %v; want %v, <nil>", name, got, err, want)
    94  		}
    95  	}
    96  
    97  	check(testFS, "foo", ModeSymlink|0o777)
    98  	check(testFS, "bar", 0o644)
    99  
   100  	// Test that Lstat on Sub works.
   101  	sub, err := Sub(testFS, "dir")
   102  	if err != nil {
   103  		t.Fatal(err)
   104  	}
   105  	check(sub, "link", ModeSymlink|0o777)
   106  }
   107  

View as plain text