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