/Lib/test/test_grp.py

http://unladen-swallow.googlecode.com/ · Python · 92 lines · 68 code · 15 blank · 9 comment · 16 complexity · 1b5bb3173e8f1a987e0ab48fe423d589 MD5 · raw file

  1. """Test script for the grp module."""
  2. import grp
  3. import unittest
  4. from test import test_support
  5. class GroupDatabaseTestCase(unittest.TestCase):
  6. def check_value(self, value):
  7. # check that a grp tuple has the entries and
  8. # attributes promised by the docs
  9. self.assertEqual(len(value), 4)
  10. self.assertEqual(value[0], value.gr_name)
  11. self.assert_(isinstance(value.gr_name, basestring))
  12. self.assertEqual(value[1], value.gr_passwd)
  13. self.assert_(isinstance(value.gr_passwd, basestring))
  14. self.assertEqual(value[2], value.gr_gid)
  15. self.assert_(isinstance(value.gr_gid, int))
  16. self.assertEqual(value[3], value.gr_mem)
  17. self.assert_(isinstance(value.gr_mem, list))
  18. def test_values(self):
  19. entries = grp.getgrall()
  20. for e in entries:
  21. self.check_value(e)
  22. if len(entries) > 1000: # Huge group file (NIS?) -- skip the rest
  23. return
  24. for e in entries:
  25. e2 = grp.getgrgid(e.gr_gid)
  26. self.check_value(e2)
  27. self.assertEqual(e2.gr_gid, e.gr_gid)
  28. e2 = grp.getgrnam(e.gr_name)
  29. self.check_value(e2)
  30. # There are instances where getgrall() returns group names in
  31. # lowercase while getgrgid() returns proper casing.
  32. # Discovered on Ubuntu 5.04 (custom).
  33. self.assertEqual(e2.gr_name.lower(), e.gr_name.lower())
  34. def test_errors(self):
  35. self.assertRaises(TypeError, grp.getgrgid)
  36. self.assertRaises(TypeError, grp.getgrnam)
  37. self.assertRaises(TypeError, grp.getgrall, 42)
  38. # try to get some errors
  39. bynames = {}
  40. bygids = {}
  41. for (n, p, g, mem) in grp.getgrall():
  42. if not n or n == '+':
  43. continue # skip NIS entries etc.
  44. bynames[n] = g
  45. bygids[g] = n
  46. allnames = bynames.keys()
  47. namei = 0
  48. fakename = allnames[namei]
  49. while fakename in bynames:
  50. chars = list(fakename)
  51. for i in xrange(len(chars)):
  52. if chars[i] == 'z':
  53. chars[i] = 'A'
  54. break
  55. elif chars[i] == 'Z':
  56. continue
  57. else:
  58. chars[i] = chr(ord(chars[i]) + 1)
  59. break
  60. else:
  61. namei = namei + 1
  62. try:
  63. fakename = allnames[namei]
  64. except IndexError:
  65. # should never happen... if so, just forget it
  66. break
  67. fakename = ''.join(chars)
  68. self.assertRaises(KeyError, grp.getgrnam, fakename)
  69. # Choose a non-existent gid.
  70. fakegid = 4127
  71. while fakegid in bygids:
  72. fakegid = (fakegid * 3) % 0x10000
  73. self.assertRaises(KeyError, grp.getgrgid, fakegid)
  74. def test_main():
  75. test_support.run_unittest(GroupDatabaseTestCase)
  76. if __name__ == "__main__":
  77. test_main()