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 })