]> git.rkrishnan.org Git - functorrent.git/blob - test/Test.hs
5205d1c2fe99903a4cbb1b1e11ad6a08b943133a
[functorrent.git] / test / Test.hs
1 {-# LANGUAGE OverloadedStrings #-}
2 module Main where
3
4 import Prelude hiding (readFile)
5 import Data.ByteString.Char8 (ByteString, readFile)
6 import Data.Map.Strict (fromList)
7
8 import Test.Tasty
9 import Test.Tasty.HUnit
10
11 import FuncTorrent.Bencode (decode, BVal(..))
12 import FuncTorrent.Peer (Peer(..), PeerResp(..), mkPeerResp)
13
14 -- Parsed .torrent file
15 file :: BVal
16 file = Bdict (fromList [
17                ("announce", Bstr "http://carrot.cs.swarthmore.edu:6969"),
18                ("created by", Bstr "Enhanced-CTorrent/dnh3.3.2"),
19                ("creation date", Bint 1352142460),
20                ("info", Bdict (fromList [
21                                 ("length", Bint 31690),
22                                 ("name", Bstr "moby_dick.txt"),
23                                 ("piece length", Bint 262144),
24                                 ("pieces", Bstr "\bW\196\168g\178\198=\156\204\221M\242\207\DC1\159\ETB~\241H")]))])
25
26 testFile :: TestTree
27 testFile = testCase "Should parse regular torrent files" $ do
28                str <- readFile "./data/moby_dick.txt.torrent"
29                case decode str of
30                  Right expected -> expected @?= file
31                  Left _ -> error "Failed parsing test file"
32
33 testResponse1 :: TestTree
34 testResponse1 = testCase "Should parse valid tracker response" $ do
35                   str <- readFile "./data/debian-7.8.0-amd64-CD-1.iso.cache"
36                   case decode str of
37                     Right bval -> expectation @?= mkPeerResp bval
38                     Left _ -> error "Failed parsing test file"
39                   where
40                     expectation :: Either a PeerResp
41                     expectation = Right PeerResp {
42                                     interval = Just 900,
43                                     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],
44                                     complete = Nothing,
45                                     incomplete = Nothing
46                                 }
47
48 testResponse2 :: TestTree
49 testResponse2 = testCase "Should parse invalid tracker response" $ do
50                   str <- readFile "./data/debian-7.8.0-amd64-CD-1.iso.error"
51                   case decode str of
52                     Right bval -> expectation @?= mkPeerResp bval
53                     Left _ -> error "Failed parsing test file"
54                   where
55                     expectation :: Either ByteString a
56                     expectation = Left "torrent not found"
57
58
59 unitTests :: TestTree
60 unitTests = testGroup "Unit tests" [testFile, testResponse1, testResponse2]
61
62 tests :: TestTree
63 tests = testGroup "Tests" [unitTests]
64
65 main :: IO ()
66 main = defaultMain tests