module Network.Haskoin.Test.Network where
import qualified Data.ByteString as BS (empty, pack)
import Data.Word (Word16, Word32)
import Network.Haskoin.Network
import Network.Haskoin.Test.Crypto
import Network.Haskoin.Test.Util
import Network.Socket (SockAddr (..))
import Test.QuickCheck
arbitraryVarInt :: Gen VarInt
arbitraryVarInt = VarInt <$> arbitrary
arbitraryVarString :: Gen VarString
arbitraryVarString = VarString <$> arbitraryBS
arbitraryNetworkAddress :: Gen NetworkAddress
arbitraryNetworkAddress = do
s <- arbitrary
a <- arbitrary
p <- arbitrary
NetworkAddress s <$> oneof
[ do
b <- arbitrary
c <- arbitrary
d <- arbitrary
return $ SockAddrInet6 (fromIntegral p) 0 (a,b,c,d) 0
, return $ SockAddrInet (fromIntegral (p :: Word16)) a
]
arbitraryNetworkAddressTime :: Gen (Word32, NetworkAddress)
arbitraryNetworkAddressTime = (,) <$> arbitrary <*> arbitraryNetworkAddress
arbitraryInvType :: Gen InvType
arbitraryInvType = elements [InvError, InvTx, InvBlock, InvMerkleBlock]
arbitraryInvVector :: Gen InvVector
arbitraryInvVector = InvVector <$> arbitraryInvType <*> arbitraryHash256
arbitraryInv1 :: Gen Inv
arbitraryInv1 = Inv <$> listOf1 arbitraryInvVector
arbitraryVersion :: Gen Version
arbitraryVersion =
Version <$> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitraryNetworkAddress
<*> arbitraryNetworkAddress
<*> arbitrary
<*> arbitraryVarString
<*> arbitrary
<*> arbitrary
arbitraryAddr1 :: Gen Addr
arbitraryAddr1 = Addr <$> listOf1 arbitraryNetworkAddressTime
arbitraryAlert :: Gen Alert
arbitraryAlert = Alert <$> arbitraryVarString <*> arbitraryVarString
arbitraryReject :: Gen Reject
arbitraryReject = do
m <- arbitraryMessageCommand
c <- arbitraryRejectCode
s <- arbitraryVarString
d <- oneof [ return BS.empty
, BS.pack <$> vectorOf 32 arbitrary
]
return $ Reject m c s d
arbitraryRejectCode :: Gen RejectCode
arbitraryRejectCode =
elements
[ RejectMalformed
, RejectInvalid
, RejectInvalid
, RejectDuplicate
, RejectNonStandard
, RejectDust
, RejectInsufficientFee
, RejectCheckpoint
]
arbitraryGetData :: Gen GetData
arbitraryGetData = GetData <$> listOf1 arbitraryInvVector
arbitraryNotFound :: Gen NotFound
arbitraryNotFound = NotFound <$> listOf1 arbitraryInvVector
arbitraryPing :: Gen Ping
arbitraryPing = Ping <$> arbitrary
arbitraryPong :: Gen Pong
arbitraryPong = Pong <$> arbitrary
arbitraryBloomFlags :: Gen BloomFlags
arbitraryBloomFlags =
elements
[ BloomUpdateNone
, BloomUpdateAll
, BloomUpdateP2PubKeyOnly
]
arbitraryBloomFilter :: Gen (Int, Double, BloomFilter)
arbitraryBloomFilter = do
n <- choose (0,100000)
fp <- choose (1e-8,1)
tweak <- arbitrary
fl <- arbitraryBloomFlags
return (n, fp, bloomCreate n fp tweak fl)
arbitraryFilterLoad :: Gen FilterLoad
arbitraryFilterLoad = do
(_, _, bf) <- arbitraryBloomFilter
return $ FilterLoad bf
arbitraryFilterAdd :: Gen FilterAdd
arbitraryFilterAdd = FilterAdd <$> arbitraryBS
arbitraryMessageCommand :: Gen MessageCommand
arbitraryMessageCommand =
elements
[ MCVersion
, MCVerAck
, MCAddr
, MCInv
, MCGetData
, MCNotFound
, MCGetBlocks
, MCGetHeaders
, MCTx
, MCBlock
, MCMerkleBlock
, MCHeaders
, MCGetAddr
, MCFilterLoad
, MCFilterAdd
, MCFilterClear
, MCPing
, MCPong
, MCAlert
]