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  }