From 9d2671dc19bdc46d1f0fc976813cb9d63e34c71e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Smr=C5=BE?= Date: Fri, 23 Feb 2024 22:21:51 +0100 Subject: Test message service for sending arbitrary data --- erebos.cabal | 1 + main/Test.hs | 16 ++++++ main/Test/Service.hs | 36 +++++++++++++ test/discovery.test | 119 ----------------------------------------- test/network.test | 146 +++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 199 insertions(+), 119 deletions(-) create mode 100644 main/Test/Service.hs delete mode 100644 test/discovery.test create mode 100644 test/network.test diff --git a/erebos.cabal b/erebos.cabal index 1692c3f..c616e11 100644 --- a/erebos.cabal +++ b/erebos.cabal @@ -156,6 +156,7 @@ executable erebos other-modules: Paths_erebos Test + Test.Service Version Version.Git autogen-modules: diff --git a/main/Test.hs b/main/Test.hs index 8a205ea..991cf85 100644 --- a/main/Test.hs +++ b/main/Test.hs @@ -43,6 +43,8 @@ import Erebos.Storage.Internal (unsafeStoreRawBytes) import Erebos.Storage.Merge import Erebos.Sync +import Test.Service + data TestState = TestState { tsHead :: Maybe (Head LocalState) @@ -243,6 +245,7 @@ commands = map (T.pack *** id) , ("start-server", cmdStartServer) , ("stop-server", cmdStopServer) , ("peer-add", cmdPeerAdd) + , ("test-message-send", cmdTestMessageSend) , ("shared-state-get", cmdSharedStateGet) , ("shared-state-wait", cmdSharedStateWait) , ("watch-local-identity", cmdWatchLocalIdentity) @@ -340,6 +343,10 @@ cmdStartServer = do , someServiceAttr $ pairingAttributes (Proxy @ContactService) out rsPeers "contact" , someServiceAttr $ directMessageAttributes out , someService @SyncService Proxy + , someServiceAttr $ (defaultServiceAttributes Proxy) + { testMessageReceived = \otype len sref -> + liftIO $ outLine out $ unwords ["test-message-received", otype, len, sref] + } ] rsPeerThread <- liftIO $ forkIO $ void $ forever $ do @@ -378,6 +385,15 @@ cmdPeerAdd = do addr:_ <- liftIO $ getAddrInfo (Just $ defaultHints { addrSocketType = Datagram }) (Just host) (Just port) void $ liftIO $ serverPeer rsServer (addrAddress addr) +cmdTestMessageSend :: Command +cmdTestMessageSend = do + [spidx, tref] <- asks tiParams + st <- asks tiStorage + Just ref <- liftIO $ readRef st (encodeUtf8 tref) + peer <- getPeer spidx + sendToPeer peer $ TestMessage $ wrappedLoad ref + cmdOut "test-message-send done" + cmdSharedStateGet :: Command cmdSharedStateGet = do h <- getHead diff --git a/main/Test/Service.hs b/main/Test/Service.hs new file mode 100644 index 0000000..1018e0d --- /dev/null +++ b/main/Test/Service.hs @@ -0,0 +1,36 @@ +module Test.Service ( + TestMessage(..), + TestMessageAttributes(..), +) where + +import Control.Monad.Reader + +import Data.ByteString.Lazy.Char8 qualified as BL + +import Erebos.Network +import Erebos.Service +import Erebos.Storage + +data TestMessage = TestMessage (Stored Object) + +data TestMessageAttributes = TestMessageAttributes + { testMessageReceived :: String -> String -> String -> ServiceHandler TestMessage () + } + +instance Storable TestMessage where + store' (TestMessage msg) = store' msg + load' = TestMessage <$> load' + +instance Service TestMessage where + serviceID _ = mkServiceID "cb46b92c-9203-4694-8370-8742d8ac9dc8" + + type ServiceAttributes TestMessage = TestMessageAttributes + defaultServiceAttributes _ = TestMessageAttributes (\_ _ _ -> return ()) + + serviceHandler smsg = do + let TestMessage sobj = fromStored smsg + case map BL.unpack $ BL.words $ BL.takeWhile (/='\n') $ serializeObject $ fromStored sobj of + [otype, len] -> do + cb <- asks $ testMessageReceived . svcAttributes + cb otype len (show $ refDigest $ storedRef sobj) + _ -> return () diff --git a/test/discovery.test b/test/discovery.test deleted file mode 100644 index 2aaaf24..0000000 --- a/test/discovery.test +++ /dev/null @@ -1,119 +0,0 @@ -test: - spawn as p1 - spawn as p2 - send "create-identity Device1 Owner" to p1 - send "create-identity Device2" to p2 - send "start-server" to p1 - send "start-server" to p2 - expect from p1: - /peer 1 addr ${p2.node.ip} 29665/ - /peer 1 id Device2/ - expect from p2: - /peer 1 addr ${p1.node.ip} 29665/ - /peer 1 id Device1 Owner/ - - send "update-local-identity Device1A" to p1 - expect /peer 1 id Device1A Owner/ from p2 - - send "update-shared-identity OwnerA" to p1 - expect /peer 1 id Device1A OwnerA/ from p2 - - send "update-local-identity Device1B" to p1 - expect /peer 1 id Device1B OwnerA/ from p2 - - send "update-shared-identity OwnerB" to p1 - expect /peer 1 id Device1B OwnerB/ from p2 - - with p2: - send "stop-server" - expect /stop-server-done/ - - send "update-shared-identity OwnerC" to p1 - - with p1: - send "stop-server" - expect /stop-server-done/ - - spawn as p3 - spawn as p4 - spawn as p5 - spawn as p6 - send "create-identity Device3" to p3 - send "create-identity Device4" to p4 - send "create-identity Device5" to p5 - send "create-identity Device6" to p6 - - for p in [ p1, p2, p3, p4, p5, p6 ]: - send "start-server" to p - - expect from p1: - /peer ([0-9]+) addr ${p2.node.ip} 29665/ capture peer1_2 - /peer $peer1_2 id Device2/ - /peer ([0-9]+) addr ${p3.node.ip} 29665/ capture peer1_3 - /peer $peer1_3 id Device3/ - /peer ([0-9]+) addr ${p4.node.ip} 29665/ capture peer1_4 - /peer $peer1_4 id Device4/ - /peer ([0-9]+) addr ${p5.node.ip} 29665/ capture peer1_5 - /peer $peer1_5 id Device5/ - /peer ([0-9]+) addr ${p6.node.ip} 29665/ capture peer1_6 - /peer $peer1_6 id Device6/ - - expect from p2: - /peer ([0-9]+) addr ${p1.node.ip} 29665/ capture peer2_1 - /peer $peer2_1 id Device1B OwnerC/ - /peer ([0-9]+) addr ${p3.node.ip} 29665/ capture peer2_3 - /peer $peer2_3 id Device3/ - /peer ([0-9]+) addr ${p4.node.ip} 29665/ capture peer2_4 - /peer $peer2_4 id Device4/ - /peer ([0-9]+) addr ${p5.node.ip} 29665/ capture peer2_5 - /peer $peer2_5 id Device5/ - /peer ([0-9]+) addr ${p6.node.ip} 29665/ capture peer2_6 - /peer $peer2_6 id Device6/ - - expect from p3: - /peer ([0-9]+) addr ${p1.node.ip} 29665/ capture peer3_1 - /peer $peer3_1 id Device1B OwnerC/ - /peer ([0-9]+) addr ${p2.node.ip} 29665/ capture peer3_2 - /peer $peer3_2 id Device2/ - /peer ([0-9]+) addr ${p4.node.ip} 29665/ capture peer3_4 - /peer $peer3_4 id Device4/ - /peer ([0-9]+) addr ${p5.node.ip} 29665/ capture peer3_5 - /peer $peer3_5 id Device5/ - /peer ([0-9]+) addr ${p6.node.ip} 29665/ capture peer3_6 - /peer $peer3_6 id Device6/ - - expect from p4: - /peer ([0-9]+) addr ${p1.node.ip} 29665/ capture peer4_1 - /peer $peer4_1 id Device1B OwnerC/ - /peer ([0-9]+) addr ${p2.node.ip} 29665/ capture peer4_2 - /peer $peer4_2 id Device2/ - /peer ([0-9]+) addr ${p3.node.ip} 29665/ capture peer4_3 - /peer $peer4_3 id Device3/ - /peer ([0-9]+) addr ${p5.node.ip} 29665/ capture peer4_5 - /peer $peer4_5 id Device5/ - /peer ([0-9]+) addr ${p6.node.ip} 29665/ capture peer4_6 - /peer $peer4_6 id Device6/ - - expect from p5: - /peer ([0-9]+) addr ${p1.node.ip} 29665/ capture peer5_1 - /peer $peer5_1 id Device1B OwnerC/ - /peer ([0-9]+) addr ${p2.node.ip} 29665/ capture peer5_2 - /peer $peer5_2 id Device2/ - /peer ([0-9]+) addr ${p3.node.ip} 29665/ capture peer5_3 - /peer $peer5_3 id Device3/ - /peer ([0-9]+) addr ${p4.node.ip} 29665/ capture peer5_4 - /peer $peer5_4 id Device4/ - /peer ([0-9]+) addr ${p6.node.ip} 29665/ capture peer5_6 - /peer $peer5_6 id Device6/ - - expect from p6: - /peer ([0-9]+) addr ${p1.node.ip} 29665/ capture peer6_1 - /peer $peer6_1 id Device1B OwnerC/ - /peer ([0-9]+) addr ${p2.node.ip} 29665/ capture peer6_2 - /peer $peer6_2 id Device2/ - /peer ([0-9]+) addr ${p3.node.ip} 29665/ capture peer6_3 - /peer $peer6_3 id Device3/ - /peer ([0-9]+) addr ${p4.node.ip} 29665/ capture peer6_4 - /peer $peer6_4 id Device4/ - /peer ([0-9]+) addr ${p5.node.ip} 29665/ capture peer6_5 - /peer $peer6_5 id Device5/ diff --git a/test/network.test b/test/network.test new file mode 100644 index 0000000..0b9fecb --- /dev/null +++ b/test/network.test @@ -0,0 +1,146 @@ +test Discovery: + spawn as p1 + spawn as p2 + send "create-identity Device1 Owner" to p1 + send "create-identity Device2" to p2 + send "start-server" to p1 + send "start-server" to p2 + expect from p1: + /peer 1 addr ${p2.node.ip} 29665/ + /peer 1 id Device2/ + expect from p2: + /peer 1 addr ${p1.node.ip} 29665/ + /peer 1 id Device1 Owner/ + + send "update-local-identity Device1A" to p1 + expect /peer 1 id Device1A Owner/ from p2 + + send "update-shared-identity OwnerA" to p1 + expect /peer 1 id Device1A OwnerA/ from p2 + + send "update-local-identity Device1B" to p1 + expect /peer 1 id Device1B OwnerA/ from p2 + + send "update-shared-identity OwnerB" to p1 + expect /peer 1 id Device1B OwnerB/ from p2 + + with p2: + send "stop-server" + expect /stop-server-done/ + + send "update-shared-identity OwnerC" to p1 + + with p1: + send "stop-server" + expect /stop-server-done/ + + spawn as p3 + spawn as p4 + spawn as p5 + spawn as p6 + send "create-identity Device3" to p3 + send "create-identity Device4" to p4 + send "create-identity Device5" to p5 + send "create-identity Device6" to p6 + + for p in [ p1, p2, p3, p4, p5, p6 ]: + send "start-server" to p + + expect from p1: + /peer ([0-9]+) addr ${p2.node.ip} 29665/ capture peer1_2 + /peer $peer1_2 id Device2/ + /peer ([0-9]+) addr ${p3.node.ip} 29665/ capture peer1_3 + /peer $peer1_3 id Device3/ + /peer ([0-9]+) addr ${p4.node.ip} 29665/ capture peer1_4 + /peer $peer1_4 id Device4/ + /peer ([0-9]+) addr ${p5.node.ip} 29665/ capture peer1_5 + /peer $peer1_5 id Device5/ + /peer ([0-9]+) addr ${p6.node.ip} 29665/ capture peer1_6 + /peer $peer1_6 id Device6/ + + expect from p2: + /peer ([0-9]+) addr ${p1.node.ip} 29665/ capture peer2_1 + /peer $peer2_1 id Device1B OwnerC/ + /peer ([0-9]+) addr ${p3.node.ip} 29665/ capture peer2_3 + /peer $peer2_3 id Device3/ + /peer ([0-9]+) addr ${p4.node.ip} 29665/ capture peer2_4 + /peer $peer2_4 id Device4/ + /peer ([0-9]+) addr ${p5.node.ip} 29665/ capture peer2_5 + /peer $peer2_5 id Device5/ + /peer ([0-9]+) addr ${p6.node.ip} 29665/ capture peer2_6 + /peer $peer2_6 id Device6/ + + expect from p3: + /peer ([0-9]+) addr ${p1.node.ip} 29665/ capture peer3_1 + /peer $peer3_1 id Device1B OwnerC/ + /peer ([0-9]+) addr ${p2.node.ip} 29665/ capture peer3_2 + /peer $peer3_2 id Device2/ + /peer ([0-9]+) addr ${p4.node.ip} 29665/ capture peer3_4 + /peer $peer3_4 id Device4/ + /peer ([0-9]+) addr ${p5.node.ip} 29665/ capture peer3_5 + /peer $peer3_5 id Device5/ + /peer ([0-9]+) addr ${p6.node.ip} 29665/ capture peer3_6 + /peer $peer3_6 id Device6/ + + expect from p4: + /peer ([0-9]+) addr ${p1.node.ip} 29665/ capture peer4_1 + /peer $peer4_1 id Device1B OwnerC/ + /peer ([0-9]+) addr ${p2.node.ip} 29665/ capture peer4_2 + /peer $peer4_2 id Device2/ + /peer ([0-9]+) addr ${p3.node.ip} 29665/ capture peer4_3 + /peer $peer4_3 id Device3/ + /peer ([0-9]+) addr ${p5.node.ip} 29665/ capture peer4_5 + /peer $peer4_5 id Device5/ + /peer ([0-9]+) addr ${p6.node.ip} 29665/ capture peer4_6 + /peer $peer4_6 id Device6/ + + expect from p5: + /peer ([0-9]+) addr ${p1.node.ip} 29665/ capture peer5_1 + /peer $peer5_1 id Device1B OwnerC/ + /peer ([0-9]+) addr ${p2.node.ip} 29665/ capture peer5_2 + /peer $peer5_2 id Device2/ + /peer ([0-9]+) addr ${p3.node.ip} 29665/ capture peer5_3 + /peer $peer5_3 id Device3/ + /peer ([0-9]+) addr ${p4.node.ip} 29665/ capture peer5_4 + /peer $peer5_4 id Device4/ + /peer ([0-9]+) addr ${p6.node.ip} 29665/ capture peer5_6 + /peer $peer5_6 id Device6/ + + expect from p6: + /peer ([0-9]+) addr ${p1.node.ip} 29665/ capture peer6_1 + /peer $peer6_1 id Device1B OwnerC/ + /peer ([0-9]+) addr ${p2.node.ip} 29665/ capture peer6_2 + /peer $peer6_2 id Device2/ + /peer ([0-9]+) addr ${p3.node.ip} 29665/ capture peer6_3 + /peer $peer6_3 id Device3/ + /peer ([0-9]+) addr ${p4.node.ip} 29665/ capture peer6_4 + /peer $peer6_4 id Device4/ + /peer ([0-9]+) addr ${p5.node.ip} 29665/ capture peer6_5 + /peer $peer6_5 id Device5/ + + +test LargeData: + spawn as p1 + spawn as p2 + send "create-identity Device1" to p1 + send "create-identity Device2" to p2 + send "start-server" to p1 + send "start-server" to p2 + expect from p1: + /peer 1 addr ${p2.node.ip} 29665/ + /peer 1 id Device2/ + expect from p2: + /peer 1 addr ${p1.node.ip} 29665/ + /peer 1 id Device1/ + + for i in [0..1]: + with p1: + send "store blob" + for j in [1 .. i * 10]: + send "123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789" + send "" + expect /store-done (blake2#[0-9a-f]*)/ capture ref + + send "test-message-send 1 $ref" + expect /test-message-send done/ + expect /test-message-received blob ${i*1000} $ref/ from p2 -- cgit v1.2.3