minio/posix-list-dir_test.go
2016-06-24 14:32:08 -07:00

158 lines
4.3 KiB
Go

/*
* Minio Cloud Storage, (C) 2016 Minio, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package main
import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
"sort"
"testing"
)
// Test to check for different input arguments.
func TestReadDir0(t *testing.T) {
// Check non existent directory.
if _, err := readDir("/tmp/non-existent-directory"); err != errFileNotFound {
t.Fatalf("expected = %s, got: %s", errFileNotFound, err)
}
// Check if file is given.
if _, err := readDir("/etc/issue/mydir"); err != errFileNotFound {
t.Fatalf("expected = %s, got: %s", errFileNotFound, err)
}
// Check if permission denied.
if _, err := readDir("/proc/1/fd"); err == nil {
t.Fatalf("expected = an error, got: nil")
}
}
type result struct {
dir string
entries []string
}
var testResults = []result{}
// Test to read empty directory.
func setupTestReadDir1(t *testing.T) {
// Create unique test directory.
if dir, err := ioutil.TempDir("", "minio-posix-list-dir"); err != nil {
t.Fatal("failed to setup.", err)
} else {
// Add empty entry slice for this test directory.
testResults = append(testResults, result{dir, []string{}})
}
}
// Test to read empty directory with reserved names.
func setupTestReadDir2(t *testing.T) {
// Create unique test directory.
if dir, err := ioutil.TempDir("", "minio-posix-list-dir"); err != nil {
t.Fatal("failed to setup.", err)
} else {
entries := []string{}
// Create a file with reserved name.
for _, reservedName := range posixReservedPrefix {
if err := ioutil.WriteFile(filepath.Join(dir, reservedName), []byte{}, os.ModePerm); err != nil {
// For cleanup, its required to add these entries into test results.
sort.Strings(entries)
testResults = append(testResults, result{dir, entries})
t.Fatal("failed to setup.", err)
}
}
sort.Strings(entries)
// Add entries slice for this test directory.
testResults = append(testResults, result{dir, entries})
}
}
// Test to read non-empty directory.
func setupTestReadDir3(t *testing.T) {
if dir, err := ioutil.TempDir("", "minio-posix-list-dir"); err != nil {
t.Fatal("failed to setup.", err)
} else {
entries := []string{}
for i := 0; i < 10; i++ {
name := fmt.Sprintf("file-%d", i)
entries = append(entries, name)
if err := ioutil.WriteFile(filepath.Join(dir, name), []byte{}, os.ModePerm); err != nil {
// Keep entries sorted for easier comparison.
sort.Strings(entries)
// For cleanup, its required to add these entries into test results.
testResults = append(testResults, result{dir, entries})
t.Fatal("failed to setup.", err)
}
}
// Keep entries sorted for easier comparison.
sort.Strings(entries)
// Add entries slice for this test directory.
testResults = append(testResults, result{dir, entries})
}
}
// teardown - cleans up test directories.
func teardown() {
for _, r := range testResults {
os.RemoveAll(r.dir)
}
}
// checkResult - checks whether entries are got are same as expected entries.
func checkResult(expected []string, got []string) bool {
// If length of expected and got slice are different, the test actually failed.
if len(expected) != len(got) {
return false
}
for i := range expected {
// If entry in expected is not same as entry it got, the test is failed.
if expected[i] != got[i] {
return false
}
}
// expected and got have same entries.
return true
}
// TestReadDir - test function to run various readDir() tests.
func TestReadDir(t *testing.T) {
defer teardown()
setupTestReadDir1(t)
setupTestReadDir2(t)
setupTestReadDir3(t)
for _, r := range testResults {
if entries, err := readDir(r.dir); err != nil {
t.Fatal("failed to run test.", err)
} else {
// Keep entries sorted for easier comparison.
sort.Strings(entries)
if !checkResult(r.entries, entries) {
t.Fatalf("expected = %s, got: %s", r.entries, entries)
}
}
}
}