gke-deploy/testservices/os.go (91 lines of code) (raw):

// Package testservices contains fake services used for unit tests. package testservices import ( "context" "fmt" "os" ) // TestOS implements the OSService interface. type TestOS struct { StatResponse map[string]StatResponse ReadDirResponse map[string]ReadDirResponse ReadFileResponse map[string]ReadFileResponse WriteFileResponse map[string]error MkdirAllResponse map[string]error RemoveAllResponse map[string]error TempDirResponse map[string]TempDirResponse } // StatResponse represents a response tuple for a Stat function call. type StatResponse struct { Res os.FileInfo Err error } // ReadDirResponse represents a response tuple for a ReadDir function call. type ReadDirResponse struct { Res []os.FileInfo Err error } // ReadDirResponse represents a response tuple for a ReadFile function call. type ReadFileResponse struct { Res []byte Err error } // TempDirResponse represents a response tuple for a TempDir function call. type TempDirResponse struct { Dir string Err error } // Stat gets a file description for a file filename. func (o *TestOS) Stat(ctx context.Context, filename string) (os.FileInfo, error) { resp, ok := o.StatResponse[filename] if !ok { panic(fmt.Sprintf("Stat has no response for filename %q", filename)) } return resp.Res, resp.Err } // ReadDir gets file descriptions for all files contained in a directory dirname. func (o *TestOS) ReadDir(ctx context.Context, dirname string) ([]os.FileInfo, error) { resp, ok := o.ReadDirResponse[dirname] if !ok { panic(fmt.Sprintf("ReadDir has no response for dirname %q", dirname)) } return resp.Res, resp.Err } // ReadFile gets the entire contents of a file filename as bytes. func (o *TestOS) ReadFile(ctx context.Context, filename string) ([]byte, error) { resp, ok := o.ReadFileResponse[filename] if !ok { panic(fmt.Sprintf("ReadFile has no response for filename %q", filename)) } return resp.Res, resp.Err } // WriteFile writes data to a file. func (o *TestOS) WriteFile(ctx context.Context, filename string, data []byte, perm os.FileMode) error { err, ok := o.WriteFileResponse[filename] if !ok { panic(fmt.Sprintf("WriteFileResponse has no response for filename %q", filename)) } return err } // MkdirAll creates a directory dirname, including all parent directories if they do not exist. func (o *TestOS) MkdirAll(ctx context.Context, dirname string, perm os.FileMode) error { err, ok := o.MkdirAllResponse[dirname] if !ok { panic(fmt.Sprintf("MkdirAllResponse has no response for dirname %q", dirname)) } return err } // RemoveAll removes path and any children it contains. func (o *TestOS) RemoveAll(ctx context.Context, path string) error { err, ok := o.RemoveAllResponse[path] if !ok { panic(fmt.Sprintf("RemoveAllResponse has no response for path %q", path)) } return err } // TempDir creates a new temporary directory in the directory dir. func (o *TestOS) TempDir(ctx context.Context, dir, pattern string) (string, error) { resp, ok := o.TempDirResponse[dir+pattern] if !ok { panic(fmt.Sprintf("TempDirResponse has no response for dir + pattern %q", dir+pattern)) } return resp.Dir, resp.Err } // TestFileInfo implements the os.FileInfo interface. type TestFileInfo struct { // Embed this so we only need to add methods used by testable functions os.FileInfo BaseName string IsDirectory bool } func (fi *TestFileInfo) Name() string { return fi.BaseName } // IsDir returns true if the file is a directory. func (fi *TestFileInfo) IsDir() bool { return fi.IsDirectory }