1// Copyright 2020 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
5package fs_test
6
7import (
8	. "io/fs"
9	"os"
10	"testing"
11	"testing/fstest"
12	"time"
13)
14
15var testFsys = fstest.MapFS{
16	"hello.txt": {
17		Data:    []byte("hello, world"),
18		Mode:    0456,
19		ModTime: time.Now(),
20		Sys:     &sysValue,
21	},
22	"sub/goodbye.txt": {
23		Data:    []byte("goodbye, world"),
24		Mode:    0456,
25		ModTime: time.Now(),
26		Sys:     &sysValue,
27	},
28}
29
30var sysValue int
31
32type readFileOnly struct{ ReadFileFS }
33
34func (readFileOnly) Open(name string) (File, error) { return nil, ErrNotExist }
35
36type openOnly struct{ FS }
37
38func TestReadFile(t *testing.T) {
39	// Test that ReadFile uses the method when present.
40	data, err := ReadFile(readFileOnly{testFsys}, "hello.txt")
41	if string(data) != "hello, world" || err != nil {
42		t.Fatalf(`ReadFile(readFileOnly, "hello.txt") = %q, %v, want %q, nil`, data, err, "hello, world")
43	}
44
45	// Test that ReadFile uses Open when the method is not present.
46	data, err = ReadFile(openOnly{testFsys}, "hello.txt")
47	if string(data) != "hello, world" || err != nil {
48		t.Fatalf(`ReadFile(openOnly, "hello.txt") = %q, %v, want %q, nil`, data, err, "hello, world")
49	}
50
51	// Test that ReadFile on Sub of . works (sub_test checks non-trivial subs).
52	sub, err := Sub(testFsys, ".")
53	if err != nil {
54		t.Fatal(err)
55	}
56	data, err = ReadFile(sub, "hello.txt")
57	if string(data) != "hello, world" || err != nil {
58		t.Fatalf(`ReadFile(sub(.), "hello.txt") = %q, %v, want %q, nil`, data, err, "hello, world")
59	}
60}
61
62func TestReadFilePath(t *testing.T) {
63	fsys := os.DirFS(t.TempDir())
64	_, err1 := ReadFile(fsys, "non-existent")
65	_, err2 := ReadFile(struct{ FS }{fsys}, "non-existent")
66	if s1, s2 := errorPath(err1), errorPath(err2); s1 != s2 {
67		t.Fatalf("s1: %s != s2: %s", s1, s2)
68	}
69}
70