/testing/mozharness/scripts/firefox_media_tests_buildbot.py

https://github.com/rillian/firefox
Python | 122 lines | 92 code | 14 blank | 16 comment | 14 complexity | f9090e3ceacce1ef6b307bbabcf70c3d MD5 | raw file
  1. #!/usr/bin/env python
  2. # ***** BEGIN LICENSE BLOCK *****
  3. # This Source Code Form is subject to the terms of the Mozilla Public
  4. # License, v. 2.0. If a copy of the MPL was not distributed with this
  5. # file, You can obtain one at http://mozilla.org/MPL/2.0/.
  6. # ***** BEGIN LICENSE BLOCK *****
  7. """firefox_media_tests_buildbot.py
  8. Author: Maja Frydrychowicz
  9. """
  10. import copy
  11. import glob
  12. import os
  13. import sys
  14. sys.path.insert(1, os.path.dirname(sys.path[0]))
  15. from mozharness.base.log import DEBUG, ERROR, INFO
  16. from mozharness.base.script import PostScriptAction
  17. from mozharness.mozilla.blob_upload import (
  18. BlobUploadMixin,
  19. blobupload_config_options
  20. )
  21. from mozharness.mozilla.buildbot import (
  22. TBPL_SUCCESS, TBPL_WARNING, TBPL_FAILURE
  23. )
  24. from mozharness.mozilla.testing.firefox_media_tests import (
  25. FirefoxMediaTestsBase, TESTFAILED, SUCCESS
  26. )
  27. class FirefoxMediaTestsBuildbot(FirefoxMediaTestsBase, BlobUploadMixin):
  28. def __init__(self):
  29. config_options = copy.deepcopy(blobupload_config_options)
  30. super(FirefoxMediaTestsBuildbot, self).__init__(
  31. config_options=config_options,
  32. all_actions=['clobber',
  33. 'read-buildbot-config',
  34. 'download-and-extract',
  35. 'create-virtualenv',
  36. 'install',
  37. 'run-media-tests',
  38. ],
  39. )
  40. def run_media_tests(self):
  41. status = super(FirefoxMediaTestsBuildbot, self).run_media_tests()
  42. if status == SUCCESS:
  43. tbpl_status = TBPL_SUCCESS
  44. else:
  45. tbpl_status = TBPL_FAILURE
  46. if status == TESTFAILED:
  47. tbpl_status = TBPL_WARNING
  48. self.buildbot_status(tbpl_status)
  49. def query_abs_dirs(self):
  50. if self.abs_dirs:
  51. return self.abs_dirs
  52. abs_dirs = super(FirefoxMediaTestsBuildbot, self).query_abs_dirs()
  53. dirs = {
  54. 'abs_blob_upload_dir': os.path.join(abs_dirs['abs_work_dir'],
  55. 'blobber_upload_dir')
  56. }
  57. abs_dirs.update(dirs)
  58. self.abs_dirs = abs_dirs
  59. return self.abs_dirs
  60. def _query_cmd(self):
  61. cmd = super(FirefoxMediaTestsBuildbot, self)._query_cmd()
  62. dirs = self.query_abs_dirs()
  63. # configure logging
  64. blob_upload_dir = dirs.get('abs_blob_upload_dir')
  65. cmd += ['--gecko-log', os.path.join(blob_upload_dir, 'gecko.log')]
  66. cmd += ['--log-html', os.path.join(blob_upload_dir, 'media_tests.html')]
  67. cmd += ['--log-mach', os.path.join(blob_upload_dir, 'media_tests_mach.log')]
  68. return cmd
  69. @PostScriptAction('run-media-tests')
  70. def _collect_uploads(self, action, success=None):
  71. """ Copy extra (log) files to blob upload dir. """
  72. dirs = self.query_abs_dirs()
  73. log_dir = dirs.get('abs_log_dir')
  74. blob_upload_dir = dirs.get('abs_blob_upload_dir')
  75. if not log_dir or not blob_upload_dir:
  76. return
  77. self.mkdir_p(blob_upload_dir)
  78. # Move firefox-media-test screenshots into log_dir
  79. screenshots_dir = os.path.join(dirs['base_work_dir'],
  80. 'screenshots')
  81. log_screenshots_dir = os.path.join(log_dir, 'screenshots')
  82. if os.access(log_screenshots_dir, os.F_OK):
  83. self.rmtree(log_screenshots_dir)
  84. if os.access(screenshots_dir, os.F_OK):
  85. self.move(screenshots_dir, log_screenshots_dir)
  86. # logs to upload: broadest level (info), error, screenshots
  87. uploads = glob.glob(os.path.join(log_screenshots_dir, '*'))
  88. log_files = self.log_obj.log_files
  89. log_level = self.log_obj.log_level
  90. def append_path(filename, dir=log_dir):
  91. if filename:
  92. uploads.append(os.path.join(dir, filename))
  93. append_path(log_files.get(ERROR))
  94. # never upload debug logs
  95. if log_level == DEBUG:
  96. append_path(log_files.get(INFO))
  97. else:
  98. append_path(log_files.get(log_level))
  99. # in case of SimpleFileLogger
  100. append_path(log_files.get('default'))
  101. for f in uploads:
  102. if os.access(f, os.F_OK):
  103. dest = os.path.join(blob_upload_dir, os.path.basename(f))
  104. self.copyfile(f, dest)
  105. if __name__ == '__main__':
  106. media_test = FirefoxMediaTestsBuildbot()
  107. media_test.run_and_exit()