]> git.rkrishnan.org Git - functorrent.git/blob - test/Test.hs
Switch to known torrent file
[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.Metainfo (Info(..), Metainfo(..), mkMetaInfo)
13 import FuncTorrent.Peer (Peer(..))
14 import FuncTorrent.Tracker (TrackerResponse(..), peers, mkTrackerResponse)
15
16 -- Parsed .torrent file
17 file :: BVal
18 file = Bdict (fromList [
19                ("announce",Bstr "http://9.rarbg.com:2710/announce"),
20                ("comment",Bstr "hello world"),
21                ("created by",Bstr "Jaseem Abid"),
22                ("creation date",Bint 1428717851),
23                ("encoding",Bstr "UTF-8"),
24                ("info",Bdict (fromList [
25                                ("length",Bint 12),
26                                ("name",Bstr "hello.txt"),
27                                ("piece length",Bint 32768),
28                                ("pieces",Bstr "\"Ycc\179\222@\176o\152\US\184]\130\&1.\140\SO\213\DC1"),
29                                ("private",Bint 0)]))])
30
31 hello :: Metainfo
32 hello = Metainfo {
33           info = Info {
34             pieceLength = 32768,
35             pieces = "\"Ycc\179\222@\176o\152\US\184]\130\&1.\140\SO\213\DC1",
36             private = Nothing,
37             name = "hello.txt",
38             lengthInBytes = 12,
39             md5sum = Nothing
40           },
41           announceList = ["http://9.rarbg.com:2710/announce"],
42           creationDate = Nothing,
43           comment = Just "hello world",
44           createdBy = Just "Jaseem Abid",
45           encoding = Just "UTF-8"
46         }
47
48 testFile :: TestTree
49 testFile = testCase "Should parse valid torrent files" $ do
50                str <- readFile "./data/hello.txt.torrent"
51                case decode str of
52                  Right expected -> expected @?= file
53                  Left _ -> error "Failed parsing test file"
54
55
56 testMkMetaInfo :: TestTree
57 testMkMetaInfo = testCase "Should mkInfo valid torrent files" $ do
58                    str <- readFile "./data/hello.txt.torrent"
59                    case decode str of
60                      Right expected -> mkMetaInfo expected @?= Just hello
61                      Left _ -> error "Failed parsing test file"
62
63 testResponse1 :: TestTree
64 testResponse1 = testCase "Should parse valid tracker response" $ do
65                   str <- readFile "./data/debian-7.8.0-amd64-CD-1.iso.cache"
66                   case decode str of
67                     Right bval -> expectation @?= mkTrackerResponse bval
68                     Left _ -> error "Failed parsing test file"
69                   where
70                     expectation :: Either a TrackerResponse
71                     expectation = Right TrackerResponse {
72                                     interval = Just 900,
73                                     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],
74                                     complete = Nothing,
75                                     incomplete = Nothing
76                                 }
77
78 testResponse2 :: TestTree
79 testResponse2 = testCase "Should parse invalid tracker response" $ do
80                   str <- readFile "./data/debian-7.8.0-amd64-CD-1.iso.error"
81                   case decode str of
82                     Right bval -> expectation @?= mkTrackerResponse bval
83                     Left _ -> error "Failed parsing test file"
84                   where
85                     expectation :: Either ByteString a
86                     expectation = Left "torrent not found"
87
88
89 unitTests :: TestTree
90 unitTests = testGroup "Unit tests" [testFile, testMkMetaInfo, testResponse1,
91                                             testResponse2]
92
93 tests :: TestTree
94 tests = testGroup "Tests" [unitTests]
95
96 main :: IO ()
97 main = defaultMain tests