@@ -9,6 +9,7 @@ package integration
9
9
import (
10
10
"bytes"
11
11
"context"
12
+ "io"
12
13
"math/rand"
13
14
"runtime"
14
15
"testing"
@@ -29,6 +30,83 @@ func TestGridFS(x *testing.T) {
29
30
mt := mtest .New (x , noClientOpts )
30
31
defer mt .Close ()
31
32
33
+ mt .Run ("skipping download" , func (mt * mtest.T ) {
34
+ data := []byte ("abc.def.ghi" )
35
+ var chunkSize int32 = 4
36
+
37
+ testcases := []struct {
38
+ name string
39
+
40
+ read int
41
+ skip int64
42
+ expectedSkipN int64
43
+ expectedSkipErr error
44
+ expectedRemaining int
45
+ }{
46
+ {
47
+ "read 0, skip 0" , 0 , 0 , 0 , nil , 11 ,
48
+ },
49
+ {
50
+ "read 0, skip to end of chunk" , 0 , 4 , 4 , nil , 7 ,
51
+ },
52
+ {
53
+ "read 0, skip 1" , 0 , 1 , 1 , nil , 10 ,
54
+ },
55
+ {
56
+ "read 1, skip to end of chunk" , 1 , 3 , 3 , nil , 7 ,
57
+ },
58
+ {
59
+ "read all, skip beyond" , 11 , 1 , 0 , nil , 0 ,
60
+ },
61
+ {
62
+ "skip all" , 0 , 11 , 11 , nil , 0 ,
63
+ },
64
+ {
65
+ "read 1, skip to last chunk" , 1 , 8 , 8 , nil , 2 ,
66
+ },
67
+ {
68
+ "read to last chunk, skip to end" , 9 , 2 , 2 , nil , 0 ,
69
+ },
70
+ {
71
+ "read to last chunk, skip beyond" , 9 , 4 , 2 , nil , 0 ,
72
+ },
73
+ }
74
+
75
+ for _ , tc := range testcases {
76
+ mt .Run (tc .name , func (mt * mtest.T ) {
77
+ bucket , err := gridfs .NewBucket (mt .DB , options .GridFSBucket ().SetChunkSizeBytes (chunkSize ))
78
+ assert .Nil (mt , err , "NewBucket error: %v" , err )
79
+
80
+ ustream , err := bucket .OpenUploadStream ("foo" )
81
+ assert .Nil (mt , err , "OpenUploadStream error: %v" , err )
82
+
83
+ id := ustream .FileID
84
+ _ , err = ustream .Write (data )
85
+ assert .Nil (mt , err , "Write error: %v" , err )
86
+ err = ustream .Close ()
87
+ assert .Nil (mt , err , "Close error: %v" , err )
88
+
89
+ dstream , err := bucket .OpenDownloadStream (id )
90
+ assert .Nil (mt , err , "OpenDownloadStream error" )
91
+ dst := make ([]byte , tc .read )
92
+ _ , err = dstream .Read (dst )
93
+ assert .Nil (mt , err , "Read error: %v" , err )
94
+
95
+ n , err := dstream .Skip (tc .skip )
96
+ assert .Equal (mt , tc .expectedSkipErr , err , "expected error on Skip: %v, got %v" , tc .expectedSkipErr , err )
97
+ assert .Equal (mt , tc .expectedSkipN , n , "expected Skip to return: %v, got %v" , tc .expectedSkipN , n )
98
+
99
+ // Read the rest.
100
+ dst = make ([]byte , len (data ))
101
+ remaining , err := dstream .Read (dst )
102
+ if err != nil {
103
+ assert .Equal (mt , err , io .EOF , "unexpected Read error: %v" , err )
104
+ }
105
+ assert .Equal (mt , tc .expectedRemaining , remaining , "expected remaining data to be: %v, got %v" , tc .expectedRemaining , remaining )
106
+ })
107
+ }
108
+ })
109
+
32
110
mt .Run ("index creation" , func (mt * mtest.T ) {
33
111
// Unit tests showing that UploadFromStream creates indexes on the chunks and files collections.
34
112
bucket , err := gridfs .NewBucket (mt .DB )
0 commit comments