2020import static com .backblaze .b2 .client .B2TestHelpers .fileName ;
2121import static com .backblaze .b2 .client .B2TestHelpers .makeVersion ;
2222import static org .junit .Assert .assertEquals ;
23+ import static org .junit .Assert .assertFalse ;
2324import static org .junit .Assert .assertNull ;
2425import static org .junit .Assert .assertSame ;
2526import static org .junit .Assert .assertTrue ;
@@ -67,6 +68,49 @@ public void testOnePage() throws B2Exception {
6768 assertTrue (!iter .hasNext ());
6869 }
6970
71+ @ Test
72+ public void testEmptyPageWithNextFileNameAndVersion () throws B2Exception {
73+ final B2ListFileVersionsRequest request = B2ListFileVersionsRequest
74+ .builder (BUCKET_ID )
75+ .setStart ("file/0000" , fileId (0 ))
76+ .setMaxFileCount (106 )
77+ .setPrefix ("file/" )
78+ .setDelimiter ("/" )
79+ .build ();
80+
81+ // First page is empty, but has a nextFileName
82+ final B2ListFileVersionsResponse pageOneResponse = new B2ListFileVersionsResponse (B2Collections .listOf (), "file/0000" , fileId (3000013 ));
83+ when (client .listFileVersions (request )).thenReturn (pageOneResponse );
84+
85+ // Second page has actual results
86+ final B2ListFileVersionsRequest pageTwoRequest = B2ListFileVersionsRequest
87+ .builder (BUCKET_ID )
88+ .setStart ("file/0000" , fileId (3000013 ))
89+ .setMaxFileCount (106 )
90+ .setPrefix ("file/" )
91+ .setDelimiter ("/" )
92+ .build ();
93+ final List <B2FileVersion > pageTwoVersions = B2Collections .listOf (
94+ makeVersion (3000000 ,3000014 ),
95+ makeVersion (4000000 , 3000015 ),
96+ makeVersion (5000000 , 3000015 ));
97+ final B2ListFileVersionsResponse pageTwoResponse = new B2ListFileVersionsResponse (pageTwoVersions , null , null );
98+ when (client .listFileVersions (pageTwoRequest )).thenReturn (pageTwoResponse );
99+
100+ final Iterator <B2FileVersion > iter = new B2ListFileVersionsIterable (client , request ).iterator ();
101+
102+ // first page.
103+ assertTrue (iter .hasNext ());
104+
105+ // second page
106+ assertSame (pageTwoVersions .get (0 ), iter .next ());
107+ assertTrue (iter .hasNext ());
108+ assertSame (pageTwoVersions .get (1 ), iter .next ());
109+ assertTrue (iter .hasNext ());
110+ assertSame (pageTwoVersions .get (2 ), iter .next ());
111+ assertFalse (iter .hasNext ());
112+ }
113+
70114 @ Test
71115 public void testMultiplePages () throws B2Exception {
72116 // using some arguments here to make sure they're used in first request and that most are propagated.
@@ -130,6 +174,81 @@ public void testMultiplePages() throws B2Exception {
130174 assertTrue (!iter .hasNext ());
131175 }
132176
177+ @ Test
178+ public void testMultiplePagesWithEmptyPageInMiddle () throws B2Exception {
179+ // using some arguments here to make sure they're used in first request and that most are propagated.
180+ final B2ListFileVersionsRequest request = B2ListFileVersionsRequest
181+ .builder (BUCKET_ID )
182+ .setStart ("file/0000" , fileId (0 ))
183+ .setMaxFileCount (106 )
184+ .setPrefix ("file/" )
185+ .setDelimiter ("/" )
186+ .build ();
187+
188+ // when asked, return one answer with a few versions and some nexts.
189+ final List <B2FileVersion > pageOneVersions = B2Collections .listOf (makeVersion (1 , 1 ), makeVersion (2 , 1 ));
190+ final B2ListFileVersionsResponse pageOneResponse = new B2ListFileVersionsResponse (pageOneVersions , fileName (3 ), fileId (13 ));
191+ when (client .listFileVersions (request )).thenReturn (pageOneResponse );
192+
193+ // Second page is empty, but has a nextFileName (Maybe millions were checked, but
194+ // didn't match; an empty page is returned to prevent the client from timing out)
195+ final B2ListFileVersionsRequest pageTwoRequest = B2ListFileVersionsRequest
196+ .builder (BUCKET_ID )
197+ .setStart (fileName (3 ), fileId (13 ))
198+ .setMaxFileCount (106 )
199+ .setPrefix ("file/" )
200+ .setDelimiter ("/" )
201+ .build ();
202+ final B2ListFileVersionsResponse pageTwoResponse = new B2ListFileVersionsResponse (B2Collections .listOf (), fileName (3000000 ), fileId (5 ));
203+ when (client .listFileVersions (pageTwoRequest )).thenReturn (pageTwoResponse );
204+
205+ // Third page has actual results and a nextFileName
206+ final B2ListFileVersionsRequest pageThreeRequest = B2ListFileVersionsRequest
207+ .builder (BUCKET_ID )
208+ .setStart (fileName (3000000 ), fileId (5 ))
209+ .setMaxFileCount (106 )
210+ .setPrefix ("file/" )
211+ .setDelimiter ("/" )
212+ .build ();
213+ final List <B2FileVersion > pageThreeVersions = B2Collections .listOf (
214+ makeVersion (3 ,3000014 ),
215+ makeVersion (4 , 3000015 ),
216+ makeVersion (5 , 3000015 ));
217+ final B2ListFileVersionsResponse pageThreeResponse = new B2ListFileVersionsResponse (pageThreeVersions , fileName (3000016 ), fileId (5 ));
218+ when (client .listFileVersions (pageThreeRequest )).thenReturn (pageThreeResponse );
219+
220+ // note that we expected to have more cuz pageThreeResponse had 'next's, but it turned out we didn't.
221+ final B2ListFileVersionsRequest pageFourRequest = B2ListFileVersionsRequest
222+ .builder (BUCKET_ID )
223+ .setStart (fileName (3000016 ), fileId (5 ))
224+ .setMaxFileCount (106 )
225+ .setPrefix ("file/" )
226+ .setDelimiter ("/" )
227+ .build ();
228+ final B2ListFileVersionsResponse pageFourResponse = new B2ListFileVersionsResponse (B2Collections .listOf (), null , null );
229+ when (client .listFileVersions (pageFourRequest )).thenReturn (pageFourResponse );
230+
231+ // iter should have two pageOneVersions.
232+ final Iterator <B2FileVersion > iter = new B2ListFileVersionsIterable (client , request ).iterator ();
233+
234+ // first page.
235+ assertTrue (iter .hasNext ());
236+ assertSame (pageOneVersions .get (0 ), iter .next ());
237+ assertTrue (iter .hasNext ());
238+ assertSame (pageOneVersions .get (1 ), iter .next ());
239+ assertTrue (iter .hasNext ());
240+
241+ // third page
242+ //noinspection ConstantConditions
243+ assertTrue (iter .hasNext ());
244+ assertSame (pageThreeVersions .get (0 ), iter .next ());
245+ assertTrue (iter .hasNext ());
246+ assertSame (pageThreeVersions .get (1 ), iter .next ());
247+ assertTrue (iter .hasNext ());
248+ assertSame (pageThreeVersions .get (2 ), iter .next ());
249+ assertFalse (iter .hasNext ());
250+ }
251+
133252 @ Test
134253 public void testOkForNextFileIdToBeNull () throws B2Exception {
135254 final B2ListFileVersionsRequest request = B2ListFileVersionsRequest
@@ -141,6 +260,15 @@ public void testOkForNextFileIdToBeNull() throws B2Exception {
141260 final B2ListFileVersionsResponse smallResponse = new B2ListFileVersionsResponse (versions , fileName (2 ), null );
142261 when (client .listFileVersions (request )).thenReturn (smallResponse );
143262
263+ // note that we expected to have more cuz pageTwoResponse had nextFileName, but it turned out we didn't.
264+ final B2ListFileVersionsRequest pageTwoRequest = B2ListFileVersionsRequest
265+ .builder (BUCKET_ID )
266+ .setStart (fileName (2 ), null )
267+ .build ();
268+ final B2ListFileVersionsResponse pageTwoResponse = new B2ListFileVersionsResponse (B2Collections .listOf (), null , null );
269+ when (client .listFileVersions (pageTwoRequest )).thenReturn (pageTwoResponse );
270+
271+
144272 // iter should have two versions.
145273 final Iterator <B2FileVersion > iter = new B2ListFileVersionsIterable (client , request ).iterator ();
146274 assertTrue (iter .hasNext ());
0 commit comments