summaryrefslogtreecommitdiff
path: root/tests/test_stanza_xep_0323.py
diff options
context:
space:
mode:
authorJoachim Lindborg <Joachim.Lindborg@lsys.se>2013-08-30 02:29:52 +0200
committerJoachim Lindborg <Joachim.Lindborg@lsys.se>2013-08-30 02:29:52 +0200
commit45689fd8799186fd6be0b308745aef428ab50dcc (patch)
tree0dd4e5f41684ad8f4b31920f1b8b9d3e27fd1527 /tests/test_stanza_xep_0323.py
parentb7adaafb3ecb0a615c93fbb1830e66357b081fe3 (diff)
downloadslixmpp-45689fd8799186fd6be0b308745aef428ab50dcc.tar.gz
slixmpp-45689fd8799186fd6be0b308745aef428ab50dcc.tar.bz2
slixmpp-45689fd8799186fd6be0b308745aef428ab50dcc.tar.xz
slixmpp-45689fd8799186fd6be0b308745aef428ab50dcc.zip
First implementation of the xep_0323 and xep_325 used in IoT systems. Tests are added for stanza and streams
Diffstat (limited to 'tests/test_stanza_xep_0323.py')
-rw-r--r--tests/test_stanza_xep_0323.py364
1 files changed, 350 insertions, 14 deletions
diff --git a/tests/test_stanza_xep_0323.py b/tests/test_stanza_xep_0323.py
index a052fced..67e0daf0 100644
--- a/tests/test_stanza_xep_0323.py
+++ b/tests/test_stanza_xep_0323.py
@@ -1,15 +1,24 @@
+# -*- coding: utf-8 -*-
+
from sleekxmpp.test import *
import sleekxmpp.plugins.xep_0323 as xep_0323
namespace='sn'
-class TestChatStates(SleekTest):
+class TestSensorDataStanzas(SleekTest):
def setUp(self):
- register_stanza_plugin(Message, xep_0323.stanza.Request)
- register_stanza_plugin(Message, xep_0323.stanza.Accepted)
- register_stanza_plugin(Message, xep_0323.stanza.Failure)
+ pass
+ #register_stanza_plugin(Iq, xep_0323.stanza.Request)
+ #register_stanza_plugin(Iq, xep_0323.stanza.Accepted)
+ #register_stanza_plugin(Message, xep_0323.stanza.Failure)
+ #register_stanza_plugin(xep_0323.stanza.Failure, xep_0323.stanza.Error)
+ #register_stanza_plugin(Iq, xep_0323.stanza.Rejected)
+ #register_stanza_plugin(Message, xep_0323.stanza.Fields)
+ #register_stanza_plugin(Message, xep_0323.stanza.Request)
+ #register_stanza_plugin(Message, xep_0323.stanza.Accepted)
+ #register_stanza_plugin(Message, xep_0323.stanza.Failure)
# register_stanza_plugin(Message, xep_0323.stanza.Result)
# register_stanza_plugin(Message, xep_0323.stanza.Gone)
# register_stanza_plugin(Message, xep_0323.stanza.Inactive)
@@ -21,37 +30,364 @@ class TestChatStates(SleekTest):
"""
iq = self.Iq()
iq['type'] = 'get'
+ iq['from'] = 'master@clayster.com/amr'
+ iq['to'] = 'device@clayster.com'
+ iq['id'] = '1'
+ iq['req']['seqnr'] = '1'
+ iq['req']['momentary'] = 'true'
+
+ self.check(iq,"""
+ <iq type='get'
+ from='master@clayster.com/amr'
+ to='device@clayster.com'
+ id='1'>
+ <req xmlns='urn:xmpp:iot:sensordata' seqnr='1' momentary='true'/>
+ </iq>
+ """
+ )
+
+ def testRequestNodes(self):
+ """
+ test of request nodes stanza
+ """
+ iq = self.Iq()
+ iq['type'] = 'get'
+ iq['from'] = 'master@clayster.com/amr'
+ iq['to'] = 'device@clayster.com'
+ iq['id'] = '1'
+ iq['req']['seqnr'] = '1'
+ iq['req']['momentary'] = 'true'
+
+
+ iq['req'].add_node("Device02", "Source02", "CacheType");
+ iq['req'].add_node("Device44");
+
+ self.check(iq,"""
+ <iq type='get'
+ from='master@clayster.com/amr'
+ to='device@clayster.com'
+ id='1'>
+ <req xmlns='urn:xmpp:iot:sensordata' seqnr='1' momentary='true'>
+ <node nodeId='Device02' sourceId='Source02' cacheType='CacheType'/>
+ <node nodeId='Device44'/>
+ </req>
+ </iq>
+ """
+ )
+
+ iq['req'].del_node("Device02");
+
+ self.check(iq,"""
+ <iq type='get'
+ from='master@clayster.com/amr'
+ to='device@clayster.com'
+ id='1'>
+ <req xmlns='urn:xmpp:iot:sensordata' seqnr='1' momentary='true'>
+ <node nodeId='Device44'/>
+ </req>
+ </iq>
+ """
+ )
+
+ iq['req'].del_nodes();
+
+ self.check(iq,"""
+ <iq type='get'
+ from='master@clayster.com/amr'
+ to='device@clayster.com'
+ id='1'>
+ <req xmlns='urn:xmpp:iot:sensordata' seqnr='1' momentary='true'>
+ </req>
+ </iq>
+ """
+ )
+
+ def testRequestField(self):
+ """
+ test of request field stanza
+ """
+ iq = self.Iq()
+ iq['type'] = 'get'
+ iq['from'] = 'master@clayster.com/amr'
+ iq['to'] = 'device@clayster.com'
iq['id'] = '1'
- iq['sensordata']['req']['seqnr'] = '1'
- iq['sensordata']['req']['momentary'] = 'true'
+ iq['req']['seqnr'] = '1'
+ iq['req']['momentary'] = 'true'
+
+
+ iq['req'].add_field("Top temperature");
+ iq['req'].add_field("Bottom temperature");
self.check(iq,"""
+ <iq type='get'
+ from='master@clayster.com/amr'
+ to='device@clayster.com'
+ id='1'>
+ <req xmlns='urn:xmpp:iot:sensordata' seqnr='1' momentary='true'>
+ <field name='Top temperature'/>
+ <field name='Bottom temperature'/>
+ </req>
+ </iq>
"""
)
+ iq['req'].del_field("Top temperature")
+
+ self.check(iq,"""
+ <iq type='get'
+ from='master@clayster.com/amr'
+ to='device@clayster.com'
+ id='1'>
+ <req xmlns='urn:xmpp:iot:sensordata' seqnr='1' momentary='true'>
+ <field name='Bottom temperature'/>
+ </req>
+ </iq>
+ """
+ )
+
+ iq['req'].del_fields()
+
+ self.check(iq,"""
+ <iq type='get'
+ from='master@clayster.com/amr'
+ to='device@clayster.com'
+ id='1'>
+ <req xmlns='urn:xmpp:iot:sensordata' seqnr='1' momentary='true'>
+ </req>
+ </iq>
+ """
+ )
+
+
def testAccepted(self):
"""
test of request stanza
"""
iq = self.Iq()
iq['type'] = 'result'
+ iq['from'] = 'device@clayster.com'
+ iq['to'] = 'master@clayster.com/amr'
iq['id'] = '2'
- iq['sensordata']['accepted']['seqnr'] = '2'
+ iq['accepted']['seqnr'] = '2'
- print(str(iq))
self.check(iq,"""
+ <iq type='result'
+ from='device@clayster.com'
+ to='master@clayster.com/amr'
+ id='2'>
+ <accepted xmlns='urn:xmpp:iot:sensordata' seqnr='2'/>
+ </iq>
"""
)
-
- def testReadOutMomentary_multiple(self):
+
+ def testRejected(self):
"""
- test of reading momentary value from a nde with multiple responses
+ test of request stanza
"""
- iq = self.Iq()
- print(str(iq))
+ iq = self.Iq()
+ iq['type'] = 'error'
+ iq['from'] = 'device@clayster.com'
+ iq['to'] = 'master@clayster.com/amr'
+ iq['id'] = '4'
+ iq['rejected']['seqnr'] = '4'
+ iq['rejected']['error'] = 'Access denied.'
self.check(iq,"""
+ <iq type='error'
+ from='device@clayster.com'
+ to='master@clayster.com/amr'
+ id='4'>
+ <rejected xmlns='urn:xmpp:iot:sensordata' seqnr='4'>
+ <error>Access denied.</error>
+ </rejected>
+ </iq>
+ """
+ )
+
+ def testFailure(self):
+ """
+ test of failure stanza
+ """
+ msg = self.Message()
+ msg['from'] = 'device@clayster.com'
+ msg['to'] = 'master@clayster.com/amr'
+ msg['failure']['seqnr'] = '3'
+ msg['failure']['done'] = 'true'
+ msg['failure']['error']['nodeId'] = 'Device01'
+ msg['failure']['error']['timestamp'] = '2013-03-07T17:13:30'
+ msg['failure']['error']['text'] = 'Timeout.'
+
+ self.check(msg,"""
+ <message from='device@clayster.com'
+ to='master@clayster.com/amr'>
+ <failure xmlns='urn:xmpp:iot:sensordata' seqnr='3' done='true'>
+ <error nodeId='Device01' timestamp='2013-03-07T17:13:30'>
+ Timeout.</error>
+ </failure>
+ </message>
"""
)
+
+ def testFields(self):
+ """
+ test of fields stanza
+ """
+ msg = self.Message()
+ msg['from'] = 'device@clayster.com'
+ msg['to'] = 'master@clayster.com/amr'
+ msg['fields']['seqnr'] = '1'
+
+ node = msg['fields'].add_node("Device02");
+ ts = node.add_timestamp("2013-03-07T16:24:30");
+
+ data = ts.add_data(typename="numeric", name="Temperature", value="-12.42", unit='K');
+ data['momentary'] = 'true';
+ data['automaticReadout'] = 'true';
+
+ self.check(msg,"""
+ <message from='device@clayster.com'
+ to='master@clayster.com/amr'>
+ <fields xmlns='urn:xmpp:iot:sensordata' seqnr='1'>
+ <node nodeId='Device02'>
+ <timestamp value='2013-03-07T16:24:30'>
+ <numeric name='Temperature' momentary='true' automaticReadout='true' value='-12.42' unit='K'/>
+ </timestamp>
+ </node>
+ </fields>
+ </message>
+ """
+ )
+
+ node = msg['fields'].add_node("EmptyDevice");
+ node = msg['fields'].add_node("Device04");
+ ts = node.add_timestamp("EmptyTimestamp");
+
+
+ self.check(msg,"""
+ <message from='device@clayster.com'
+ to='master@clayster.com/amr'>
+ <fields xmlns='urn:xmpp:iot:sensordata' seqnr='1'>
+ <node nodeId='Device02'>
+ <timestamp value='2013-03-07T16:24:30'>
+ <numeric name='Temperature' momentary='true' automaticReadout='true' value='-12.42' unit='K'/>
+ </timestamp>
+ </node>
+ <node nodeId='EmptyDevice'/>
+ <node nodeId='Device04'>
+ <timestamp value='EmptyTimestamp'/>
+ </node>
+ </fields>
+ </message>
+ """
+ )
+
+ node = msg['fields'].add_node("Device77");
+ ts = node.add_timestamp("2013-05-03T12:00:01");
+ data = ts.add_data(typename="numeric", name="Temperature", value="-12.42", unit='K');
+ data['historicalDay'] = 'true';
+ data = ts.add_data(typename="numeric", name="Speed", value="312.42", unit='km/h');
+ data['historicalWeek'] = 'false';
+ data = ts.add_data(typename="string", name="Temperature name", value="Bottom oil");
+ data['historicalMonth'] = 'true';
+ data = ts.add_data(typename="string", name="Speed name", value="Top speed");
+ data['historicalQuarter'] = 'false';
+ data = ts.add_data(typename="dateTime", name="T1", value="1979-01-01T00:00:00");
+ data['historicalYear'] = 'true';
+ data = ts.add_data(typename="dateTime", name="T2", value="2000-01-01T01:02:03");
+ data['historicalOther'] = 'false';
+ data = ts.add_data(typename="timeSpan", name="TS1", value="P5Y");
+ data['missing'] = 'true';
+ data = ts.add_data(typename="timeSpan", name="TS2", value="PT2M1S");
+ data['manualEstimate'] = 'false';
+ data = ts.add_data(typename="enum", name="top color", value="red", dataType="string");
+ data['invoiced'] = 'true';
+ data = ts.add_data(typename="enum", name="bottom color", value="black", dataType="string");
+ data['powerFailure'] = 'false';
+ data = ts.add_data(typename="boolean", name="Temperature real", value="false");
+ data['historicalDay'] = 'true';
+ data = ts.add_data(typename="boolean", name="Speed real", value="true");
+ data['historicalWeek'] = 'false';
+
+ self.check(msg,"""
+ <message from='device@clayster.com'
+ to='master@clayster.com/amr'>
+ <fields xmlns='urn:xmpp:iot:sensordata' seqnr='1'>
+ <node nodeId='Device02'>
+ <timestamp value='2013-03-07T16:24:30'>
+ <numeric name='Temperature' momentary='true' automaticReadout='true' value='-12.42' unit='K'/>
+ </timestamp>
+ </node>
+ <node nodeId='EmptyDevice'/>
+ <node nodeId='Device04'>
+ <timestamp value='EmptyTimestamp'/>
+ </node>
+ <node nodeId='Device77'>
+ <timestamp value='2013-05-03T12:00:01'>
+ <numeric name='Temperature' historicalDay='true' value='-12.42' unit='K'/>
+ <numeric name='Speed' historicalWeek='false' value='312.42' unit='km/h'/>
+ <string name='Temperature name' historicalMonth='true' value='Bottom oil'/>
+ <string name='Speed name' historicalQuarter='false' value='Top speed'/>
+ <dateTime name='T1' historicalYear='true' value='1979-01-01T00:00:00'/>
+ <dateTime name='T2' historicalOther='false' value='2000-01-01T01:02:03'/>
+ <timeSpan name='TS1' missing='true' value='P5Y'/>
+ <timeSpan name='TS2' manualEstimate='false' value='PT2M1S'/>
+ <enum name='top color' invoiced='true' value='red' dataType='string'/>
+ <enum name='bottom color' powerFailure='false' value='black' dataType='string'/>
+ <boolean name='Temperature real' historicalDay='true' value='false'/>
+ <boolean name='Speed real' historicalWeek='false' value='true'/>
+ </timestamp>
+ </node>
+ </fields>
+ </message>
+ """
+ )
+
+
+ def testTimestamp(self):
+ msg = self.Message();
+
+ msg['from'] = 'device@clayster.com'
+ msg['to'] = 'master@clayster.com/amr'
+ msg['fields']['seqnr'] = '1'
+
+ node = msg['fields'].add_node("Device02");
+ node = msg['fields'].add_node("Device03");
+
+ ts = node.add_timestamp("2013-03-07T16:24:30");
+ ts = node.add_timestamp("2013-03-07T16:24:31");
+
+
+
+ self.check(msg,"""
+ <message from='device@clayster.com'
+ to='master@clayster.com/amr'>
+ <fields xmlns='urn:xmpp:iot:sensordata' seqnr='1'>
+ <node nodeId='Device02'/>
+ <node nodeId='Device03'>
+ <timestamp value='2013-03-07T16:24:30'/>
+ <timestamp value='2013-03-07T16:24:31'/>
+ </node>
+ </fields>
+ </message>
+ """
+ )
+
+
+ def testStringIdsMatcher(self):
+ """
+ test of StringIds follow spec
+ """
+ emptyStringIdXML='<message xmlns="jabber:client"><fields xmlns="urn:xmpp:iot:sensordata" /></message>'
+
+ msg = self.Message()
+ msg['fields']['stringIds'] = "Nisse"
+ self.check(msg,emptyStringIdXML)
+ msg['fields']['stringIds'] = "Nisse___nje#"
+ self.check(msg,emptyStringIdXML)
+ msg['fields']['stringIds'] = "1"
+ self.check(msg,emptyStringIdXML)
+
+
+
-suite = unittest.TestLoader().loadTestsFromTestCase(TestChatStates)
+suite = unittest.TestLoader().loadTestsFromTestCase(TestSensorDataStanzas)