| 
									
										
										
										
											2009-01-11 13:49:03 +00:00
										 |  |  | '''
 | 
					
						
							|  |  |  | Tests for capabilities and the capabilities cache | 
					
						
							|  |  |  | '''
 | 
					
						
							| 
									
										
										
										
											2008-06-12 03:56:47 +00:00
										 |  |  | import unittest | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-09 00:24:08 +00:00
										 |  |  | import lib | 
					
						
							|  |  |  | lib.setup_env() | 
					
						
							| 
									
										
										
										
											2008-06-12 03:56:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-07 23:41:15 +02:00
										 |  |  | from nbxmpp import NS_MUC, NS_PING, NS_XHTML_IM | 
					
						
							| 
									
										
										
										
											2009-12-10 20:06:46 +01:00
										 |  |  | from common import caps_cache as caps | 
					
						
							| 
									
										
										
										
											2009-10-27 20:31:09 +01:00
										 |  |  | from common.contacts import Contact | 
					
						
							| 
									
										
										
										
											2008-06-12 03:56:47 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | from mock import Mock | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-10 18:31:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | class CommonCapsTest(unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |     def setUp(self): | 
					
						
							|  |  |  |         self.caps_method = 'sha-1' | 
					
						
							|  |  |  |         self.caps_hash = 'm3P2WeXPMGVH2tZPe7yITnfY0Dw=' | 
					
						
							|  |  |  |         self.client_caps = (self.caps_method, self.caps_hash) | 
					
						
							| 
									
										
										
										
											2009-12-10 18:31:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |         self.node = "http://gajim.org" | 
					
						
							|  |  |  |         self.identity = {'category': 'client', 'type': 'pc', 'name':'Gajim'} | 
					
						
							| 
									
										
										
										
											2008-06-12 03:56:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |         self.identities = [self.identity] | 
					
						
							|  |  |  |         self.features = [NS_MUC, NS_XHTML_IM] # NS_MUC not supported! | 
					
						
							| 
									
										
										
										
											2009-12-10 18:31:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |         # Simulate a filled db | 
					
						
							|  |  |  |         db_caps_cache = [ | 
					
						
							|  |  |  |                         (self.caps_method, self.caps_hash, self.identities, self.features), | 
					
						
							|  |  |  |                         ('old', self.node + '#' + self.caps_hash, self.identities, self.features)] | 
					
						
							|  |  |  |         self.logger = Mock(returnValues={"iter_caps_data":db_caps_cache}) | 
					
						
							| 
									
										
										
										
											2009-12-10 18:31:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |         self.cc = caps.CapsCache(self.logger) | 
					
						
							|  |  |  |         caps.capscache = self.cc | 
					
						
							| 
									
										
										
										
											2009-12-10 18:31:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-25 22:32:18 +01:00
										 |  |  | class TestCapsCache(CommonCapsTest): | 
					
						
							| 
									
										
										
										
											2009-12-10 18:31:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |     def test_set_retrieve(self): | 
					
						
							|  |  |  |         ''' Test basic set / retrieve cycle ''' | 
					
						
							| 
									
										
										
										
											2008-06-12 03:56:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |         self.cc[self.client_caps].identities = self.identities | 
					
						
							|  |  |  |         self.cc[self.client_caps].features = self.features | 
					
						
							| 
									
										
										
										
											2008-06-12 03:56:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |         self.assert_(NS_MUC in self.cc[self.client_caps].features) | 
					
						
							|  |  |  |         self.assert_(NS_PING not in self.cc[self.client_caps].features) | 
					
						
							| 
									
										
										
										
											2008-08-27 07:49:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |         identities = self.cc[self.client_caps].identities | 
					
						
							| 
									
										
										
										
											2009-10-25 21:17:32 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |         self.assertEqual(1, len(identities)) | 
					
						
							| 
									
										
										
										
											2009-10-25 21:17:32 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |         identity = identities[0] | 
					
						
							|  |  |  |         self.assertEqual('client', identity['category']) | 
					
						
							|  |  |  |         self.assertEqual('pc', identity['type']) | 
					
						
							| 
									
										
										
										
											2009-12-10 18:31:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |     def test_set_and_store(self): | 
					
						
							|  |  |  |         ''' Test client_caps update gets logged into db ''' | 
					
						
							| 
									
										
										
										
											2009-12-10 18:31:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |         item = self.cc[self.client_caps] | 
					
						
							|  |  |  |         item.set_and_store(self.identities, self.features) | 
					
						
							| 
									
										
										
										
											2009-12-10 18:31:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |         self.logger.mockCheckCall(0, "add_caps_entry", self.caps_method, | 
					
						
							|  |  |  |                         self.caps_hash, self.identities, self.features) | 
					
						
							| 
									
										
										
										
											2009-12-10 18:31:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |     def test_initialize_from_db(self): | 
					
						
							|  |  |  |         ''' Read cashed dummy data from db ''' | 
					
						
							|  |  |  |         self.assertEqual(self.cc[self.client_caps].status, caps.NEW) | 
					
						
							|  |  |  |         self.cc.initialize_from_db() | 
					
						
							|  |  |  |         self.assertEqual(self.cc[self.client_caps].status, caps.CACHED) | 
					
						
							| 
									
										
										
										
											2009-10-25 21:17:32 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |     def test_preload_triggering_query(self): | 
					
						
							|  |  |  |         ''' Make sure that preload issues a disco ''' | 
					
						
							|  |  |  |         connection = Mock() | 
					
						
							|  |  |  |         client_caps = caps.ClientCaps(self.caps_hash, self.node, self.caps_method) | 
					
						
							| 
									
										
										
										
											2009-12-10 18:31:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |         self.cc.query_client_of_jid_if_unknown(connection, "test@gajim.org", | 
					
						
							|  |  |  |                         client_caps) | 
					
						
							| 
									
										
										
										
											2009-12-10 18:31:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |         self.assertEqual(1, len(connection.mockGetAllCalls())) | 
					
						
							| 
									
										
										
										
											2009-12-10 18:31:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |     def test_no_preload_query_if_cashed(self): | 
					
						
							|  |  |  |         ''' Preload must not send a query if the data is already cached ''' | 
					
						
							|  |  |  |         connection = Mock() | 
					
						
							|  |  |  |         client_caps = caps.ClientCaps(self.caps_hash, self.node, self.caps_method) | 
					
						
							| 
									
										
										
										
											2009-10-27 20:31:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |         self.cc.initialize_from_db() | 
					
						
							|  |  |  |         self.cc.query_client_of_jid_if_unknown(connection, "test@gajim.org", | 
					
						
							|  |  |  |                         client_caps) | 
					
						
							| 
									
										
										
										
											2009-12-10 18:31:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |         self.assertEqual(0, len(connection.mockGetAllCalls())) | 
					
						
							| 
									
										
										
										
											2009-12-10 18:31:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |     def test_hash(self): | 
					
						
							|  |  |  |         '''tests the hash computation''' | 
					
						
							|  |  |  |         computed_hash = caps.compute_caps_hash(self.identities, self.features) | 
					
						
							|  |  |  |         self.assertEqual(self.caps_hash, computed_hash) | 
					
						
							| 
									
										
										
										
											2008-08-27 07:49:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-25 21:17:32 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-26 19:20:16 +01:00
										 |  |  | class TestClientCaps(CommonCapsTest): | 
					
						
							| 
									
										
										
										
											2009-12-10 18:31:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |     def setUp(self): | 
					
						
							|  |  |  |         CommonCapsTest.setUp(self) | 
					
						
							|  |  |  |         self.client_caps = caps.ClientCaps(self.caps_hash, self.node, self.caps_method) | 
					
						
							| 
									
										
										
										
											2009-12-10 18:31:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |     def test_query_by_get_discover_strategy(self): | 
					
						
							|  |  |  |         ''' Client must be queried if the data is unkown ''' | 
					
						
							|  |  |  |         connection = Mock() | 
					
						
							|  |  |  |         discover = self.client_caps.get_discover_strategy() | 
					
						
							|  |  |  |         discover(connection, "test@gajim.org") | 
					
						
							| 
									
										
										
										
											2009-12-10 18:31:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |         connection.mockCheckCall(0, "discoverInfo", "test@gajim.org", | 
					
						
							|  |  |  |                         "http://gajim.org#m3P2WeXPMGVH2tZPe7yITnfY0Dw=") | 
					
						
							| 
									
										
										
										
											2009-12-10 18:31:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |     def test_client_supports(self): | 
					
						
							|  |  |  |         self.assertTrue(caps.client_supports(self.client_caps, NS_PING), | 
					
						
							|  |  |  |                         msg="Assume supported, if we don't have caps") | 
					
						
							| 
									
										
										
										
											2009-12-10 18:31:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |         self.assertFalse(caps.client_supports(self.client_caps, NS_XHTML_IM), | 
					
						
							|  |  |  |                 msg="Must not assume blacklisted feature is supported on default") | 
					
						
							| 
									
										
										
										
											2009-12-10 18:31:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |         self.cc.initialize_from_db() | 
					
						
							| 
									
										
										
										
											2009-12-10 18:31:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |         self.assertFalse(caps.client_supports(self.client_caps, NS_PING), | 
					
						
							|  |  |  |                         msg="Must return false on unsupported feature") | 
					
						
							| 
									
										
										
										
											2009-12-10 18:31:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |         self.assertTrue(caps.client_supports(self.client_caps, NS_XHTML_IM), | 
					
						
							|  |  |  |                         msg="Must return True on supported feature") | 
					
						
							| 
									
										
										
										
											2009-12-10 18:31:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |         self.assertTrue(caps.client_supports(self.client_caps, NS_MUC), | 
					
						
							|  |  |  |                         msg="Must return True on supported feature") | 
					
						
							| 
									
										
										
										
											2009-10-26 19:20:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-10 18:31:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | class TestOldClientCaps(TestClientCaps): | 
					
						
							| 
									
										
										
										
											2009-10-25 22:32:18 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |     def setUp(self): | 
					
						
							|  |  |  |         TestClientCaps.setUp(self) | 
					
						
							|  |  |  |         self.client_caps = caps.OldClientCaps(self.caps_hash, self.node) | 
					
						
							| 
									
										
										
										
											2009-12-10 18:31:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |     def test_query_by_get_discover_strategy(self): | 
					
						
							|  |  |  |         ''' Client must be queried if the data is unknown ''' | 
					
						
							|  |  |  |         connection = Mock() | 
					
						
							|  |  |  |         discover = self.client_caps.get_discover_strategy() | 
					
						
							|  |  |  |         discover(connection, "test@gajim.org") | 
					
						
							| 
									
										
										
										
											2009-12-10 18:31:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |         connection.mockCheckCall(0, "discoverInfo", "test@gajim.org") | 
					
						
							| 
									
										
										
										
											2009-10-25 22:32:18 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-12 03:56:47 +00:00
										 |  |  | if __name__ == '__main__': | 
					
						
							| 
									
										
										
										
											2010-02-08 15:08:40 +01:00
										 |  |  |     unittest.main() |