Title: [264795] trunk/Tools
Revision
264795
Author
aakash_j...@apple.com
Date
2020-07-23 15:20:23 -0700 (Thu, 23 Jul 2020)

Log Message

[ews] Notify bot watchers about pre-existing and flaky test failures found on ews bots
https://bugs.webkit.org/show_bug.cgi?id=207475

Reviewed by Jonathan Bedard.

* BuildSlaveSupport/ews-build/steps.py:
(ReRunWebKitTests.evaluateCommand):
(ReRunWebKitTests.send_email_for_flaky_failure): Method to send email for flaky failure.
(AnalyzeLayoutTestsResults.report_pre_existing_failures):
(AnalyzeLayoutTestsResults.send_email_for_flaky_failure): Method to send email for flaky failure.
(AnalyzeLayoutTestsResults.send_email_for_pre_existing_failure): Method to send email for pre-existing failure.
* BuildSlaveSupport/ews-build/steps.py: Updated unit-tests accordingly.
* BuildSlaveSupport/ews-build/send_email.py: Added error handling.

Modified Paths

Diff

Modified: trunk/Tools/BuildSlaveSupport/ews-build/send_email.py (264794 => 264795)


--- trunk/Tools/BuildSlaveSupport/ews-build/send_email.py	2020-07-23 22:17:50 UTC (rev 264794)
+++ trunk/Tools/BuildSlaveSupport/ews-build/send_email.py	2020-07-23 22:20:23 UTC (rev 264795)
@@ -28,6 +28,13 @@
 
 
 def send_email(to_emails, subject, text):
+    if not to_emails:
+        print('Skipping email since no recipient is specified')
+        return
+    if not subject or not text:
+        print('Skipping email since no subject or text is specified')
+        return
+
     email_data = """From: {}\nTo: {}\nSubject: {}\n\n{}""".format(FROM_EMAIL, ', '.join(to_emails), subject, text)
 
     server = smtplib.SMTP(SERVER)

Modified: trunk/Tools/BuildSlaveSupport/ews-build/steps.py (264794 => 264795)


--- trunk/Tools/BuildSlaveSupport/ews-build/steps.py	2020-07-23 22:17:50 UTC (rev 264794)
+++ trunk/Tools/BuildSlaveSupport/ews-build/steps.py	2020-07-23 22:20:23 UTC (rev 264795)
@@ -29,6 +29,7 @@
 from twisted.internet import defer
 
 from layout_test_failures import LayoutTestFailures
+from send_email import send_email_to_bot_watchers
 
 import json
 import re
@@ -1866,6 +1867,8 @@
                 pluralSuffix = 's' if len(flaky_failures) > 1 else ''
                 message = 'Found flaky test{}: {}'.format(pluralSuffix, flaky_failures_string)
             self.setProperty('build_summary', message)
