From ac4100f4f9ed09fcba4c482f3c245fc5837324b1 Mon Sep 17 00:00:00 2001
From: Jaseem Abid <jaseemabid@gmail.com>
Date: Sun, 22 Mar 2015 23:30:46 +0530
Subject: [PATCH] Fix tracker response test

---
 src/FuncTorrent/Peer.hs | 34 +++++++++++++++++-----------------
 test/Test.hs            | 18 +++++++++---------
 2 files changed, 26 insertions(+), 26 deletions(-)

diff --git a/src/FuncTorrent/Peer.hs b/src/FuncTorrent/Peer.hs
index bf5c912..6c27019 100644
--- a/src/FuncTorrent/Peer.hs
+++ b/src/FuncTorrent/Peer.hs
@@ -1,5 +1,5 @@
 module FuncTorrent.Peer
-    (Peer,
+    (Peer(..),
      PeerResp(..),
      getPeerResponse,
      handShakeMsg
@@ -23,13 +23,13 @@ type Address = String
 type Port = Integer
 
 data Peer = Peer Address Port
-            deriving (Show)
+            deriving (Show, Eq)
 
-data PeerResp = PeerResponse { interval :: Maybe Integer
-                             , peers :: [Peer]
-                             , complete :: Maybe Integer
-                             , incomplete :: Maybe Integer
-                             } deriving (Show)
+data PeerResp = PeerResp { interval :: Maybe Integer
+                         , peers :: [Peer]
+                         , complete :: Maybe Integer
+                         , incomplete :: Maybe Integer
+                         } deriving (Show, Eq)
 
 toInt :: String -> Integer
 toInt = read
@@ -42,21 +42,21 @@ getPeerResponse body = case decode body of
                               pl = map (\peer -> let (ip', port') = splitAt 4 peer
                                                  in Peer (toIPNum ip') (toPortNum port'))
                                    (splitN 6 peersBS)
-                          in PeerResponse { interval = Just i
-                                          , peers = pl
-                                          , complete = Nothing
-                                          , incomplete = Nothing
-                                          }
+                          in PeerResp { interval = Just i
+                                      , peers = pl
+                                      , complete = Nothing
+                                      , incomplete = Nothing
+                                      }
                           where toPortNum = read . ("0x" ++) . unpack . B16.encode
                                 toIPNum = intercalate "." .
                                           map (show . toInt . ("0x" ++) . unpack) .
                                           splitN 2 . B16.encode
 
-                        _ -> PeerResponse { interval = Nothing
-                                          , peers = []
-                                          , complete = Nothing
-                                          , incomplete = Nothing
-                                          }
+                        _ -> PeerResp { interval = Nothing
+                                      , peers = []
+                                      , complete = Nothing
+                                      , incomplete = Nothing
+                                      }
 
 
 handShakeMsg :: InfoDict -> String -> ByteString
diff --git a/test/Test.hs b/test/Test.hs
index 4b67b86..4a293ff 100644
--- a/test/Test.hs
+++ b/test/Test.hs
@@ -9,14 +9,16 @@ import Test.Tasty
 import Test.Tasty.HUnit
 
 import FuncTorrent.Bencode (decode, BVal(..))
+import FuncTorrent.Peer (Peer(..), PeerResp(..), getPeerResponse)
 
 -- Initial response from tracker
-response :: BVal
-response = Bdict (fromList [
-                   (Bstr "interval", Bint 900),
-                   (Bstr "peers", Bstr "U\EM\201e\200\213%;\FS\236V\206L\NAK\149+\202\154\US\183!\205\169\203\213\210xVkX\213\239\216\205\ESC\STX[\192\163\152.:>\210\240A\ESCWT\250g\161\ESC%X\195\241\192\200\213X\165=\223\SUB\225V\157\234\243\232\191\213)\137\242\200\213[\nT\195\183]@8\249\183\ESCo\202>\DLEG\234\EM\US+~z\225\216D\169\133H\196.\223\135a\177\229\189\ENQ\166]v\251\203\200\148m\141\200\213m\226\236\160\173\156N:\139\154Y\"\188\244/\186\154\219\203V\204o\204\187Pn(b\ESC\ACKD\187\142\217\227\240Gs\139\180\246YF\169#\173\200\213\185\ETX\135\186*\137X\198\224\202\200\213\183\157A\217#\219W\251\189\150\182XWr\202\174\&0i]:\ENQ\DLE\200\211Yf\tE'<^\159\DC3\222=\167_\FS1\176\229\170\217r:\135\SUB\225O\141\162&\139\222\136\169\&2H\214\143\187C\188\151\200\213Oo\218\&2\209\132>K\137\129\200\213\SO\204\DC4\156-PO\141\162\"_\211R\144\192\a\246\232\212\"\231\nP\204_\225\246\221\200\213|)\237fa*"),
-                   (Bstr "peers6", Bstr "")
-                  ])
+response :: PeerResp
+response = PeerResp {
+             interval = Just 900,
+             peers = [Peer "85.25.201.101" 51413, Peer "37.59.28.236" 22222, Peer "76.21.149.43" 51866, Peer "31.183.33.205" 43467, Peer "213.210.120.86" 27480, Peer "213.239.216.205" 6914, Peer "91.192.163.152" 11834, Peer "62.210.240.65" 6999, Peer "84.250.103.161" 6949, Peer "88.195.241.192" 51413, Peer "88.165.61.223" 6881, Peer "86.157.234.243" 59583, Peer "213.41.137.242" 51413, Peer "91.10.84.195" 46941, Peer "64.56.249.183" 7023, Peer "202.62.16.71" 59929, Peer "31.43.126.122" 57816, Peer "68.169.133.72" 50222, Peer "223.135.97.177" 58813, Peer "5.166.93.118" 64459, Peer "200.148.109.141" 51413, Peer "109.226.236.160" 44444, Peer "78.58.139.154" 22818, Peer "188.244.47.186" 39643, Peer "203.86.204.111" 52411, Peer "80.110.40.98" 6918, Peer "68.187.142.217" 58352, Peer "71.115.139.180" 63065, Peer "70.169.35.173" 51413, Peer "185.3.135.186" 10889, Peer "88.198.224.202" 51413, Peer "183.157.65.217" 9179, Peer "87.251.189.150" 46680, Peer "87.114.202.174" 12393, Peer "93.58.5.16" 51411, Peer "89.102.9.69" 10044, Peer "94.159.19.222" 15783, Peer "95.28.49.176" 58794, Peer "217.114.58.135" 6881, Peer "79.141.162.38" 35806, Peer "136.169.50.72" 54927, Peer "187.67.188.151" 51413, Peer "79.111.218.50" 53636, Peer "62.75.137.129" 51413, Peer "14.204.20.156" 11600, Peer "79.141.162.34" 24531, Peer "82.144.192.7" 63208, Peer "212.34.231.10" 20684, Peer "95.225.246.221" 51413, Peer "124.41.237.102" 24874],
+             complete = Nothing,
+             incomplete = Nothing
+           }
 
 -- Parsed .torrent file
 file :: BVal
@@ -44,9 +46,7 @@ testFile = testCase "Should parse regular torrent files" $ do
 testResponse :: TestTree
 testResponse = testCase "Should parse tracker response" $ do
                str <- readFile "./data/debian-7.8.0-amd64-CD-1.iso.cache"
-               case decode str of
-                 Right expected -> expected @?= response
-                 Left _ -> error "Failed parsing test file"
+               response @?= getPeerResponse str
 
 unitTests :: TestTree
 unitTests = testGroup "Unit tests" [testFile, testResponse]
-- 
2.45.2