bind10_test.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. from bind10 import ProcessInfo, BoB
  2. # XXX: environment tests are currently disabled, due to the preprocessor
  3. # setup that we have now complicating the environment
  4. import unittest
  5. import sys
  6. import os
  7. import signal
  8. import socket
  9. class TestProcessInfo(unittest.TestCase):
  10. def setUp(self):
  11. # redirect stdout to a pipe so we can check that our
  12. # process spawning is doing the right thing with stdout
  13. self.old_stdout = os.dup(sys.stdout.fileno())
  14. self.pipes = os.pipe()
  15. os.dup2(self.pipes[1], sys.stdout.fileno())
  16. os.close(self.pipes[1])
  17. # note that we use dup2() to restore the original stdout
  18. # to the main program ASAP in each test... this prevents
  19. # hangs reading from the child process (as the pipe is only
  20. # open in the child), and also insures nice pretty output
  21. def tearDown(self):
  22. # clean up our stdout munging
  23. os.dup2(self.old_stdout, sys.stdout.fileno())
  24. os.close(self.pipes[0])
  25. def test_init(self):
  26. pi = ProcessInfo('Test Process', [ '/bin/echo', 'foo' ])
  27. os.dup2(self.old_stdout, sys.stdout.fileno())
  28. self.assertEqual(pi.name, 'Test Process')
  29. self.assertEqual(pi.args, [ '/bin/echo', 'foo' ])
  30. # self.assertEqual(pi.env, { 'PATH': os.environ['PATH'],
  31. # 'PYTHON_EXEC': os.environ['PYTHON_EXEC'] })
  32. self.assertEqual(pi.dev_null_stdout, False)
  33. self.assertEqual(os.read(self.pipes[0], 100), b"foo\n")
  34. self.assertNotEqual(pi.process, None)
  35. self.assertTrue(type(pi.pid) is int)
  36. # def test_setting_env(self):
  37. # pi = ProcessInfo('Test Process', [ '/bin/true' ], env={'FOO': 'BAR'})
  38. # os.dup2(self.old_stdout, sys.stdout.fileno())
  39. # self.assertEqual(pi.env, { 'PATH': os.environ['PATH'],
  40. # 'PYTHON_EXEC': os.environ['PYTHON_EXEC'],
  41. # 'FOO': 'BAR' })
  42. def test_setting_null_stdout(self):
  43. pi = ProcessInfo('Test Process', [ '/bin/echo', 'foo' ],
  44. dev_null_stdout=True)
  45. os.dup2(self.old_stdout, sys.stdout.fileno())
  46. self.assertEqual(pi.dev_null_stdout, True)
  47. self.assertEqual(os.read(self.pipes[0], 100), b"")
  48. def test_respawn(self):
  49. pi = ProcessInfo('Test Process', [ '/bin/echo', 'foo' ])
  50. # wait for old process to work...
  51. self.assertEqual(os.read(self.pipes[0], 100), b"foo\n")
  52. # respawn it
  53. old_pid = pi.pid
  54. pi.respawn()
  55. os.dup2(self.old_stdout, sys.stdout.fileno())
  56. # make sure the new one started properly
  57. self.assertEqual(pi.name, 'Test Process')
  58. self.assertEqual(pi.args, [ '/bin/echo', 'foo' ])
  59. # self.assertEqual(pi.env, { 'PATH': os.environ['PATH'],
  60. # 'PYTHON_EXEC': os.environ['PYTHON_EXEC'] })
  61. self.assertEqual(pi.dev_null_stdout, False)
  62. self.assertEqual(os.read(self.pipes[0], 100), b"foo\n")
  63. self.assertNotEqual(pi.process, None)
  64. self.assertTrue(type(pi.pid) is int)
  65. self.assertNotEqual(pi.pid, old_pid)
  66. class TestBoB(unittest.TestCase):
  67. def test_init(self):
  68. bob = BoB()
  69. self.assertEqual(bob.verbose, False)
  70. self.assertEqual(bob.msgq_socket_file, None)
  71. self.assertEqual(bob.auth_port, 5300)
  72. self.assertEqual(bob.cc_session, None)
  73. self.assertEqual(bob.address, None)
  74. self.assertEqual(bob.processes, {})
  75. self.assertEqual(bob.dead_processes, {})
  76. self.assertEqual(bob.runnable, False)
  77. def test_init_alternate_socket(self):
  78. bob = BoB("alt_socket_file")
  79. self.assertEqual(bob.verbose, False)
  80. self.assertEqual(bob.msgq_socket_file, "alt_socket_file")
  81. self.assertEqual(bob.cc_session, None)
  82. self.assertEqual(bob.processes, {})
  83. self.assertEqual(bob.dead_processes, {})
  84. self.assertEqual(bob.runnable, False)
  85. def test_init_alternate_auth_port(self):
  86. bob = BoB(None, 9999)
  87. self.assertEqual(bob.verbose, False)
  88. self.assertEqual(bob.msgq_socket_file, None)
  89. self.assertEqual(bob.auth_port, 9999)
  90. self.assertEqual(bob.cc_session, None)
  91. self.assertEqual(bob.address, None)
  92. self.assertEqual(bob.processes, {})
  93. self.assertEqual(bob.dead_processes, {})
  94. self.assertEqual(bob.runnable, False)
  95. def test_init_alternate_address(self):
  96. bob = BoB(None, 5300, '127.127.127.127')
  97. self.assertEqual(bob.verbose, False)
  98. self.assertEqual(bob.auth_port, 5300)
  99. self.assertEqual(bob.msgq_socket_file, None)
  100. self.assertEqual(bob.cc_session, None)
  101. self.assertEqual(bob.address.addr, socket.inet_aton('127.127.127.127'))
  102. self.assertEqual(bob.processes, {})
  103. self.assertEqual(bob.dead_processes, {})
  104. self.assertEqual(bob.runnable, False)
  105. # verbose testing...
  106. if __name__ == '__main__':
  107. unittest.main()