| // Copyright 2018 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 godoc | 
 |  | 
 | import ( | 
 | 	"go/build" | 
 | 	"path/filepath" | 
 | 	"runtime" | 
 | 	"sort" | 
 | 	"testing" | 
 |  | 
 | 	"golang.org/x/tools/godoc/vfs" | 
 | 	"golang.org/x/tools/godoc/vfs/gatefs" | 
 | ) | 
 |  | 
 | func TestNewDirTree(t *testing.T) { | 
 | 	fsGate := make(chan bool, 20) | 
 | 	rootfs := gatefs.New(vfs.OS(runtime.GOROOT()), fsGate) | 
 | 	fs := vfs.NameSpace{} | 
 | 	fs.Bind("/", rootfs, "/", vfs.BindReplace) | 
 |  | 
 | 	c := NewCorpus(fs) | 
 | 	// 3 levels deep is enough for testing | 
 | 	dir := c.newDirectory("/", 3) | 
 |  | 
 | 	processDir(t, dir) | 
 | } | 
 |  | 
 | func processDir(t *testing.T, dir *Directory) { | 
 | 	var list []string | 
 | 	for _, d := range dir.Dirs { | 
 | 		list = append(list, d.Name) | 
 | 		// recursively process the lower level | 
 | 		processDir(t, d) | 
 | 	} | 
 |  | 
 | 	if sort.StringsAreSorted(list) == false { | 
 | 		t.Errorf("list: %v is not sorted\n", list) | 
 | 	} | 
 | } | 
 |  | 
 | func BenchmarkNewDirectory(b *testing.B) { | 
 | 	if testing.Short() { | 
 | 		b.Skip("not running tests requiring large file scan in short mode") | 
 | 	} | 
 |  | 
 | 	fsGate := make(chan bool, 20) | 
 |  | 
 | 	goroot := runtime.GOROOT() | 
 | 	rootfs := gatefs.New(vfs.OS(goroot), fsGate) | 
 | 	fs := vfs.NameSpace{} | 
 | 	fs.Bind("/", rootfs, "/", vfs.BindReplace) | 
 | 	for _, p := range filepath.SplitList(build.Default.GOPATH) { | 
 | 		fs.Bind("/src/golang.org", gatefs.New(vfs.OS(p), fsGate), "/src/golang.org", vfs.BindAfter) | 
 | 	} | 
 | 	b.ResetTimer() | 
 | 	b.ReportAllocs() | 
 | 	for tries := 0; tries < b.N; tries++ { | 
 | 		corpus := NewCorpus(fs) | 
 | 		corpus.newDirectory("/", -1) | 
 | 	} | 
 | } |