github.com/YousefHaggyHeroku/pack@v1.5.5/internal/blob/downloader_test.go (about) 1 package blob_test 2 3 import ( 4 "context" 5 "io/ioutil" 6 "net/http" 7 "os" 8 "path/filepath" 9 "testing" 10 11 "github.com/heroku/color" 12 "github.com/onsi/gomega/ghttp" 13 "github.com/sclevine/spec" 14 "github.com/sclevine/spec/report" 15 16 "github.com/YousefHaggyHeroku/pack" 17 "github.com/YousefHaggyHeroku/pack/internal/archive" 18 "github.com/YousefHaggyHeroku/pack/internal/blob" 19 "github.com/YousefHaggyHeroku/pack/internal/paths" 20 "github.com/YousefHaggyHeroku/pack/logging" 21 h "github.com/YousefHaggyHeroku/pack/testhelpers" 22 ) 23 24 func TestDownloader(t *testing.T) { 25 color.Disable(true) 26 defer color.Disable(false) 27 spec.Run(t, "Downloader", testDownloader, spec.Sequential(), spec.Report(report.Terminal{})) 28 } 29 30 func testDownloader(t *testing.T, when spec.G, it spec.S) { 31 when("#Download", func() { 32 var ( 33 cacheDir string 34 err error 35 subject pack.Downloader 36 ) 37 38 it.Before(func() { 39 cacheDir, err = ioutil.TempDir("", "cache") 40 h.AssertNil(t, err) 41 subject = blob.NewDownloader(logging.New(ioutil.Discard), cacheDir) 42 }) 43 44 it.After(func() { 45 h.AssertNil(t, os.RemoveAll(cacheDir)) 46 }) 47 48 when("is path", func() { 49 var ( 50 relPath string 51 ) 52 53 it.Before(func() { 54 relPath = filepath.Join("testdata", "blob") 55 }) 56 57 when("is absolute", func() { 58 it("return the absolute path", func() { 59 absPath, err := filepath.Abs(relPath) 60 h.AssertNil(t, err) 61 62 b, err := subject.Download(context.TODO(), absPath) 63 h.AssertNil(t, err) 64 assertBlob(t, b) 65 }) 66 }) 67 68 when("is relative", func() { 69 it("resolves the absolute path", func() { 70 b, err := subject.Download(context.TODO(), relPath) 71 h.AssertNil(t, err) 72 assertBlob(t, b) 73 }) 74 }) 75 76 when("path is a file:// uri", func() { 77 it("resolves the absolute path", func() { 78 absPath, err := filepath.Abs(relPath) 79 h.AssertNil(t, err) 80 81 uri, err := paths.FilePathToURI(absPath) 82 h.AssertNil(t, err) 83 84 b, err := subject.Download(context.TODO(), uri) 85 h.AssertNil(t, err) 86 assertBlob(t, b) 87 }) 88 }) 89 }) 90 91 when("is uri", func() { 92 var ( 93 server *ghttp.Server 94 uri string 95 tgz string 96 ) 97 98 it.Before(func() { 99 server = ghttp.NewServer() 100 uri = server.URL() + "/downloader/somefile.tgz" 101 102 tgz = h.CreateTGZ(t, filepath.Join("testdata", "blob"), "./", 0777) 103 }) 104 105 it.After(func() { 106 os.Remove(tgz) 107 server.Close() 108 }) 109 110 when("uri is valid", func() { 111 it.Before(func() { 112 server.AppendHandlers(func(w http.ResponseWriter, r *http.Request) { 113 w.Header().Add("ETag", "A") 114 http.ServeFile(w, r, tgz) 115 }) 116 117 server.AppendHandlers(func(w http.ResponseWriter, r *http.Request) { 118 w.WriteHeader(304) 119 }) 120 }) 121 122 it("downloads from a 'http(s)://' URI", func() { 123 b, err := subject.Download(context.TODO(), uri) 124 h.AssertNil(t, err) 125 assertBlob(t, b) 126 }) 127 128 it("uses cache from a 'http(s)://' URI tgz", func() { 129 b, err := subject.Download(context.TODO(), uri) 130 h.AssertNil(t, err) 131 assertBlob(t, b) 132 133 b, err = subject.Download(context.TODO(), uri) 134 h.AssertNil(t, err) 135 assertBlob(t, b) 136 }) 137 }) 138 139 when("uri is invalid", func() { 140 when("uri file is not found", func() { 141 it.Before(func() { 142 server.AppendHandlers(func(w http.ResponseWriter, r *http.Request) { 143 w.WriteHeader(404) 144 }) 145 }) 146 147 it("should return error", func() { 148 _, err := subject.Download(context.TODO(), uri) 149 h.AssertError(t, err, "could not download") 150 h.AssertError(t, err, "http status '404'") 151 }) 152 }) 153 154 when("uri is unsupported", func() { 155 it("should return error", func() { 156 _, err := subject.Download(context.TODO(), "not-supported://file.tgz") 157 h.AssertError(t, err, "unsupported protocol 'not-supported'") 158 }) 159 }) 160 }) 161 }) 162 }) 163 } 164 165 func assertBlob(t *testing.T, b blob.Blob) { 166 t.Helper() 167 r, err := b.Open() 168 h.AssertNil(t, err) 169 defer r.Close() 170 171 _, bytes, err := archive.ReadTarEntry(r, "file.txt") 172 h.AssertNil(t, err) 173 174 h.AssertEq(t, string(bytes), "contents") 175 }