diff options
author | Sam Truzjan <pxqr.sta@gmail.com> | 2014-02-26 21:09:46 +0400 |
---|---|---|
committer | Sam Truzjan <pxqr.sta@gmail.com> | 2014-02-26 21:09:46 +0400 |
commit | 8d094413e88b57dc71f60fb48631fe43174dc696 (patch) | |
tree | e1da3481ca6342fbc5cc646a595de5699bc8e310 | |
parent | ac56fc5a2111ff0a5fcb97566a15e598b53b62bb (diff) |
Check udp tracker manager options
-rw-r--r-- | src/Network/BitTorrent/Tracker/RPC/UDP.hs | 16 | ||||
-rw-r--r-- | tests/Network/BitTorrent/Tracker/RPC/UDPSpec.hs | 25 |
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 | ||
121 | checkOptions :: Options -> IO () | ||
122 | checkOptions 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 | ||
165 | newManager :: Options -> IO Manager | 180 | newManager :: Options -> IO Manager |
166 | newManager opts = do | 181 | newManager 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 #-} |
2 | module Network.BitTorrent.Tracker.RPC.UDPSpec (spec, rpcOpts) where | 2 | module Network.BitTorrent.Tracker.RPC.UDPSpec (spec, rpcOpts) where |
3 | import Control.Concurrent.Async | 3 | import Control.Concurrent.Async |
4 | import Control.Exception | ||
4 | import Control.Monad | 5 | import Control.Monad |
5 | import Data.Default | 6 | import Data.Default |
6 | import Data.List as L | 7 | import Data.List as L |
@@ -40,8 +41,32 @@ isTimeoutExpired :: RpcException -> Bool | |||
40 | isTimeoutExpired (TimeoutExpired _) = True | 41 | isTimeoutExpired (TimeoutExpired _) = True |
41 | isTimeoutExpired _ = False | 42 | isTimeoutExpired _ = False |
42 | 43 | ||
44 | isSomeException :: SomeException -> Bool | ||
45 | isSomeException _ = True | ||
46 | |||
43 | spec :: Spec | 47 | spec :: Spec |
44 | spec = parallel $ do | 48 | spec = 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 | ||