diff --git a/src/Network/XMPP/Pickle.hs b/src/Network/XMPP/Pickle.hs index 45eeab2..347e8a5 100644 --- a/src/Network/XMPP/Pickle.hs +++ b/src/Network/XMPP/Pickle.hs @@ -29,12 +29,6 @@ xmlLang = Name "lang" Nothing (Just "xml") xpLangTag :: PU [Attribute] (Maybe LangTag) xpLangTag = xpAttrImplied xmlLang xpPrim --- xpElemExists :: Name -> PU [Node] Bool --- xpElemExists name = xpWrap (\x -> mbToBool x) --- (\x -> if x then Just () else Nothing) $ --- xpOption (xpElemEmpty name) - - xpNodeElem :: PU [Node] a -> PU Element a xpNodeElem xp = PU { pickleTree = \x -> head $ (pickleTree xp x) >>= \y -> case y of diff --git a/src/Network/XMPP/Session.hs b/src/Network/XMPP/Session.hs index 7b37a44..5a355b0 100644 --- a/src/Network/XMPP/Session.hs +++ b/src/Network/XMPP/Session.hs @@ -8,15 +8,14 @@ import Data.XML.Types(Element) import Network.XMPP.Monad import Network.XMPP.Pickle import Network.XMPP.Types +import Network.XMPP.Concurrent + sessionXML :: Element sessionXML = pickleElem (xpElemBlank "{urn:ietf:params:xml:ns:xmpp-session}session" ) () - - - sessionIQ :: Stanza sessionIQ = IQRequestS $ IQRequest { iqRequestID = "sess" , iqRequestFrom = Nothing @@ -33,3 +32,9 @@ xmppSession = do let IQResultS (IQResult "sess" Nothing Nothing _lang _body) = answer return () +startSession :: XMPPThread () +startSession = do + answer <- sendIQ' Nothing Set Nothing sessionXML + case answer of + Left e -> error $ show e + Right _ -> return () diff --git a/src/Network/XMPP/Types.hs b/src/Network/XMPP/Types.hs index e6eace6..1f59194 100644 --- a/src/Network/XMPP/Types.hs +++ b/src/Network/XMPP/Types.hs @@ -122,6 +122,7 @@ data Stanza = IQRequestS IQRequest | MessageErrorS MessageError | PresenceS Presence | PresenceErrorS PresenceError + deriving Show -- | -- A "request" Info/Query (IQ) stanza is one with either "get" or diff --git a/src/Tests.hs b/src/Tests.hs index 3b46959..d5621ab 100644 --- a/src/Tests.hs +++ b/src/Tests.hs @@ -34,7 +34,11 @@ attXmpp = liftIO . atomically testNS :: Text testNS = "xmpp:library:test" -data Payload = Payload Int Bool Text deriving (Eq, Show) +data Payload = Payload + { payloadCounter ::Int + , payloadFlag :: Bool + , payloadText :: Text + } deriving (Eq, Show) payloadP = xpWrap (\((counter,flag) , message) -> Payload counter flag message) (\(Payload counter flag message) ->((counter,flag) , message)) $ @@ -58,6 +62,7 @@ iqResponder = do let answerPayload = invertPayload payload let answerBody = pickleElem payloadP answerPayload answerIQ next (Right $ Just answerBody) + when (payloadCounter payload == 10) endSession autoAccept :: XMPPThread () autoAccept = forever $ do @@ -84,7 +89,9 @@ runMain debug number = do _ -> error "Need either 1 or 2" let debug' = liftIO . atomically . debug . (("Thread " ++ show number ++ ":") ++) + wait <- newEmptyTMVarIO xmppNewSession $ do + setSessionEndHandler (liftIO . atomically $ putTMVar wait ()) debug' "running" connect "localhost" "species64739.dyndns.org" startTLS exampleParams @@ -93,23 +100,29 @@ runMain debug number = do Right _ -> return () Left e -> error e xmppThreadedBind (resourcepart we) - withConnection $ xmppSession +-- startSession debug' "session standing" sendPresence presenceOnline forkXMPP autoAccept + sendPresence $ presenceSubscribe them forkXMPP iqResponder - when active . void . forkXMPP $ do - forM [1..10] $ \count -> do - let message = Text.pack . show $ localpart we - let payload = Payload count (even count) (Text.pack $ show count) - let body = pickleElem payloadP payload - Right answer <- sendIQ' (Just them) Get Nothing body - let Right answerPayload = unpickleElem payloadP - (fromJust $ iqResultPayload answer) - expect debug' (invertPayload payload) answerPayload - liftIO $ threadDelay 100000 - sendUser "All tests done" - liftIO . forever $ threadDelay 10000000 + when active $ do + liftIO $ threadDelay 1000000 -- Wait for the other thread to go online + void . forkXMPP $ do + forM [1..10] $ \count -> do + let message = Text.pack . show $ localpart we + let payload = Payload count (even count) (Text.pack $ show count) + let body = pickleElem payloadP payload + debug' "sending" + Right answer <- sendIQ' (Just them) Get Nothing body + debug' "received" + let Right answerPayload = unpickleElem payloadP + (fromJust $ iqResultPayload answer) + expect debug' (invertPayload payload) answerPayload + liftIO $ threadDelay 100000 + sendUser "All tests done" + endSession + liftIO . atomically $ takeTMVar wait return () return () diff --git a/tests/Stanzas.hs b/tests/Stanzas.hs new file mode 100644 index 0000000..23f6250 --- /dev/null +++ b/tests/Stanzas.hs @@ -0,0 +1,17 @@ +{-# LANGUAGE OverloadedStrings #-} +module Tests.Stanzas where + +import Data.Either +import Data.XML.Types +import Network.XMPP +import Network.XMPP.Marshal +import Network.XMPP.Pickle +import Network.XMPP.Types + +xml1 = Element {elementName = Name {nameLocalName = "iq", nameNamespace = Just "jabber:client", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = "id", nameNamespace = Nothing, namePrefix = Nothing},[ContentText "2"]), (Name {nameLocalName = "type", nameNamespace = Nothing, namePrefix = Nothing},[ContentText "error"]),(Name {nameLocalName = "to", nameNamespace = Nothing, namePrefix = Nothing},[ContentText "testuser1@species64739.dyndns.org/bot1"]),(Name {nameLocalName = "from", nameNamespace = Nothing, namePrefix = Nothing},[ContentText "testuser2@species64739.dyndns.org/bot2"])], elementNodes = [NodeElement (Element {elementName = Name {nameLocalName = "error", nameNamespace = Just "jabber:client", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = "type", nameNamespace = Nothing, namePrefix = Nothing},[ContentText "cancel"])], elementNodes = [NodeElement (Element {elementName = Name {nameLocalName = "service-unavailable", nameNamespace = Just "urn:ietf:params:xml:ns:xmpp-stanzas", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})]})]} + +isRight (Right _) = True +isRight _ = False + + +testXML1 = isRight $ unpickleElem stanzaP xml1 \ No newline at end of file