First implementation of the xep_0323 and xep_325 used in IoT systems. Tests are added for stanza and streams
This commit is contained in:
@@ -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['sensordata']['req']['seqnr'] = '1'
|
||||
iq['sensordata']['req']['momentary'] = 'true'
|
||||
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['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 testRejected(self):
|
||||
"""
|
||||
test of request stanza
|
||||
"""
|
||||
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 testReadOutMomentary_multiple(self):
|
||||
"""
|
||||
test of reading momentary value from a nde with multiple responses
|
||||
"""
|
||||
iq = self.Iq()
|
||||
print(str(iq))
|
||||
def testTimestamp(self):
|
||||
msg = self.Message();
|
||||
|
||||
self.check(iq,"""
|
||||
"""
|
||||
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)
|
||||
|
248
tests/test_stanza_xep_0325.py
Normal file
248
tests/test_stanza_xep_0325.py
Normal file
@@ -0,0 +1,248 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
SleekXMPP: The Sleek XMPP Library
|
||||
Implementation of xeps for Internet of Things
|
||||
http://wiki.xmpp.org/web/Tech_pages/IoT_systems
|
||||
Copyright (C) 2013 Sustainable Innovation, Joachim.lindborg@sust.se, bjorn.westrom@consoden.se
|
||||
This file is part of SleekXMPP.
|
||||
|
||||
See the file LICENSE for copying permission.
|
||||
"""
|
||||
|
||||
from sleekxmpp.test import *
|
||||
import sleekxmpp.plugins.xep_0325 as xep_0325
|
||||
|
||||
namespace='sn'
|
||||
|
||||
class TestControlStanzas(SleekTest):
|
||||
|
||||
|
||||
def setUp(self):
|
||||
pass
|
||||
|
||||
def testSetRequest(self):
|
||||
"""
|
||||
test of set request stanza
|
||||
"""
|
||||
iq = self.Iq()
|
||||
iq['type'] = 'set'
|
||||
iq['from'] = 'master@clayster.com/amr'
|
||||
iq['to'] = 'device@clayster.com'
|
||||
iq['id'] = '1'
|
||||
iq['set'].add_node("Device02", "Source02", "MyCacheType");
|
||||
iq['set'].add_node("Device15");
|
||||
iq['set'].add_data("Tjohej", "boolean", "true")
|
||||
|
||||
self.check(iq,"""
|
||||
<iq type='set'
|
||||
from='master@clayster.com/amr'
|
||||
to='device@clayster.com'
|
||||
id='1'>
|
||||
<set xmlns='urn:xmpp:iot:control'>
|
||||
<node nodeId='Device02' sourceId='Source02' cacheType='MyCacheType'/>
|
||||
<node nodeId='Device15'/>
|
||||
<boolean name='Tjohej' value='true'/>
|
||||
</set>
|
||||
</iq>
|
||||
"""
|
||||
)
|
||||
|
||||
iq['set'].del_node("Device02");
|
||||
|
||||
self.check(iq,"""
|
||||
<iq type='set'
|
||||
from='master@clayster.com/amr'
|
||||
to='device@clayster.com'
|
||||
id='1'>
|
||||
<set xmlns='urn:xmpp:iot:control'>
|
||||
<node nodeId='Device15'/>
|
||||
<boolean name='Tjohej' value='true'/>
|
||||
</set>
|
||||
</iq>
|
||||
"""
|
||||
)
|
||||
|
||||
iq['set'].del_nodes();
|
||||
|
||||
self.check(iq,"""
|
||||
<iq type='set'
|
||||
from='master@clayster.com/amr'
|
||||
to='device@clayster.com'
|
||||
id='1'>
|
||||
<set xmlns='urn:xmpp:iot:control'>
|
||||
<boolean name='Tjohej' value='true'/>
|
||||
</set>
|
||||
</iq>
|
||||
"""
|
||||
)
|
||||
|
||||
|
||||
def testDirectSet(self):
|
||||
"""
|
||||
test of direct set stanza
|
||||
"""
|
||||
msg = self.Message()
|
||||
msg['from'] = 'master@clayster.com/amr'
|
||||
msg['to'] = 'device@clayster.com'
|
||||
msg['set'].add_node("Device02");
|
||||
msg['set'].add_node("Device15");
|
||||
msg['set'].add_data("Tjohej", "boolean", "true")
|
||||
|
||||
self.check(msg,"""
|
||||
<message
|
||||
from='master@clayster.com/amr'
|
||||
to='device@clayster.com'>
|
||||
<set xmlns='urn:xmpp:iot:control'>
|
||||
<node nodeId='Device02'/>
|
||||
<node nodeId='Device15'/>
|
||||
<boolean name='Tjohej' value='true'/>
|
||||
</set>
|
||||
</message>
|
||||
"""
|
||||
)
|
||||
|
||||
|
||||
def testSetResponse(self):
|
||||
"""
|
||||
test of set response stanza
|
||||
"""
|
||||
iq = self.Iq()
|
||||
iq['type'] = 'result'
|
||||
iq['from'] = 'master@clayster.com/amr'
|
||||
iq['to'] = 'device@clayster.com'
|
||||
iq['id'] = '8'
|
||||
iq['setResponse']['responseCode'] = "OK";
|
||||
|
||||
self.check(iq,"""
|
||||
<iq type='result'
|
||||
from='master@clayster.com/amr'
|
||||
to='device@clayster.com'
|
||||
id='8'>
|
||||
<setResponse xmlns='urn:xmpp:iot:control' responseCode='OK' />
|
||||
</iq>
|
||||
"""
|
||||
)
|
||||
|
||||
iq = self.Iq()
|
||||
iq['type'] = 'error'
|
||||
iq['from'] = 'master@clayster.com/amr'
|
||||
iq['to'] = 'device@clayster.com'
|
||||
iq['id'] = '9'
|
||||
iq['setResponse']['responseCode'] = "OtherError";
|
||||
iq['setResponse']['error']['var'] = "Output";
|
||||
iq['setResponse']['error']['text'] = "Test of other error.!";
|
||||
|
||||
|
||||
self.check(iq,"""
|
||||
<iq type='error'
|
||||
from='master@clayster.com/amr'
|
||||
to='device@clayster.com'
|
||||
id='9'>
|
||||
<setResponse xmlns='urn:xmpp:iot:control' responseCode='OtherError'>
|
||||
<error var='Output'>Test of other error.!</error>
|
||||
</setResponse>
|
||||
</iq>
|
||||
"""
|
||||
)
|
||||
|
||||
iq = self.Iq()
|
||||
iq['type'] = 'error'
|
||||
iq['from'] = 'master@clayster.com/amr'
|
||||
iq['to'] = 'device@clayster.com'
|
||||
iq['id'] = '9'
|
||||
iq['setResponse']['responseCode'] = "NotFound";
|
||||
iq['setResponse'].add_node("Device17", "Source09");
|
||||
iq['setResponse'].add_node("Device18", "Source09");
|
||||
iq['setResponse'].add_data("Tjohopp");
|
||||
|
||||
|
||||
self.check(iq,"""
|
||||
<iq type='error'
|
||||
from='master@clayster.com/amr'
|
||||
to='device@clayster.com'
|
||||
id='9'>
|
||||
<setResponse xmlns='urn:xmpp:iot:control' responseCode='NotFound'>
|
||||
<node nodeId='Device17' sourceId='Source09'/>
|
||||
<node nodeId='Device18' sourceId='Source09'/>
|
||||
<parameter name='Tjohopp' />
|
||||
</setResponse>
|
||||
</iq>
|
||||
"""
|
||||
)
|
||||
|
||||
def testSetRequestDatas(self):
|
||||
"""
|
||||
test of set request data stanzas
|
||||
"""
|
||||
iq = self.Iq()
|
||||
iq['type'] = 'set'
|
||||
iq['from'] = 'master@clayster.com/amr'
|
||||
iq['to'] = 'device@clayster.com'
|
||||
iq['id'] = '1'
|
||||
iq['set'].add_node("Device02", "Source02", "MyCacheType");
|
||||
iq['set'].add_node("Device15");
|
||||
|
||||
iq['set'].add_data("Tjohej", "boolean", "true");
|
||||
iq['set'].add_data("Tjohej2", "boolean", "false");
|
||||
|
||||
iq['set'].add_data("TjohejC", "color", "FF00FF");
|
||||
iq['set'].add_data("TjohejC2", "color", "00FF00");
|
||||
|
||||
iq['set'].add_data("TjohejS", "string", "String1");
|
||||
iq['set'].add_data("TjohejS2", "string", "String2");
|
||||
|
||||
iq['set'].add_data("TjohejDate", "date", "2012-01-01");
|
||||
iq['set'].add_data("TjohejDate2", "date", "1900-12-03");
|
||||
|
||||
iq['set'].add_data("TjohejDateT4", "dateTime", "1900-12-03 12:30");
|
||||
iq['set'].add_data("TjohejDateT2", "dateTime", "1900-12-03 11:22");
|
||||
|
||||
iq['set'].add_data("TjohejDouble2", "double", "200.22");
|
||||
iq['set'].add_data("TjohejDouble3", "double", "-12232131.3333");
|
||||
|
||||
iq['set'].add_data("TjohejDur", "duration", "P5Y");
|
||||
iq['set'].add_data("TjohejDur2", "duration", "PT2M1S");
|
||||
|
||||
iq['set'].add_data("TjohejInt", "int", "1");
|
||||
iq['set'].add_data("TjohejInt2", "int", "-42");
|
||||
|
||||
iq['set'].add_data("TjohejLong", "long", "123456789098");
|
||||
iq['set'].add_data("TjohejLong2", "long", "-90983243827489374");
|
||||
|
||||
iq['set'].add_data("TjohejTime", "time", "23:59");
|
||||
iq['set'].add_data("TjohejTime2", "time", "12:00");
|
||||
|
||||
self.check(iq,"""
|
||||
<iq type='set'
|
||||
from='master@clayster.com/amr'
|
||||
to='device@clayster.com'
|
||||
id='1'>
|
||||
<set xmlns='urn:xmpp:iot:control'>
|
||||
<node nodeId='Device02' sourceId='Source02' cacheType='MyCacheType'/>
|
||||
<node nodeId='Device15'/>
|
||||
<boolean name='Tjohej' value='true'/>
|
||||
<boolean name='Tjohej2' value='false'/>
|
||||
<color name='TjohejC' value='FF00FF'/>
|
||||
<color name='TjohejC2' value='00FF00'/>
|
||||
<string name='TjohejS' value='String1'/>
|
||||
<string name='TjohejS2' value='String2'/>
|
||||
<date name='TjohejDate' value='2012-01-01'/>
|
||||
<date name='TjohejDate2' value='1900-12-03'/>
|
||||
<dateTime name='TjohejDateT4' value='1900-12-03 12:30'/>
|
||||
<dateTime name='TjohejDateT2' value='1900-12-03 11:22'/>
|
||||
<double name='TjohejDouble2' value='200.22'/>
|
||||
<double name='TjohejDouble3' value='-12232131.3333'/>
|
||||
<duration name='TjohejDur' value='P5Y'/>
|
||||
<duration name='TjohejDur2' value='PT2M1S'/>
|
||||
<int name='TjohejInt' value='1'/>
|
||||
<int name='TjohejInt2' value='-42'/>
|
||||
<long name='TjohejLong' value='123456789098'/>
|
||||
<long name='TjohejLong2' value='-90983243827489374'/>
|
||||
<time name='TjohejTime' value='23:59'/>
|
||||
<time name='TjohejTime2' value='12:00'/>
|
||||
</set>
|
||||
</iq>
|
||||
"""
|
||||
)
|
||||
|
||||
suite = unittest.TestLoader().loadTestsFromTestCase(TestControlStanzas)
|
1250
tests/test_stream_xep_0323.py
Normal file
1250
tests/test_stream_xep_0323.py
Normal file
File diff suppressed because it is too large
Load Diff
365
tests/test_stream_xep_0325.py
Normal file
365
tests/test_stream_xep_0325.py
Normal file
@@ -0,0 +1,365 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
SleekXMPP: The Sleek XMPP Library
|
||||
Implementation of xeps for Internet of Things
|
||||
http://wiki.xmpp.org/web/Tech_pages/IoT_systems
|
||||
Copyright (C) 2013 Sustainable Innovation, Joachim.lindborg@sust.se, bjorn.westrom@consoden.se
|
||||
This file is part of SleekXMPP.
|
||||
|
||||
See the file LICENSE for copying permission.
|
||||
"""
|
||||
|
||||
import sys
|
||||
import datetime
|
||||
import time
|
||||
import threading
|
||||
|
||||
from sleekxmpp.test import *
|
||||
from sleekxmpp.xmlstream import ElementBase
|
||||
from sleekxmpp.plugins.xep_0325.device import Device
|
||||
|
||||
|
||||
class TestStreamControl(SleekTest):
|
||||
|
||||
"""
|
||||
Test using the XEP-0325 plugin.
|
||||
"""
|
||||
def setUp(self):
|
||||
pass
|
||||
|
||||
def _time_now(self):
|
||||
return datetime.datetime.now().replace(microsecond=0).isoformat();
|
||||
|
||||
def tearDown(self):
|
||||
self.stream_close()
|
||||
|
||||
def testRequestSetOk(self):
|
||||
self.stream_start(mode='component',
|
||||
plugins=['xep_0030',
|
||||
'xep_0325'])
|
||||
|
||||
myDevice = Device("Device22");
|
||||
myDevice._add_control_field(name="Temperature", typename="int", value="15");
|
||||
|
||||
self.xmpp['xep_0325'].register_node(nodeId="Device22", device=myDevice, commTimeout=0.5);
|
||||
|
||||
self.recv("""
|
||||
<iq type='set'
|
||||
from='master@clayster.com/amr'
|
||||
to='device@clayster.com'
|
||||
id='1'>
|
||||
<set xmlns='urn:xmpp:iot:control'>
|
||||
<int name="Temperature" value="17"/>
|
||||
</set>
|
||||
</iq>
|
||||
""")
|
||||
|
||||
self.send("""
|
||||
<iq type='result'
|
||||
from='device@clayster.com'
|
||||
to='master@clayster.com/amr'
|
||||
id='1'>
|
||||
<setResponse xmlns='urn:xmpp:iot:control' responseCode="OK" />
|
||||
</iq>
|
||||
""")
|
||||
|
||||
self.assertEqual(myDevice._get_field_value("Temperature"), "17");
|
||||
|
||||
def testRequestSetMulti(self):
|
||||
self.stream_start(mode='component',
|
||||
plugins=['xep_0030',
|
||||
'xep_0325'])
|
||||
|
||||
myDevice = Device("Device22");
|
||||
myDevice._add_control_field(name="Temperature", typename="int", value="15");
|
||||
myDevice._add_control_field(name="Startup", typename="date", value="2013-01-03");
|
||||
|
||||
myDevice2 = Device("Device23");
|
||||
myDevice2._add_control_field(name="Temperature", typename="int", value="19");
|
||||
myDevice2._add_control_field(name="Startup", typename="date", value="2013-01-09");
|
||||
|
||||
self.xmpp['xep_0325'].register_node(nodeId="Device22", device=myDevice, commTimeout=0.5);
|
||||
self.xmpp['xep_0325'].register_node(nodeId="Device23", device=myDevice2, commTimeout=0.5);
|
||||
|
||||
self.recv("""
|
||||
<iq type='set'
|
||||
from='master@clayster.com/amr'
|
||||
to='device@clayster.com'
|
||||
id='1'>
|
||||
<set xmlns='urn:xmpp:iot:control'>
|
||||
<node nodeId='Device22' />
|
||||
<int name="Temperature" value="17"/>
|
||||
</set>
|
||||
</iq>
|
||||
""")
|
||||
|
||||
self.send("""
|
||||
<iq type='result'
|
||||
from='device@clayster.com'
|
||||
to='master@clayster.com/amr'
|
||||
id='1'>
|
||||
<setResponse xmlns='urn:xmpp:iot:control' responseCode="OK" />
|
||||
</iq>
|
||||
""")
|
||||
|
||||
self.assertEqual(myDevice._get_field_value("Temperature"), "17");
|
||||
self.assertEqual(myDevice2._get_field_value("Temperature"), "19");
|
||||
|
||||
self.recv("""
|
||||
<iq type='set'
|
||||
from='master@clayster.com/amr'
|
||||
to='device@clayster.com'
|
||||
id='2'>
|
||||
<set xmlns='urn:xmpp:iot:control'>
|
||||
<node nodeId='Device23' />
|
||||
<node nodeId='Device22' />
|
||||
<date name="Startup" value="2013-02-01"/>
|
||||
<int name="Temperature" value="20"/>
|
||||
</set>
|
||||
</iq>
|
||||
""")
|
||||
|
||||
self.send("""
|
||||
<iq type='result'
|
||||
from='device@clayster.com'
|
||||
to='master@clayster.com/amr'
|
||||
id='2'>
|
||||
<setResponse xmlns='urn:xmpp:iot:control' responseCode="OK" />
|
||||
</iq>
|
||||
""")
|
||||
|
||||
self.assertEqual(myDevice._get_field_value("Temperature"), "20");
|
||||
self.assertEqual(myDevice2._get_field_value("Temperature"), "20");
|
||||
self.assertEqual(myDevice._get_field_value("Startup"), "2013-02-01");
|
||||
self.assertEqual(myDevice2._get_field_value("Startup"), "2013-02-01");
|
||||
|
||||
def testRequestSetFail(self):
|
||||
self.stream_start(mode='component',
|
||||
plugins=['xep_0030',
|
||||
'xep_0325'])
|
||||
|
||||
myDevice = Device("Device23");
|
||||
myDevice._add_control_field(name="Temperature", typename="int", value="15");
|
||||
|
||||
self.xmpp['xep_0325'].register_node(nodeId="Device23", device=myDevice, commTimeout=0.5);
|
||||
|
||||
self.recv("""
|
||||
<iq type='set'
|
||||
from='master@clayster.com/amr'
|
||||
to='device@clayster.com'
|
||||
id='9'>
|
||||
<set xmlns='urn:xmpp:iot:control'>
|
||||
<int name="Voltage" value="17"/>
|
||||
</set>
|
||||
</iq>
|
||||
""")
|
||||
|
||||
self.send("""
|
||||
<iq type='error'
|
||||
from='device@clayster.com'
|
||||
to='master@clayster.com/amr'
|
||||
id='9'>
|
||||
<setResponse xmlns='urn:xmpp:iot:control' responseCode='NotFound'>
|
||||
<parameter name='Voltage' />
|
||||
<error var='Output'>Invalid field Voltage</error>
|
||||
</setResponse>
|
||||
</iq>
|
||||
""")
|
||||
|
||||
self.assertEqual(myDevice._get_field_value("Temperature"), "15");
|
||||
self.assertFalse(myDevice.has_control_field("Voltage", "int"));
|
||||
|
||||
def testDirectSetOk(self):
|
||||
self.stream_start(mode='component',
|
||||
plugins=['xep_0030',
|
||||
'xep_0325'])
|
||||
|
||||
myDevice = Device("Device22");
|
||||
myDevice._add_control_field(name="Temperature", typename="int", value="15");
|
||||
|
||||
self.xmpp['xep_0325'].register_node(nodeId="Device22", device=myDevice, commTimeout=0.5);
|
||||
|
||||
self.recv("""
|
||||
<message
|
||||
from='master@clayster.com/amr'
|
||||
to='device@clayster.com'>
|
||||
<set xmlns='urn:xmpp:iot:control'>
|
||||
<int name="Temperature" value="17"/>
|
||||
</set>
|
||||
</message>
|
||||
""")
|
||||
|
||||
time.sleep(.5)
|
||||
|
||||
self.assertEqual(myDevice._get_field_value("Temperature"), "17");
|
||||
|
||||
def testDirectSetFail(self):
|
||||
self.stream_start(mode='component',
|
||||
plugins=['xep_0030',
|
||||
'xep_0325'])
|
||||
|
||||
myDevice = Device("Device22");
|
||||
myDevice._add_control_field(name="Temperature", typename="int", value="15");
|
||||
|
||||
self.xmpp['xep_0325'].register_node(nodeId="Device22", device=myDevice, commTimeout=0.5);
|
||||
|
||||
self.recv("""
|
||||
<message
|
||||
from='master@clayster.com/amr'
|
||||
to='device@clayster.com'>
|
||||
<set xmlns='urn:xmpp:iot:control'>
|
||||
<int name="Voltage" value="17"/>
|
||||
</set>
|
||||
</message>
|
||||
""")
|
||||
|
||||
time.sleep(.5)
|
||||
|
||||
self.assertEqual(myDevice._get_field_value("Temperature"), "15");
|
||||
self.assertFalse(myDevice.has_control_field("Voltage", "int"));
|
||||
|
||||
|
||||
def testRequestSetOkAPI(self):
|
||||
|
||||
self.stream_start(mode='client',
|
||||
plugins=['xep_0030',
|
||||
'xep_0325'])
|
||||
|
||||
results = [];
|
||||
|
||||
def my_callback(from_jid, result, nodeIds=None, fields=None, error_msg=None):
|
||||
results.append(result);
|
||||
|
||||
fields = []
|
||||
fields.append(("Temperature", "double", "20.5"))
|
||||
fields.append(("TemperatureAlarmSetting", "string", "High"))
|
||||
|
||||
self.xmpp['xep_0325'].set_request(from_jid="tester@localhost", to_jid="you@google.com", fields=fields, nodeIds=['Device33', 'Device22'], callback=my_callback);
|
||||
|
||||
self.send("""
|
||||
<iq type='set'
|
||||
from='tester@localhost'
|
||||
to='you@google.com'
|
||||
id='1'>
|
||||
<set xmlns='urn:xmpp:iot:control'>
|
||||
<node nodeId='Device33' />
|
||||
<node nodeId='Device22' />
|
||||
<double name="Temperature" value="20.5" />
|
||||
<string name="TemperatureAlarmSetting" value="High" />
|
||||
</set>
|
||||
</iq>
|
||||
""")
|
||||
|
||||
self.recv("""
|
||||
<iq type='result'
|
||||
from='you@google.com'
|
||||
to='tester@localhost'
|
||||
id='1'>
|
||||
<setResponse xmlns='urn:xmpp:iot:control' responseCode="OK" />
|
||||
</iq>
|
||||
""")
|
||||
|
||||
time.sleep(.5)
|
||||
|
||||
self.assertEqual(results, ["OK"]);
|
||||
|
||||
def testRequestSetErrorAPI(self):
|
||||
|
||||
self.stream_start(mode='client',
|
||||
plugins=['xep_0030',
|
||||
'xep_0325'])
|
||||
|
||||
results = [];
|
||||
|
||||
def my_callback(from_jid, result, nodeIds=None, fields=None, error_msg=None):
|
||||
results.append(result);
|
||||
|
||||
fields = []
|
||||
fields.append(("Temperature", "double", "20.5"))
|
||||
fields.append(("TemperatureAlarmSetting", "string", "High"))
|
||||
|
||||
self.xmpp['xep_0325'].set_request(from_jid="tester@localhost", to_jid="you@google.com", fields=fields, nodeIds=['Device33', 'Device22'], callback=my_callback);
|
||||
|
||||
self.send("""
|
||||
<iq type='set'
|
||||
from='tester@localhost'
|
||||
to='you@google.com'
|
||||
id='1'>
|
||||
<set xmlns='urn:xmpp:iot:control'>
|
||||
<node nodeId='Device33' />
|
||||
<node nodeId='Device22' />
|
||||
<double name="Temperature" value="20.5" />
|
||||
<string name="TemperatureAlarmSetting" value="High" />
|
||||
</set>
|
||||
</iq>
|
||||
""")
|
||||
|
||||
self.recv("""
|
||||
<iq type='error'
|
||||
from='you@google.com'
|
||||
to='tester@localhost'
|
||||
id='1'>
|
||||
<setResponse xmlns='urn:xmpp:iot:control' responseCode="OtherError" >
|
||||
<error var='Temperature'>Sensor error</error>
|
||||
</setResponse>
|
||||
</iq>
|
||||
""")
|
||||
|
||||
time.sleep(.5)
|
||||
|
||||
self.assertEqual(results, ["OtherError"]);
|
||||
|
||||
def testServiceDiscoveryClient(self):
|
||||
self.stream_start(mode='client',
|
||||
plugins=['xep_0030',
|
||||
'xep_0325']);
|
||||
|
||||
self.recv("""
|
||||
<iq type='get'
|
||||
from='master@clayster.com/amr'
|
||||
to='tester@localhost'
|
||||
id='disco1'>
|
||||
<query xmlns='http://jabber.org/protocol/disco#info'/>
|
||||
</iq>
|
||||
""")
|
||||
|
||||
self.send("""
|
||||
<iq type='result'
|
||||
to='master@clayster.com/amr'
|
||||
id='disco1'>
|
||||
<query xmlns='http://jabber.org/protocol/disco#info'>
|
||||
<identity category='client' type='bot'/>
|
||||
<feature var='urn:xmpp:iot:control'/>
|
||||
</query>
|
||||
</iq>
|
||||
""")
|
||||
|
||||
def testServiceDiscoveryComponent(self):
|
||||
self.stream_start(mode='component',
|
||||
plugins=['xep_0030',
|
||||
'xep_0325']);
|
||||
|
||||
self.recv("""
|
||||
<iq type='get'
|
||||
from='master@clayster.com/amr'
|
||||
to='tester@localhost'
|
||||
id='disco1'>
|
||||
<query xmlns='http://jabber.org/protocol/disco#info'/>
|
||||
</iq>
|
||||
""")
|
||||
|
||||
self.send("""
|
||||
<iq type='result'
|
||||
from='tester@localhost'
|
||||
to='master@clayster.com/amr'
|
||||
id='disco1'>
|
||||
<query xmlns='http://jabber.org/protocol/disco#info'>
|
||||
<identity category='component' type='generic'/>
|
||||
<feature var='urn:xmpp:iot:control'/>
|
||||
</query>
|
||||
</iq>
|
||||
""")
|
||||
|
||||
|
||||
suite = unittest.TestLoader().loadTestsFromTestCase(TestStreamControl)
|
||||
|
Reference in New Issue
Block a user