diff --git a/utils/download.go b/utils/download.go index 7ba6dd99..469aefbd 100644 --- a/utils/download.go +++ b/utils/download.go @@ -14,7 +14,7 @@ import ( // Downloader is parallel HTTP fetcher type Downloader interface { - Download(url string, destination string) <-chan error + Download(url string, destination string, result chan<- error) Shutdown() } @@ -68,12 +68,8 @@ func (downloader *downloaderImpl) Shutdown() { } // Download starts new download task -func (downloader *downloaderImpl) Download(url string, destination string) <-chan error { - ch := make(chan error, 1) - - downloader.queue <- &downloadTask{url: url, destination: destination, result: ch} - - return ch +func (downloader *downloaderImpl) Download(url string, destination string, result chan<- error) { + downloader.queue <- &downloadTask{url: url, destination: destination, result: result} } // handleTask processes single download task @@ -149,7 +145,8 @@ func DownloadTemp(downloader Downloader, url string) (*os.File, error) { tempfile := filepath.Join(tempdir, "buffer") - ch := downloader.Download(url, tempfile) + ch := make(chan error, 1) + downloader.Download(url, tempfile, ch) err = <-ch if err != nil { diff --git a/utils/download_test.go b/utils/download_test.go index a0e64e5c..63de4aca 100644 --- a/utils/download_test.go +++ b/utils/download_test.go @@ -48,32 +48,40 @@ func (s *DownloaderSuite) TestStartupShutdown(c *C) { func (s *DownloaderSuite) TestDownloadOK(c *C) { d := NewDownloader(2) defer d.Shutdown() + ch := make(chan error) - res := <-d.Download("http://smira.ru/", s.tempfile.Name()) + d.Download("http://smira.ru/", s.tempfile.Name(), ch) + res := <-ch c.Assert(res, IsNil) } func (s *DownloaderSuite) TestDownload404(c *C) { d := NewDownloader(2) defer d.Shutdown() + ch := make(chan error) - res := <-d.Download("http://smira.ru/doesntexist", s.tempfile.Name()) + d.Download("http://smira.ru/doesntexist", s.tempfile.Name(), ch) + res := <-ch c.Assert(res, ErrorMatches, "HTTP code 404.*") } func (s *DownloaderSuite) TestDownloadConnectError(c *C) { d := NewDownloader(2) defer d.Shutdown() + ch := make(chan error) - res := <-d.Download("http://nosuch.smira.ru/", s.tempfile.Name()) + d.Download("http://nosuch.smira.ru/", s.tempfile.Name(), ch) + res := <-ch c.Assert(res, ErrorMatches, ".*no such host") } func (s *DownloaderSuite) TestDownloadFileError(c *C) { d := NewDownloader(2) defer d.Shutdown() + ch := make(chan error) - res := <-d.Download("http://smira.ru/", "/") + d.Download("http://smira.ru/", "/", ch) + res := <-ch c.Assert(res, ErrorMatches, ".*permission denied") } diff --git a/utils/fake.go b/utils/fake.go index 6339dfec..13163e71 100644 --- a/utils/fake.go +++ b/utils/fake.go @@ -47,12 +47,10 @@ func (f *FakeDownloader) Empty() bool { } // Download performs fake download by matching against first expectation in the queue -func (f *FakeDownloader) Download(url string, filename string) <-chan error { - result := make(chan error, 1) - +func (f *FakeDownloader) Download(url string, filename string, result chan<- error) { if len(f.expected) == 0 || f.expected[0].URL != url { result <- fmt.Errorf("unexpected request for %s", url) - return result + return } expected := f.expected[0] @@ -60,24 +58,24 @@ func (f *FakeDownloader) Download(url string, filename string) <-chan error { if expected.Err != nil { result <- expected.Err - return result + return } outfile, err := os.Create(filename) if err != nil { result <- err - return result + return } defer outfile.Close() _, err = outfile.Write([]byte(expected.Response)) if err != nil { result <- err - return result + return } result <- nil - return result + return } // Shutdown does nothing