Skip to content

Commit

Permalink
test: verify .Open can be used concurrently
Browse files Browse the repository at this point in the history
  • Loading branch information
adamdecaf committed Nov 8, 2023
1 parent 5a0b25d commit 80a23bf
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 13 deletions.
4 changes: 2 additions & 2 deletions client.go
Original file line number Diff line number Diff line change
Expand Up @@ -222,10 +222,10 @@ func (cc *client) Open(path string) (*File, error) {
}

// Reader will open the file at path and provide a reader to access its contents.
// Callers need to close the returned Contents
// Callers need to close the returned Contents.
//
// Callers should be aware that network errors while reading can occur since contents
// are streamed from the FTP server. Having multiple open readers may not be supported.
// are streamed from the FTP server. Having multiple open readers is not supported.
func (cc *client) Reader(path string) (*File, error) {
cc.mu.Lock()
defer cc.mu.Unlock()
Expand Down
26 changes: 18 additions & 8 deletions client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"os"
"path/filepath"
"strings"
"sync"
"testing"
"time"

Expand Down Expand Up @@ -47,17 +48,25 @@ func TestClient(t *testing.T) {
t.Run("open larger files", func(t *testing.T) {
largerFileSize := size(t, filepath.Join("testdata", "ftp-server", "bigdata", "large.txt"))

for i := 0; i < 10; i++ {
file, err := client.Open("/bigdata/large.txt")
require.NoError(t, err)
const iterations = 10
var wg sync.WaitGroup
wg.Add(iterations)
for i := 0; i < iterations; i++ {
go func(wg *sync.WaitGroup) {
defer wg.Done()

var buf bytes.Buffer
_, err = io.Copy(&buf, file)
require.NoError(t, err)
file, err := client.Open("/bigdata/large.txt")
require.NoError(t, err)

require.NoError(t, file.Close())
require.Equal(t, largerFileSize, len(buf.Bytes()))
var buf bytes.Buffer
_, err = io.Copy(&buf, file)
require.NoError(t, err)

require.NoError(t, file.Close())
require.Equal(t, largerFileSize, len(buf.Bytes()))
}(&wg)
}
wg.Wait()
})

t.Run("reader", func(t *testing.T) {
Expand All @@ -73,6 +82,7 @@ func TestClient(t *testing.T) {
t.Run("read larger files", func(t *testing.T) {
largerFileSize := size(t, filepath.Join("testdata", "ftp-server", "bigdata", "large.txt"))

// reader must process files in sequence
for i := 0; i < 10; i++ {
file, err := client.Reader("/bigdata/large.txt")
require.NoError(t, err)
Expand Down
8 changes: 5 additions & 3 deletions file.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,16 @@ func (f *File) Close() error {
if f == nil {
return nil
}
if f.Contents != nil {
if err := f.Contents.Close(); err != nil {
return err
}
}
if f.cleanup != nil {
if err := f.cleanup(); err != nil {
return err
}
}
if f.Contents != nil {
return f.Contents.Close()
}
return nil
}

Expand Down

0 comments on commit 80a23bf

Please sign in to comment.