reclient_metrics_test.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. #!/usr/bin/env python3
  2. # Copyright (c) 2023 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. import io
  6. import os
  7. import os.path
  8. import sys
  9. import tempfile
  10. import unittest
  11. import unittest.mock
  12. ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  13. sys.path.insert(0, ROOT_DIR)
  14. import reclient_metrics
  15. class ReclientMetricsTest(unittest.TestCase):
  16. def test_is_googler(self):
  17. with unittest.mock.patch('subprocess.run') as run_mock:
  18. run_mock.return_value.returncode = 0
  19. run_mock.return_value.stdout = 'Logged in as abc@google.com.'
  20. self.assertTrue(reclient_metrics.is_googler())
  21. with unittest.mock.patch('subprocess.run') as run_mock:
  22. run_mock.return_value.returncode = 1
  23. self.assertFalse(reclient_metrics.is_googler())
  24. with unittest.mock.patch('subprocess.run') as run_mock:
  25. run_mock.return_value.returncode = 0
  26. run_mock.return_value.stdout = ''
  27. self.assertFalse(reclient_metrics.is_googler())
  28. with unittest.mock.patch('subprocess.run') as run_mock:
  29. run_mock.return_value.returncode = 0
  30. run_mock.return_value.stdout = 'Logged in as foo@example.com.'
  31. self.assertFalse(reclient_metrics.is_googler())
  32. with unittest.mock.patch('subprocess.run') as run_mock:
  33. self.assertTrue(reclient_metrics.is_googler({
  34. 'is-googler': True,
  35. }))
  36. self.assertFalse(
  37. reclient_metrics.is_googler({
  38. 'is-googler': False,
  39. }))
  40. run_mock.assert_not_called()
  41. def test_load_and_save_config(self):
  42. with tempfile.TemporaryDirectory() as tmpdir:
  43. reclient_metrics.CONFIG = os.path.join(tmpdir,
  44. 'reclient_metrics.cfg')
  45. with unittest.mock.patch('subprocess.run') as run_mock:
  46. run_mock.return_value.returncode = 0
  47. run_mock.return_value.stdout = 'Logged in as abc@google.com.'
  48. cfg1 = reclient_metrics.load_config()
  49. self.assertDictEqual(
  50. cfg1, {
  51. 'is-googler': True,
  52. 'countdown': 10,
  53. 'version': reclient_metrics.VERSION,
  54. })
  55. reclient_metrics.save_config(cfg1)
  56. cfg2 = reclient_metrics.load_config()
  57. self.assertDictEqual(
  58. cfg2, {
  59. 'is-googler': True,
  60. 'countdown': 9,
  61. 'version': reclient_metrics.VERSION,
  62. })
  63. run_mock.assert_called_once()
  64. def test_check_status(self):
  65. with tempfile.TemporaryDirectory() as tmpdir:
  66. reclient_metrics.CONFIG = os.path.join(tmpdir,
  67. 'reclient_metrics.cfg')
  68. with unittest.mock.patch('subprocess.run') as run_mock:
  69. run_mock.return_value.returncode = 0
  70. run_mock.return_value.stdout = 'Logged in as abc@google.com.'
  71. with unittest.mock.patch('sys.stdout',
  72. new=io.StringIO()) as stdout_mock:
  73. self.assertFalse(reclient_metrics.check_status("outdir"))
  74. self.assertIn("Your reclient metrics will",
  75. stdout_mock.getvalue())
  76. self.assertIn(
  77. os.path.join("outdir", ".reproxy_tmp", "logs",
  78. "rbe_metrics.txt"), stdout_mock.getvalue())
  79. run_mock.assert_called_once()
  80. with tempfile.TemporaryDirectory() as tmpdir:
  81. reclient_metrics.CONFIG = os.path.join(tmpdir,
  82. 'reclient_metrics.cfg')
  83. with unittest.mock.patch('subprocess.run') as run_mock:
  84. run_mock.return_value.returncode = 0
  85. run_mock.return_value.stdout = 'Logged in as abc@google.com.'
  86. for i in range(10):
  87. with unittest.mock.patch('sys.stdout',
  88. new=io.StringIO()) as stdout_mock:
  89. self.assertFalse(
  90. reclient_metrics.check_status("outdir"))
  91. self.assertIn("Your reclient metrics will",
  92. stdout_mock.getvalue())
  93. self.assertIn(
  94. os.path.join("outdir", ".reproxy_tmp", "logs",
  95. "rbe_metrics.txt"),
  96. stdout_mock.getvalue())
  97. self.assertIn(
  98. "you run autoninja another %d time(s)" % (10 - i),
  99. stdout_mock.getvalue())
  100. with unittest.mock.patch('sys.stdout',
  101. new=io.StringIO()) as stdout_mock:
  102. self.assertTrue(reclient_metrics.check_status("outdir"))
  103. self.assertNotIn("Your reclient metrics will",
  104. stdout_mock.getvalue())
  105. self.assertNotIn(
  106. os.path.join("outdir", ".reproxy_tmp", "logs",
  107. "rbe_metrics.txt"), stdout_mock.getvalue())
  108. run_mock.assert_called_once()
  109. with tempfile.TemporaryDirectory() as tmpdir:
  110. reclient_metrics.CONFIG = os.path.join(tmpdir,
  111. 'reclient_metrics.cfg')
  112. with unittest.mock.patch('subprocess.run') as run_mock:
  113. run_mock.return_value.returncode = 0
  114. run_mock.return_value.stdout = 'Logged in as abc@example.com.'
  115. with unittest.mock.patch('sys.stdout',
  116. new=io.StringIO()) as stdout_mock:
  117. self.assertFalse(reclient_metrics.check_status("outdir"))
  118. self.assertNotIn("Your reclient metrics will",
  119. stdout_mock.getvalue())
  120. self.assertNotIn(
  121. os.path.join("outdir", ".reproxy_tmp", "logs",
  122. "rbe_metrics.txt"), stdout_mock.getvalue())
  123. run_mock.assert_called_once()
  124. with tempfile.TemporaryDirectory() as tmpdir:
  125. reclient_metrics.CONFIG = os.path.join(tmpdir,
  126. 'reclient_metrics.cfg')
  127. with unittest.mock.patch('subprocess.run') as run_mock:
  128. run_mock.return_value.returncode = 1
  129. run_mock.return_value.stdout = ''
  130. with unittest.mock.patch('sys.stdout',
  131. new=io.StringIO()) as stdout_mock:
  132. self.assertFalse(reclient_metrics.check_status("outdir"))
  133. self.assertNotIn("Your reclient metrics will",
  134. stdout_mock.getvalue())
  135. self.assertNotIn(
  136. os.path.join("outdir", ".reproxy_tmp", "logs",
  137. "rbe_metrics.txt"), stdout_mock.getvalue())
  138. run_mock.assert_called_once()
  139. with tempfile.TemporaryDirectory() as tmpdir:
  140. reclient_metrics.CONFIG = os.path.join(tmpdir,
  141. 'reclient_metrics.cfg')
  142. with unittest.mock.patch('subprocess.run') as run_mock:
  143. run_mock.return_value.returncode = 0
  144. run_mock.return_value.stdout = 'Logged in as abc@google.com.'
  145. reclient_metrics.main(["reclient_metrics.py", "opt-in"])
  146. with unittest.mock.patch('sys.stdout',
  147. new=io.StringIO()) as stdout_mock:
  148. self.assertTrue(reclient_metrics.check_status("outdir"))
  149. self.assertNotIn("Your reclient metrics will",
  150. stdout_mock.getvalue())
  151. self.assertNotIn(
  152. os.path.join("outdir", ".reproxy_tmp", "logs",
  153. "rbe_metrics.txt"), stdout_mock.getvalue())
  154. run_mock.assert_called_once()
  155. with tempfile.TemporaryDirectory() as tmpdir:
  156. reclient_metrics.CONFIG = os.path.join(tmpdir,
  157. 'reclient_metrics.cfg')
  158. with unittest.mock.patch('subprocess.run') as run_mock:
  159. run_mock.return_value.returncode = 0
  160. run_mock.return_value.stdout = 'Logged in as abc@google.com.'
  161. for i in range(3):
  162. with unittest.mock.patch('sys.stdout',
  163. new=io.StringIO()) as stdout_mock:
  164. self.assertFalse(
  165. reclient_metrics.check_status("outdir"))
  166. self.assertIn("Your reclient metrics will",
  167. stdout_mock.getvalue())
  168. self.assertIn(
  169. os.path.join("outdir", ".reproxy_tmp", "logs",
  170. "rbe_metrics.txt"),
  171. stdout_mock.getvalue())
  172. self.assertIn(
  173. "you run autoninja another %d time(s)" % (10 - i),
  174. stdout_mock.getvalue())
  175. reclient_metrics.main(["reclient_metrics.py", "opt-in"])
  176. with unittest.mock.patch('sys.stdout',
  177. new=io.StringIO()) as stdout_mock:
  178. self.assertTrue(reclient_metrics.check_status("outdir"))
  179. self.assertNotIn("Your reclient metrics will",
  180. stdout_mock.getvalue())
  181. self.assertNotIn(
  182. os.path.join("outdir", ".reproxy_tmp", "logs",
  183. "rbe_metrics.txt"), stdout_mock.getvalue())
  184. run_mock.assert_called_once()
  185. with tempfile.TemporaryDirectory() as tmpdir:
  186. reclient_metrics.CONFIG = os.path.join(tmpdir,
  187. 'reclient_metrics.cfg')
  188. with unittest.mock.patch('subprocess.run') as run_mock:
  189. run_mock.return_value.returncode = 0
  190. run_mock.return_value.stdout = 'Logged in as abc@example.com.'
  191. with unittest.mock.patch('sys.stdout',
  192. new=io.StringIO()) as stdout_mock:
  193. self.assertFalse(reclient_metrics.check_status("outdir"))
  194. self.assertNotIn("Your reclient metrics will",
  195. stdout_mock.getvalue())
  196. self.assertNotIn(
  197. os.path.join("outdir", ".reproxy_tmp", "logs",
  198. "rbe_metrics.txt"), stdout_mock.getvalue())
  199. reclient_metrics.main(["reclient_metrics.py", "opt-in"])
  200. with unittest.mock.patch('sys.stdout',
  201. new=io.StringIO()) as stdout_mock:
  202. self.assertFalse(reclient_metrics.check_status("outdir"))
  203. self.assertNotIn("Your reclient metrics will",
  204. stdout_mock.getvalue())
  205. self.assertNotIn(
  206. os.path.join("outdir", ".reproxy_tmp", "logs",
  207. "rbe_metrics.txt"), stdout_mock.getvalue())
  208. run_mock.assert_called_once()
  209. with tempfile.TemporaryDirectory() as tmpdir:
  210. reclient_metrics.CONFIG = os.path.join(tmpdir,
  211. 'reclient_metrics.cfg')
  212. with unittest.mock.patch('subprocess.run') as run_mock:
  213. run_mock.return_value.returncode = 0
  214. run_mock.return_value.stdout = 'Logged in as abc@google.com.'
  215. for i in range(3):
  216. with unittest.mock.patch('sys.stdout',
  217. new=io.StringIO()) as stdout_mock:
  218. self.assertFalse(
  219. reclient_metrics.check_status("outdir"))
  220. self.assertIn("Your reclient metrics will",
  221. stdout_mock.getvalue())
  222. self.assertIn(
  223. os.path.join("outdir", ".reproxy_tmp", "logs",
  224. "rbe_metrics.txt"),
  225. stdout_mock.getvalue())
  226. self.assertIn(
  227. "you run autoninja another %d time(s)" % (10 - i),
  228. stdout_mock.getvalue())
  229. reclient_metrics.main(["reclient_metrics.py", "opt-out"])
  230. with unittest.mock.patch('sys.stdout',
  231. new=io.StringIO()) as stdout_mock:
  232. self.assertFalse(reclient_metrics.check_status("outdir"))
  233. self.assertNotIn("Your reclient metrics will",
  234. stdout_mock.getvalue())
  235. self.assertNotIn(
  236. os.path.join("outdir", ".reproxy_tmp", "logs",
  237. "rbe_metrics.txt"), stdout_mock.getvalue())
  238. run_mock.assert_called_once()
  239. if __name__ == '__main__':
  240. unittest.main()