Add missing tests and docs for pkg/fileutils

Signed-off-by: Vincent Demeester <vincent@sbr.pm>
This commit is contained in:
Vincent Demeester 2015-07-12 22:43:42 +02:00
parent 853b7e8274
commit 95d6468e72
2 changed files with 60 additions and 8 deletions

View file

@ -12,11 +12,13 @@ import (
"github.com/Sirupsen/logrus" "github.com/Sirupsen/logrus"
) )
func Exclusion(pattern string) bool { // exclusion return true if the specified pattern is an exclusion
func exclusion(pattern string) bool {
return pattern[0] == '!' return pattern[0] == '!'
} }
func Empty(pattern string) bool { // empty return true if the specified pattern is empty
func empty(pattern string) bool {
return pattern == "" return pattern == ""
} }
@ -35,10 +37,10 @@ func CleanPatterns(patterns []string) ([]string, [][]string, bool, error) {
for _, pattern := range patterns { for _, pattern := range patterns {
// Eliminate leading and trailing whitespace. // Eliminate leading and trailing whitespace.
pattern = strings.TrimSpace(pattern) pattern = strings.TrimSpace(pattern)
if Empty(pattern) { if empty(pattern) {
continue continue
} }
if Exclusion(pattern) { if exclusion(pattern) {
if len(pattern) == 1 { if len(pattern) == 1 {
return nil, nil, false, errors.New("Illegal exclusion pattern: !") return nil, nil, false, errors.New("Illegal exclusion pattern: !")
} }
@ -46,7 +48,7 @@ func CleanPatterns(patterns []string) ([]string, [][]string, bool, error) {
} }
pattern = filepath.Clean(pattern) pattern = filepath.Clean(pattern)
cleanedPatterns = append(cleanedPatterns, pattern) cleanedPatterns = append(cleanedPatterns, pattern)
if Exclusion(pattern) { if exclusion(pattern) {
pattern = pattern[1:] pattern = pattern[1:]
} }
patternDirs = append(patternDirs, strings.Split(pattern, "/")) patternDirs = append(patternDirs, strings.Split(pattern, "/"))
@ -86,7 +88,7 @@ func OptimizedMatches(file string, patterns []string, patDirs [][]string) (bool,
for i, pattern := range patterns { for i, pattern := range patterns {
negative := false negative := false
if Exclusion(pattern) { if exclusion(pattern) {
negative = true negative = true
pattern = pattern[1:] pattern = pattern[1:]
} }
@ -116,6 +118,9 @@ func OptimizedMatches(file string, patterns []string, patDirs [][]string) (bool,
return matched, nil return matched, nil
} }
// CopyFile copies from src to dst until either EOF is reached
// on src or an error occurs. It verifies src exists and remove
// the dst if it exists.
func CopyFile(src, dst string) (int64, error) { func CopyFile(src, dst string) (int64, error) {
cleanSrc := filepath.Clean(src) cleanSrc := filepath.Clean(src)
cleanDst := filepath.Clean(dst) cleanDst := filepath.Clean(dst)
@ -138,6 +143,8 @@ func CopyFile(src, dst string) (int64, error) {
return io.Copy(df, sf) return io.Copy(df, sf)
} }
// GetTotalUsedFds Returns the number of used File Descriptors by
// reading it via /proc filesystem.
func GetTotalUsedFds() int { func GetTotalUsedFds() int {
if fds, err := ioutil.ReadDir(fmt.Sprintf("/proc/%d/fd", os.Getpid())); err != nil { if fds, err := ioutil.ReadDir(fmt.Sprintf("/proc/%d/fd", os.Getpid())); err != nil {
logrus.Errorf("Error opening /proc/%d/fd: %s", os.Getpid(), err) logrus.Errorf("Error opening /proc/%d/fd: %s", os.Getpid(), err)

View file

@ -4,6 +4,7 @@ import (
"io/ioutil" "io/ioutil"
"os" "os"
"path" "path"
"path/filepath"
"testing" "testing"
) )
@ -268,7 +269,7 @@ func TestSingleExclamationError(t *testing.T) {
// A string preceded with a ! should return true from Exclusion. // A string preceded with a ! should return true from Exclusion.
func TestExclusion(t *testing.T) { func TestExclusion(t *testing.T) {
exclusion := Exclusion("!") exclusion := exclusion("!")
if !exclusion { if !exclusion {
t.Errorf("failed to get true for a single !, got %v", exclusion) t.Errorf("failed to get true for a single !, got %v", exclusion)
} }
@ -298,7 +299,7 @@ func TestMatchesWithMalformedPatterns(t *testing.T) {
// An empty string should return true from Empty. // An empty string should return true from Empty.
func TestEmpty(t *testing.T) { func TestEmpty(t *testing.T) {
empty := Empty("") empty := empty("")
if !empty { if !empty {
t.Errorf("failed to get true for an empty string, got %v", empty) t.Errorf("failed to get true for an empty string, got %v", empty)
} }
@ -355,3 +356,47 @@ func TestCleanPatternsFolderSplit(t *testing.T) {
t.Errorf("expected first element in dirs slice to be config, got %v", dirs[0][1]) t.Errorf("expected first element in dirs slice to be config, got %v", dirs[0][1])
} }
} }
func TestCreateIfNotExistsDir(t *testing.T) {
tempFolder, err := ioutil.TempDir("", "docker-fileutils-test")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(tempFolder)
folderToCreate := filepath.Join(tempFolder, "tocreate")
if err := CreateIfNotExists(folderToCreate, true); err != nil {
t.Fatal(err)
}
fileinfo, err := os.Stat(folderToCreate)
if err != nil {
t.Fatalf("Should have create a folder, got %v", err)
}
if !fileinfo.IsDir() {
t.Fatalf("Should have been a dir, seems it's not")
}
}
func TestCreateIfNotExistsFile(t *testing.T) {
tempFolder, err := ioutil.TempDir("", "docker-fileutils-test")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(tempFolder)
fileToCreate := filepath.Join(tempFolder, "file/to/create")
if err := CreateIfNotExists(fileToCreate, false); err != nil {
t.Fatal(err)
}
fileinfo, err := os.Stat(fileToCreate)
if err != nil {
t.Fatalf("Should have create a file, got %v", err)
}
if fileinfo.IsDir() {
t.Fatalf("Should have been a file, seems it's not")
}
}