+            for flaky_failure in flaky_failures:
+                self.send_email_for_flaky_failure(flaky_failure)
         else:
             self.setProperty('patchFailedTests', True)
             self.build.addStepsAfterCurrentStep([ArchiveTestResults(),
@@ -1893,7 +1896,19 @@
                 self._addToLog(self.test_failures_log_name, '\n'.join(second_results.failing_tests))
         self._parseRunWebKitTestsOutput(logText)
 
+    def send_email_for_flaky_failure(self, test_name):
+        try:
+            builder_name = self.getProperty('buildername', '')
+            build_url = '{}#/builders/{}/builds/{}'.format(self.master.config.buildbotURL, self.build._builderid, self.build.number)
 
+            email_subject = 'Flaky test: {}'.format(test_name)
+            email_text = 'Test {} flaked in {}\n\nBuilder: {}'.format(test_name, build_url, builder_name)
+            send_email_to_bot_watchers(email_subject, email_text)
+        except Exception as e:
+            # Catching all exceptions here to ensure that failure to send email doesn't impact the build
+            print('Error in sending email for flaky failures: {}'.format(e))
+
+
 class RunWebKitTestsWithoutPatch(RunWebKitTests):
     name = 'run-layout-tests-without-patch'
 
@@ -1952,6 +1967,9 @@
             message = 'Found {} pre-existing test failure{}: {}'.format(len(clean_tree_failures), pluralSuffix, clean_tree_failures_string)
             if len(clean_tree_failures) > self.NUM_FAILURES_TO_DISPLAY:
                 message += ' ...'
+            for clean_tree_failure in clean_tree_failures:
+                self.send_email_for_pre_existing_failure(clean_tree_failure)
+
         if flaky_failures:
             flaky_failures_string = ', '.join(sorted(flaky_failures)[:self.NUM_FAILURES_TO_DISPLAY])
             pluralSuffix = 's' if len(flaky_failures) > 1 else ''
@@ -1958,6 +1976,9 @@
             message += ' Found flaky test{}: {}'.format(pluralSuffix, flaky_failures_string)
             if len(flaky_failures) > self.NUM_FAILURES_TO_DISPLAY:
                 message += ' ...'
+            for flaky_failure in flaky_failures:
+                self.send_email_for_flaky_failure(flaky_failure)
+
         self.setProperty('build_summary', message)
         return defer.succeed(None)
 
@@ -1971,6 +1992,28 @@
     def _results_failed_different_tests(self, first_results_failing_tests, second_results_failing_tests):
         return first_results_failing_tests != second_results_failing_tests
 
+    def send_email_for_flaky_failure(self, test_name):
+        try:
+            builder_name = self.getProperty('buildername', '')
+            build_url = '{}#/builders/{}/builds/{}'.format(self.master.config.buildbotURL, self.build._builderid, self.build.number)
+
+            email_subject = 'Flaky test: {}'.format(test_name)
+            email_text = 'Test {} flaked in {}\n\nBuilder: {}'.format(test_name, build_url, builder_name)
+            rc = send_email_to_bot_watchers(email_subject, email_text)
+        except Exception as e:
+            print('Error in sending email for flaky failure: {}'.format(e))
+
+    def send_email_for_pre_existing_failure(self, test_name):
+        try:
+            builder_name = self.getProperty('buildername', '')
+            build_url = '{}#/builders/{}/builds/{}'.format(self.master.config.buildbotURL, self.build._builderid, self.build.number)
+
+            email_subject = 'Pre-existing test failure: {}'.format(test_name)
+            email_text = 'Test {} failed on clean tree run in {}.\nBuilder: {}'.format(test_name, build_url, builder_name)
+            rc = send_email_to_bot_watchers(email_subject, email_text)
+        except Exception as e:
+            print('Error in sending email for pre-existing failure: {}'.format(e))
+
     def _report_flaky_tests(self, flaky_tests):
         #TODO: implement this
         pass

Modified: trunk/Tools/BuildSlaveSupport/ews-build/steps_unittest.py (264794 => 264795)


--- trunk/Tools/BuildSlaveSupport/ews-build/steps_unittest.py	2020-07-23 22:17:50 UTC (rev 264794)
+++ trunk/Tools/BuildSlaveSupport/ews-build/steps_unittest.py	2020-07-23 22:20:23 UTC (rev 264795)
@@ -52,6 +52,9 @@
                    Trigger, TransferToS3, UnApplyPatchIfRequired, UpdateWorkingDirectory, UploadBuiltProduct,
                    UploadTestResults, ValidateCommiterAndReviewer, ValidatePatch)
 
+import send_email
+send_email.BOT_WATCHERS_EMAILS = []
+
 # Workaround for https://github.com/buildbot/buildbot/issues/4669
 from buildbot.test.fake.fakebuild import FakeBuild
 FakeBuild.addStepsAfterCurrentStep = lambda FakeBuild, step_factories: None
@@ -1737,8 +1740,27 @@
         self.setupStep(ReRunWebKitTests())
         self.property_exceed_failure_limit = 'second_results_exceed_failure_limit'
         self.property_failures = 'second_run_failures'
+        ReRunWebKitTests.send_email_for_flaky_failure = lambda subject, test: None
 
+    def test_flaky_failures_in_first_run(self):
+        self.configureStep()
+        self.setProperty('fullPlatform', 'ios-simulator')
+        self.setProperty('configuration', 'release')
+        self.setProperty('first_run_failures', ['test1', 'test2'])
+        self.expectRemoteCommands(
+            ExpectShell(workdir='wkdir',
+                        logfiles={'json': self.jsonFileName},
+                        logEnviron=False,
+                        command=['python', 'Tools/Scripts/run-webkit-tests', '--no-build', '--no-show-results', '--no-new-test-results', '--clobber-old-results', '--release', '--results-directory', 'layout-test-results', '--debug-rwt-logging', '--exit-after-n-failures', '30', '--skip-failing-tests'],
+                        )
+            + 0,
+        )
+        self.expectOutcome(result=SUCCESS, state_string='Passed layout tests')
+        rc = self.runStep()
+        self.assertEqual(self.getProperty('build_summary'), 'Found flaky tests: test1, test2')
+        return rc
 
+
 class TestRunWebKitTestsWithoutPatch(BuildStepMixinAdditions, unittest.TestCase):
     def setUp(self):
         self.longMessage = True
@@ -1867,6 +1889,8 @@
         return self.tearDownBuildStep()
 
     def configureStep(self):
+        AnalyzeLayoutTestsResults.send_email_for_flaky_failure = lambda subject, test: None
+        AnalyzeLayoutTestsResults.send_email_for_pre_existing_failure = lambda subject, test: None
         self.setupStep(AnalyzeLayoutTestsResults())
         self.setProperty('first_results_exceed_failure_limit', False)
         self.setProperty('second_results_exceed_failure_limit', False)

Modified: trunk/Tools/ChangeLog (264794 => 264795)


--- trunk/Tools/ChangeLog	2020-07-23 22:17:50 UTC (rev 264794)
+++ trunk/Tools/ChangeLog	2020-07-23 22:20:23 UTC (rev 264795)
@@ -1,3 +1,19 @@
+2020-07-23  Aakash Jain  <aakash_j...@apple.com>
+
+        [ews] Notify bot watchers about pre-existing and flaky test failures found on ews bots
+        https://bugs.webkit.org/show_bug.cgi?id=207475
+
+        Reviewed by Jonathan Bedard.
+
+        * BuildSlaveSupport/ews-build/steps.py:
+        (ReRunWebKitTests.evaluateCommand):
+        (ReRunWebKitTests.send_email_for_flaky_failure): Method to send email for flaky failure.
+        (AnalyzeLayoutTestsResults.report_pre_existing_failures):
+        (AnalyzeLayoutTestsResults.send_email_for_flaky_failure): Method to send email for flaky failure.
+        (AnalyzeLayoutTestsResults.send_email_for_pre_existing_failure): Method to send email for pre-existing failure.
+        * BuildSlaveSupport/ews-build/steps.py: Updated unit-tests accordingly.
+        * BuildSlaveSupport/ews-build/send_email.py: Added error handling.
+
 2020-07-23  Sihui Liu  <sihui_...@appe.com>
 
         Allow IndexedDB in third-party frames
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to