Jay Conrod | 7c411de | 2019-09-27 17:11:20 -0400 | [diff] [blame] | 1 | // Copyright 2016 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 vfs_test |
| 6 | |
| 7 | import ( |
| 8 | "fmt" |
| 9 | "strings" |
| 10 | "testing" |
| 11 | "time" |
| 12 | |
| 13 | "golang.org/x/tools/godoc/vfs" |
| 14 | "golang.org/x/tools/godoc/vfs/mapfs" |
| 15 | ) |
| 16 | |
| 17 | func TestNewNameSpace(t *testing.T) { |
| 18 | |
| 19 | // We will mount this filesystem under /fs1 |
| 20 | mount := mapfs.New(map[string]string{"fs1file": "abcdefgh"}) |
| 21 | |
| 22 | // Existing process. This should give error on Stat("/") |
| 23 | t1 := vfs.NameSpace{} |
| 24 | t1.Bind("/fs1", mount, "/", vfs.BindReplace) |
| 25 | |
| 26 | // using NewNameSpace. This should work fine. |
| 27 | t2 := vfs.NewNameSpace() |
| 28 | t2.Bind("/fs1", mount, "/", vfs.BindReplace) |
| 29 | |
| 30 | testcases := map[string][]bool{ |
| 31 | "/": {false, true}, |
| 32 | "/fs1": {true, true}, |
| 33 | "/fs1/fs1file": {true, true}, |
| 34 | } |
| 35 | |
| 36 | fss := []vfs.FileSystem{t1, t2} |
| 37 | |
| 38 | for j, fs := range fss { |
| 39 | for k, v := range testcases { |
| 40 | _, err := fs.Stat(k) |
| 41 | result := err == nil |
| 42 | if result != v[j] { |
| 43 | t.Errorf("fs: %d, testcase: %s, want: %v, got: %v, err: %s", j, k, v[j], result, err) |
| 44 | } |
| 45 | } |
| 46 | } |
| 47 | |
| 48 | fi, err := t2.Stat("/") |
| 49 | if err != nil { |
| 50 | t.Fatal(err) |
| 51 | } |
| 52 | |
| 53 | if fi.Name() != "/" { |
| 54 | t.Errorf("t2.Name() : want:%s got:%s", "/", fi.Name()) |
| 55 | } |
| 56 | |
| 57 | if !fi.ModTime().IsZero() { |
| 58 | t.Errorf("t2.ModTime() : want:%v got:%v", time.Time{}, fi.ModTime()) |
| 59 | } |
| 60 | } |
| 61 | |
| 62 | func TestReadDirUnion(t *testing.T) { |
| 63 | for _, tc := range []struct { |
| 64 | desc string |
| 65 | ns vfs.NameSpace |
| 66 | path, want string |
| 67 | }{ |
| 68 | { |
| 69 | desc: "no_go_files", |
| 70 | ns: func() vfs.NameSpace { |
| 71 | rootFs := mapfs.New(map[string]string{ |
| 72 | "doc/a.txt": "1", |
| 73 | "doc/b.txt": "1", |
| 74 | "doc/dir1/d1.txt": "", |
| 75 | }) |
| 76 | docFs := mapfs.New(map[string]string{ |
| 77 | "doc/a.txt": "22", |
| 78 | "doc/dir2/d2.txt": "", |
| 79 | }) |
| 80 | ns := vfs.NameSpace{} |
| 81 | ns.Bind("/", rootFs, "/", vfs.BindReplace) |
| 82 | ns.Bind("/doc", docFs, "/doc", vfs.BindBefore) |
| 83 | return ns |
| 84 | }(), |
| 85 | path: "/doc", |
| 86 | want: "a.txt:2,b.txt:1,dir1:0,dir2:0", |
| 87 | }, { |
| 88 | desc: "have_go_files", |
| 89 | ns: func() vfs.NameSpace { |
| 90 | a := mapfs.New(map[string]string{ |
| 91 | "src/x/a.txt": "", |
| 92 | "src/x/suba/sub.txt": "", |
| 93 | }) |
| 94 | b := mapfs.New(map[string]string{ |
| 95 | "src/x/b.go": "package b", |
| 96 | "src/x/subb/sub.txt": "", |
| 97 | }) |
| 98 | c := mapfs.New(map[string]string{ |
| 99 | "src/x/c.txt": "", |
| 100 | "src/x/subc/sub.txt": "", |
| 101 | }) |
| 102 | ns := vfs.NameSpace{} |
| 103 | ns.Bind("/", a, "/", vfs.BindReplace) |
| 104 | ns.Bind("/", b, "/", vfs.BindAfter) |
| 105 | ns.Bind("/", c, "/", vfs.BindAfter) |
| 106 | return ns |
| 107 | }(), |
| 108 | path: "/src/x", |
| 109 | want: "b.go:9,suba:0,subb:0,subc:0", |
| 110 | }, { |
| 111 | desc: "empty_mount", |
| 112 | ns: func() vfs.NameSpace { |
| 113 | ns := vfs.NameSpace{} |
| 114 | ns.Bind("/empty", mapfs.New(nil), "/empty", vfs.BindReplace) |
| 115 | return ns |
| 116 | }(), |
| 117 | path: "/", |
| 118 | want: "empty:0", |
| 119 | }, |
| 120 | } { |
| 121 | t.Run(tc.desc, func(t *testing.T) { |
| 122 | fis, err := tc.ns.ReadDir(tc.path) |
| 123 | if err != nil { |
| 124 | t.Fatal(err) |
| 125 | } |
| 126 | buf := &strings.Builder{} |
| 127 | sep := "" |
| 128 | for _, fi := range fis { |
| 129 | fmt.Fprintf(buf, "%s%s:%d", sep, fi.Name(), fi.Size()) |
| 130 | sep = "," |
| 131 | } |
| 132 | if got := buf.String(); got != tc.want { |
| 133 | t.Errorf("got %q; want %q", got, tc.want) |
| 134 | } |
| 135 | }) |
| 136 | } |
| 137 | } |