// Add an object to the output. // If the function returns true, the operation has been aborted. // Multiple goroutines can safely add objects concurrently. func (lo *ListOpts) Add(obj fs.Object) (abort bool) { remote := obj.Remote() _, err := lo.f.cipher.DecryptFileName(remote) if err != nil { fs.Debug(remote, "Skipping undecryptable file name: %v", err) return lo.ListOpts.IsFinished() } return lo.ListOpts.Add(lo.f.newObject(obj)) }
// read the contents of an object as a string func readObject(t *testing.T, obj fs.Object, options ...fs.OpenOption) string { in, err := obj.Open(options...) require.NoError(t, err) contents, err := ioutil.ReadAll(in) require.NoError(t, err) err = in.Close() require.NoError(t, err) return string(contents) }
// CheckHashes checks all the hashes the object supports are correct func (i *Item) CheckHashes(t *testing.T, obj fs.Object) { require.NotNil(t, obj) types := obj.Fs().Hashes().Array() for _, hash := range types { // Check attributes sum, err := obj.Hash(hash) require.NoError(t, err) assert.True(t, fs.HashEquals(i.Hashes[hash], sum), fmt.Sprintf("%s/%s: %v hash incorrect - expecting %q got %q", obj.Fs().String(), obj.Remote(), hash, i.Hashes[hash], sum)) } }
func newReadFileHandle(o fs.Object) (*ReadFileHandle, error) { r, err := o.Open() if err != nil { return nil, err } return &ReadFileHandle{ r: r, o: o, }, nil }
func newReadFileHandle(o fs.Object) (*ReadFileHandle, error) { r, err := o.Open() if err != nil { return nil, err } fh := &ReadFileHandle{ o: o, r: fs.NewAccount(r, o), // account the transfer } fs.Stats.Transferring(fh.o.Remote()) return fh, nil }
// Check checks all the attributes of the object are correct func (i *Item) Check(t *testing.T, obj fs.Object, precision time.Duration) { i.CheckHashes(t, obj) if i.Size != obj.Size() { t.Errorf("%s/%s: Size incorrect - expecting %d got %d", obj.Fs().String(), obj.Remote(), i.Size, obj.Size()) } i.CheckModTime(t, obj, obj.ModTime(), precision) }
// Check off an item func (is *Items) Find(t *testing.T, obj fs.Object, precision time.Duration) { i, ok := is.byName[obj.Remote()] if !ok { t.Errorf("Unexpected file %q", obj.Remote()) return } delete(is.byName, obj.Remote()) i.Check(t, obj, precision) }
// Find checks off an item func (is *Items) Find(t *testing.T, obj fs.Object, precision time.Duration) { i, ok := is.byName[obj.Remote()] if !ok { i, ok = is.byNameAlt[obj.Remote()] assert.True(t, ok, fmt.Sprintf("Unexpected file %q", obj.Remote())) } delete(is.byName, i.Path) delete(is.byName, i.WinPath) i.Check(t, obj, precision) }
// Check checks all the attributes of the object are correct func (i *Item) Check(t *testing.T, obj fs.Object, precision time.Duration) { i.CheckHashes(t, obj) assert.Equal(t, i.Size, obj.Size()) i.CheckModTime(t, obj, obj.ModTime(), precision) }
// CheckModTime checks the mod time to the given precision func (i *Item) CheckModTime(t *testing.T, obj fs.Object, modTime time.Time, precision time.Duration) { dt, ok := CheckTimeEqualWithPrecision(modTime, i.ModTime, precision) assert.True(t, ok, fmt.Sprintf("%s: Modification time difference too big |%s| > %s (%s vs %s) (precision %s)", obj.Remote(), dt, precision, modTime, i.ModTime, precision)) }
// Check checks all the attributes of the object are correct func (i *Item) Check(t *testing.T, obj fs.Object, precision time.Duration) { if obj == nil { t.Fatalf("Object is nil") } // Check attributes Md5sum, err := obj.Md5sum() if err != nil { t.Fatalf("Failed to read md5sum for %q: %v", obj.Remote(), err) } if !fs.Md5sumsEqual(i.Md5sum, Md5sum) { t.Errorf("%s: Md5sum incorrect - expecting %q got %q", obj.Remote(), i.Md5sum, Md5sum) } if i.Size != obj.Size() { t.Errorf("%s: Size incorrect - expecting %d got %d", obj.Remote(), i.Size, obj.Size()) } i.CheckModTime(t, obj, obj.ModTime(), precision) }
// CheckModTime checks the mod time to the given precision func (i *Item) CheckModTime(t *testing.T, obj fs.Object, modTime time.Time, precision time.Duration) { dt, ok := CheckTimeEqualWithPrecision(modTime, i.ModTime, precision) if !ok { t.Errorf("%s: Modification time difference too big |%s| > %s (%s vs %s) (precision %s)", obj.Remote(), dt, precision, modTime, i.ModTime, precision) } }
// check the mod time to the given precision func (i *Item) CheckModTime(t *testing.T, obj fs.Object, modTime time.Time, precision time.Duration) { dt := modTime.Sub(i.ModTime) if dt >= precision || dt <= -precision { t.Errorf("%s: Modification time difference too big |%s| > %s (%s vs %s) (precision %s)", obj.Remote(), dt, precision, modTime, i.ModTime, precision) } }
// Check checks all the attributes of the object are correct func (i *Item) Check(t *testing.T, obj fs.Object, precision time.Duration) { i.CheckHashes(t, obj) assert.Equal(t, i.Size, obj.Size(), fmt.Sprintf("%s: size incorrect", i.Path)) i.CheckModTime(t, obj, obj.ModTime(), precision) }
// CheckHashes checks all the hashes the object supports are correct func (i *Item) CheckHashes(t *testing.T, obj fs.Object) { if obj == nil { t.Fatalf("Object is nil") } types := obj.Fs().Hashes().Array() for _, hash := range types { // Check attributes sum, err := obj.Hash(hash) if err != nil { t.Fatalf("%s: Failed to read hash %v for %q: %v", obj.Fs().String(), hash, obj.Remote(), err) } if !fs.HashEquals(i.Hashes[hash], sum) { t.Errorf("%s/%s: %v hash incorrect - expecting %q got %q", obj.Fs().String(), obj.Remote(), hash, i.Hashes[hash], sum) } } }
// Check checks all the attributes of the object are correct func (i *Item) Check(t *testing.T, obj fs.Object, precision time.Duration) { if obj == nil { t.Fatalf("Object is nil") } types := obj.Fs().Hashes().Array() for _, hash := range types { // Check attributes sum, err := obj.Hash(hash) if err != nil { t.Fatalf("%s: Failed to read hash %v for %q: %v", obj.Fs().String(), hash, obj.Remote(), err) } if hash == fs.HashMD5 { if !fs.HashEquals(i.Md5sum, sum) { t.Errorf("%s/%s: md5 hash incorrect - expecting %q got %q", obj.Fs().String(), obj.Remote(), i.Md5sum, sum) } } } if i.Size != obj.Size() { t.Errorf("%s/%s: Size incorrect - expecting %d got %d", obj.Fs().String(), obj.Remote(), i.Size, obj.Size()) } i.CheckModTime(t, obj, obj.ModTime(), precision) }