hbs2/hbs2-core/test/TestFakeMessaging.hs

69 lines
1.6 KiB
Haskell

module TestFakeMessaging where
import HBS2.Net.Proto
import HBS2.Net.Messaging
import HBS2.Net.Messaging.Fake
import Test.Tasty.HUnit
import Control.Monad
import Data.Tuple
import Data.Hashable
import System.Random
import Data.IORef
import Data.Word
import Data.Set qualified as Set
import Data.Map qualified as Map
-- import Control.Monad.Writer
-- import Data.Hashable
-- import Data.IORef
-- import Data.Map qualified as Map
-- import Data.Set qualified as Set
-- import Data.Tuple
-- import Data.Word
-- import System.Random
-- import Data.HbSync.Types
-- import Network.HbSync.Protocol.Messaging
-- import Network.HbSync.Protocol.Messaging.Fake
data Fake
instance IsPeer Fake where
newtype instance Peer Fake = FakePeer Int
deriving stock (Eq,Ord,Show)
deriving newtype (Hashable,Num,Enum,Real,Integral)
testFakeMessaging1 :: IO ()
testFakeMessaging1 = do
gen <- newIORef (mkStdGen 0x4387ddaA10124)
let peers = fmap FakePeer [1..10]
bus <- newFakeP2P @Fake @Word16 False
sent <- forM (zip peers peers) $ \(to,from) -> do
msg <- replicateM 10 $ atomicModifyIORef' gen (swap . random) :: IO [Word16]
forM msg $ \m -> do
sendTo bus (To to) (From from) m
pure ( to, Set.singleton m )
received <- forM peers $ \me -> do
msg <- replicateM 10 $ receive bus (To me)
pure ( me, Set.fromList (mconcat msg) )
let s1 = Map.fromListWith (<>) (mconcat sent)
let s2 = Map.fromList received
-- print ("sent", s1)
-- print ("receive", s2)
assertEqual "sent == received" s1 s2