/neatx/test/python/neatx.session_test.py

http://neatx.googlecode.com/ · Python · 187 lines · 147 code · 17 blank · 23 comment · 1 complexity · ea69242e935f86cd59c5de08f89e3f5b MD5 · raw file

  1. #!/usr/bin/python
  2. #
  3. # Copyright (C) 2009 Google Inc.
  4. #
  5. # This program is free software; you can redistribute it and/or modify
  6. # it under the terms of the GNU General Public License as published by
  7. # the Free Software Foundation; either version 2 of the License, or
  8. # (at your option) any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful, but
  11. # WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. # General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with this program; if not, write to the Free Software
  17. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  18. # 02110-1301, USA.
  19. """Script for unittesting the session module"""
  20. import logging
  21. import os
  22. import os.path
  23. import shutil
  24. import tempfile
  25. import unittest
  26. from neatx import constants
  27. from neatx import errors
  28. from neatx import session
  29. from neatx import utils
  30. class _SaveableFakeSession(session.SessionBase):
  31. pass
  32. class TestNewUniqueId(unittest.TestCase):
  33. """Tests for NewUniqueId"""
  34. def test(self):
  35. wanted = set("ABCDEF0123456789")
  36. found = set()
  37. # NewUniqueId uses a hash algorithm, hence we've to run it
  38. # several times to cover the whole charset.
  39. for i in xrange(1, 5):
  40. sessid = session.NewUniqueId(_data=i)
  41. self.failUnlessEqual(len(sessid), 32)
  42. chars = set(sessid)
  43. self.failUnlessEqual(len(chars - wanted), 0)
  44. # Keep used chars
  45. found |= chars
  46. self.failUnlessEqual(len(found), len(wanted))
  47. class TestNxSessionManager(unittest.TestCase):
  48. """Tests for NxSessionManager"""
  49. def setUp(self):
  50. self.tmpdir = tempfile.mkdtemp()
  51. self.mgr = session.NxSessionManager(_path=self.tmpdir)
  52. def tearDown(self):
  53. shutil.rmtree(self.tmpdir)
  54. def _CreateSession(self, host, display, user):
  55. sessid = self.mgr.CreateSessionID()
  56. sesspath = os.path.join(self.tmpdir, sessid)
  57. self.failUnless(os.path.exists(sesspath))
  58. sess = _SaveableFakeSession(sessid, host, display, user)
  59. self.failUnlessEqual(sess.id, sessid)
  60. self.failUnlessEqual(sess.hostname, host)
  61. self.failUnlessEqual(sess.display, display)
  62. self.failUnlessEqual(sess.username, user)
  63. self.failUnlessEqual(sess.state, constants.SESS_STATE_CREATED)
  64. self.failUnless(sess.cookie is not None)
  65. sessdatapath = os.path.join(self.tmpdir, sess.id,
  66. constants.SESSION_DATA_FILE_NAME)
  67. self.failIf(os.path.exists(sessdatapath))
  68. self.mgr.SaveSession(sess)
  69. self.failUnless(os.path.exists(sessdatapath))
  70. return (sess, sessid, sesspath, sessdatapath)
  71. def testSession(self):
  72. (sess1, sessid1, _, _) = self._CreateSession("localhost", 1, "joedoe")
  73. sess1.name = "foobar"
  74. self.failUnlessEqual(sess1.name, "foobar")
  75. self.mgr.SaveSession(sess1)
  76. self.failUnlessEqual(sess1.id, sessid1)
  77. self.failUnlessEqual(sess1.name, "foobar")
  78. def testFindSessionsWithFilter(self):
  79. (sess1, _, _, _) = self._CreateSession("localhost", 1, "user_a")
  80. (sess2, _, _, _) = self._CreateSession("localhost", 2, "user_a")
  81. (sess3, _, _, _) = self._CreateSession("localhost", 3, "user_b")
  82. (sess4, _, _, _) = self._CreateSession("localhost", 4, "user_c")
  83. # Filter without username and function
  84. result = self.mgr.FindSessionsWithFilter(None, None)
  85. self.failUnlessEqual(len(result), 4)
  86. # Filter with username without function
  87. result = self.mgr.FindSessionsWithFilter("user_a", None)
  88. self.failUnlessEqual(len(result), 2)
  89. self.failUnless(isinstance(result[0], session.NxSession))
  90. self.failUnless(isinstance(result[1], session.NxSession))
  91. self.failIf(set([result[0].id, result[1].id]) - set([sess1.id, sess2.id]))
  92. # Filter with username and without function
  93. result = self.mgr.FindSessionsWithFilter("user_b", None)
  94. self.failUnlessEqual(len(result), 1)
  95. self.failUnless(isinstance(result[0], session.NxSession))
  96. self.failUnlessEqual(result[0].id, sess3.id)
  97. # Set data for filter function tests
  98. sess1.state = constants.SESS_STATE_RUNNING
  99. sess2.state = constants.SESS_STATE_TERMINATING
  100. sess3.state = constants.SESS_STATE_RUNNING
  101. sess4.type = "unix-kde"
  102. self.mgr.SaveSession(sess1)
  103. self.mgr.SaveSession(sess2)
  104. self.mgr.SaveSession(sess3)
  105. self.mgr.SaveSession(sess4)
  106. # Filter with username and function
  107. result = self.mgr.FindSessionsWithFilter("user_c", self._FilterTypeUnixKde)
  108. self.failUnlessEqual(len(result), 1)
  109. self.failUnlessEqual(result[0].id, sess4.id)
  110. # Filter without username, with function
  111. result = self.mgr.FindSessionsWithFilter(None, self._FilterStateRunning)
  112. self.failUnlessEqual(len(result), 2)
  113. self.failUnlessEqual(result[0].state, constants.SESS_STATE_RUNNING)
  114. self.failUnlessEqual(result[1].state, constants.SESS_STATE_RUNNING)
  115. self.failIf(set([result[0].id, result[1].id]) - set([sess1.id, sess3.id]))
  116. @staticmethod
  117. def _FilterTypeUnixKde(sess):
  118. return sess.type == "unix-kde"
  119. @staticmethod
  120. def _FilterStateRunning(sess):
  121. return sess.state == constants.SESS_STATE_RUNNING
  122. def testLoadSessionForUser(self):
  123. (sess1, _, _, _) = self._CreateSession("localhost", 1, "user_a")
  124. (sess2, _, _, _) = self._CreateSession("localhost", 2, "user_a")
  125. (sess3, _, _, _) = self._CreateSession("localhost", 2, "user_b")
  126. self.failUnless(self.mgr.LoadSessionForUser(sess1.id, "user_a"))
  127. self.failUnless(self.mgr.LoadSessionForUser(sess2.id, "user_a"))
  128. self.failUnless(self.mgr.LoadSessionForUser(sess3.id, "user_b"))
  129. self.failIf(self.mgr.LoadSessionForUser(sess1.id, "!otheruser!"))
  130. self.failIf(self.mgr.LoadSessionForUser(sess2.id, "user_b"))
  131. def testState(self):
  132. (sess, _, _, _) = self._CreateSession("localhost", 1, "joedoe")
  133. def _SetState(state):
  134. sess.state = state
  135. _SetState(constants.SESS_STATE_STARTING)
  136. self.failUnlessRaises(errors.InvalidSessionState, _SetState, "!invalid!")
  137. self.failUnlessRaises(errors.InvalidSessionState, _SetState, "!dummy!")
  138. self.failUnlessEqual(sess.state, constants.SESS_STATE_STARTING)
  139. if __name__ == '__main__':
  140. # TODO: Move this to a generic function
  141. logging.disable(logging.CRITICAL)
  142. unittest.main()