blob: 57d593357a00a70032d37e9b580b690039c99e86 [file] [log] [blame]
// Copyright 2015 The Vanadium 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 envvar
import (
"io/ioutil"
"os"
"path/filepath"
"reflect"
"testing"
)
func mkdir(t *testing.T, d ...string) string {
path := filepath.Join(d...)
if err := os.MkdirAll(path, 0755); err != nil {
t.Fatal(err)
}
return path
}
func mkfile(t *testing.T, dir, file string, perm os.FileMode) string {
path := filepath.Join(dir, file)
f, err := os.OpenFile(path, os.O_CREATE|os.O_EXCL|os.O_WRONLY, perm)
if err != nil {
t.Fatal(err)
}
if err := f.Close(); err != nil {
t.Fatal(err)
}
return path
}
func initTmpDir(t *testing.T) (string, func()) {
tmpDir, err := ioutil.TempDir("", "envvar_lookpath")
if err != nil {
t.Fatal(err)
}
return tmpDir, func() {
if err := os.RemoveAll(tmpDir); err != nil {
t.Error(err)
}
}
}
func TestLookPath(t *testing.T) {
tmpDir, cleanup := initTmpDir(t)
defer cleanup()
dirA, dirB := mkdir(t, tmpDir, "a"), mkdir(t, tmpDir, "b")
aFoo, aBar := mkfile(t, dirA, "foo", 0755), mkfile(t, dirA, "bar", 0755)
bBar, bBaz := mkfile(t, dirB, "bar", 0755), mkfile(t, dirB, "baz", 0755)
_, bExe := mkfile(t, dirA, "exe", 0644), mkfile(t, dirB, "exe", 0755)
tests := []struct {
Dirs []string
Name string
Want string
}{
{nil, "", ""},
{nil, "foo", ""},
{[]string{dirA}, "foo", aFoo},
{[]string{dirA}, "bar", aBar},
{[]string{dirA}, "baz", ""},
{[]string{dirB}, "foo", ""},
{[]string{dirB}, "bar", bBar},
{[]string{dirB}, "baz", bBaz},
{[]string{dirA, dirB}, "foo", aFoo},
{[]string{dirA, dirB}, "bar", aBar},
{[]string{dirA, dirB}, "baz", bBaz},
// Make sure we find bExe, since aExe isn't executable
{[]string{dirA, dirB}, "exe", bExe},
}
for _, test := range tests {
if got, want := LookPath(test.Dirs, test.Name), test.Want; got != want {
t.Errorf("dirs=%v name=%v got %v, want %v", test.Dirs, test.Name, got, want)
}
}
}
func TestLookPathAll(t *testing.T) {
tmpDir, cleanup := initTmpDir(t)
defer cleanup()
dirA, dirB := mkdir(t, tmpDir, "a"), mkdir(t, tmpDir, "b")
aFoo, aBar := mkfile(t, dirA, "foo", 0755), mkfile(t, dirA, "bar", 0755)
bBar, bBaz := mkfile(t, dirB, "bar", 0755), mkfile(t, dirB, "baz", 0755)
aBzz, bBaa := mkfile(t, dirA, "bzz", 0755), mkfile(t, dirB, "baa", 0755)
_, bExe := mkfile(t, dirA, "exe", 0644), mkfile(t, dirB, "exe", 0755)
tests := []struct {
Dirs []string
Prefix string
Names map[string]bool
Want []string
}{
{nil, "", nil, nil},
{nil, "foo", nil, nil},
{[]string{dirA}, "foo", nil, []string{aFoo}},
{[]string{dirA}, "bar", nil, []string{aBar}},
{[]string{dirA}, "baz", nil, nil},
{[]string{dirA}, "f", nil, []string{aFoo}},
{[]string{dirA}, "b", nil, []string{aBar, aBzz}},
{[]string{dirB}, "foo", nil, nil},
{[]string{dirB}, "bar", nil, []string{bBar}},
{[]string{dirB}, "baz", nil, []string{bBaz}},
{[]string{dirB}, "f", nil, nil},
{[]string{dirB}, "b", nil, []string{bBaa, bBar, bBaz}},
{[]string{dirA, dirB}, "foo", nil, []string{aFoo}},
{[]string{dirA, dirB}, "bar", nil, []string{aBar}},
{[]string{dirA, dirB}, "baz", nil, []string{bBaz}},
{[]string{dirA, dirB}, "f", nil, []string{aFoo}},
{[]string{dirA, dirB}, "b", nil, []string{bBaa, aBar, bBaz, aBzz}},
// Don't find baz, since it's already provided.
{[]string{dirA, dirB}, "b", map[string]bool{"baz": true}, []string{bBaa, aBar, aBzz}},
// Make sure we find bExe, since aExe isn't executable
{[]string{dirA, dirB}, "exe", nil, []string{bExe}},
{[]string{dirA, dirB}, "e", nil, []string{bExe}},
}
for _, test := range tests {
if got, want := LookPathAll(test.Dirs, test.Prefix, test.Names), test.Want; !reflect.DeepEqual(got, want) {
t.Errorf("dirs=%v prefix=%v names=%v got %v, want %v", test.Dirs, test.Prefix, test.Names, got, want)
}
}
}