1 # -*- coding: utf-8 -*-
8 from slixmpp
.test
import *
9 from slixmpp
.xmlstream
import ElementBase
10 from slixmpp
.plugins
.xep_0323
.device
import Device
13 class TestStreamSensorData(SlixTest
):
16 Test using the XEP-0323 plugin.
22 return datetime
.datetime
.now().replace(microsecond
=0).isoformat();
27 def testRequestAccept(self
):
28 self
.stream_start(mode
='component',
32 myDevice
= Device("Device22");
33 myDevice
._add
_field
(name
="Temperature", typename
="numeric", unit
="°C");
34 myDevice
._set
_momentary
_timestamp
("2013-03-07T16:24:30")
35 myDevice
._add
_field
_momentary
_data
("Temperature", "23.4", flags
={"automaticReadout": "true"});
37 self
.xmpp
['xep_0323'].register_node(nodeId
="Device22", device
=myDevice
, commTimeout
=0.5);
41 from='master@clayster.com/amr'
42 to='device@clayster.com'
44 <req xmlns='urn:xmpp:iot:sensordata' seqnr='1' momentary='true'/>
50 from='device@clayster.com'
51 to='master@clayster.com/amr'
53 <accepted xmlns='urn:xmpp:iot:sensordata' seqnr='1'/>
58 <message from='device@clayster.com'
59 to='master@clayster.com/amr'>
60 <fields xmlns='urn:xmpp:iot:sensordata' seqnr='1' done='true'>
61 <node nodeId='Device22'>
62 <timestamp value='2013-03-07T16:24:30'>
63 <numeric name='Temperature' momentary='true' automaticReadout='true' value='23.4' unit='°C'/>
70 def testRequestRejectAuth(self
):
72 self
.stream_start(mode
='component',
76 self
.xmpp
['xep_0323']._set
_authenticated
("darth@deathstar.com");
80 from='master@clayster.com/amr'
81 to='device@clayster.com'
83 <req xmlns='urn:xmpp:iot:sensordata' seqnr='5' momentary='true'/>
89 from='device@clayster.com'
90 to='master@clayster.com/amr'
92 <rejected xmlns='urn:xmpp:iot:sensordata' seqnr='5'>
93 <error>Access denied</error>
98 def testRequestNode(self
):
100 self
.stream_start(mode
='component',
104 myDevice
= Device("Device44");
105 self
.xmpp
['xep_0323'].register_node('Device44', myDevice
, commTimeout
=0.5);
111 from='master@clayster.com/amr'
112 to='device@clayster.com'
114 <req xmlns='urn:xmpp:iot:sensordata' seqnr='66' momentary='true'>
115 <node nodeId='Device33'/>
122 from='device@clayster.com'
123 to='master@clayster.com/amr'
125 <rejected xmlns='urn:xmpp:iot:sensordata' seqnr='66'>
126 <error>Invalid nodeId Device33</error>
135 from='master@clayster.com/amr'
136 to='device@clayster.com'
138 <req xmlns='urn:xmpp:iot:sensordata' seqnr='7' momentary='true'>
139 <node nodeId='Device44'/>
146 from='device@clayster.com'
147 to='master@clayster.com/amr'
149 <accepted xmlns='urn:xmpp:iot:sensordata' seqnr='7'/>
154 def testRequestField(self
):
156 self
.stream_start(mode
='component',
160 myDevice
= Device("Device44");
161 myDevice
._add
_field
(name
='Voltage', typename
="numeric", unit
="V");
162 myDevice
._add
_field
_timestamp
_data
(name
="Voltage", value
="230.4", timestamp
="2000-01-01T00:01:02", flags
={"invoiced": "true"});
164 self
.xmpp
['xep_0323'].register_node('Device44', myDevice
, commTimeout
=0.5);
170 from='master@clayster.com/amr'
171 to='device@clayster.com'
173 <req xmlns='urn:xmpp:iot:sensordata' seqnr='6'>
174 <field name='Current'/>
181 from='device@clayster.com'
182 to='master@clayster.com/amr'
184 <rejected xmlns='urn:xmpp:iot:sensordata' seqnr='6'>
185 <error>Invalid field Current</error>
194 from='master@clayster.com/amr'
195 to='device@clayster.com'
197 <req xmlns='urn:xmpp:iot:sensordata' seqnr='7'>
198 <field name='Voltage'/>
205 from='device@clayster.com'
206 to='master@clayster.com/amr'
208 <accepted xmlns='urn:xmpp:iot:sensordata' seqnr='7'/>
213 <message from='device@clayster.com'
214 to='master@clayster.com/amr'>
215 <fields xmlns='urn:xmpp:iot:sensordata' seqnr='7'>
216 <node nodeId='Device44'>
217 <timestamp value='2000-01-01T00:01:02'>
218 <numeric name='Voltage' invoiced='true' value='230.4' unit='V'/>
226 <message from='device@clayster.com'
227 to='master@clayster.com/amr'>
228 <fields xmlns='urn:xmpp:iot:sensordata' seqnr='7' done='true'>
233 def testRequestMultiTimestampSingleField(self
):
235 self
.stream_start(mode
='component',
239 myDevice
= Device("Device44");
240 myDevice
._add
_field
(name
='Voltage', typename
="numeric", unit
="V");
241 myDevice
._add
_field
_timestamp
_data
(name
="Voltage", value
="230.4", timestamp
="2000-01-01T00:01:02", flags
={"invoiced": "true"});
242 myDevice
._add
_field
(name
='Current', typename
="numeric", unit
="A");
243 myDevice
._add
_field
(name
='Height', typename
="string");
244 myDevice
._add
_field
_timestamp
_data
(name
="Voltage", value
="230.6", timestamp
="2000-01-01T01:01:02");
245 myDevice
._add
_field
_timestamp
_data
(name
="Height", value
="115 m", timestamp
="2000-01-01T01:01:02", flags
={"invoiced": "true"});
247 self
.xmpp
['xep_0323'].register_node('Device44', myDevice
, commTimeout
=0.5);
253 from='master@clayster.com/amr'
254 to='device@clayster.com'
256 <req xmlns='urn:xmpp:iot:sensordata' seqnr='7'>
257 <field name='Voltage'/>
264 from='device@clayster.com'
265 to='master@clayster.com/amr'
267 <accepted xmlns='urn:xmpp:iot:sensordata' seqnr='7'/>
272 <message from='device@clayster.com'
273 to='master@clayster.com/amr'>
274 <fields xmlns='urn:xmpp:iot:sensordata' seqnr='7'>
275 <node nodeId='Device44'>
276 <timestamp value='2000-01-01T00:01:02'>
277 <numeric name='Voltage' invoiced='true' value='230.4' unit='V'/>
285 <message from='device@clayster.com'
286 to='master@clayster.com/amr'>
287 <fields xmlns='urn:xmpp:iot:sensordata' seqnr='7'>
288 <node nodeId='Device44'>
289 <timestamp value='2000-01-01T01:01:02'>
290 <numeric name='Voltage' value='230.6' unit='V'/>
298 <message from='device@clayster.com'
299 to='master@clayster.com/amr'>
300 <fields xmlns='urn:xmpp:iot:sensordata' seqnr='7' done='true'>
305 def testRequestMultiTimestampAllFields(self
):
307 self
.stream_start(mode
='component',
311 myDevice
= Device("Device44");
312 myDevice
._add
_field
(name
='Voltage', typename
="numeric", unit
="V");
313 myDevice
._add
_field
_timestamp
_data
(name
="Voltage", value
="230.4", timestamp
="2000-01-01T00:01:02", flags
={"invoiced": "true"});
314 myDevice
._add
_field
(name
='Current', typename
="numeric", unit
="A");
315 myDevice
._add
_field
(name
='Height', typename
="string");
316 myDevice
._add
_field
_timestamp
_data
(name
="Voltage", value
="230.6", timestamp
="2000-01-01T01:01:02");
317 myDevice
._add
_field
_timestamp
_data
(name
="Height", value
="115 m", timestamp
="2000-01-01T01:01:02", flags
={"invoiced": "true"});
319 self
.xmpp
['xep_0323'].register_node('Device44', myDevice
, commTimeout
=0.5);
325 from='master@clayster.com/amr'
326 to='device@clayster.com'
328 <req xmlns='urn:xmpp:iot:sensordata' seqnr='7'/>
334 from='device@clayster.com'
335 to='master@clayster.com/amr'
337 <accepted xmlns='urn:xmpp:iot:sensordata' seqnr='7'/>
342 <message from='device@clayster.com'
343 to='master@clayster.com/amr'>
344 <fields xmlns='urn:xmpp:iot:sensordata' seqnr='7'>
345 <node nodeId='Device44'>
346 <timestamp value='2000-01-01T00:01:02'>
347 <numeric name='Voltage' invoiced='true' value='230.4' unit='V'/>
355 <message from='device@clayster.com'
356 to='master@clayster.com/amr'>
357 <fields xmlns='urn:xmpp:iot:sensordata' seqnr='7'>
358 <node nodeId='Device44'>
359 <timestamp value='2000-01-01T01:01:02'>
360 <numeric name='Voltage' value='230.6' unit='V'/>
361 <string name='Height' invoiced='true' value='115 m'/>
369 <message from='device@clayster.com'
370 to='master@clayster.com/amr'>
371 <fields xmlns='urn:xmpp:iot:sensordata' seqnr='7' done='true'>
376 def testRequestAPI(self
):
378 self
.stream_start(mode
='client',
382 self
.xmpp
['xep_0323'].request_data(from_jid
="tester@localhost", to_jid
="you@google.com", callback
=None);
386 from='tester@localhost'
389 <req xmlns='urn:xmpp:iot:sensordata' seqnr='1'/>
393 self
.xmpp
['xep_0323'].request_data(from_jid
="tester@localhost", to_jid
="you@google.com", nodeIds
=['Device33', 'Device22'], callback
=None);
397 from='tester@localhost'
400 <req xmlns='urn:xmpp:iot:sensordata' seqnr='2'>
401 <node nodeId="Device33"/>
402 <node nodeId="Device22"/>
407 self
.xmpp
['xep_0323'].request_data(from_jid
="tester@localhost", to_jid
="you@google.com", fields
=['Temperature', 'Voltage'], callback
=None);
411 from='tester@localhost'
414 <req xmlns='urn:xmpp:iot:sensordata' seqnr='3'>
415 <field name="Temperature"/>
416 <field name="Voltage"/>
421 def testRequestRejectAPI(self
):
423 self
.stream_start(mode
='client',
429 def my_callback(from_jid
, result
, nodeId
=None, timestamp
=None, fields
=None, error_msg
=None):
430 if (result
== "rejected") and (error_msg
== "Invalid device Device22"):
431 results
.append("rejected");
433 self
.xmpp
['xep_0323'].request_data(from_jid
="tester@localhost", to_jid
="you@google.com", nodeIds
=['Device33', 'Device22'], callback
=my_callback
);
437 from='tester@localhost'
440 <req xmlns='urn:xmpp:iot:sensordata' seqnr='1'>
441 <node nodeId="Device33"/>
442 <node nodeId="Device22"/>
449 from='you@google.com'
450 to='tester@localhost'
452 <rejected xmlns='urn:xmpp:iot:sensordata' seqnr='1'>
453 <error>Invalid device Device22</error>
460 self
.failUnless(results
== ["rejected"],
461 "Rejected callback was not properly executed");
463 def testRequestAcceptedAPI(self
):
465 self
.stream_start(mode
='client',
471 def my_callback(from_jid
, result
, nodeId
=None, timestamp
=None, fields
=None, error_msg
=None):
472 results
.append(result
);
474 self
.xmpp
['xep_0323'].request_data(from_jid
="tester@localhost", to_jid
="you@google.com", nodeIds
=['Device33', 'Device22'], callback
=my_callback
);
478 from='tester@localhost'
481 <req xmlns='urn:xmpp:iot:sensordata' seqnr='1'>
482 <node nodeId="Device33"/>
483 <node nodeId="Device22"/>
490 from='you@google.com'
491 to='tester@localhost'
493 <accepted xmlns='urn:xmpp:iot:sensordata' seqnr='1'/>
499 self
.failUnless(results
== ["accepted"],
500 "Accepted callback was not properly executed");
502 def testRequestFieldsAPI(self
):
504 self
.stream_start(mode
='client',
511 def my_callback(from_jid
, result
, nodeId
=None, timestamp
=None, fields
=None, error_msg
=None):
512 results
.append(result
);
513 if result
== "fields":
514 callback_data
["nodeId"] = nodeId
;
515 callback_data
["timestamp"] = timestamp
;
516 callback_data
["error_msg"] = error_msg
;
518 callback_data
["field_" + f
['name']] = f
;
520 t1
= threading
.Thread(name
="request_data",
521 target
=self
.xmpp
['xep_0323'].request_data
,
522 kwargs
={"from_jid": "tester@localhost",
523 "to_jid": "you@google.com",
524 "nodeIds": ['Device33'],
525 "callback": my_callback
});
527 #self.xmpp['xep_0323'].request_data(from_jid="tester@localhost", to_jid="you@google.com", nodeIds=['Device33'], callback=my_callback);
531 from='tester@localhost'
534 <req xmlns='urn:xmpp:iot:sensordata' seqnr='1'>
535 <node nodeId="Device33"/>
542 from='you@google.com'
543 to='tester@localhost'
545 <accepted xmlns='urn:xmpp:iot:sensordata' seqnr='1'/>
550 <message from='you@google.com'
551 to='tester@localhost'>
552 <fields xmlns='urn:xmpp:iot:sensordata' seqnr='1'>
553 <node nodeId='Device33'>
554 <timestamp value='2000-01-01T00:01:02'>
555 <numeric name='Voltage' invoiced='true' value='230.4' unit='V'/>
556 <boolean name='TestBool' value='true'/>
564 <message from='you@google.com'
565 to='tester@localhost'>
566 <fields xmlns='urn:xmpp:iot:sensordata' seqnr='1' done='true'/>
573 self
.failUnlessEqual(results
, ["accepted","fields","done"]);
574 # self.assertIn("nodeId", callback_data);
575 self
.assertTrue("nodeId" in callback_data
)
576 self
.failUnlessEqual(callback_data
["nodeId"], "Device33");
577 # self.assertIn("timestamp", callback_data);
578 self
.assertTrue("timestamp" in callback_data
);
579 self
.failUnlessEqual(callback_data
["timestamp"], "2000-01-01T00:01:02");
580 #self.assertIn("field_Voltage", callback_data);
581 self
.assertTrue("field_Voltage" in callback_data
);
582 self
.failUnlessEqual(callback_data
["field_Voltage"], {"name": "Voltage", "value": "230.4", "typename": "numeric", "unit": "V", "flags": {"invoiced": "true"}});
583 #self.assertIn("field_TestBool", callback_data);
584 self
.assertTrue("field_TestBool" in callback_data
);
585 self
.failUnlessEqual(callback_data
["field_TestBool"], {"name": "TestBool", "value": "true", "typename": "boolean" });
587 def testServiceDiscoveryClient(self
):
588 self
.stream_start(mode
='client',
594 from='master@clayster.com/amr'
595 to='tester@localhost'
597 <query xmlns='http://jabber.org/protocol/disco#info'/>
603 to='master@clayster.com/amr'
605 <query xmlns='http://jabber.org/protocol/disco#info'>
606 <identity category='client' type='bot'/>
607 <feature var='urn:xmpp:iot:sensordata'/>
612 def testServiceDiscoveryComponent(self
):
613 self
.stream_start(mode
='component',
619 from='master@clayster.com/amr'
620 to='tester@localhost'
622 <query xmlns='http://jabber.org/protocol/disco#info'/>
628 from='tester@localhost'
629 to='master@clayster.com/amr'
631 <query xmlns='http://jabber.org/protocol/disco#info'>
632 <identity category='component' type='generic'/>
633 <feature var='urn:xmpp:iot:sensordata'/>
638 def testRequestTimeout(self
):
640 self
.stream_start(mode
='client',
647 def my_callback(from_jid
, result
, nodeId
=None, timestamp
=None, error_msg
=None):
648 results
.append(result
);
649 if result
== "failure":
650 callback_data
["nodeId"] = nodeId
;
651 callback_data
["timestamp"] = timestamp
;
652 callback_data
["error_msg"] = error_msg
;
654 t1
= threading
.Thread(name
="request_data",
655 target
=self
.xmpp
['xep_0323'].request_data
,
656 kwargs
={"from_jid": "tester@localhost",
657 "to_jid": "you@google.com",
658 "nodeIds": ['Device33'],
659 "callback": my_callback
});
664 from='tester@localhost'
667 <req xmlns='urn:xmpp:iot:sensordata' seqnr='1'>
668 <node nodeId="Device33"/>
675 from='you@google.com'
676 to='tester@localhost'
678 <accepted xmlns='urn:xmpp:iot:sensordata' seqnr='1'/>
683 <message from='you@google.com'
684 to='tester@localhost'>
685 <failure xmlns='urn:xmpp:iot:sensordata' seqnr='1' done='true'>
686 <error nodeId='Device33' timestamp='2013-03-07T17:13:30'>Timeout.</error>
694 self
.failUnlessEqual(results
, ["accepted","failure"]);
695 # self.assertIn("nodeId", callback_data);
696 self
.assertTrue("nodeId" in callback_data
);
697 self
.failUnlessEqual(callback_data
["nodeId"], "Device33");
698 # self.assertIn("timestamp", callback_data);
699 self
.assertTrue("timestamp" in callback_data
);
700 self
.failUnlessEqual(callback_data
["timestamp"], "2013-03-07T17:13:30");
701 # self.assertIn("error_msg", callback_data);
702 self
.assertTrue("error_msg" in callback_data
);
703 self
.failUnlessEqual(callback_data
["error_msg"], "Timeout.");
705 def testDelayedRequest(self
):
706 self
.stream_start(mode
='component',
710 myDevice
= Device("Device22");
711 myDevice
._add
_field
(name
="Temperature", typename
="numeric", unit
="°C");
712 myDevice
._set
_momentary
_timestamp
("2013-03-07T16:24:30")
713 myDevice
._add
_field
_momentary
_data
("Temperature", "23.4", flags
={"automaticReadout": "true"});
715 self
.xmpp
['xep_0323'].register_node(nodeId
="Device22", device
=myDevice
, commTimeout
=0.5);
717 dtnow
= datetime
.datetime
.now()
718 ts_2sec
= datetime
.timedelta(0,2)
719 dtnow_plus_2sec
= dtnow
+ ts_2sec
720 when_flag
= dtnow_plus_2sec
.replace(microsecond
=0).isoformat()
724 from='master@clayster.com/amr'
725 to='device@clayster.com'
727 <req xmlns='urn:xmpp:iot:sensordata' seqnr='1' momentary='true' when='""" + when_flag
+ """'/>
733 from='device@clayster.com'
734 to='master@clayster.com/amr'
736 <accepted xmlns='urn:xmpp:iot:sensordata' seqnr='1' queued='true' />
743 <message from='device@clayster.com'
744 to='master@clayster.com/amr'>
745 <started xmlns='urn:xmpp:iot:sensordata' seqnr='1' />
750 <message from='device@clayster.com'
751 to='master@clayster.com/amr'>
752 <fields xmlns='urn:xmpp:iot:sensordata' seqnr='1' done='true'>
753 <node nodeId='Device22'>
754 <timestamp value='2013-03-07T16:24:30'>
755 <numeric name='Temperature' momentary='true' automaticReadout='true' value='23.4' unit='°C'/>
762 def testDelayedRequestFail(self
):
763 self
.stream_start(mode
='component',
767 myDevice
= Device("Device22");
768 myDevice
._add
_field
(name
="Temperature", typename
="numeric", unit
="°C");
769 myDevice
._set
_momentary
_timestamp
("2013-03-07T16:24:30")
770 myDevice
._add
_field
_momentary
_data
("Temperature", "23.4", flags
={"automaticReadout": "true"});
772 self
.xmpp
['xep_0323'].register_node(nodeId
="Device22", device
=myDevice
, commTimeout
=0.5);
774 dtnow
= datetime
.datetime
.now()
775 ts_2sec
= datetime
.timedelta(0,2)
776 dtnow_minus_2sec
= dtnow
- ts_2sec
777 when_flag
= dtnow_minus_2sec
.replace(microsecond
=0).isoformat()
781 from='master@clayster.com/amr'
782 to='device@clayster.com'
784 <req xmlns='urn:xmpp:iot:sensordata' seqnr='1' momentary='true' when='""" + when_flag
+ """'/>
788 # Remove the returned datetime to allow predictable test
789 xml_stanza
= self
._filtered
_stanza
_prepare
()
790 error_text
= xml_stanza
['rejected']['error'] #['text']
791 error_text
= error_text
[:error_text
.find(':')]
792 xml_stanza
['rejected']['error'] = error_text
794 self
._filtered
_stanza
_check
("""
796 from='device@clayster.com'
797 to='master@clayster.com/amr'
799 <rejected xmlns='urn:xmpp:iot:sensordata' seqnr='1'>
800 <error>Invalid datetime in 'when' flag, cannot set a time in the past. Current time</error>
806 def _filtered_stanza_prepare(self
, timeout
=.5):
807 sent
= self
.xmpp
.socket
.next_sent(timeout
)
809 self
.fail("No stanza was sent.")
811 xml
= self
.parse_xml(sent
)
812 self
.fix_namespaces(xml
, 'jabber:client')
813 sent
= self
.xmpp
._build
_stanza
(xml
, 'jabber:client')
816 def _filtered_stanza_check(self
, data
, filtered
, defaults
=None, use_values
=True, method
='exact'):
817 self
.check(filtered
, data
,
820 use_values
=use_values
)
822 def testRequestFieldFrom(self
):
824 self
.stream_start(mode
='component',
828 myDevice
= Device("Device44");
829 myDevice
._add
_field
(name
='Voltage', typename
="numeric", unit
="V");
830 myDevice
._add
_field
_timestamp
_data
(name
="Voltage", value
="230.1", timestamp
="2000-01-01T00:01:02", flags
={"invoiced": "true"});
831 myDevice
._add
_field
_timestamp
_data
(name
="Voltage", value
="230.2", timestamp
="2000-02-01T00:01:02", flags
={"invoiced": "true"});
832 myDevice
._add
_field
_timestamp
_data
(name
="Voltage", value
="230.3", timestamp
="2000-03-01T00:01:02", flags
={"invoiced": "true"});
834 self
.xmpp
['xep_0323'].register_node('Device44', myDevice
, commTimeout
=0.5);
840 from='master@clayster.com/amr'
841 to='device@clayster.com'
843 <req xmlns='urn:xmpp:iot:sensordata' seqnr='6' from='2000-01-02T00:00:01'>
844 <field name='Voltage'/>
851 from='device@clayster.com'
852 to='master@clayster.com/amr'
854 <accepted xmlns='urn:xmpp:iot:sensordata' seqnr='6'/>
859 <message from='device@clayster.com'
860 to='master@clayster.com/amr'>
861 <fields xmlns='urn:xmpp:iot:sensordata' seqnr='6'>
862 <node nodeId='Device44'>
863 <timestamp value='2000-02-01T00:01:02'>
864 <numeric name='Voltage' invoiced='true' value='230.2' unit='V'/>
872 <message from='device@clayster.com'
873 to='master@clayster.com/amr'>
874 <fields xmlns='urn:xmpp:iot:sensordata' seqnr='6'>
875 <node nodeId='Device44'>
876 <timestamp value='2000-03-01T00:01:02'>
877 <numeric name='Voltage' invoiced='true' value='230.3' unit='V'/>
885 <message from='device@clayster.com'
886 to='master@clayster.com/amr'>
887 <fields xmlns='urn:xmpp:iot:sensordata' seqnr='6' done='true'>
892 def testRequestFieldTo(self
):
894 self
.stream_start(mode
='component',
898 myDevice
= Device("Device44");
899 myDevice
._add
_field
(name
='Voltage', typename
="numeric", unit
="V");
900 myDevice
._add
_field
_timestamp
_data
(name
="Voltage", value
="230.1", timestamp
="2000-01-01T00:01:02", flags
={"invoiced": "true"});
901 myDevice
._add
_field
_timestamp
_data
(name
="Voltage", value
="230.2", timestamp
="2000-02-01T00:01:02", flags
={"invoiced": "true"});
902 myDevice
._add
_field
_timestamp
_data
(name
="Voltage", value
="230.3", timestamp
="2000-03-01T00:01:02", flags
={"invoiced": "true"});
904 self
.xmpp
['xep_0323'].register_node('Device44', myDevice
, commTimeout
=0.5);
910 from='master@clayster.com/amr'
911 to='device@clayster.com'
913 <req xmlns='urn:xmpp:iot:sensordata' seqnr='6' to='2000-02-02T00:00:01'>
914 <field name='Voltage'/>
921 from='device@clayster.com'
922 to='master@clayster.com/amr'
924 <accepted xmlns='urn:xmpp:iot:sensordata' seqnr='6'/>
929 <message from='device@clayster.com'
930 to='master@clayster.com/amr'>
931 <fields xmlns='urn:xmpp:iot:sensordata' seqnr='6'>
932 <node nodeId='Device44'>
933 <timestamp value='2000-01-01T00:01:02'>
934 <numeric name='Voltage' invoiced='true' value='230.1' unit='V'/>
942 <message from='device@clayster.com'
943 to='master@clayster.com/amr'>
944 <fields xmlns='urn:xmpp:iot:sensordata' seqnr='6'>
945 <node nodeId='Device44'>
946 <timestamp value='2000-02-01T00:01:02'>
947 <numeric name='Voltage' invoiced='true' value='230.2' unit='V'/>
955 <message from='device@clayster.com'
956 to='master@clayster.com/amr'>
957 <fields xmlns='urn:xmpp:iot:sensordata' seqnr='6' done='true'>
962 def testRequestFieldFromTo(self
):
964 self
.stream_start(mode
='component',
968 myDevice
= Device("Device44");
969 myDevice
._add
_field
(name
='Voltage', typename
="numeric", unit
="V");
970 myDevice
._add
_field
_timestamp
_data
(name
="Voltage", value
="230.1", timestamp
="2000-01-01T00:01:02", flags
={"invoiced": "true"});
971 myDevice
._add
_field
_timestamp
_data
(name
="Voltage", value
="230.2", timestamp
="2000-02-01T00:01:02", flags
={"invoiced": "true"});
972 myDevice
._add
_field
_timestamp
_data
(name
="Voltage", value
="230.3", timestamp
="2000-03-01T00:01:02", flags
={"invoiced": "true"});
974 self
.xmpp
['xep_0323'].register_node('Device44', myDevice
, commTimeout
=0.5);
980 from='master@clayster.com/amr'
981 to='device@clayster.com'
983 <req xmlns='urn:xmpp:iot:sensordata' seqnr='6' from='2000-01-01T00:01:03' to='2000-02-02T00:00:01'>
984 <field name='Voltage'/>
991 from='device@clayster.com'
992 to='master@clayster.com/amr'
994 <accepted xmlns='urn:xmpp:iot:sensordata' seqnr='6'/>
999 <message from='device@clayster.com'
1000 to='master@clayster.com/amr'>
1001 <fields xmlns='urn:xmpp:iot:sensordata' seqnr='6'>
1002 <node nodeId='Device44'>
1003 <timestamp value='2000-02-01T00:01:02'>
1004 <numeric name='Voltage' invoiced='true' value='230.2' unit='V'/>
1012 <message from='device@clayster.com'
1013 to='master@clayster.com/amr'>
1014 <fields xmlns='urn:xmpp:iot:sensordata' seqnr='6' done='true'>
1019 def testDelayedRequestClient(self
):
1020 self
.stream_start(mode
='client',
1021 plugins
=['xep_0030',
1027 def my_callback(from_jid
, result
, nodeId
=None, timestamp
=None, fields
=None, error_msg
=None):
1028 results
.append(result
);
1029 if result
== "fields":
1030 callback_data
["nodeId"] = nodeId
;
1031 callback_data
["timestamp"] = timestamp
;
1032 callback_data
["error_msg"] = error_msg
;
1034 callback_data
["field_" + f
['name']] = f
;
1036 t1
= threading
.Thread(name
="request_data",
1037 target
=self
.xmpp
['xep_0323'].request_data
,
1038 kwargs
={"from_jid": "tester@localhost",
1039 "to_jid": "you@google.com",
1040 "nodeIds": ['Device33'],
1041 "callback": my_callback
});
1043 #self.xmpp['xep_0323'].request_data(from_jid="tester@localhost", to_jid="you@google.com", nodeIds=['Device33'], callback=my_callback);
1047 from='tester@localhost'
1050 <req xmlns='urn:xmpp:iot:sensordata' seqnr='1'>
1051 <node nodeId="Device33"/>
1058 from='you@google.com'
1059 to='tester@localhost'
1061 <accepted xmlns='urn:xmpp:iot:sensordata' seqnr='1' queued='true'/>
1066 <message from='device@clayster.com'
1067 to='master@clayster.com/amr'>
1068 <started xmlns='urn:xmpp:iot:sensordata' seqnr='1' />
1073 <message from='you@google.com'
1074 to='tester@localhost'>
1075 <fields xmlns='urn:xmpp:iot:sensordata' seqnr='1'>
1076 <node nodeId='Device33'>
1077 <timestamp value='2000-01-01T00:01:02'>
1078 <numeric name='Voltage' invoiced='true' value='230.4' unit='V'/>
1079 <boolean name='TestBool' value='true'/>
1087 <message from='you@google.com'
1088 to='tester@localhost'>
1089 <fields xmlns='urn:xmpp:iot:sensordata' seqnr='1' done='true'/>
1096 self
.failUnlessEqual(results
, ["queued","started","fields","done"]);
1097 # self.assertIn("nodeId", callback_data);
1098 self
.assertTrue("nodeId" in callback_data
);
1099 self
.failUnlessEqual(callback_data
["nodeId"], "Device33");
1100 # self.assertIn("timestamp", callback_data);
1101 self
.assertTrue("timestamp" in callback_data
);
1102 self
.failUnlessEqual(callback_data
["timestamp"], "2000-01-01T00:01:02");
1103 # self.assertIn("field_Voltage", callback_data);
1104 self
.assertTrue("field_Voltage" in callback_data
);
1105 self
.failUnlessEqual(callback_data
["field_Voltage"], {"name": "Voltage", "value": "230.4", "typename": "numeric", "unit": "V", "flags": {"invoiced": "true"}});
1106 # self.assertIn("field_TestBool", callback_data);
1107 self
.assertTrue("field_TestBool" in callback_data
);
1108 self
.failUnlessEqual(callback_data
["field_TestBool"], {"name": "TestBool", "value": "true", "typename": "boolean" });
1111 def testRequestFieldsCancelAPI(self
):
1113 self
.stream_start(mode
='client',
1114 plugins
=['xep_0030',
1119 def my_callback(from_jid
, result
, nodeId
=None, timestamp
=None, fields
=None, error_msg
=None):
1120 results
.append(result
);
1122 session
= self
.xmpp
['xep_0323'].request_data(from_jid
="tester@localhost", to_jid
="you@google.com", nodeIds
=['Device33'], callback
=my_callback
);
1126 from='tester@localhost'
1129 <req xmlns='urn:xmpp:iot:sensordata' seqnr='1'>
1130 <node nodeId="Device33"/>
1137 from='you@google.com'
1138 to='tester@localhost'
1140 <accepted xmlns='urn:xmpp:iot:sensordata' seqnr='1'/>
1144 self
.xmpp
['xep_0323'].cancel_request(session
=session
);
1148 from='tester@localhost'
1151 <cancel xmlns='urn:xmpp:iot:sensordata' seqnr='1' />
1157 from='tester@localhost'
1160 <cancelled xmlns='urn:xmpp:iot:sensordata' seqnr='1' />
1166 self
.failUnlessEqual(results
, ["accepted","cancelled"]);
1168 def testDelayedRequestCancel(self
):
1169 self
.stream_start(mode
='component',
1170 plugins
=['xep_0030',
1173 myDevice
= Device("Device22");
1174 myDevice
._add
_field
(name
="Temperature", typename
="numeric", unit
="°C");
1175 myDevice
._set
_momentary
_timestamp
("2013-03-07T16:24:30")
1176 myDevice
._add
_field
_momentary
_data
("Temperature", "23.4", flags
={"automaticReadout": "true"});
1178 self
.xmpp
['xep_0323'].register_node(nodeId
="Device22", device
=myDevice
, commTimeout
=0.5);
1180 dtnow
= datetime
.datetime
.now()
1181 ts_2sec
= datetime
.timedelta(0,2)
1182 dtnow_plus_2sec
= dtnow
+ ts_2sec
1183 when_flag
= dtnow_plus_2sec
.replace(microsecond
=0).isoformat()
1187 from='master@clayster.com/amr'
1188 to='device@clayster.com'
1190 <req xmlns='urn:xmpp:iot:sensordata' seqnr='1' momentary='true' when='""" + when_flag
+ """'/>
1196 from='device@clayster.com'
1197 to='master@clayster.com/amr'
1199 <accepted xmlns='urn:xmpp:iot:sensordata' seqnr='1' queued='true' />
1205 from='master@clayster.com/amr'
1206 to='device@clayster.com'
1208 <cancel xmlns='urn:xmpp:iot:sensordata' seqnr='1' />
1214 from='device@clayster.com'
1215 to='master@clayster.com/amr'
1217 <cancelled xmlns='urn:xmpp:iot:sensordata' seqnr='1' />
1221 # Test cancel of non-existing request
1224 from='tester@localhost'
1227 <cancel xmlns='urn:xmpp:iot:sensordata' seqnr='1' />
1233 from='you@google.com'
1234 to='tester@localhost'
1236 <rejected xmlns='urn:xmpp:iot:sensordata' seqnr='1'>
1237 <error>Cancel request received, no matching request is active.</error>
1244 # Ensure we don't get anything after cancellation
1249 suite
= unittest
.TestLoader().loadTestsFromTestCase(TestStreamSensorData
)