You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
4.4 KiB
119 lines
4.4 KiB
{-# LANGUAGE ScopedTypeVariables #-} |
|
{-# LANGUAGE OverloadedStrings #-} |
|
{-# LANGUAGE QuasiQuotes #-} |
|
{-# LANGUAGE PatternGuards #-} |
|
{-# LANGUAGE LambdaCase #-} |
|
|
|
module Main where |
|
|
|
import Control.Applicative |
|
import Control.Concurrent |
|
import Control.Monad |
|
import qualified Data.Configurator as Conf |
|
import qualified Data.Configurator.Types as Conf |
|
import Data.Maybe |
|
import qualified Data.Text as Text |
|
import Network |
|
import Network.Xmpp |
|
import System.Directory |
|
import System.Exit |
|
import System.FilePath |
|
import System.Log.Logger |
|
import System.Timeout |
|
import Test.HUnit |
|
import Test.Hspec.Expectations |
|
|
|
import Run.Payload |
|
|
|
xmppConfig :: ConnectionDetails -> SessionConfiguration |
|
xmppConfig det = def{sessionStreamConfiguration |
|
= def{connectionDetails = det} |
|
, onConnectionClosed = \sess _ -> do |
|
_ <- reconnect' sess |
|
_ <- sendPresence presenceOnline sess |
|
return () |
|
} |
|
|
|
-- | Load the configuration files |
|
loadConfig :: IO Conf.Config |
|
loadConfig = do |
|
appData <- getAppUserDataDirectory "pontarius-xmpp-tests" |
|
home <- getHomeDirectory |
|
Conf.load [ Conf.Optional $ appData </> "pontarius-xmpp-tests.conf" |
|
, Conf.Optional $ home </> ".pontarius-xmpp-tests.conf" |
|
] |
|
|
|
-- | reflect messages to their origin |
|
reflect :: Session -> IO b |
|
reflect sess = forever $ do |
|
m <- getMessage sess |
|
case answerMessage m (messagePayload m) of |
|
Nothing -> return () |
|
Just am -> |
|
void $ sendMessage am{messageAttributes = messageAttributes m} sess |
|
|
|
testAttributes = [( "{org.pontarius.xmpp.test}testattr" |
|
, "testvalue 12321 åäü>" |
|
)] |
|
|
|
main :: IO () |
|
main = void $ do |
|
conf <- loadConfig |
|
uname1 <- Conf.require conf "xmpp.user1" |
|
pwd1 <- Conf.require conf "xmpp.password1" |
|
uname2 <- Conf.require conf "xmpp.user1" |
|
pwd2 <- Conf.require conf "xmpp.password1" |
|
realm <- Conf.require conf "xmpp.realm" |
|
server <- Conf.lookup conf "xmpp.server" |
|
port <- Conf.lookup conf "xmpp.port" :: IO (Maybe Integer) |
|
let conDetails = case server of |
|
Nothing -> UseRealm |
|
Just srv -> case port of |
|
Nothing -> UseSrv srv |
|
Just p -> UseHost srv (PortNumber $ fromIntegral p) |
|
loglevel <- Conf.lookup conf "loglevel" >>= \case |
|
(Nothing :: Maybe Text.Text) -> return ERROR |
|
Just "debug" -> return DEBUG |
|
Just "info" -> return INFO |
|
Just "notice" -> return NOTICE |
|
Just "warning" -> return WARNING |
|
Just "error" -> return ERROR |
|
Just "critical" -> return CRITICAL |
|
Just "alert" -> return ALERT |
|
Just "emergency" -> return EMERGENCY |
|
Just e -> error $ "Log level " ++ (Text.unpack e) ++ " unknown" |
|
updateGlobalLogger "Pontarius.Xmpp" $ setLevel loglevel |
|
mbSess1 <- session realm (simpleAuth uname1 pwd1) |
|
((xmppConfig conDetails)) |
|
sess1 <- case mbSess1 of |
|
Left e -> do |
|
assertFailure $ "session 1 could not be initialized" ++ show e |
|
exitFailure |
|
Right r -> return r |
|
mbSess2 <- session realm (simpleAuth uname2 pwd2) |
|
((xmppConfig conDetails)) |
|
sess2 <- case mbSess2 of |
|
Left e -> do |
|
assertFailure $ "session 2 could not be initialized" ++ show e |
|
exitFailure |
|
Right r -> return r |
|
Just jid1 <- getJid sess1 |
|
Just jid2 <- getJid sess2 |
|
_ <- sendPresence presenceOnline sess1 |
|
_ <- forkIO $ reflect sess1 |
|
forkIO $ iqResponder sess1 |
|
_ <- sendPresence presenceOnline sess2 |
|
-- check message responsiveness |
|
infoM "Pontarius.Xmpp" "Running message mirror" |
|
sendMessage message{ messageTo = Just jid1 |
|
, messageAttributes = testAttributes |
|
} sess2 |
|
resp <- timeout 3000000 $ waitForMessage (\m -> messageFrom m == Just jid1) |
|
sess2 |
|
case resp of |
|
Nothing -> assertFailure "Did not receive message answer" |
|
Just am -> messageAttributes am `shouldBe` testAttributes |
|
infoM "Pontarius.Xmpp" "Done running message mirror" |
|
infoM "Pontarius.Xmpp" "Running IQ tests" |
|
testPayload jid1 sess2 |
|
infoM "Pontarius.Xmpp" "Done running IQ tests"
|
|
|