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