diff --git a/utils/download.go b/utils/download.go index b968b5a3..11dbd163 100644 --- a/utils/download.go +++ b/utils/download.go @@ -164,12 +164,15 @@ func DownloadTryCompression(downloader Downloader, url string) (io.Reader, *os.F var err error for _, method := range compressionMethods { - file, err := DownloadTemp(downloader, url+method.extenstion) + var file *os.File + + file, err = DownloadTemp(downloader, url+method.extenstion) if err != nil { continue } - uncompressed, err := method.transformation(file) + var uncompressed io.Reader + uncompressed, err = method.transformation(file) if err != nil { continue } diff --git a/utils/download_test.go b/utils/download_test.go index e7012431..f16db619 100644 --- a/utils/download_test.go +++ b/utils/download_test.go @@ -1,6 +1,8 @@ package utils import ( + "errors" + "io" "io/ioutil" . "launchpad.net/gocheck" "os" @@ -101,3 +103,75 @@ func (s *DownloaderSuite) TestDownloadTempError(c *C) { c.Assert(f, IsNil) c.Assert(err, ErrorMatches, "HTTP code 404.*") } + +const ( + bzipData = "BZh91AY&SY\xcc\xc3q\xd4\x00\x00\x02A\x80\x00\x10\x02\x00\x0c\x00 \x00!\x9ah3M\x19\x97\x8b\xb9\"\x9c(Hfa\xb8\xea\x00" + gzipData = "\x1f\x8b\x08\x00\xc8j\xb0R\x00\x03+I-.\xe1\x02\x00\xc65\xb9;\x05\x00\x00\x00" + rawData = "test" +) + +func (s *DownloaderSuite) TestDownloadTryCompression(c *C) { + var buf []byte + + // bzip2 only available + buf = make([]byte, 4) + d := NewFakeDownloader() + d.ExpectResponse("http://example.com/file.bz2", bzipData) + r, file, err := DownloadTryCompression(d, "http://example.com/file") + c.Assert(err, IsNil) + defer file.Close() + io.ReadFull(r, buf) + c.Assert(string(buf), Equals, rawData) + c.Assert(d.Empty(), Equals, true) + + // bzip2 not available, but gz is + buf = make([]byte, 4) + d = NewFakeDownloader() + d.ExpectError("http://example.com/file.bz2", errors.New("404")) + d.ExpectResponse("http://example.com/file.gz", gzipData) + r, file, err = DownloadTryCompression(d, "http://example.com/file") + c.Assert(err, IsNil) + defer file.Close() + io.ReadFull(r, buf) + c.Assert(string(buf), Equals, rawData) + c.Assert(d.Empty(), Equals, true) + + // bzip2 & gzip not available, but raw is + buf = make([]byte, 4) + d = NewFakeDownloader() + d.ExpectError("http://example.com/file.bz2", errors.New("404")) + d.ExpectError("http://example.com/file.gz", errors.New("404")) + d.ExpectResponse("http://example.com/file", rawData) + r, file, err = DownloadTryCompression(d, "http://example.com/file") + c.Assert(err, IsNil) + defer file.Close() + io.ReadFull(r, buf) + c.Assert(string(buf), Equals, rawData) + c.Assert(d.Empty(), Equals, true) + + // gzip available, but broken + buf = make([]byte, 4) + d = NewFakeDownloader() + d.ExpectError("http://example.com/file.bz2", errors.New("404")) + d.ExpectResponse("http://example.com/file.gz", "x") + d.ExpectResponse("http://example.com/file", "recovered") + r, file, err = DownloadTryCompression(d, "http://example.com/file") + c.Assert(err, IsNil) + defer file.Close() + io.ReadFull(r, buf) + c.Assert(string(buf), Equals, "reco") + c.Assert(d.Empty(), Equals, true) +} + +func (s *DownloaderSuite) TestDownloadTryCompressionErrors(c *C) { + d := NewFakeDownloader() + _, _, err := DownloadTryCompression(d, "http://example.com/file") + c.Assert(err, ErrorMatches, "unexpected request.*") + + d = NewFakeDownloader() + d.ExpectError("http://example.com/file.bz2", errors.New("404")) + d.ExpectError("http://example.com/file.gz", errors.New("404")) + d.ExpectError("http://example.com/file", errors.New("403")) + _, _, err = DownloadTryCompression(d, "http://example.com/file") + c.Assert(err, ErrorMatches, "403") +}