operating/operating.go (72 lines of code) (raw):
package operating
/*
* This file contains structs and functions used as entry points for
* unit testing via dependency injection.
*/
import (
"io"
"io/ioutil"
"os"
"os/user"
"path/filepath"
"time"
)
var (
System = InitializeSystemFunctions()
)
/*
* Structs and functions for mocking out file reading
*/
type ReadCloserAt interface {
io.ReadCloser
io.ReaderAt
}
func OpenFileRead(name string, flag int, perm os.FileMode) (ReadCloserAt, error) {
var reader ReadCloserAt
var err error
reader, err = os.OpenFile(name, flag, perm)
return reader, err
}
func OpenFileWrite(name string, flag int, perm os.FileMode) (io.WriteCloser, error) {
var writer io.WriteCloser
var err error
writer, err = os.OpenFile(name, flag, perm)
return writer, err
}
/*
* SystemFunctions holds function pointers for built-in functions that will need
* to be mocked out for unit testing. All built-in functions manipulating the
* filesystem, shell, or environment should ideally be called through a function
* pointer in System (the global SystemFunctions variable) instead of being called
* directly.
*
* All function pointers in SystemFunctions refer directly to built-in functions
* except for OpenFileRead and OpenFileWrite, which both refer to os.OpenFile but
* return either an io.ReadCloser or io.WriteCloser instead of an *os.File, to make
* mocking file opening in tests easier.
*/
type SystemFunctions struct {
Chmod func(name string, mode os.FileMode) error
CurrentUser func() (*user.User, error)
Getenv func(key string) string
Getpid func() int
Glob func(pattern string) (matches []string, err error)
Hostname func() (string, error)
IsNotExist func(err error) bool
MkdirAll func(path string, perm os.FileMode) error
Now func() time.Time
OpenFileRead func(name string, flag int, perm os.FileMode) (ReadCloserAt, error)
OpenFileWrite func(name string, flag int, perm os.FileMode) (io.WriteCloser, error)
ReadFile func(filename string) ([]byte, error)
Remove func(name string) error
RemoveAll func(name string) error
Stat func(name string) (os.FileInfo, error)
Stdin ReadCloserAt
Stdout io.WriteCloser
TempFile func(dir, pattern string) (f *os.File, err error)
Local *time.Location
}
func InitializeSystemFunctions() *SystemFunctions {
return &SystemFunctions{
Chmod: os.Chmod,
CurrentUser: user.Current,
Getenv: os.Getenv,
Getpid: os.Getpid,
Glob: filepath.Glob,
Hostname: os.Hostname,
IsNotExist: os.IsNotExist,
MkdirAll: os.MkdirAll,
Now: time.Now,
OpenFileRead: OpenFileRead,
OpenFileWrite: OpenFileWrite,
ReadFile: ioutil.ReadFile,
Remove: os.Remove,
RemoveAll: os.RemoveAll,
Stat: os.Stat,
Stdin: os.Stdin,
Stdout: os.Stdout,
TempFile: ioutil.TempFile,
Local: time.Local,
}
}