| // Copyright 2016 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package vfs_test |
| |
| import ( |
| "fmt" |
| "strings" |
| "testing" |
| "time" |
| |
| "golang.org/x/tools/godoc/vfs" |
| "golang.org/x/tools/godoc/vfs/mapfs" |
| ) |
| |
| func TestNewNameSpace(t *testing.T) { |
| |
| // We will mount this filesystem under /fs1 |
| mount := mapfs.New(map[string]string{"fs1file": "abcdefgh"}) |
| |
| // Existing process. This should give error on Stat("/") |
| t1 := vfs.NameSpace{} |
| t1.Bind("/fs1", mount, "/", vfs.BindReplace) |
| |
| // using NewNameSpace. This should work fine. |
| t2 := vfs.NewNameSpace() |
| t2.Bind("/fs1", mount, "/", vfs.BindReplace) |
| |
| testcases := map[string][]bool{ |
| "/": {false, true}, |
| "/fs1": {true, true}, |
| "/fs1/fs1file": {true, true}, |
| } |
| |
| fss := []vfs.FileSystem{t1, t2} |
| |
| for j, fs := range fss { |
| for k, v := range testcases { |
| _, err := fs.Stat(k) |
| result := err == nil |
| if result != v[j] { |
| t.Errorf("fs: %d, testcase: %s, want: %v, got: %v, err: %s", j, k, v[j], result, err) |
| } |
| } |
| } |
| |
| fi, err := t2.Stat("/") |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| if fi.Name() != "/" { |
| t.Errorf("t2.Name() : want:%s got:%s", "/", fi.Name()) |
| } |
| |
| if !fi.ModTime().IsZero() { |
| t.Errorf("t2.ModTime() : want:%v got:%v", time.Time{}, fi.ModTime()) |
| } |
| } |
| |
| func TestReadDirUnion(t *testing.T) { |
| for _, tc := range []struct { |
| desc string |
| ns vfs.NameSpace |
| path, want string |
| }{ |
| { |
| desc: "no_go_files", |
| ns: func() vfs.NameSpace { |
| rootFs := mapfs.New(map[string]string{ |
| "doc/a.txt": "1", |
| "doc/b.txt": "1", |
| "doc/dir1/d1.txt": "", |
| }) |
| docFs := mapfs.New(map[string]string{ |
| "doc/a.txt": "22", |
| "doc/dir2/d2.txt": "", |
| }) |
| ns := vfs.NameSpace{} |
| ns.Bind("/", rootFs, "/", vfs.BindReplace) |
| ns.Bind("/doc", docFs, "/doc", vfs.BindBefore) |
| return ns |
| }(), |
| path: "/doc", |
| want: "a.txt:2,b.txt:1,dir1:0,dir2:0", |
| }, { |
| desc: "have_go_files", |
| ns: func() vfs.NameSpace { |
| a := mapfs.New(map[string]string{ |
| "src/x/a.txt": "", |
| "src/x/suba/sub.txt": "", |
| }) |
| b := mapfs.New(map[string]string{ |
| "src/x/b.go": "package b", |
| "src/x/subb/sub.txt": "", |
| }) |
| c := mapfs.New(map[string]string{ |
| "src/x/c.txt": "", |
| "src/x/subc/sub.txt": "", |
| }) |
| ns := vfs.NameSpace{} |
| ns.Bind("/", a, "/", vfs.BindReplace) |
| ns.Bind("/", b, "/", vfs.BindAfter) |
| ns.Bind("/", c, "/", vfs.BindAfter) |
| return ns |
| }(), |
| path: "/src/x", |
| want: "b.go:9,suba:0,subb:0,subc:0", |
| }, { |
| desc: "empty_mount", |
| ns: func() vfs.NameSpace { |
| ns := vfs.NameSpace{} |
| ns.Bind("/empty", mapfs.New(nil), "/empty", vfs.BindReplace) |
| return ns |
| }(), |
| path: "/", |
| want: "empty:0", |
| }, |
| } { |
| t.Run(tc.desc, func(t *testing.T) { |
| fis, err := tc.ns.ReadDir(tc.path) |
| if err != nil { |
| t.Fatal(err) |
| } |
| buf := &strings.Builder{} |
| sep := "" |
| for _, fi := range fis { |
| fmt.Fprintf(buf, "%s%s:%d", sep, fi.Name(), fi.Size()) |
| sep = "," |
| } |
| if got := buf.String(); got != tc.want { |
| t.Errorf("got %q; want %q", got, tc.want) |
| } |
| }) |
| } |
| } |