From c88874a89db54402dbf6bdd56f6d0306f4303e53 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 10 Aug 2014 14:52:58 -0400 Subject: testremote: Add testing of behavior when remote is not available Added a mkUnavailable method, which a Remote can use to generate a version of itself that is not available. Implemented for several, but not yet all remotes. This allows testing that checkPresent properly throws an exceptions when it cannot check if a key is present or not. It also allows testing that the other methods don't throw exceptions in these circumstances. This immediately found several bugs, which this commit also fixes! * git remotes using ssh accidentially had checkPresent return an exception, rather than throwing it * The chunking code accidentially returned False rather than propigating an exception when there were no chunks and checkPresent threw an exception for the non-chunked key. This commit was sponsored by Carlo Matteo Capocasa. --- Remote/Helper/Chunked.hs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'Remote/Helper/Chunked.hs') diff --git a/Remote/Helper/Chunked.hs b/Remote/Helper/Chunked.hs index 5e4ea111f..271978658 100644 --- a/Remote/Helper/Chunked.hs +++ b/Remote/Helper/Chunked.hs @@ -348,11 +348,12 @@ checkPresentChunks checker u chunkconfig encryptor basek v <- check basek case v of Right True -> return True + Left e -> checklists (Just e) =<< chunkKeysOnly u basek _ -> checklists Nothing =<< chunkKeysOnly u basek | otherwise = checklists Nothing =<< chunkKeys u chunkconfig basek where checklists Nothing [] = return False - checklists (Just deferrederror) [] = error deferrederror + checklists (Just deferrederror) [] = throwM deferrederror checklists d (l:ls) | not (null l) = do v <- checkchunks l @@ -362,14 +363,14 @@ checkPresentChunks checker u chunkconfig encryptor basek Right False -> checklists Nothing ls | otherwise = checklists d ls - checkchunks :: [Key] -> Annex (Either String Bool) + checkchunks :: [Key] -> Annex (Either SomeException Bool) checkchunks [] = return (Right True) checkchunks (k:ks) = do v <- check k case v of Right True -> checkchunks ks Right False -> return $ Right False - Left e -> return $ Left $ show e + Left e -> return $ Left e check = tryNonAsync . checker . encryptor -- cgit v1.2.3