| package afero | 
 |  | 
 | import ( | 
 | 	"os" | 
 | 	"path/filepath" | 
 | 	"runtime" | 
 | 	"testing" | 
 | ) | 
 |  | 
 | func TestBasePath(t *testing.T) { | 
 | 	baseFs := &MemMapFs{} | 
 | 	baseFs.MkdirAll("/base/path/tmp", 0777) | 
 | 	bp := NewBasePathFs(baseFs, "/base/path") | 
 |  | 
 | 	if _, err := bp.Create("/tmp/foo"); err != nil { | 
 | 		t.Errorf("Failed to set real path") | 
 | 	} | 
 |  | 
 | 	if fh, err := bp.Create("../tmp/bar"); err == nil { | 
 | 		t.Errorf("succeeded in creating %s ...", fh.Name()) | 
 | 	} | 
 | } | 
 |  | 
 | func TestBasePathRoot(t *testing.T) { | 
 | 	baseFs := &MemMapFs{} | 
 | 	baseFs.MkdirAll("/base/path/foo/baz", 0777) | 
 | 	baseFs.MkdirAll("/base/path/boo/", 0777) | 
 | 	bp := NewBasePathFs(baseFs, "/base/path") | 
 |  | 
 | 	rd, err := ReadDir(bp, string(os.PathSeparator)) | 
 |  | 
 | 	if len(rd) != 2 { | 
 | 		t.Errorf("base path doesn't respect root") | 
 | 	} | 
 |  | 
 | 	if err != nil { | 
 | 		t.Error(err) | 
 | 	} | 
 | } | 
 |  | 
 | func TestRealPath(t *testing.T) { | 
 | 	fs := NewOsFs() | 
 | 	baseDir, err := TempDir(fs, "", "base") | 
 | 	if err != nil { | 
 | 		t.Fatal("error creating tempDir", err) | 
 | 	} | 
 | 	defer fs.RemoveAll(baseDir) | 
 | 	anotherDir, err := TempDir(fs, "", "another") | 
 | 	if err != nil { | 
 | 		t.Fatal("error creating tempDir", err) | 
 | 	} | 
 | 	defer fs.RemoveAll(anotherDir) | 
 |  | 
 | 	bp := NewBasePathFs(fs, baseDir).(*BasePathFs) | 
 |  | 
 | 	subDir := filepath.Join(baseDir, "s1") | 
 |  | 
 | 	realPath, err := bp.RealPath("/s1") | 
 |  | 
 | 	if err != nil { | 
 | 		t.Errorf("Got error %s", err) | 
 | 	} | 
 |  | 
 | 	if realPath != subDir { | 
 | 		t.Errorf("Expected \n%s got \n%s", subDir, realPath) | 
 | 	} | 
 |  | 
 | 	if runtime.GOOS == "windows" { | 
 | 		_, err = bp.RealPath(anotherDir) | 
 |  | 
 | 		if err == nil { | 
 | 			t.Errorf("Expected error") | 
 | 		} | 
 |  | 
 | 	} else { | 
 | 		// on *nix we have no way of just looking at the path and tell that anotherDir | 
 | 		// is not inside the base file system. | 
 | 		// The user will receive an os.ErrNotExist later. | 
 | 		surrealPath, err := bp.RealPath(anotherDir) | 
 |  | 
 | 		if err != nil { | 
 | 			t.Errorf("Got error %s", err) | 
 | 		} | 
 |  | 
 | 		excpected := filepath.Join(baseDir, anotherDir) | 
 |  | 
 | 		if surrealPath != excpected { | 
 | 			t.Errorf("Expected \n%s got \n%s", excpected, surrealPath) | 
 | 		} | 
 | 	} | 
 |  | 
 | } | 
 |  | 
 | func TestNestedBasePaths(t *testing.T) { | 
 | 	type dirSpec struct { | 
 | 		Dir1, Dir2, Dir3 string | 
 | 	} | 
 | 	dirSpecs := []dirSpec{ | 
 | 		dirSpec{Dir1: "/", Dir2: "/", Dir3: "/"}, | 
 | 		dirSpec{Dir1: "/", Dir2: "/path2", Dir3: "/"}, | 
 | 		dirSpec{Dir1: "/path1/dir", Dir2: "/path2/dir/", Dir3: "/path3/dir"}, | 
 | 		dirSpec{Dir1: "C:/path1", Dir2: "path2/dir", Dir3: "/path3/dir/"}, | 
 | 	} | 
 |  | 
 | 	for _, ds := range dirSpecs { | 
 | 		memFs := NewMemMapFs() | 
 | 		level1Fs := NewBasePathFs(memFs, ds.Dir1) | 
 | 		level2Fs := NewBasePathFs(level1Fs, ds.Dir2) | 
 | 		level3Fs := NewBasePathFs(level2Fs, ds.Dir3) | 
 |  | 
 | 		type spec struct { | 
 | 			BaseFs   Fs | 
 | 			FileName string | 
 | 		} | 
 | 		specs := []spec{ | 
 | 			spec{BaseFs: level3Fs, FileName: "f.txt"}, | 
 | 			spec{BaseFs: level2Fs, FileName: "f.txt"}, | 
 | 			spec{BaseFs: level1Fs, FileName: "f.txt"}, | 
 | 		} | 
 |  | 
 | 		for _, s := range specs { | 
 | 			if err := s.BaseFs.MkdirAll(s.FileName, 0755); err != nil { | 
 | 				t.Errorf("Got error %s", err.Error()) | 
 | 			} | 
 | 			if _, err := s.BaseFs.Stat(s.FileName); err != nil { | 
 | 				t.Errorf("Got error %s", err.Error()) | 
 | 			} | 
 |  | 
 | 			if s.BaseFs == level3Fs { | 
 | 				pathToExist := filepath.Join(ds.Dir3, s.FileName) | 
 | 				if _, err := level2Fs.Stat(pathToExist); err != nil { | 
 | 					t.Errorf("Got error %s (path %s)", err.Error(), pathToExist) | 
 | 				} | 
 | 			} else if s.BaseFs == level2Fs { | 
 | 				pathToExist := filepath.Join(ds.Dir2, ds.Dir3, s.FileName) | 
 | 				if _, err := level1Fs.Stat(pathToExist); err != nil { | 
 | 					t.Errorf("Got error %s (path %s)", err.Error(), pathToExist) | 
 | 				} | 
 | 			} | 
 | 		} | 
 | 	} | 
 | } |