| 
									
										
										
										
											2001-05-18 21:38:52 +00:00
										 |  |  | """Test script for the grp module.""" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-18 19:36:34 +00:00
										 |  |  | import grp | 
					
						
							| 
									
										
										
										
											2001-05-18 21:38:52 +00:00
										 |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2002-07-23 19:04:11 +00:00
										 |  |  | from test import test_support | 
					
						
							| 
									
										
										
										
											2001-05-18 21:38:52 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class GroupDatabaseTestCase(unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-23 19:50:24 +00:00
										 |  |  |     def check_value(self, value): | 
					
						
							|  |  |  |         # check that a grp tuple has the entries and | 
					
						
							|  |  |  |         # attributes promised by the docs | 
					
						
							|  |  |  |         self.assertEqual(len(value), 4) | 
					
						
							|  |  |  |         self.assertEqual(value[0], value.gr_name) | 
					
						
							|  |  |  |         self.assert_(isinstance(value.gr_name, basestring)) | 
					
						
							|  |  |  |         self.assertEqual(value[1], value.gr_passwd) | 
					
						
							|  |  |  |         self.assert_(isinstance(value.gr_passwd, basestring)) | 
					
						
							|  |  |  |         self.assertEqual(value[2], value.gr_gid) | 
					
						
							|  |  |  |         self.assert_(isinstance(value.gr_gid, int)) | 
					
						
							|  |  |  |         self.assertEqual(value[3], value.gr_mem) | 
					
						
							|  |  |  |         self.assert_(isinstance(value.gr_mem, list)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-15 11:10:33 +00:00
										 |  |  |     def test_values(self): | 
					
						
							|  |  |  |         entries = grp.getgrall() | 
					
						
							| 
									
										
										
										
											2001-05-18 21:38:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-15 11:10:33 +00:00
										 |  |  |         for e in entries: | 
					
						
							| 
									
										
										
										
											2003-04-23 19:50:24 +00:00
										 |  |  |             self.check_value(e) | 
					
						
							| 
									
										
										
										
											2003-04-15 15:59:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         for e in entries: | 
					
						
							| 
									
										
										
										
											2003-04-23 19:50:24 +00:00
										 |  |  |             e2 = grp.getgrgid(e.gr_gid) | 
					
						
							|  |  |  |             self.check_value(e2) | 
					
						
							| 
									
										
										
											
												On Mac OS X pwd.getpwall() might return the tuples
('pgsql', '*', 252, []) and ('postgres', '*', 252, ['skip']),
but pwd.getgrgid(252) might return ('pgsql', '', 252, ['skip']).
Drop the test that tried to find a tuple similar to the one
returned from pwd.getgrgid() among those for the same gid returned
by pwd.getgrall(), as the only working definition of 'similar' seems
to be 'has the same gid'. This check can be done more directly.
This should fix SF bug #732783.
											
										 
											2003-05-05 20:37:33 +00:00
										 |  |  |             self.assertEqual(e2.gr_gid, e.gr_gid) | 
					
						
							| 
									
										
										
										
											2003-04-23 19:50:24 +00:00
										 |  |  |             e2 = grp.getgrnam(e.gr_name) | 
					
						
							|  |  |  |             self.check_value(e2) | 
					
						
							| 
									
										
										
										
											2006-05-25 21:33:11 +00:00
										 |  |  |             # There are instances where getgrall() returns group names in | 
					
						
							|  |  |  |             # lowercase while getgrgid() returns proper casing. | 
					
						
							|  |  |  |             # Discovered on Ubuntu 5.04 (custom). | 
					
						
							|  |  |  |             self.assertEqual(e2.gr_name.lower(), e.gr_name.lower()) | 
					
						
							| 
									
										
										
										
											2001-05-18 21:38:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-15 11:10:33 +00:00
										 |  |  |     def test_errors(self): | 
					
						
							|  |  |  |         self.assertRaises(TypeError, grp.getgrgid) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, grp.getgrnam) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, grp.getgrall, 42) | 
					
						
							| 
									
										
										
										
											2001-05-18 21:38:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-15 11:10:33 +00:00
										 |  |  |         # try to get some errors | 
					
						
							|  |  |  |         bynames = {} | 
					
						
							|  |  |  |         bygids = {} | 
					
						
							|  |  |  |         for (n, p, g, mem) in grp.getgrall(): | 
					
						
							| 
									
										
										
										
											2005-12-12 20:53:40 +00:00
										 |  |  |             if not n or n == '+': | 
					
						
							|  |  |  |                 continue # skip NIS entries etc. | 
					
						
							| 
									
										
										
										
											2003-04-15 11:10:33 +00:00
										 |  |  |             bynames[n] = g | 
					
						
							|  |  |  |             bygids[g] = n | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         allnames = bynames.keys() | 
					
						
							|  |  |  |         namei = 0 | 
					
						
							|  |  |  |         fakename = allnames[namei] | 
					
						
							|  |  |  |         while fakename in bynames: | 
					
						
							|  |  |  |             chars = map(None, fakename) | 
					
						
							|  |  |  |             for i in xrange(len(chars)): | 
					
						
							|  |  |  |                 if chars[i] == 'z': | 
					
						
							|  |  |  |                     chars[i] = 'A' | 
					
						
							|  |  |  |                     break | 
					
						
							|  |  |  |                 elif chars[i] == 'Z': | 
					
						
							|  |  |  |                     continue | 
					
						
							|  |  |  |                 else: | 
					
						
							|  |  |  |                     chars[i] = chr(ord(chars[i]) + 1) | 
					
						
							|  |  |  |                     break | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 namei = namei + 1 | 
					
						
							|  |  |  |                 try: | 
					
						
							|  |  |  |                     fakename = allnames[namei] | 
					
						
							|  |  |  |                 except IndexError: | 
					
						
							|  |  |  |                     # should never happen... if so, just forget it | 
					
						
							|  |  |  |                     break | 
					
						
							|  |  |  |             fakename = ''.join(map(None, chars)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertRaises(KeyError, grp.getgrnam, fakename) | 
					
						
							| 
									
										
										
										
											2001-09-20 21:33:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-15 11:10:33 +00:00
										 |  |  |         # Choose a non-existent gid. | 
					
						
							|  |  |  |         fakegid = 4127 | 
					
						
							|  |  |  |         while fakegid in bygids: | 
					
						
							|  |  |  |             fakegid = (fakegid * 3) % 0x10000 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertRaises(KeyError, grp.getgrgid, fakegid) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_main(): | 
					
						
							| 
									
										
										
										
											2003-05-01 17:45:56 +00:00
										 |  |  |     test_support.run_unittest(GroupDatabaseTestCase) | 
					
						
							| 
									
										
										
										
											2001-09-20 21:33:42 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     test_main() |