Skip to content
This repository has been archived by the owner on Apr 30, 2021. It is now read-only.

Commit

Permalink
Use File interface as return type of FileSystem.Open
Browse files Browse the repository at this point in the history
  • Loading branch information
Svetlin Ralchev committed Apr 15, 2018
1 parent b0109f6 commit 9be630b
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 28 deletions.
3 changes: 1 addition & 2 deletions dir.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package parcel

import (
"io"
"os"
"path/filepath"
)
Expand All @@ -13,7 +12,7 @@ var _ FileSystem = Dir("")
type Dir string

// OpenFile is the generalized open call; most users will use Open
func (d Dir) OpenFile(name string, flag int, perm os.FileMode) (io.ReadWriteCloser, error) {
func (d Dir) OpenFile(name string, flag int, perm os.FileMode) (File, error) {
dir := filepath.Join(string(d), filepath.Dir(name))

if err := os.MkdirAll(dir, 0700); err != nil {
Expand Down
79 changes: 63 additions & 16 deletions fake/ReadWriteCloser.go → fake/File.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@
package fake

import (
"io"
"sync"

"github.com/phogolabs/parcel"
)

type ReadWriteCloser struct {
type File struct {
ReadStub func(p []byte) (n int, err error)
readMutex sync.RWMutex
readArgsForCall []struct {
Expand All @@ -25,6 +26,16 @@ type ReadWriteCloser struct {
result1 int
result2 error
}
SeekStub func(offset int64, whence int) (int64, error)
seekMutex sync.RWMutex
seekArgsForCall []struct {
offset int64
whence int
}
seekReturns struct {
result1 int64
result2 error
}
CloseStub func() error
closeMutex sync.RWMutex
closeArgsForCall []struct{}
Expand All @@ -35,7 +46,7 @@ type ReadWriteCloser struct {
invocationsMutex sync.RWMutex
}

func (fake *ReadWriteCloser) Read(p []byte) (n int, err error) {
func (fake *File) Read(p []byte) (n int, err error) {
var pCopy []byte
if p != nil {
pCopy = make([]byte, len(p))
Expand All @@ -53,27 +64,27 @@ func (fake *ReadWriteCloser) Read(p []byte) (n int, err error) {
return fake.readReturns.result1, fake.readReturns.result2
}

func (fake *ReadWriteCloser) ReadCallCount() int {
func (fake *File) ReadCallCount() int {
fake.readMutex.RLock()
defer fake.readMutex.RUnlock()
return len(fake.readArgsForCall)
}

func (fake *ReadWriteCloser) ReadArgsForCall(i int) []byte {
func (fake *File) ReadArgsForCall(i int) []byte {
fake.readMutex.RLock()
defer fake.readMutex.RUnlock()
return fake.readArgsForCall[i].p
}

func (fake *ReadWriteCloser) ReadReturns(result1 int, result2 error) {
func (fake *File) ReadReturns(result1 int, result2 error) {
fake.ReadStub = nil
fake.readReturns = struct {
result1 int
result2 error
}{result1, result2}
}

func (fake *ReadWriteCloser) Write(p []byte) (n int, err error) {
func (fake *File) Write(p []byte) (n int, err error) {
var pCopy []byte
if p != nil {
pCopy = make([]byte, len(p))
Expand All @@ -91,27 +102,61 @@ func (fake *ReadWriteCloser) Write(p []byte) (n int, err error) {
return fake.writeReturns.result1, fake.writeReturns.result2
}

func (fake *ReadWriteCloser) WriteCallCount() int {
func (fake *File) WriteCallCount() int {
fake.writeMutex.RLock()
defer fake.writeMutex.RUnlock()
return len(fake.writeArgsForCall)
}

func (fake *ReadWriteCloser) WriteArgsForCall(i int) []byte {
func (fake *File) WriteArgsForCall(i int) []byte {
fake.writeMutex.RLock()
defer fake.writeMutex.RUnlock()
return fake.writeArgsForCall[i].p
}

func (fake *ReadWriteCloser) WriteReturns(result1 int, result2 error) {
func (fake *File) WriteReturns(result1 int, result2 error) {
fake.WriteStub = nil
fake.writeReturns = struct {
result1 int
result2 error
}{result1, result2}
}

func (fake *ReadWriteCloser) Close() error {
func (fake *File) Seek(offset int64, whence int) (int64, error) {
fake.seekMutex.Lock()
fake.seekArgsForCall = append(fake.seekArgsForCall, struct {
offset int64
whence int
}{offset, whence})
fake.recordInvocation("Seek", []interface{}{offset, whence})
fake.seekMutex.Unlock()
if fake.SeekStub != nil {
return fake.SeekStub(offset, whence)
}
return fake.seekReturns.result1, fake.seekReturns.result2
}

func (fake *File) SeekCallCount() int {
fake.seekMutex.RLock()
defer fake.seekMutex.RUnlock()
return len(fake.seekArgsForCall)
}

func (fake *File) SeekArgsForCall(i int) (int64, int) {
fake.seekMutex.RLock()
defer fake.seekMutex.RUnlock()
return fake.seekArgsForCall[i].offset, fake.seekArgsForCall[i].whence
}

func (fake *File) SeekReturns(result1 int64, result2 error) {
fake.SeekStub = nil
fake.seekReturns = struct {
result1 int64
result2 error
}{result1, result2}
}

func (fake *File) Close() error {
fake.closeMutex.Lock()
fake.closeArgsForCall = append(fake.closeArgsForCall, struct{}{})
fake.recordInvocation("Close", []interface{}{})
Expand All @@ -122,32 +167,34 @@ func (fake *ReadWriteCloser) Close() error {
return fake.closeReturns.result1
}

func (fake *ReadWriteCloser) CloseCallCount() int {
func (fake *File) CloseCallCount() int {
fake.closeMutex.RLock()
defer fake.closeMutex.RUnlock()
return len(fake.closeArgsForCall)
}

func (fake *ReadWriteCloser) CloseReturns(result1 error) {
func (fake *File) CloseReturns(result1 error) {
fake.CloseStub = nil
fake.closeReturns = struct {
result1 error
}{result1}
}

func (fake *ReadWriteCloser) Invocations() map[string][][]interface{} {
func (fake *File) Invocations() map[string][][]interface{} {
fake.invocationsMutex.RLock()
defer fake.invocationsMutex.RUnlock()
fake.readMutex.RLock()
defer fake.readMutex.RUnlock()
fake.writeMutex.RLock()
defer fake.writeMutex.RUnlock()
fake.seekMutex.RLock()
defer fake.seekMutex.RUnlock()
fake.closeMutex.RLock()
defer fake.closeMutex.RUnlock()
return fake.invocations
}

func (fake *ReadWriteCloser) recordInvocation(key string, args []interface{}) {
func (fake *File) recordInvocation(key string, args []interface{}) {
fake.invocationsMutex.Lock()
defer fake.invocationsMutex.Unlock()
if fake.invocations == nil {
Expand All @@ -159,4 +206,4 @@ func (fake *ReadWriteCloser) recordInvocation(key string, args []interface{}) {
fake.invocations[key] = append(fake.invocations[key], args)
}

var _ io.ReadWriteCloser = new(ReadWriteCloser)
var _ parcel.File = new(File)
11 changes: 5 additions & 6 deletions fake/FileSystem.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
package fake

import (
"io"
"os"
"path/filepath"
"sync"
Expand All @@ -20,15 +19,15 @@ type FileSystem struct {
walkReturns struct {
result1 error
}
OpenFileStub func(name string, flag int, perm os.FileMode) (io.ReadWriteCloser, error)
OpenFileStub func(name string, flag int, perm os.FileMode) (parcel.File, error)
openFileMutex sync.RWMutex
openFileArgsForCall []struct {
name string
flag int
perm os.FileMode
}
openFileReturns struct {
result1 io.ReadWriteCloser
result1 parcel.File
result2 error
}
invocations map[string][][]interface{}
Expand Down Expand Up @@ -68,7 +67,7 @@ func (fake *FileSystem) WalkReturns(result1 error) {
}{result1}
}

func (fake *FileSystem) OpenFile(name string, flag int, perm os.FileMode) (io.ReadWriteCloser, error) {
func (fake *FileSystem) OpenFile(name string, flag int, perm os.FileMode) (parcel.File, error) {
fake.openFileMutex.Lock()
fake.openFileArgsForCall = append(fake.openFileArgsForCall, struct {
name string
Expand All @@ -95,10 +94,10 @@ func (fake *FileSystem) OpenFileArgsForCall(i int) (string, int, os.FileMode) {
return fake.openFileArgsForCall[i].name, fake.openFileArgsForCall[i].flag, fake.openFileArgsForCall[i].perm
}

func (fake *FileSystem) OpenFileReturns(result1 io.ReadWriteCloser, result2 error) {
func (fake *FileSystem) OpenFileReturns(result1 parcel.File, result2 error) {
fake.OpenFileStub = nil
fake.openFileReturns = struct {
result1 io.ReadWriteCloser
result1 parcel.File
result2 error
}{result1, result2}
}
Expand Down
2 changes: 1 addition & 1 deletion generator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ var _ = Describe("Generator", func() {

Context("when writing the bundle fails", func() {
It("returns the error", func() {
buffer := &fake.ReadWriteCloser{}
buffer := &fake.File{}
buffer.WriteReturns(0, fmt.Errorf("Oh no!"))
fileSystem.OpenFileReturns(buffer, nil)

Expand Down
4 changes: 2 additions & 2 deletions manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,12 +81,12 @@ func (m *Manager) Root(name string) (*Manager, error) {
}

// Open opens an embeded resource for read
func (m *Manager) Open(name string) (io.ReadCloser, error) {
func (m *Manager) Open(name string) (File, error) {
return m.OpenFile(name, 0, 0)
}

// OpenFile is the generalized open call; most users will use Open
func (m *Manager) OpenFile(name string, flag int, perm os.FileMode) (io.ReadWriteCloser, error) {
func (m *Manager) OpenFile(name string, flag int, perm os.FileMode) (File, error) {
if node := find(split(name), m.root); node != nil {
if node.dir {
return nil, fmt.Errorf("Cannot open directory '%s'", name)
Expand Down
3 changes: 2 additions & 1 deletion model.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
)

//go:generate counterfeiter -fake-name FileSystem -o ./fake/FileSystem.go . FileSystem
//go:generate counterfeiter -fake-name File -o ./fake/File.go . File
//go:generate counterfeiter -fake-name Composer -o ./fake/Composer.go . Composer
//go:generate counterfeiter -fake-name Compressor -o ./fake/Compressor.go . Compressor

Expand All @@ -18,7 +19,7 @@ type FileSystem interface {
// directory in the tree, including root.
Walk(dir string, fn filepath.WalkFunc) error
// OpenFile is the generalized open call; most users will use Open
OpenFile(name string, flag int, perm os.FileMode) (io.ReadWriteCloser, error)
OpenFile(name string, flag int, perm os.FileMode) (File, error)
}

// Composer composes the resources
Expand Down

0 comments on commit 9be630b

Please sign in to comment.