summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Network/BitTorrent/Tracker/RPC/UDP.hs16
-rw-r--r--tests/Network/BitTorrent/Tracker/RPC/UDPSpec.hs25
2 files changed, 41 insertions, 0 deletions
diff --git a/src/Network/BitTorrent/Tracker/RPC/UDP.hs b/src/Network/BitTorrent/Tracker/RPC/UDP.hs
index b0f44ec6..a2099ef0 100644
--- a/src/Network/BitTorrent/Tracker/RPC/UDP.hs
+++ b/src/Network/BitTorrent/Tracker/RPC/UDP.hs
@@ -118,6 +118,20 @@ instance Default Options where
118 , optMultiplier = defMultiplier 118 , optMultiplier = defMultiplier
119 } 119 }
120 120
121checkOptions :: Options -> IO ()
122checkOptions Options {..} = do
123 unless (optMaxPacketSize > 0) $ do
124 throwIO $ userError "optMaxPacketSize must be positive"
125
126 unless (optMinTimeout > 0) $ do
127 throwIO $ userError "optMinTimeout must be positive"
128
129 unless (optMaxTimeout > 0) $ do
130 throwIO $ userError "optMaxTimeout must be greater than optMinTimeout"
131
132 unless (optMinTimeout > 0) $ do
133 throwIO $ userError "optMinTimeout must be positive"
134
121{----------------------------------------------------------------------- 135{-----------------------------------------------------------------------
122-- Manager state 136-- Manager state
123-----------------------------------------------------------------------} 137-----------------------------------------------------------------------}
@@ -162,8 +176,10 @@ resetState Manager {..} = do
162 where 176 where
163 err = error "UDP tracker manager closed" 177 err = error "UDP tracker manager closed"
164 178
179-- | This function will throw 'IOException' if or
165newManager :: Options -> IO Manager 180newManager :: Options -> IO Manager
166newManager opts = do 181newManager opts = do
182 checkOptions opts
167 mgr <- initManager opts 183 mgr <- initManager opts
168 tid <- forkIO (listen mgr `finally` resetState mgr) 184 tid <- forkIO (listen mgr `finally` resetState mgr)
169 putMVar (listenerThread mgr) tid 185 putMVar (listenerThread mgr) tid
diff --git a/tests/Network/BitTorrent/Tracker/RPC/UDPSpec.hs b/tests/Network/BitTorrent/Tracker/RPC/UDPSpec.hs
index acc60e09..bfe0c92f 100644
--- a/tests/Network/BitTorrent/Tracker/RPC/UDPSpec.hs
+++ b/tests/Network/BitTorrent/Tracker/RPC/UDPSpec.hs
@@ -1,6 +1,7 @@
1{-# LANGUAGE RecordWildCards #-} 1{-# LANGUAGE RecordWildCards #-}
2module Network.BitTorrent.Tracker.RPC.UDPSpec (spec, rpcOpts) where 2module Network.BitTorrent.Tracker.RPC.UDPSpec (spec, rpcOpts) where
3import Control.Concurrent.Async 3import Control.Concurrent.Async
4import Control.Exception
4import Control.Monad 5import Control.Monad
5import Data.Default 6import Data.Default
6import Data.List as L 7import Data.List as L
@@ -40,8 +41,32 @@ isTimeoutExpired :: RpcException -> Bool
40isTimeoutExpired (TimeoutExpired _) = True 41isTimeoutExpired (TimeoutExpired _) = True
41isTimeoutExpired _ = False 42isTimeoutExpired _ = False
42 43
44isSomeException :: SomeException -> Bool
45isSomeException _ = True
46
43spec :: Spec 47spec :: Spec
44spec = parallel $ do 48spec = parallel $ do
49 describe "newManager" $ do
50 it "should throw exception on zero optMaxPacketSize" $ do
51 let opts = def { optMaxPacketSize = 0 }
52 newManager opts `shouldThrow` isSomeException
53
54 it "should throw exception on zero optMinTimout" $ do
55 let opts = def { optMinTimeout = 0 }
56 newManager opts `shouldThrow` isSomeException
57
58 it "should throw exception on zero optMaxTimeout" $ do
59 let opts = def { optMaxTimeout = 0 }
60 newManager opts `shouldThrow` isSomeException
61
62 it "should throw exception on maxTimeout < minTimeout" $ do
63 let opts = def { optMinTimeout = 2, optMaxTimeout = 1 }
64 newManager opts `shouldThrow` isSomeException
65
66 it "should throw exception on optMultiplier" $ do
67 let opts = def { optMultiplier = 0 }
68 newManager opts `shouldThrow` isSomeException
69
45 forM_ (L.filter isUdpTracker trackers) $ \ TrackerEntry {..} -> 70 forM_ (L.filter isUdpTracker trackers) $ \ TrackerEntry {..} ->
46 context trackerName $ do 71 context trackerName $ do
47 72