DONOTUSE quickcheck tests do not terminate
authorRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Sun, 23 Jul 2017 16:36:30 +0000 (22:06 +0530)
committerRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Sun, 23 Jul 2017 16:36:30 +0000 (22:06 +0530)
src/FuncTorrent/Bencode.hs
src/FuncTorrent/Metainfo.hs
src/FuncTorrent/Tracker/Types.hs
test/BencodeTests.hs

index f359465c0d4edf684a4432249ea9eb86d023cd33..fd521dcb58a774bbcc384db8da9b7c1b431e4589 100644 (file)
@@ -33,6 +33,7 @@ import Prelude hiding (length, concat)
 
 import Data.ByteString (ByteString, length, concat)
 import Data.ByteString.Char8 (unpack, pack)
+import Data.Char (isLetter, isNumber, isPrint, isAscii)
 import Data.Map.Strict (Map, fromList, toList)
 import Text.ParserCombinators.Parsec
 import qualified Text.Parsec.ByteString as ParsecBS
@@ -44,6 +45,11 @@ data BVal = Bint Integer
           | Bdict (Map String BVal)
             deriving (Ord, Eq, Show)
 
+genNonEmptyString :: Gen String
+genNonEmptyString = arbitrary `suchThat` (\s -> ((s /= "") &&
+                                                 (all isAscii s) &&
+                                                 (all isLetter s)))
+
 instance Arbitrary ByteString where
   arbitrary = pack <$> arbitrary
 
@@ -56,7 +62,7 @@ instance Arbitrary BVal where
                 bval n = oneof [ Bint <$> arbitrary
                                , Bstr <$> arbitrary
                                , Blist <$> vectorOf n (bval (n `div` 4))
-                               , do keys <- vectorOf n arbitrary
+                               , do keys <- vectorOf n genNonEmptyString
                                     vals <- vectorOf n (bval (n `div` 4))
                                     return $ Bdict $ fromList $ zip keys vals ]
 
@@ -152,9 +158,14 @@ bencList = between (char 'l') (char 'e') (many bencVal)
 -- Right (fromList [("publisher",Bstr "bob"),("publisher-webpage",Bstr "www.example.com"),("publisher.location",Bstr "home")])
 bencDict :: ParsecBS.Parser (Map String BVal)
 bencDict = between (char 'd') (char 'e') $ fromList <$> many kvpair
-  where kvpair = do k <- bencStr
+  where kvpair = do k <- bdictKey
                     v <- bencVal
-                    return (unpack k, v)
+                    return (k, v)
+        bdictKey = do
+          ds <- many1 digit <* char ':'
+          s <- count (read ds) alphaNum
+          return s
+
 
 bencVal :: ParsecBS.Parser BVal
 bencVal = Bstr <$> bencStr <|>
@@ -195,4 +206,4 @@ encode (Bdict d) = concat ["d", concat kvlist, "e"]
     where
       kvlist :: [ByteString]
       kvlist = [encPair kv | kv <- toList d]
-      encPair (k, v) = concat [encode . Bstr . pack $ k, encode v]
+      encPair (k, v) = concat [encode (Bstr (pack k)), encode v]
index 898cc54a037b7e009a60a172b9fdf31fc814b98b..13e7979644c085b3b3778cad9478f81e5bbd9036 100644 (file)
@@ -17,6 +17,7 @@
  - along with FuncTorrent; if not,  see <http://www.gnu.org/licenses/>
  -}
 
+{-# LANGUAGE OverloadedStrings #-}
 module FuncTorrent.Metainfo
     (Info(..),
      Metainfo(..),
index 1c47d3191f593471457972497d490555caf549e9..56d56045eb6134f7bcce331ddf9c4a7fb4c9881c 100644 (file)
@@ -28,7 +28,7 @@ module FuncTorrent.Tracker.Types
        , TrackerMsg(..)
        ) where
 
-import Data.ByteString (ByteString)
+
 import Data.Word (Word32)
 import Control.Concurrent.MVar (MVar)
 
index d8896437f9c0efc4a051b6536f94077866d8e419..8e54e93e1e431de55175092bad4e560eaa654b99 100644 (file)
@@ -24,9 +24,13 @@ tests = hspec $ do
         let encoded = encode (Bint i)
             decoded = decode encoded
         in Right (Bint i) == decoded
-  -- describe "Bencode property tests" $ do
-  --   it "encode/decode" $ do
-  --     property $ \bval ->
-  --       let encoded = encode bval
-  --           decoded = decode encoded
-  --       in Right bval == decoded
+    it "encode/decode blist tests" $ do
+      property $ \bval ->
+        let encoded = encode (Blist (take 1 bval))
+            decoded = decode encoded
+        in Right (Blist (take 1 bval)) == decoded
+    -- it "encode/decode" $ do
+    --   property $ \bval ->
+    --     let encoded = encode bval
+    --         decoded = decode encoded
+    --     in Right bval == decoded