Move rclonetest into go tests for fs module

This commit is contained in:
Nick Craig-Wood
2014-08-03 11:18:25 +01:00
parent d3c16608e4
commit 18439cf2d7
10 changed files with 428 additions and 382 deletions
+32 -28
View File
@@ -10,13 +10,12 @@ import (
"math/rand"
"os"
"strings"
"testing"
"time"
"github.com/ncw/rclone/fs"
)
var Fatalf = log.Fatalf
// Seed the random number generator
func init() {
rand.Seed(time.Now().UnixNano())
@@ -32,30 +31,29 @@ type Item struct {
}
// check the mod time to the given precision
func (i *Item) CheckModTime(obj fs.Object, modTime time.Time) {
func (i *Item) CheckModTime(t *testing.T, obj fs.Object, modTime time.Time, precision time.Duration) {
dt := modTime.Sub(i.ModTime)
precision := obj.Fs().Precision()
if dt >= precision || dt <= -precision {
Fatalf("%s: Modification time difference too big |%s| > %s (%s vs %s)", obj.Remote(), dt, precision, modTime, i.ModTime)
t.Errorf("%s: Modification time difference too big |%s| > %s (%s vs %s) (precision %s)", obj.Remote(), dt, precision, modTime, i.ModTime, precision)
}
}
func (i *Item) Check(obj fs.Object) {
func (i *Item) Check(t *testing.T, obj fs.Object, precision time.Duration) {
if obj == nil {
Fatalf("Object is nil")
t.Fatalf("Object is nil")
}
// Check attributes
Md5sum, err := obj.Md5sum()
if err != nil {
Fatalf("Failed to read md5sum for %q: %v", obj.Remote(), err)
t.Fatalf("Failed to read md5sum for %q: %v", obj.Remote(), err)
}
if i.Md5sum != Md5sum {
Fatalf("%s: Md5sum incorrect - expecting %q got %q", obj.Remote(), i.Md5sum, Md5sum)
t.Errorf("%s: Md5sum incorrect - expecting %q got %q", obj.Remote(), i.Md5sum, Md5sum)
}
if i.Size != obj.Size() {
Fatalf("%s: Size incorrect - expecting %d got %d", obj.Remote(), i.Size, obj.Size())
t.Errorf("%s: Size incorrect - expecting %d got %d", obj.Remote(), i.Size, obj.Size())
}
i.CheckModTime(obj, obj.ModTime())
i.CheckModTime(t, obj, obj.ModTime(), precision)
}
// Represents all items for checking
@@ -78,39 +76,45 @@ func NewItems(items []Item) *Items {
}
// Check off an item
func (is *Items) Find(obj fs.Object) {
func (is *Items) Find(t *testing.T, obj fs.Object, precision time.Duration) {
i, ok := is.byName[obj.Remote()]
if !ok {
Fatalf("Unexpected file %q", obj.Remote())
t.Errorf("Unexpected file %q", obj.Remote())
}
delete(is.byName, obj.Remote())
i.Check(obj)
i.Check(t, obj, precision)
}
// Check all done
func (is *Items) Done() {
func (is *Items) Done(t *testing.T) {
if len(is.byName) != 0 {
for name := range is.byName {
log.Printf("Not found %q", name)
}
Fatalf("%d objects not found", len(is.byName))
t.Errorf("%d objects not found", len(is.byName))
}
}
// Checks the fs to see if it has the expected contents
func CheckListing(f fs.Fs, items []Item) {
func CheckListingWithPrecision(t *testing.T, f fs.Fs, items []Item, precision time.Duration) {
is := NewItems(items)
for obj := range f.List() {
is.Find(obj)
is.Find(t, obj, precision)
}
is.Done()
is.Done(t)
}
// Checks the fs to see if it has the expected contents
func CheckListing(t *testing.T, f fs.Fs, items []Item) {
precision := f.Precision()
CheckListingWithPrecision(t, f, items, precision)
}
// Parse a time string or explode
func Time(timeString string) time.Time {
t, err := time.Parse(time.RFC3339Nano, timeString)
if err != nil {
Fatalf("Failed to parse time %q: %v", timeString, err)
log.Fatalf("Failed to parse time %q: %v", timeString, err)
}
return t
}
@@ -197,25 +201,25 @@ func RandomRemote(remoteName string, subdir bool) (fs.Fs, func(), error) {
return remote, finalise, nil
}
func TestMkdir(remote fs.Fs) {
func TestMkdir(t *testing.T, remote fs.Fs) {
err := fs.Mkdir(remote)
if err != nil {
Fatalf("Mkdir failed: %v", err)
t.Fatalf("Mkdir failed: %v", err)
}
CheckListing(remote, []Item{})
CheckListing(t, remote, []Item{})
}
func TestPurge(remote fs.Fs) {
func TestPurge(t *testing.T, remote fs.Fs) {
err := fs.Purge(remote)
if err != nil {
Fatalf("Purge failed: %v", err)
t.Fatalf("Purge failed: %v", err)
}
CheckListing(remote, []Item{})
CheckListing(t, remote, []Item{})
}
func TestRmdir(remote fs.Fs) {
func TestRmdir(t *testing.T, remote fs.Fs) {
err := fs.Rmdir(remote)
if err != nil {
Fatalf("Rmdir failed: %v", err)
t.Fatalf("Rmdir failed: %v", err)
}
}
+18 -22
View File
@@ -1,8 +1,6 @@
// Generic tests for testing the Fs and Object interfaces
package fstests
// FIXME need to check the limited file system
import (
"bytes"
"crypto/md5"
@@ -58,12 +56,10 @@ func TestInit(t *testing.T) {
if err != nil {
t.Fatalf("Couldn't start FS: %v", err)
}
fstest.Fatalf = t.Fatalf
fstest.TestMkdir(remote)
fstest.TestMkdir(t, remote)
}
func skipIfNotOk(t *testing.T) {
fstest.Fatalf = t.Fatalf
if remote == nil {
t.Skip("FS not configured")
}
@@ -88,7 +84,7 @@ type TestFile struct {
func TestFsRmdirEmpty(t *testing.T) {
skipIfNotOk(t)
fstest.TestRmdir(remote)
fstest.TestRmdir(t, remote)
}
func TestFsRmdirNotFound(t *testing.T) {
@@ -101,13 +97,13 @@ func TestFsRmdirNotFound(t *testing.T) {
func TestFsMkdir(t *testing.T) {
skipIfNotOk(t)
fstest.TestMkdir(remote)
fstest.TestMkdir(remote)
fstest.TestMkdir(t, remote)
fstest.TestMkdir(t, remote)
}
func TestFsListEmpty(t *testing.T) {
skipIfNotOk(t)
fstest.CheckListing(remote, []fstest.Item{})
fstest.CheckListing(t, remote, []fstest.Item{})
}
func TestFsListDirEmpty(t *testing.T) {
@@ -143,10 +139,10 @@ func testPut(t *testing.T, file *fstest.Item) {
t.Fatal("Put error", err)
}
file.Md5sum = hex.EncodeToString(hash.Sum(nil))
file.Check(obj)
file.Check(t, obj, remote.Precision())
// Re-read the object and check again
obj = findObject(t, file.Path)
file.Check(obj)
file.Check(t, obj, remote.Precision())
}
func TestFsPutFile1(t *testing.T) {
@@ -231,18 +227,18 @@ func TestFsListRoot(t *testing.T) {
func TestFsListFile1(t *testing.T) {
skipIfNotOk(t)
fstest.CheckListing(remote, []fstest.Item{file1, file2})
fstest.CheckListing(t, remote, []fstest.Item{file1, file2})
}
func TestFsNewFsObject(t *testing.T) {
skipIfNotOk(t)
obj := findObject(t, file1.Path)
file1.Check(obj)
file1.Check(t, obj, remote.Precision())
}
func TestFsListFile1and2(t *testing.T) {
skipIfNotOk(t)
fstest.CheckListing(remote, []fstest.Item{file1, file2})
fstest.CheckListing(t, remote, []fstest.Item{file1, file2})
}
func TestFsRmdirFull(t *testing.T) {
@@ -307,7 +303,7 @@ func TestObjectMd5sum(t *testing.T) {
func TestObjectModTime(t *testing.T) {
skipIfNotOk(t)
obj := findObject(t, file1.Path)
file1.CheckModTime(obj, obj.ModTime())
file1.CheckModTime(t, obj, obj.ModTime(), remote.Precision())
}
func TestObjectSetModTime(t *testing.T) {
@@ -316,7 +312,7 @@ func TestObjectSetModTime(t *testing.T) {
obj := findObject(t, file1.Path)
obj.SetModTime(newModTime)
file1.ModTime = newModTime
file1.CheckModTime(obj, newModTime)
file1.CheckModTime(t, obj, newModTime, remote.Precision())
// And make a new object and read it from there too
TestObjectModTime(t)
}
@@ -367,10 +363,10 @@ func TestObjectUpdate(t *testing.T) {
t.Fatal("Update error", err)
}
file1.Md5sum = hex.EncodeToString(hash.Sum(nil))
file1.Check(obj)
file1.Check(t, obj, remote.Precision())
// Re-read the object and check again
obj = findObject(t, file1.Path)
file1.Check(obj)
file1.Check(t, obj, remote.Precision())
}
func TestObjectStorable(t *testing.T) {
@@ -390,7 +386,7 @@ func TestLimitedFs(t *testing.T) {
if err != nil {
t.Fatal("Failed to make remote %q: %v", remoteName, err)
}
fstest.CheckListing(fileRemote, []fstest.Item{file2Copy})
fstest.CheckListing(t, fileRemote, []fstest.Item{file2Copy})
_, ok := fileRemote.(*fs.Limited)
if !ok {
t.Errorf("%v is not a fs.Limited", fileRemote)
@@ -404,7 +400,7 @@ func TestLimitedFsNotFound(t *testing.T) {
if err != nil {
t.Fatal("Failed to make remote %q: %v", remoteName, err)
}
fstest.CheckListing(fileRemote, []fstest.Item{})
fstest.CheckListing(t, fileRemote, []fstest.Item{})
_, ok := fileRemote.(*fs.Limited)
if ok {
t.Errorf("%v is is a fs.Limited", fileRemote)
@@ -418,12 +414,12 @@ func TestObjectRemove(t *testing.T) {
if err != nil {
t.Fatal("Remove error", err)
}
fstest.CheckListing(remote, []fstest.Item{file2})
fstest.CheckListing(t, remote, []fstest.Item{file2})
}
func TestObjectPurge(t *testing.T) {
skipIfNotOk(t)
fstest.TestPurge(remote)
fstest.TestPurge(t, remote)
err := fs.Purge(remote)
if err == nil {
t.Fatal("Expecting error after on second purge")