github.com/pivotal-cf/go-pivnet/v6@v6.0.2/download/ranger_test.go (about)

     1  package download_test
     2  
     3  import (
     4  	"net/http"
     5  
     6  	"github.com/pivotal-cf/go-pivnet/v6/download"
     7  
     8  	. "github.com/onsi/ginkgo"
     9  	. "github.com/onsi/gomega"
    10  )
    11  
    12  var _ = Describe("BuildRange", func() {
    13  	Context("when an even content length is provided", func() {
    14  		var cr download.Ranger
    15  
    16  		BeforeEach(func() {
    17  			cr = download.NewRanger(10)
    18  		})
    19  
    20  		It("returns an set of byte ranges", func() {
    21  			contentLength := int64(100)
    22  			r, err := cr.BuildRange(contentLength)
    23  			Expect(err).NotTo(HaveOccurred())
    24  
    25  			Expect(r).To(Equal([]download.Range{
    26  				{Lower: 0, Upper: 9, HTTPHeader: http.Header{"Range": []string{"bytes=0-9"}}},
    27  				{Lower: 10, Upper: 19, HTTPHeader: http.Header{"Range": []string{"bytes=10-19"}}},
    28  				{Lower: 20, Upper: 29, HTTPHeader: http.Header{"Range": []string{"bytes=20-29"}}},
    29  				{Lower: 30, Upper: 39, HTTPHeader: http.Header{"Range": []string{"bytes=30-39"}}},
    30  				{Lower: 40, Upper: 49, HTTPHeader: http.Header{"Range": []string{"bytes=40-49"}}},
    31  				{Lower: 50, Upper: 59, HTTPHeader: http.Header{"Range": []string{"bytes=50-59"}}},
    32  				{Lower: 60, Upper: 69, HTTPHeader: http.Header{"Range": []string{"bytes=60-69"}}},
    33  				{Lower: 70, Upper: 79, HTTPHeader: http.Header{"Range": []string{"bytes=70-79"}}},
    34  				{Lower: 80, Upper: 89, HTTPHeader: http.Header{"Range": []string{"bytes=80-89"}}},
    35  				{Lower: 90, Upper: 99, HTTPHeader: http.Header{"Range": []string{"bytes=90-99"}}},
    36  			}))
    37  		})
    38  	})
    39  
    40  	Context("when an odd content length is provided", func() {
    41  		var cr download.Ranger
    42  
    43  		BeforeEach(func() {
    44  			cr = download.NewRanger(10)
    45  		})
    46  
    47  		It("returns the byte ranges", func() {
    48  			contentLength := int64(101)
    49  			r, err := cr.BuildRange(contentLength)
    50  			Expect(err).NotTo(HaveOccurred())
    51  
    52  			Expect(r).To(Equal([]download.Range{
    53  				{Lower: 0, Upper: 9, HTTPHeader: http.Header{"Range": []string{"bytes=0-9"}}},
    54  				{Lower: 10, Upper: 19, HTTPHeader: http.Header{"Range": []string{"bytes=10-19"}}},
    55  				{Lower: 20, Upper: 29, HTTPHeader: http.Header{"Range": []string{"bytes=20-29"}}},
    56  				{Lower: 30, Upper: 39, HTTPHeader: http.Header{"Range": []string{"bytes=30-39"}}},
    57  				{Lower: 40, Upper: 49, HTTPHeader: http.Header{"Range": []string{"bytes=40-49"}}},
    58  				{Lower: 50, Upper: 59, HTTPHeader: http.Header{"Range": []string{"bytes=50-59"}}},
    59  				{Lower: 60, Upper: 69, HTTPHeader: http.Header{"Range": []string{"bytes=60-69"}}},
    60  				{Lower: 70, Upper: 79, HTTPHeader: http.Header{"Range": []string{"bytes=70-79"}}},
    61  				{Lower: 80, Upper: 89, HTTPHeader: http.Header{"Range": []string{"bytes=80-89"}}},
    62  				{Lower: 90, Upper: 100, HTTPHeader: http.Header{"Range": []string{"bytes=90-100"}}},
    63  			}))
    64  		})
    65  	})
    66  
    67  	Context("when content length is less than the number of hunks", func() {
    68  		var cr download.Ranger
    69  
    70  		BeforeEach(func() {
    71  			cr = download.NewRanger(10)
    72  		})
    73  
    74  		It("returns as many byte ranges as possible", func() {
    75  			contentLength := int64(3)
    76  			r, err := cr.BuildRange(contentLength)
    77  			Expect(err).NotTo(HaveOccurred())
    78  
    79  			Expect(r).To(Equal([]download.Range{
    80  				{Lower: 0, Upper: 2, HTTPHeader: http.Header{"Range": []string{"bytes=0-2"}}},
    81  			}))
    82  		})
    83  
    84  		It("returns as many byte ranges as possible", func() {
    85  			contentLength := int64(9)
    86  			r, err := cr.BuildRange(contentLength)
    87  			Expect(err).NotTo(HaveOccurred())
    88  
    89  			Expect(r).To(Equal([]download.Range{
    90  				{Lower: 0, Upper: 1, HTTPHeader: http.Header{"Range": []string{"bytes=0-1"}}},
    91  				{Lower: 2, Upper: 3, HTTPHeader: http.Header{"Range": []string{"bytes=2-3"}}},
    92  				{Lower: 4, Upper: 5, HTTPHeader: http.Header{"Range": []string{"bytes=4-5"}}},
    93  				{Lower: 6, Upper: 8, HTTPHeader: http.Header{"Range": []string{"bytes=6-8"}}},
    94  			}))
    95  		})
    96  	})
    97  
    98  	Context("when an error occurs", func() {
    99  		Context("when the content length is zero", func() {
   100  			var cr download.Ranger
   101  
   102  			BeforeEach(func() {
   103  				cr = download.NewRanger(10)
   104  			})
   105  
   106  			It("returns an error", func() {
   107  				contentLength := int64(0)
   108  				_, err := cr.BuildRange(contentLength)
   109  				Expect(err).To(MatchError("content length cannot be zero"))
   110  			})
   111  		})
   112  	})
   113  })