skia_gold_session_manager_unittest.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. #!/usr/bin/env vpython3
  2. # Copyright 2020 The Chromium Authors. All rights reserved.
  3. # Use of this source code is governed by a BSD-style license that can be
  4. # found in the LICENSE file.
  5. #pylint: disable=protected-access
  6. import json
  7. import os
  8. import sys
  9. import tempfile
  10. import typing
  11. import unittest
  12. if sys.version_info[0] == 2:
  13. import mock
  14. else:
  15. import unittest.mock as mock
  16. from pyfakefs import fake_filesystem_unittest
  17. from skia_gold_common import skia_gold_properties
  18. from skia_gold_common import skia_gold_session
  19. from skia_gold_common import skia_gold_session_manager
  20. from skia_gold_common import unittest_utils
  21. createSkiaGoldArgs = unittest_utils.createSkiaGoldArgs
  22. class SkiaGoldSessionManagerGetSessionTest(fake_filesystem_unittest.TestCase):
  23. """Tests the functionality of SkiaGoldSessionManager.GetSkiaGoldSession."""
  24. def setUp(self) -> None:
  25. self.setUpPyfakefs()
  26. self._working_dir = tempfile.mkdtemp()
  27. self._patcher = mock.patch.object(
  28. skia_gold_session_manager.SkiaGoldSessionManager, 'GetSessionClass')
  29. self._session_class_mock = self._patcher.start()
  30. self._session_class_mock.return_value = skia_gold_session.SkiaGoldSession
  31. self.addCleanup(self._patcher.stop)
  32. def test_ArgsForwardedToSession(self) -> None:
  33. args = createSkiaGoldArgs()
  34. sgp = skia_gold_properties.SkiaGoldProperties(args)
  35. sgsm = skia_gold_session_manager.SkiaGoldSessionManager(
  36. self._working_dir, sgp)
  37. session = sgsm.GetSkiaGoldSession({}, 'corpus', 'instance')
  38. self.assertTrue(session._keys_file.startswith(self._working_dir))
  39. self.assertEqual(session._corpus, 'corpus')
  40. self.assertEqual(session._instance, 'instance')
  41. # Make sure the session's working directory is a subdirectory of the
  42. # manager's working directory.
  43. self.assertEqual(os.path.dirname(session._working_dir), self._working_dir)
  44. def test_corpusFromJson(self) -> None:
  45. args = createSkiaGoldArgs()
  46. sgp = skia_gold_properties.SkiaGoldProperties(args)
  47. sgsm = skia_gold_session_manager.SkiaGoldSessionManager(
  48. self._working_dir, sgp)
  49. session = sgsm.GetSkiaGoldSession({'source_type': 'foobar'}, None,
  50. 'instance')
  51. self.assertTrue(session._keys_file.startswith(self._working_dir))
  52. self.assertEqual(session._corpus, 'foobar')
  53. self.assertEqual(session._instance, 'instance')
  54. def test_corpusDefaultsToInstance(self) -> None:
  55. args = createSkiaGoldArgs()
  56. sgp = skia_gold_properties.SkiaGoldProperties(args)
  57. sgsm = skia_gold_session_manager.SkiaGoldSessionManager(
  58. self._working_dir, sgp)
  59. session = sgsm.GetSkiaGoldSession({}, None, 'instance')
  60. self.assertTrue(session._keys_file.startswith(self._working_dir))
  61. self.assertEqual(session._corpus, 'instance')
  62. self.assertEqual(session._instance, 'instance')
  63. @mock.patch.object(skia_gold_session_manager.SkiaGoldSessionManager,
  64. '_GetDefaultInstance')
  65. def test_getDefaultInstance(self,
  66. default_instance_mock: mock.MagicMock) -> None:
  67. default_instance_mock.return_value = 'default'
  68. args = createSkiaGoldArgs()
  69. sgp = skia_gold_properties.SkiaGoldProperties(args)
  70. sgsm = skia_gold_session_manager.SkiaGoldSessionManager(
  71. self._working_dir, sgp)
  72. session = sgsm.GetSkiaGoldSession({}, None, None)
  73. self.assertTrue(session._keys_file.startswith(self._working_dir))
  74. self.assertEqual(session._corpus, 'default')
  75. self.assertEqual(session._instance, 'default')
  76. @mock.patch.object(skia_gold_session.SkiaGoldSession, '__init__')
  77. def test_matchingSessionReused(self, session_mock: mock.MagicMock) -> None:
  78. session_mock.return_value = None
  79. args = createSkiaGoldArgs()
  80. sgp = skia_gold_properties.SkiaGoldProperties(args)
  81. sgsm = skia_gold_session_manager.SkiaGoldSessionManager(
  82. self._working_dir, sgp)
  83. session1 = sgsm.GetSkiaGoldSession({}, 'corpus', 'instance')
  84. session2 = sgsm.GetSkiaGoldSession({}, 'corpus', 'instance')
  85. self.assertEqual(session1, session2)
  86. # For some reason, session_mock.assert_called_once() always passes,
  87. # so check the call count directly.
  88. self.assertEqual(session_mock.call_count, 1)
  89. @mock.patch.object(skia_gold_session.SkiaGoldSession, '__init__')
  90. def test_separateSessionsFromKeys(self, session_mock: mock.MagicMock) -> None:
  91. session_mock.return_value = None
  92. args = createSkiaGoldArgs()
  93. sgp = skia_gold_properties.SkiaGoldProperties(args)
  94. sgsm = skia_gold_session_manager.SkiaGoldSessionManager(
  95. self._working_dir, sgp)
  96. session1 = sgsm.GetSkiaGoldSession({}, 'corpus', 'instance')
  97. session2 = sgsm.GetSkiaGoldSession({'something_different': 1}, 'corpus',
  98. 'instance')
  99. self.assertNotEqual(session1, session2)
  100. self.assertEqual(session_mock.call_count, 2)
  101. @mock.patch.object(skia_gold_session.SkiaGoldSession, '__init__')
  102. def test_separateSessionsFromCorpus(self,
  103. session_mock: mock.MagicMock) -> None:
  104. session_mock.return_value = None
  105. args = createSkiaGoldArgs()
  106. sgp = skia_gold_properties.SkiaGoldProperties(args)
  107. sgsm = skia_gold_session_manager.SkiaGoldSessionManager(
  108. self._working_dir, sgp)
  109. session1 = sgsm.GetSkiaGoldSession({}, 'corpus1', 'instance')
  110. session2 = sgsm.GetSkiaGoldSession({}, 'corpus2', 'instance')
  111. self.assertNotEqual(session1, session2)
  112. self.assertEqual(session_mock.call_count, 2)
  113. @mock.patch.object(skia_gold_session.SkiaGoldSession, '__init__')
  114. def test_separateSessionsFromInstance(self,
  115. session_mock: mock.MagicMock) -> None:
  116. session_mock.return_value = None
  117. args = createSkiaGoldArgs()
  118. sgp = skia_gold_properties.SkiaGoldProperties(args)
  119. self._working_dir = tempfile.mkdtemp()
  120. sgsm = skia_gold_session_manager.SkiaGoldSessionManager(
  121. self._working_dir, sgp)
  122. session1 = sgsm.GetSkiaGoldSession({}, 'corpus', 'instance1')
  123. session2 = sgsm.GetSkiaGoldSession({}, 'corpus', 'instance2')
  124. self.assertNotEqual(session1, session2)
  125. self.assertEqual(session_mock.call_count, 2)
  126. class SkiaGoldSessionManagerKeyConversionTest(fake_filesystem_unittest.TestCase
  127. ):
  128. def setUp(self) -> None:
  129. self.setUpPyfakefs()
  130. self._working_dir = tempfile.mkdtemp()
  131. def test_getKeysAsDict(self) -> None:
  132. keys_dict = {'foo': 'bar'}
  133. keys_file_contents = {'bar': 'baz'}
  134. keys_file = tempfile.NamedTemporaryFile(delete=False).name
  135. with open(keys_file, 'w') as f:
  136. json.dump(keys_file_contents, f)
  137. self.assertEqual(skia_gold_session_manager._GetKeysAsDict(keys_dict),
  138. keys_dict)
  139. self.assertEqual(skia_gold_session_manager._GetKeysAsDict(keys_file),
  140. keys_file_contents)
  141. with self.assertRaises(AssertionError):
  142. skia_gold_session_manager._GetKeysAsDict(typing.cast(dict, 1))
  143. def test_getKeysAsJson(self) -> None:
  144. keys_dict = {'foo': 'bar'}
  145. keys_file_contents = {'bar': 'baz'}
  146. keys_file = tempfile.NamedTemporaryFile(delete=False).name
  147. with open(keys_file, 'w') as f:
  148. json.dump(keys_file_contents, f)
  149. self.assertEqual(skia_gold_session_manager._GetKeysAsJson(keys_file, ''),
  150. keys_file)
  151. keys_dict_as_json = skia_gold_session_manager._GetKeysAsJson(
  152. keys_dict, self._working_dir)
  153. self.assertTrue(keys_dict_as_json.startswith(self._working_dir))
  154. with open(keys_dict_as_json) as f:
  155. self.assertEqual(json.load(f), keys_dict)
  156. with self.assertRaises(AssertionError):
  157. skia_gold_session_manager._GetKeysAsJson(typing.cast(dict, 1), '')
  158. if __name__ == '__main__':
  159. unittest.main(verbosity=2)