github.com/rclone/rclone@v1.66.1-0.20240517100346-7b89735ae726/vfs/vfstest/os.go (about)

     1  package vfstest
     2  
     3  import (
     4  	"os"
     5  	"time"
     6  
     7  	"github.com/rclone/rclone/lib/file"
     8  	"github.com/rclone/rclone/vfs"
     9  )
    10  
    11  // Oser defines the things that the "os" package can do
    12  //
    13  // This covers what the VFS can do also
    14  type Oser interface {
    15  	Chtimes(name string, atime time.Time, mtime time.Time) error
    16  	Create(name string) (vfs.Handle, error)
    17  	Mkdir(name string, perm os.FileMode) error
    18  	Open(name string) (vfs.Handle, error)
    19  	OpenFile(name string, flags int, perm os.FileMode) (fd vfs.Handle, err error)
    20  	ReadDir(dirname string) ([]os.FileInfo, error)
    21  	ReadFile(filename string) (b []byte, err error)
    22  	Remove(name string) error
    23  	Rename(oldName, newName string) error
    24  	Stat(path string) (os.FileInfo, error)
    25  }
    26  
    27  // realOs is an implementation of Oser backed by the "os" package
    28  type realOs struct {
    29  }
    30  
    31  // realOsFile is an implementation of vfs.Handle
    32  type realOsFile struct {
    33  	*os.File
    34  }
    35  
    36  // Flush
    37  func (f realOsFile) Flush() error {
    38  	return nil
    39  }
    40  
    41  // Release
    42  func (f realOsFile) Release() error {
    43  	return f.File.Close()
    44  }
    45  
    46  // Node
    47  func (f realOsFile) Node() vfs.Node {
    48  	return nil
    49  }
    50  
    51  func (f realOsFile) Lock() error {
    52  	return os.ErrInvalid
    53  }
    54  
    55  func (f realOsFile) Unlock() error {
    56  	return os.ErrInvalid
    57  }
    58  
    59  // Chtimes
    60  func (r realOs) Chtimes(name string, atime time.Time, mtime time.Time) error {
    61  	return os.Chtimes(name, atime, mtime)
    62  }
    63  
    64  // Create
    65  func (r realOs) Create(name string) (vfs.Handle, error) {
    66  	fd, err := file.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666)
    67  	if err != nil {
    68  		return nil, err
    69  	}
    70  	return realOsFile{File: fd}, err
    71  }
    72  
    73  // Mkdir
    74  func (r realOs) Mkdir(name string, perm os.FileMode) error {
    75  	return os.Mkdir(name, perm)
    76  }
    77  
    78  // Open
    79  func (r realOs) Open(name string) (vfs.Handle, error) {
    80  	fd, err := os.Open(name)
    81  	if err != nil {
    82  		return nil, err
    83  	}
    84  	return realOsFile{File: fd}, err
    85  }
    86  
    87  // OpenFile
    88  func (r realOs) OpenFile(name string, flags int, perm os.FileMode) (vfs.Handle, error) {
    89  	fd, err := file.OpenFile(name, flags, perm)
    90  	if err != nil {
    91  		return nil, err
    92  	}
    93  	return realOsFile{File: fd}, err
    94  }
    95  
    96  // ReadDir
    97  func (r realOs) ReadDir(dirname string) ([]os.FileInfo, error) {
    98  	entries, err := os.ReadDir(dirname)
    99  	if err != nil {
   100  		return nil, err
   101  	}
   102  	infos := make([]os.FileInfo, 0, len(entries))
   103  	for _, entry := range entries {
   104  		info, err := entry.Info()
   105  		if err != nil {
   106  			return nil, err
   107  		}
   108  		infos = append(infos, info)
   109  	}
   110  	return infos, nil
   111  }
   112  
   113  // ReadFile
   114  func (r realOs) ReadFile(filename string) (b []byte, err error) {
   115  	return os.ReadFile(filename)
   116  }
   117  
   118  // Remove
   119  func (r realOs) Remove(name string) error {
   120  	return os.Remove(name)
   121  }
   122  
   123  // Rename
   124  func (r realOs) Rename(oldName, newName string) error {
   125  	return os.Rename(oldName, newName)
   126  }
   127  
   128  // Stat
   129  func (r realOs) Stat(path string) (os.FileInfo, error) {
   130  	return os.Stat(path)
   131  }
   132  
   133  // Check interfaces
   134  var _ Oser = &realOs{}
   135  var _ vfs.Handle = &realOsFile{}