diff options
Diffstat (limited to 'bittorrent/tests/System/Torrent/StorageSpec.hs')
-rw-r--r-- | bittorrent/tests/System/Torrent/StorageSpec.hs | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/bittorrent/tests/System/Torrent/StorageSpec.hs b/bittorrent/tests/System/Torrent/StorageSpec.hs new file mode 100644 index 00000000..b5e49078 --- /dev/null +++ b/bittorrent/tests/System/Torrent/StorageSpec.hs | |||
@@ -0,0 +1,91 @@ | |||
1 | module System.Torrent.StorageSpec (spec) where | ||
2 | import Data.ByteString.Lazy as BL | ||
3 | import Data.Conduit as C | ||
4 | import Data.Conduit.List as C | ||
5 | import System.FilePath | ||
6 | import System.Directory | ||
7 | import System.IO.Unsafe | ||
8 | import Test.Hspec | ||
9 | |||
10 | import Data.Torrent | ||
11 | import Network.BitTorrent.Exchange.Bitfield as BF | ||
12 | import System.Torrent.Storage | ||
13 | |||
14 | |||
15 | layout :: FileLayout FileSize | ||
16 | layout = | ||
17 | [ (dir </> "_a", 20) | ||
18 | , (dir </> "_b", 50) | ||
19 | , (dir </> "_c", 100) | ||
20 | , (dir </> "_d", 5) | ||
21 | ] | ||
22 | where | ||
23 | dir = unsafePerformIO $ getTemporaryDirectory | ||
24 | |||
25 | createLayout :: IO () | ||
26 | createLayout = withStorage ReadWriteEx 1 layout (const (return ())) | ||
27 | |||
28 | psize :: PieceSize | ||
29 | psize = 16 | ||
30 | |||
31 | pcount :: PieceCount | ||
32 | pcount = 11 | ||
33 | |||
34 | spec :: Spec | ||
35 | spec = before createLayout $ do | ||
36 | describe "writePiece" $ do | ||
37 | it "should fail gracefully on write operation in RO mode" $ do | ||
38 | withStorage ReadOnly 1 layout $ \ s -> | ||
39 | writePiece (Piece 0 "a") s `shouldThrow` (== StorageIsRO) | ||
40 | |||
41 | it "should fail if piece size do not match" $ do | ||
42 | withStorage ReadWrite 1 layout $ \ s -> | ||
43 | writePiece (Piece 0 "") s `shouldThrow` (== InvalidSize 0) | ||
44 | |||
45 | it "should fail on negative index" $ do | ||
46 | withStorage ReadWrite 1 layout $ \ s -> | ||
47 | writePiece (Piece (-1) "") s `shouldThrow` (== InvalidIndex (-1)) | ||
48 | |||
49 | it "should fail on out of upper bound index" $ do | ||
50 | withStorage ReadWrite 100 layout $ \ s -> do | ||
51 | let bs = BL.replicate 100 0 | ||
52 | writePiece (Piece 0 bs) s | ||
53 | |||
54 | let bs' = BL.replicate 75 0 | ||
55 | writePiece (Piece 1 bs') s | ||
56 | |||
57 | writePiece (Piece 2 bs') s `shouldThrow` (== InvalidIndex 2) | ||
58 | |||
59 | describe "readPiece" $ do | ||
60 | it "should fail on negative index" $ | ||
61 | withStorage ReadOnly 1 layout $ \ s -> | ||
62 | readPiece (-1) s `shouldThrow` (== InvalidIndex (-1)) | ||
63 | |||
64 | it "should fail on out of upper bound index" $ do | ||
65 | withStorage ReadOnly 100 layout $ \ s -> do | ||
66 | _ <- readPiece 1 s | ||
67 | readPiece 2 s `shouldThrow` (== InvalidIndex 2) | ||
68 | |||
69 | describe "sourceStorage" $ do | ||
70 | it "should source all chunks" $ do | ||
71 | withStorage ReadOnly psize layout $ \ s -> do | ||
72 | n <- sourceStorage s $$ C.fold (\ n _ -> succ n) 0 | ||
73 | n `shouldBe` pcount | ||
74 | |||
75 | -- this test should fail if 'sourceStorage' test fail | ||
76 | describe "sinkStorage" $ do | ||
77 | it "should write all chunks" $ do | ||
78 | let byteVal = 0 | ||
79 | let bzeroPiece p = p { pieceData = BL.replicate (BL.length (pieceData p)) byteVal } | ||
80 | let isZeroPiece p = (== byteVal) `BL.all` pieceData p | ||
81 | |||
82 | withStorage ReadWrite psize layout $ \ s -> do | ||
83 | sourceStorage s $= C.map bzeroPiece $$ sinkStorage s | ||
84 | b <- sourceStorage s $$ C.fold (\ b p -> b && isZeroPiece p) True | ||
85 | b `shouldBe` True | ||
86 | |||
87 | describe "genPieceInfo" $ do | ||
88 | it "" $ do | ||
89 | withStorage ReadWrite psize layout $ \ s -> do | ||
90 | bf <- genPieceInfo s >>= getBitfield s | ||
91 | bf `shouldSatisfy` BF.full \ No newline at end of file | ||