so far so good

This commit is contained in:
Dmitry Zuikov 2023-01-13 13:47:47 +03:00
parent ef9271b808
commit 6c3ca86b05
4 changed files with 39 additions and 14 deletions

View File

@ -1,8 +1,14 @@
module HBS2.Net.PeerLocator where module HBS2.Net.PeerLocator where
-- import HBS2.Prelude
import HBS2.Net.Proto import HBS2.Net.Proto
class (IsPeer peer, Monad m) => PeerLocator l peer m where class PeerLocator l where
knownPeers :: l -> m [Peer peer] knownPeers :: (IsPeer peer, Monad m) => l -> m [Peer peer]
data AnyPeerLocator = forall a . PeerLocator a => AnyPeerLocator a
instance PeerLocator AnyPeerLocator where
knownPeers (AnyPeerLocator l) = knownPeers l

View File

@ -17,8 +17,7 @@ newStaticPeerLocator seeds = do
tv <- liftIO $ newTVarIO (Set.fromList seeds) tv <- liftIO $ newTVarIO (Set.fromList seeds)
pure $ StaticPeerLocator tv pure $ StaticPeerLocator tv
instance (MonadIO m, IsPeer p) instance PeerLocator (StaticPeerLocator p) where
=> PeerLocator (StaticPeerLocator p) p m where
knownPeers _ = pure mempty knownPeers _ = pure mempty

View File

@ -1,10 +1,11 @@
module HBS2.Net.Proto.Actors.BlockInfo where module HBS2.Net.Proto.Actors.BlockInfo where
import HBS2.Prelude
import HBS2.Hash
import HBS2.Net.Proto
import HBS2.Clock
import HBS2.Actors import HBS2.Actors
import HBS2.Clock
import HBS2.Hash
import HBS2.Net.PeerLocator
import HBS2.Net.Proto
import HBS2.Prelude
import Data.Function import Data.Function
import Data.Kind import Data.Kind
@ -19,19 +20,19 @@ import Prettyprinter
data BlockInfoActor (m :: Type -> Type) = data BlockInfoActor (m :: Type -> Type) =
BlockInfoActor BlockInfoActor
{ tasks :: Pipeline m () { tasks :: Pipeline m ()
, peers :: AnyPeerLocator
} }
-- TODO: send block info request -- TODO: send block info request
-- TODO: receive block info request -- TODO: receive block info request
-- TODO: cache block info per peer -- TODO: cache block info per peer
-- TODO: get block info per peer -- TODO: get block info per peer
createBlockInfoActor :: MonadIO m => m (BlockInfoActor m ) createBlockInfoActor :: MonadIO m => AnyPeerLocator -> m (BlockInfoActor m )
createBlockInfoActor = do createBlockInfoActor l = do
pip <- newPipeline 200 -- FIXME: to settings! pip <- newPipeline 200 -- FIXME: to settings!
pure $ BlockInfoActor pip pure $ BlockInfoActor pip l
runBlockInfoActor :: MonadIO m => BlockInfoActor m -> m () runBlockInfoActor :: MonadIO m => BlockInfoActor m -> m ()
runBlockInfoActor b = runPipeline (tasks b) runBlockInfoActor b = runPipeline (tasks b)
@ -41,6 +42,7 @@ stopBlockInfoActor b = stopPipeline (tasks b)
requestBlockInfo :: forall peer h m . ( MonadIO m requestBlockInfo :: forall peer h m . ( MonadIO m
, Pretty (Hash h) , Pretty (Hash h)
, IsPeer peer
) )
=> BlockInfoActor m => BlockInfoActor m
-> Maybe (Peer peer) -> Maybe (Peer peer)
@ -50,7 +52,11 @@ requestBlockInfo :: forall peer h m . ( MonadIO m
requestBlockInfo b mp h = do requestBlockInfo b mp h = do
addJob (tasks b) do addJob (tasks b) do
-- peers <- getPeers -- peers <- getPeers
--
-- TODO: get given peer or some other peers -- TODO: get given peer or some other peers
somePeers <- knownPeers @_ @peer (peers b)
-- TODO: get cookie from cookie generator -- TODO: get cookie from cookie generator
-- TODO: set waiting for request -- TODO: set waiting for request
-- TODO: send block info request to messaging -- TODO: send block info request to messaging

View File

@ -2,26 +2,40 @@ module TestBlockInfoActor where
import HBS2.Hash import HBS2.Hash
import HBS2.Clock import HBS2.Clock
import HBS2.Net.Proto
import HBS2.Net.Proto.Actors.BlockInfo import HBS2.Net.Proto.Actors.BlockInfo
import HBS2.Net.PeerLocator
import HBS2.Net.PeerLocator.Static
import Test.Tasty.HUnit import Test.Tasty.HUnit
import Test.QuickCheck import Test.QuickCheck
import Data.Word import Data.Word
import Data.Hashable (Hashable)
import Data.ByteString (ByteString) import Data.ByteString (ByteString)
import Data.ByteString qualified as B import Data.ByteString qualified as B
import Control.Concurrent.Async import Control.Concurrent.Async
data Fake
instance IsPeer Fake where
newtype instance Peer Fake = FakePeer Int
deriving stock (Eq,Ord,Show)
deriving newtype (Hashable,Num,Enum,Real,Integral)
testBlockInfoActor :: IO () testBlockInfoActor :: IO ()
testBlockInfoActor = do testBlockInfoActor = do
a <- createBlockInfoActor
np <- newStaticPeerLocator @Fake [1..10]
a <- createBlockInfoActor (AnyPeerLocator np)
actor <- async $ runBlockInfoActor a actor <- async $ runBlockInfoActor a
let obj = shrink [0x00 .. 0xFF] :: [[Word8]] let obj = shrink [0x00 .. 0xFF] :: [[Word8]]
forConcurrently_ obj $ \x -> do forConcurrently_ obj $ \x -> do
requestBlockInfo a Nothing (hashObject (B.pack x) :: Hash HbSync) requestBlockInfo @Fake a Nothing (hashObject (B.pack x) :: Hash HbSync)
pause ( 1 :: Timeout 'Seconds) pause ( 1 :: Timeout 'Seconds)