Skip to content

Commit c21dfef

Browse files
committed
Cover CleanedAbs
1 parent 028724d commit c21dfef

File tree

7 files changed

+173
-34
lines changed

7 files changed

+173
-34
lines changed

pkg/fs/fakefs.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,16 @@ func (fs *fakeFs) Open(name string) (File, error) {
102102
return fs.m[name], nil
103103
}
104104

105-
// EvalSymlinks does nothing and cannot fail.
106-
func (fs *fakeFs) EvalSymlinks(path string) (string, error) {
107-
return path, nil
105+
// CleanedAbs does nothing and cannot fail.
106+
func (fs *fakeFs) CleanedAbs(path string) (string, string, error) {
107+
if fs.IsDir(path) {
108+
return path, "", nil
109+
}
110+
d := filepath.Dir(path)
111+
if d == path {
112+
return d, "", nil
113+
}
114+
return d, filepath.Base(path), nil
108115
}
109116

110117
// Exists returns true if file is known.

pkg/fs/fs.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ type FileSystem interface {
3030
RemoveAll(name string) error
3131
Open(name string) (File, error)
3232
IsDir(name string) bool
33-
EvalSymlinks(path string) (string, error)
33+
CleanedAbs(path string) (string, string, error)
3434
Exists(name string) bool
3535
Glob(pattern string) ([]string, error)
3636
ReadFile(name string) ([]byte, error)

pkg/fs/realfs.go

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ limitations under the License.
1717
package fs
1818

1919
import (
20+
"fmt"
2021
"io/ioutil"
22+
"log"
2123
"os"
2224
"path/filepath"
2325
)
@@ -53,9 +55,41 @@ func (realFS) RemoveAll(name string) error {
5355
// Open delegates to os.Open.
5456
func (realFS) Open(name string) (File, error) { return os.Open(name) }
5557

56-
// EvalSymlinks delegates to filepath.EvalSymlinks.
57-
func (realFS) EvalSymlinks(path string) (string, error) {
58-
return filepath.EvalSymlinks(path)
58+
// CleanedAbs returns a cleaned, absolute path
59+
// with no symbolic links split into directory
60+
// and file components. If the entire path is
61+
// a directory, the file component is an empty
62+
// string.
63+
func (x realFS) CleanedAbs(path string) (string, string, error) {
64+
absRoot, err := filepath.Abs(path)
65+
if err != nil {
66+
return "", "", fmt.Errorf(
67+
"abs path error on '%s' : %v", path, err)
68+
}
69+
deLinked, err := filepath.EvalSymlinks(absRoot)
70+
if err != nil {
71+
return "", "", fmt.Errorf(
72+
"evalsymlink failure on '%s' : %v", path, err)
73+
}
74+
if x.IsDir(deLinked) {
75+
return deLinked, "", nil
76+
}
77+
d := filepath.Dir(deLinked)
78+
if !x.IsDir(d) {
79+
// Programmer/assumption error.
80+
log.Fatalf("first part of '%s' not a directory", deLinked)
81+
}
82+
if d == deLinked {
83+
// Programmer/assumption error.
84+
log.Fatalf("d '%s' should be a subset of deLinked", d)
85+
}
86+
f := filepath.Base(deLinked)
87+
if filepath.Join(d, f) != deLinked {
88+
// Programmer/assumption error.
89+
log.Fatalf("these should be equal: '%s', '%s'",
90+
filepath.Join(d, f), deLinked)
91+
}
92+
return d, f, nil
5993
}
6094

6195
// Exists returns true if os.Stat succeeds.

pkg/fs/realfs_test.go

Lines changed: 110 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,17 @@ limitations under the License.
1717
package fs
1818

1919
import (
20+
"io/ioutil"
2021
"os"
2122
"path"
23+
"path/filepath"
2224
"reflect"
2325
"testing"
2426
)
2527

26-
func TestReadFilesRealFS(t *testing.T) {
28+
func makeTestDir(t *testing.T) (FileSystem, string) {
2729
x := MakeRealFS()
28-
testDir := "kustomize_testing_dir"
29-
err := x.Mkdir(testDir)
30-
defer os.RemoveAll(testDir)
31-
30+
testDir, err := ioutil.TempDir("", "kustomize_testing_dir")
3231
if err != nil {
3332
t.Fatalf("unexpected error %s", err)
3433
}
@@ -38,8 +37,113 @@ func TestReadFilesRealFS(t *testing.T) {
3837
if !x.IsDir(testDir) {
3938
t.Fatalf("expected directory")
4039
}
40+
return x, testDir
41+
}
42+
43+
func TestCleanedAbs_1(t *testing.T) {
44+
x, testDir := makeTestDir(t)
45+
defer os.RemoveAll(testDir)
46+
47+
d, f, err := x.CleanedAbs("")
48+
if err != nil {
49+
t.Fatalf("unexpected err=%v", err)
50+
}
51+
wd, err := os.Getwd()
52+
if err != nil {
53+
t.Fatalf("unexpected err=%v", err)
54+
}
55+
if d != wd {
56+
t.Fatalf("unexpected d=%s", d)
57+
}
58+
if f != "" {
59+
t.Fatalf("unexpected f=%s", f)
60+
}
61+
}
62+
63+
func TestCleanedAbs_2(t *testing.T) {
64+
x, testDir := makeTestDir(t)
65+
defer os.RemoveAll(testDir)
66+
67+
d, f, err := x.CleanedAbs("/")
68+
if err != nil {
69+
t.Fatalf("unexpected err=%v", err)
70+
}
71+
if d != "/" {
72+
t.Fatalf("unexpected d=%s", d)
73+
}
74+
if f != "" {
75+
t.Fatalf("unexpected f=%s", f)
76+
}
77+
}
78+
79+
func TestCleanedAbs_3(t *testing.T) {
80+
x, testDir := makeTestDir(t)
81+
defer os.RemoveAll(testDir)
82+
83+
err := x.WriteFile(
84+
filepath.Join(testDir, "foo"), []byte(`foo`))
85+
if err != nil {
86+
t.Fatalf("unexpected err=%v", err)
87+
}
88+
89+
d, f, err := x.CleanedAbs(filepath.Join(testDir, "foo"))
90+
if err != nil {
91+
t.Fatalf("unexpected err=%v", err)
92+
}
93+
if d != testDir {
94+
t.Fatalf("unexpected d=%s", d)
95+
}
96+
if f != "foo" {
97+
t.Fatalf("unexpected f=%s", f)
98+
}
99+
100+
}
101+
102+
func TestCleanedAbs_4(t *testing.T) {
103+
x, testDir := makeTestDir(t)
104+
defer os.RemoveAll(testDir)
105+
106+
err := x.MkdirAll(filepath.Join(testDir, "d1", "d2"))
107+
if err != nil {
108+
t.Fatalf("unexpected err=%v", err)
109+
}
110+
err = x.WriteFile(
111+
filepath.Join(testDir, "d1", "d2", "bar"),
112+
[]byte(`bar`))
113+
if err != nil {
114+
t.Fatalf("unexpected err=%v", err)
115+
}
116+
117+
d, f, err := x.CleanedAbs(
118+
filepath.Join(testDir, "d1", "d2"))
119+
if err != nil {
120+
t.Fatalf("unexpected err=%v", err)
121+
}
122+
if d != filepath.Join(testDir, "d1", "d2") {
123+
t.Fatalf("unexpected d=%s", d)
124+
}
125+
if f != "" {
126+
t.Fatalf("unexpected f=%s", f)
127+
}
128+
129+
d, f, err = x.CleanedAbs(
130+
filepath.Join(testDir, "d1", "d2", "bar"))
131+
if err != nil {
132+
t.Fatalf("unexpected err=%v", err)
133+
}
134+
if d != filepath.Join(testDir, "d1", "d2") {
135+
t.Fatalf("unexpected d=%s", d)
136+
}
137+
if f != "bar" {
138+
t.Fatalf("unexpected f=%s", f)
139+
}
140+
}
141+
142+
func TestReadFilesRealFS(t *testing.T) {
143+
x, testDir := makeTestDir(t)
144+
defer os.RemoveAll(testDir)
41145

42-
err = x.WriteFile(path.Join(testDir, "foo"), []byte(`foo`))
146+
err := x.WriteFile(path.Join(testDir, "foo"), []byte(`foo`))
43147
if err != nil {
44148
t.Fatalf("unexpected error %s", err)
45149
}

pkg/loader/fileloader.go

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -123,11 +123,16 @@ func newFileLoaderAt(
123123
return nil, fmt.Errorf(
124124
"loader root cannot be empty")
125125
}
126-
absRoot, err := cleanedAbs(root, fSys)
126+
absRoot, f, err := fSys.CleanedAbs(root)
127127
if err != nil {
128128
return nil, fmt.Errorf(
129129
"absolute path error in '%s' : %v", root, err)
130130
}
131+
if f != "" {
132+
return nil, fmt.Errorf(
133+
"got file '%s', but '%s' must be a directory to be a root",
134+
f, root)
135+
}
131136
if err := isPathEqualToOrAbove(absRoot, roots); err != nil {
132137
return nil, err
133138
}
@@ -143,22 +148,6 @@ func newFileLoaderAt(
143148
}, nil
144149
}
145150

146-
// cleanedAbs returns a cleaned, absolute path
147-
// with no symbolic links.
148-
func cleanedAbs(path string, fSys fs.FileSystem) (string, error) {
149-
absRoot, err := filepath.Abs(path)
150-
if err != nil {
151-
return "", fmt.Errorf(
152-
"abs path error on '%s' : %v", path, err)
153-
}
154-
deLinked, err := fSys.EvalSymlinks(absRoot)
155-
if err != nil {
156-
return "", fmt.Errorf(
157-
"evalsymlink failure on '%s' : %v", path, err)
158-
}
159-
return deLinked, nil
160-
}
161-
162151
// New returns a new Loader, rooted relative to current loader,
163152
// or rooted in a temp directory holding a git repo clone.
164153
func (l *fileLoader) New(path string) (ifc.Loader, error) {
@@ -226,11 +215,16 @@ func (l *fileLoader) Load(path string) ([]byte, error) {
226215
if filepath.IsAbs(path) {
227216
return nil, l.loadOutOfBounds(path)
228217
}
229-
path, err := cleanedAbs(
230-
filepath.Join(l.Root(), path), l.fSys)
218+
d, f, err := l.fSys.CleanedAbs(
219+
filepath.Join(l.Root(), path))
231220
if err != nil {
232221
return nil, err
233222
}
223+
if f == "" {
224+
return nil, fmt.Errorf(
225+
"'%s' must be a file (got d='%s')", path, d)
226+
}
227+
path = filepath.Join(d, f)
234228
if !l.isInOrBelowRoot(path) {
235229
return nil, l.loadOutOfBounds(path)
236230
}

pkg/loader/fileloader_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ func TestNewFileLoaderAt_DemandsDirectory(t *testing.T) {
7575
if err == nil {
7676
t.Fatalf("Expected error - a file should not work.")
7777
}
78-
if !strings.Contains(err.Error(), "does not exist or is not a directory") {
78+
if !strings.Contains(err.Error(), "must be a directory to be a root") {
7979
t.Fatalf("unexpected err: %v", err)
8080
}
8181
}

pkg/resmap/factory_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ func TestNewFromConfigMaps(t *testing.T) {
145145
expected ResMap
146146
}
147147

148-
l := loadertest.NewFakeLoader("/whatever/project/")
148+
l := loadertest.NewFakeLoader("/whatever/project")
149149
testCases := []testCase{
150150
{
151151
description: "construct config map from env",

0 commit comments

Comments
 (0)