diff --git a/dir.go b/dir.go index 56c5fb6..1132dfe 100644 --- a/dir.go +++ b/dir.go @@ -1,7 +1,6 @@ package parcel import ( - "io" "os" "path/filepath" ) @@ -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 { diff --git a/fake/ReadWriteCloser.go b/fake/File.go similarity index 61% rename from fake/ReadWriteCloser.go rename to fake/File.go index 65179dd..fdce641 100644 --- a/fake/ReadWriteCloser.go +++ b/fake/File.go @@ -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 { @@ -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{} @@ -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)) @@ -53,19 +64,19 @@ 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 @@ -73,7 +84,7 @@ func (fake *ReadWriteCloser) ReadReturns(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)) @@ -91,19 +102,19 @@ 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 @@ -111,7 +122,41 @@ func (fake *ReadWriteCloser) WriteReturns(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{}{}) @@ -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 { @@ -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) diff --git a/fake/FileSystem.go b/fake/FileSystem.go index 8b9d671..26db7d0 100644 --- a/fake/FileSystem.go +++ b/fake/FileSystem.go @@ -2,7 +2,6 @@ package fake import ( - "io" "os" "path/filepath" "sync" @@ -20,7 +19,7 @@ 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 @@ -28,7 +27,7 @@ type FileSystem struct { perm os.FileMode } openFileReturns struct { - result1 io.ReadWriteCloser + result1 parcel.File result2 error } invocations map[string][][]interface{} @@ -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 @@ -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} } diff --git a/generator_test.go b/generator_test.go index f2e22d0..4b7e4df 100644 --- a/generator_test.go +++ b/generator_test.go @@ -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) diff --git a/manager.go b/manager.go index ce2879f..9fb93bc 100644 --- a/manager.go +++ b/manager.go @@ -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) diff --git a/model.go b/model.go index 8b67488..bc636d7 100644 --- a/model.go +++ b/model.go @@ -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 @@ -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