server stress test

This commit is contained in:
Efim Poberezkin
2022-02-15 15:09:50 +04:00
parent c81bb0f15d
commit b843368d03
2 changed files with 39 additions and 1 deletions

View File

@@ -23,6 +23,7 @@ import Simplex.Chat.Terminal.Output (newChatTerminal)
import Simplex.Chat.Types (Profile) import Simplex.Chat.Types (Profile)
import Simplex.Messaging.Agent.Env.SQLite import Simplex.Messaging.Agent.Env.SQLite
import Simplex.Messaging.Agent.RetryInterval import Simplex.Messaging.Agent.RetryInterval
import Simplex.Messaging.Client (SMPClientConfig (..), smpDefaultConfig)
import Simplex.Messaging.Server (runSMPServerBlocking) import Simplex.Messaging.Server (runSMPServerBlocking)
import Simplex.Messaging.Server.Env.STM import Simplex.Messaging.Server.Env.STM
import Simplex.Messaging.Transport import Simplex.Messaging.Transport
@@ -42,6 +43,7 @@ opts :: ChatOpts
opts = opts =
ChatOpts ChatOpts
{ dbFilePrefix = undefined, { dbFilePrefix = undefined,
-- smp://Ufcpyx7utrV45fUopHVvKh4NECi5Z3Fa1TyL4L7tGgc=@smp7.simplex.im
smpServers = ["smp://LcJUMfVhwD8yxjAiSaDzzGF3-kLG4Uh0Fl_ZIjrRwjI=@localhost:5001"], smpServers = ["smp://LcJUMfVhwD8yxjAiSaDzzGF3-kLG4Uh0Fl_ZIjrRwjI=@localhost:5001"],
logging = False logging = False
} }
@@ -70,7 +72,10 @@ cfg :: ChatConfig
cfg = cfg =
defaultChatConfig defaultChatConfig
{ agentConfig = { agentConfig =
aCfg {reconnectInterval = (reconnectInterval aCfg) {initialInterval = 50000}}, aCfg
{ reconnectInterval = (reconnectInterval aCfg) {initialInterval = 50000},
smpCfg = smpDefaultConfig {tcpTimeout = 10000000}
},
testView = True testView = True
} }
@@ -115,6 +120,12 @@ withTmpFiles =
(createDirectoryIfMissing False "tests/tmp") (createDirectoryIfMissing False "tests/tmp")
(removeDirectoryRecursive "tests/tmp") (removeDirectoryRecursive "tests/tmp")
testChat2' :: (Int, Profile) -> (Int, Profile) -> (TestCC -> TestCC -> IO ()) -> IO ()
testChat2' (i1, p1) (i2, p2) test = do
cc1 <- virtualSimplexChat (testDBPrefix <> show i1) p1
cc2 <- virtualSimplexChat (testDBPrefix <> show i2) p2
test cc1 cc2
testChatN :: [Profile] -> ([TestCC] -> IO ()) -> IO () testChatN :: [Profile] -> ([TestCC] -> IO ()) -> IO ()
testChatN ps test = withTmpFiles $ do testChatN ps test = withTmpFiles $ do
let envs = zip ps $ map ((testDBPrefix <>) . show) [(1 :: Int) ..] let envs = zip ps $ map ((testDBPrefix <>) . show) [(1 :: Int) ..]

View File

@@ -6,8 +6,10 @@
module ChatTests where module ChatTests where
import ChatClient import ChatClient
import Control.Concurrent (threadDelay)
import Control.Concurrent.Async (concurrently_) import Control.Concurrent.Async (concurrently_)
import Control.Concurrent.STM import Control.Concurrent.STM
import Control.Monad (forever)
import qualified Data.ByteString as B import qualified Data.ByteString as B
import Data.Char (isDigit) import Data.Char (isDigit)
import Data.Maybe (fromJust) import Data.Maybe (fromJust)
@@ -57,6 +59,31 @@ chatTests = do
it "should deduplicate contact requests with profile change" testDeduplicateContactRequestsProfileChange it "should deduplicate contact requests with profile change" testDeduplicateContactRequestsProfileChange
it "should reject contact and delete contact link" testRejectContactAndDeleteUserContact it "should reject contact and delete contact link" testRejectContactAndDeleteUserContact
it "should delete connection requests when contact link deleted" testDeleteConnectionRequests it "should delete connection requests when contact link deleted" testDeleteConnectionRequests
describe "server stress test" $
fit "should stress server with many chats and messages" testStressServer
testStressServer :: IO ()
testStressServer =
withTmpFiles $ do
sentTVar <- newTVarIO (0 :: Int)
concurrentlyN_ $
forever
( do
threadDelay 5000000
sent <- readTVarIO sentTVar
print $ show sent
) :
map
( \i ->
testChat2' (i * 2 -1, aliceProfile) (i * 2, bobProfile) $
\alice bob -> do
connectUsers alice bob
forever $ do
alice <##> bob
atomically $ modifyTVar sentTVar (+ 2)
threadDelay 500
)
(take 100 ([1 ..] :: [Int]))
testAddContact :: IO () testAddContact :: IO ()
testAddContact = testAddContact =