summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/weepinbell/http/downloader.clj14
-rw-r--r--test/weepinbell/downloader_test.clj15
2 files changed, 20 insertions, 9 deletions
diff --git a/src/weepinbell/http/downloader.clj b/src/weepinbell/http/downloader.clj
index 3b5bdfb..e2d0fba 100644
--- a/src/weepinbell/http/downloader.clj
+++ b/src/weepinbell/http/downloader.clj
@@ -7,10 +7,8 @@
"Download file to destination. Return true if success, false if failed."
[url dest-path]
(try
- (let [file (io/file dest-path)
- parent-dir (.getParentFile file)]
- (when (and parent-dir (not (.exists parent-dir)))
- (.mkdirs parent-dir))
+ (let [file (io/file dest-path)]
+ (io/make-parents file)
(let [response (client/get! url {:as :stream})
status (:status response)]
(if (and status (> status 199) (< status 300))
@@ -25,11 +23,13 @@
(do
(timbre/warn "Download fail. Status: " status)
(when-let [error (:error response)]
- (timbre/error error))))))
+ (timbre/error error))
+ false))))
;; when download failed
- (catch Exception e
+ (catch Throwable e
(timbre/error "Download error:" (.getMessage e))
(timbre/debug e)
- (io/delete-file (io/file dest-path))
+ (when (.exists (io/file dest-path))
+ (io/delete-file (io/file dest-path)))
false)))
diff --git a/test/weepinbell/downloader_test.clj b/test/weepinbell/downloader_test.clj
index 7a2d6b3..469c9ba 100644
--- a/test/weepinbell/downloader_test.clj
+++ b/test/weepinbell/downloader_test.clj
@@ -1,6 +1,7 @@
(ns weepinbell.downloader-test
(:require [weepinbell.http.downloader :refer [download-file]]
[clojure.java.io :as io]
+ [weepinbell.http.client]
[org.httpkit.server :refer [run-server]]
[clojure.test :refer [deftest testing is]]))
@@ -29,5 +30,15 @@
(testing "Downloading a non-existant file"
(let [file-dst (io/file "tmp/should-not-exist.txt")]
(is (not (download-file "https://localhost:18888" file-dst)))
- (is (not (.exists file-dst))))))
-
+ (is (not (.exists file-dst)))))
+ (testing "Exception/Error thrown while downloading"
+ (with-redefs [weepinbell.http.client/get!
+ (fn [& _] (throw (.Error "Test error")))]
+ (is (false? (download-file "" "")))))
+ (testing "Deletes possibly corrupted file when failure is caught"
+ (with-redefs [weepinbell.http.client/get!
+ (fn [& _] (throw (.Error "Test error")))]
+ (let [dest "dest"]
+ (spit dest "CORRUPTED")
+ (is (false? (download-file "" dest)))
+ (is (not (.exists (io/file dest))))))))