@@ -400,6 +400,57 @@ func TestDownloadRetry(t *testing.T) {
400400 require .Less (t , azblobRetryTimes , count )
401401}
402402
403+ func TestAzblobSeekToEndShouldNotError (t * testing.T ) {
404+ const fileSize int32 = 16
405+
406+ server := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
407+ t .Log (r .URL )
408+ switch r .Method {
409+ case http .MethodHead :
410+ // Open file request, return file size
411+ header := w .Header ()
412+ header .Add ("Content-Length" , fmt .Sprintf ("%d" , fileSize ))
413+ w .WriteHeader (200 )
414+ case http .MethodGet :
415+ if r .Header .Get ("Range" ) != "" || r .Header .Get ("x-ms-range" ) != "" {
416+ // Seek request, return an error
417+ w .WriteHeader (http .StatusRequestedRangeNotSatisfiable )
418+ } else {
419+ w .WriteHeader (200 )
420+ }
421+ }
422+ }))
423+
424+ defer server .Close ()
425+ t .Log (server .URL )
426+
427+ options := & backuppb.AzureBlobStorage {
428+ Bucket : "test" ,
429+ Prefix : "a/b/" ,
430+ }
431+
432+ ctx := context .Background ()
433+ builder := & fakeClientBuilder {Endpoint : server .URL }
434+ s , err := newAzureBlobStorageWithClientBuilder (ctx , options , builder )
435+ require .NoError (t , err )
436+
437+ r , err := s .Open (ctx , "c" , nil )
438+ require .NoError (t , err )
439+
440+ // Seek to end
441+ offset , err := r .Seek (0 , io .SeekEnd )
442+ require .NoError (t , err )
443+ require .EqualValues (t , fileSize , offset )
444+
445+ // Read after seek to end
446+ buf := make ([]byte , 1 )
447+ n , err := r .Read (buf )
448+ require .Equal (t , 0 , n )
449+ require .Equal (t , io .EOF , err )
450+
451+ require .NoError (t , r .Close ())
452+ }
453+
403454type wr struct {
404455 w ExternalFileWriter
405456 ctx context.Context
0 commit comments