From: John Goerzen Date: Tue, 12 Aug 2008 13:33:27 +0000 (-0500) Subject: Test for failure in readLine and readBytes X-Git-Url: https://code.delx.au/offlineimap/commitdiff_plain/a7b53cef29e68a8f87028cc9300d822322dd9f36 Test for failure in readLine and readBytes --- diff --git a/src/Network/IMAP/Connection.hs b/src/Network/IMAP/Connection.hs index ace53e8..998f0b5 100644 --- a/src/Network/IMAP/Connection.hs +++ b/src/Network/IMAP/Connection.hs @@ -39,13 +39,15 @@ newStringConnection = writeBytes = lwriteBytes, closeConn = return ()} where - lreadBytes count = - do (s,sw) <- get - if genericLength s < count - then fail "EOF in input in readBytes" - else do let (r, s') = genericSplitAt count s - put (s', sw) - return r + lreadBytes count + | count < 0 = fail "readBytes: negative count" + | otherwise = + do (s,sw) <- get + if genericLength s < count + then fail "EOF in input in readBytes" + else do let (r, s') = genericSplitAt count s + put (s', sw) + return r lreadLine = do (s, sw) <- get let (line, remainder) = spanList (\x -> "\r\n" /= take 2 x) s diff --git a/testsrc/TestConnection.hs b/testsrc/TestConnection.hs index 681d45e..275c259 100644 --- a/testsrc/TestConnection.hs +++ b/testsrc/TestConnection.hs @@ -47,15 +47,21 @@ expectedString f = prop_readLine :: [String] -> Property prop_readLine s = - (not (null s)) && (and (map (notElem '\r') s)) ==> + (and (map (notElem '\r') s)) ==> runLinesConnection s readLine @?= - Right (head s, (expectedString (tail s), [])) + if null s + then Left "EOF in input in readLine" + else Right (head s, (expectedString (tail s), [])) -prop_readBytes :: String -> Int -> Property +prop_readBytes :: String -> Int -> Result prop_readBytes s l = - l <= length s && l >= 0 ==> - runStringConnection s (\c -> readBytes c (fromIntegral l)) == - Right (take l s, (drop l s, [])) + runStringConnection s (\c -> readBytes c (fromIntegral l)) @?= + if l < 0 + then Left "readBytes: negative count" + else case compare l (length s) of + EQ -> Right (take l s, (drop l s, [])) + LT -> Right (take l s, (drop l s, [])) + GT -> Left "EOF in input in readBytes" q :: Testable a => String -> a -> HU.Test q = qccheck (defaultConfig {configMaxTest = 250, configMaxFail = 5000})