Best Python code snippet using lemoncheesecake
run_suite_unittest.py
Source:run_suite_unittest.py  
1#!/usr/bin/python2# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.3# Use of this source code is governed by a BSD-style license that can be4# found in the LICENSE file.5import datetime as datetime_base6from datetime import datetime7import mock8import time9import unittest10import common11from autotest_lib.server.cros.dynamic_suite import constants12from autotest_lib.site_utils import run_suite13from autotest_lib.site_utils import diagnosis_utils14class ResultCollectorUnittest(unittest.TestCase):15    """Runsuite unittest"""16    JOB_MAX_RUNTIME_MINS = 1017    def setUp(self):18        """Set up test."""19        self.afe = mock.MagicMock()20        self.tko = mock.MagicMock()21    def _build_view(self, test_idx, test_name, subdir, status, afe_job_id,22                    job_name='fake_job_name', reason='fake reason',23                    job_keyvals=None, test_started_time=None,24                    test_finished_time=None, invalidates_test_idx=None,25                    job_started_time=None, job_finished_time=None):26        """Build a test view using the given fields.27        @param test_idx: An integer representing test_idx.28        @param test_name: A string, e.g. 'dummy_Pass'29        @param subdir: A string representing the subdir field of the test view.30                       e.g. 'dummy_Pass'.31        @param status: A string representing the test status.32                       e.g. 'FAIL', 'PASS'33        @param afe_job_id: An integer representing the afe job id.34        @param job_name: A string representing the job name.35        @param reason: A string representing the reason field of the test view.36        @param job_keyvals: A dictionary stroing the job keyvals.37        @param test_started_time: A string, e.g. '2014-04-12 12:35:33'38        @param test_finished_time: A string, e.g. '2014-04-12 12:35:33'39        @param invalidates_test_idx: An integer, representing the idx of the40                                     test that has been retried.41        @param job_started_time: A string, e.g. '2014-04-12 12:35:33'42        @param job_finished_time: A string, e.g. '2014-04-12 12:35:33'43        @reutrn: A dictionary representing a test view.44        """45        if job_keyvals is None:46            job_keyvals = {}47        return {'test_idx': test_idx, 'test_name': test_name, 'subdir':subdir,48                'status': status, 'afe_job_id': afe_job_id,49                'job_name': job_name, 'reason': reason,50                'job_keyvals': job_keyvals,51                'test_started_time': test_started_time,52                'test_finished_time': test_finished_time,53                'invalidates_test_idx': invalidates_test_idx,54                'job_started_time': job_started_time,55                'job_finished_time': job_finished_time}56    def _mock_tko_get_detailed_test_views(self, test_views,57                                          missing_results=[]):58        """Mock tko method get_detailed_test_views call.59        @param test_views: A list of test views that will be returned60                           by get_detailed_test_views.61        """62        return_values = {}63        for v in test_views:64            views_of_job = return_values.setdefault(65                    ('get_detailed_test_views', v['afe_job_id']), [])66            views_of_job.append(v)67        for job_id in missing_results:68            views_of_job = return_values.setdefault(69                    ('get_detailed_test_views', job_id), [])70        def side_effect(*args, **kwargs):71            """Maps args and kwargs to the mocked return values."""72            key = (kwargs['call'], kwargs['afe_job_id'])73            return return_values[key]74        self.tko.run = mock.MagicMock(side_effect=side_effect)75    def _mock_afe_get_jobs(self, suite_job_id, child_job_ids):76        """Mock afe get_jobs call.77        @param suite_job_id: The afe job id of the suite job.78        @param child_job_ids: A list of job ids of the child jobs.79        """80        suite_job = mock.MagicMock()81        suite_job.id = suite_job_id82        suite_job.max_runtime_mins = 1083        suite_job.parent_job = None84        return_values = {suite_job_id: []}85        for job_id in child_job_ids:86            new_job = mock.MagicMock()87            new_job.id = job_id88            new_job.name = 'test.%d' % job_id89            new_job.max_runtime_mins = self.JOB_MAX_RUNTIME_MINS90            new_job.parent_job = suite_job91            return_values[suite_job_id].append(new_job)92        def side_effect(*args, **kwargs):93            """Maps args and kwargs to the mocked return values."""94            if kwargs.get('id') == suite_job_id:95                return [suite_job]96            return return_values[kwargs['parent_job_id']]97        self.afe.get_jobs = mock.MagicMock(side_effect=side_effect)98    def testFetchSuiteTestView(self):99        """Test that it fetches the correct suite test views."""100        suite_job_id = 100101        suite_name = 'dummy'102        build = 'R23-1.1.1.1'103        server_job_view = self._build_view(104                10, 'SERVER_JOB', '----', 'GOOD', suite_job_id)105        test_to_ignore = self._build_view(106                11, 'dummy_Pass', '101-user/host/dummy_Pass',107                'GOOD', suite_job_id)108        test_to_include = self._build_view(109                12, 'dummy_Pass.bluetooth', None, 'TEST_NA', suite_job_id)110        test_missing = self._build_view(111                13, 'dummy_Missing', None, 'ABORT', suite_job_id)112        self._mock_afe_get_jobs(suite_job_id, [])113        self._mock_tko_get_detailed_test_views(114                [server_job_view, test_to_ignore, test_to_include,115                 test_missing])116        collector = run_suite.ResultCollector(117                'fake_server', self.afe, self.tko,118                build='fake/build', board='fake', suite_name='dummy',119                suite_job_id=suite_job_id,120                return_code_function=run_suite._ReturnCodeComputer())121        collector._missing_results = {122                test_missing['test_name']: [14, 15],123        }124        suite_views = collector._fetch_relevant_test_views_of_suite()125        suite_views = sorted(suite_views, key=lambda view: view['test_idx'])126        # Verify that SERVER_JOB is renamed to 'Suite job'127        self.assertEqual(suite_views[0].get_testname(),128                         run_suite.TestView.SUITE_JOB)129        # Verify that the test with a subidr is not included.130        self.assertEqual(suite_views[0]['test_idx'], 10)131        self.assertEqual(suite_views[1]['test_idx'], 12)132        self.assertEqual(suite_views[1]['afe_job_id'], suite_job_id)133        # Verify that the test with missing results had it's AFE job id134        # replaced.135        self.assertEqual(suite_views[2]['test_idx'], 13)136        self.assertEqual(suite_views[2]['afe_job_id'], 14)137    def testFetchTestViewOfChildJobs(self):138        """Test that it fetches the correct child test views."""139        build = 'lumpy-release/R36-5788.0.0'140        board = 'lumpy'141        suite_name = 'my_suite'142        suite_job_id = 100143        invalid_job_id = 101144        invalid_job_name = '%s/%s/test_Pass' % (build, suite_name)145        good_job_id = 102146        good_job_name = '%s/%s/test_Pass' % (build, suite_name)147        bad_job_id = 103148        bad_job_name = '%s/%s/test_ServerJobFail' % (build, suite_name)149        missing_job_id = 104150        invalid_test = self._build_view(151                19, 'test_Pass_Old', 'fake/subdir',152                'FAIL', invalid_job_id, invalid_job_name)153        good_job_server_job = self._build_view(154                20, 'SERVER_JOB', '----', 'GOOD', good_job_id, good_job_name)155        good_job_test = self._build_view(156                21, 'test_Pass', 'fake/subdir', 'GOOD',157                good_job_id, good_job_name,158                job_keyvals={'retry_original_job_id': invalid_job_id})159        bad_job_server_job = self._build_view(160                22, 'SERVER_JOB', '----', 'FAIL', bad_job_id, bad_job_name)161        bad_job_test = self._build_view(162                23, 'test_ServerJobFail', 'fake/subdir', 'GOOD',163                bad_job_id, bad_job_name)164        self._mock_tko_get_detailed_test_views(165                [good_job_server_job, good_job_test,166                 bad_job_server_job, bad_job_test, invalid_test],167                [missing_job_id])168        self._mock_afe_get_jobs(suite_job_id,169                                [good_job_id, bad_job_id, missing_job_id])170        collector = run_suite.ResultCollector(171                'fake_server', self.afe, self.tko,172                build, board, suite_name, suite_job_id,173                return_code_function=run_suite._ReturnCodeComputer())174        child_views, retry_counts, missing_results = (175                collector._fetch_test_views_of_child_jobs())176        # child_views should contain tests 21, 22, 23177        child_views = sorted(child_views, key=lambda view: view['test_idx'])178        # Verify that the SERVER_JOB has been renamed properly179        self.assertEqual(child_views[1].get_testname(),180                         'test_ServerJobFail_SERVER_JOB')181        self.assertEqual(missing_results, {'test.104': [104]})182        # Verify that failed SERVER_JOB and actual invalid tests are included,183        expected = [good_job_test['test_idx'], bad_job_server_job['test_idx'],184                    bad_job_test['test_idx']]185        child_view_ids = [v['test_idx'] for v in child_views]186        self.assertEqual(child_view_ids, expected)187        self.afe.get_jobs.assert_called_once_with(188                parent_job_id=suite_job_id)189        # Verify the retry_counts is calculated correctly190        self.assertEqual(len(retry_counts), 1)191        self.assertEqual(retry_counts[21], 1)192    def testGenerateLinks(self):193        """Test that it generates correct web and buildbot links."""194        suite_job_id = 100195        suite_name = 'my_suite'196        build = 'lumpy-release/R36-5788.0.0'197        board = 'lumpy'198        fake_job = mock.MagicMock()199        fake_job.parent = suite_job_id200        suite_job_view = run_suite.TestView(201                self._build_view(202                    20, 'Suite job', '----', 'GOOD', suite_job_id),203                fake_job, suite_name, build, 'chromeos-test')204        good_test = run_suite.TestView(205                self._build_view(206                    21, 'test_Pass', 'fake/subdir', 'GOOD', 101),207                fake_job, suite_name, build, 'chromeos-test')208        bad_test = run_suite.TestView(209                self._build_view(210                    23, 'test_Fail', 'fake/subdir', 'FAIL', 102),211                fake_job, suite_name, build, 'chromeos-test')212        collector = run_suite.ResultCollector(213                'fake_server', self.afe, self.tko,214                build, board, suite_name, suite_job_id, user='chromeos-test',215                return_code_function=run_suite._ReturnCodeComputer())216        collector._suite_views = [suite_job_view]217        collector._test_views = [suite_job_view, good_test, bad_test]218        collector._max_testname_width = max(219                [len(v.get_testname()) for v in collector._test_views]) + 3220        collector._generate_web_and_buildbot_links()221        URL_PATTERN = run_suite._URL_PATTERN222        # expected_web_links is list of (anchor, url) tuples we223        # are expecting.224        expected_web_links = [225                 (v.get_testname(),226                  URL_PATTERN % ('fake_server',227                                '%s-%s' % (v['afe_job_id'], 'chromeos-test')))228                 for v in collector._test_views]229        # Verify web links are generated correctly.230        for i in range(len(collector._web_links)):231            expect = expected_web_links[i]232            self.assertEqual(collector._web_links[i].anchor, expect[0])233            self.assertEqual(collector._web_links[i].url, expect[1])234        expected_buildbot_links = [235                 (v.get_testname(),236                  URL_PATTERN % ('fake_server',237                                '%s-%s' % (v['afe_job_id'], 'chromeos-test')))238                 for v in collector._test_views if v['status'] != 'GOOD']239        # Verify buildbot links are generated correctly.240        for i in range(len(collector.buildbot_links)):241            expect = expected_buildbot_links[i]242            self.assertEqual(collector.buildbot_links[i].anchor, expect[0])243            self.assertEqual(collector.buildbot_links[i].url, expect[1])244            self.assertEqual(collector.buildbot_links[i].retry_count, 0)245            # Assert that a wmatrix retry dashboard link is created.246            self.assertNotEqual(247                    collector.buildbot_links[i].GenerateWmatrixRetryLink(), '')248            self.assertNotEqual(249                    collector.buildbot_links[i].GenerateWmatrixHistoryLink(),250                    '')251    def _end_to_end_test_helper(252            self, include_bad_test=False, include_warn_test=False,253            include_timeout_test=False,254            include_self_aborted_test=False,255            include_aborted_by_suite_test=False,256            include_good_retry=False, include_bad_retry=False,257            suite_job_timed_out=False, suite_job_status='GOOD'):258        """A helper method for testing ResultCollector end-to-end.259        This method mocks the retrieving of required test views,260        and call ResultCollector.run() to collect the results.261        @param include_bad_test:262                If True, include a view of a test which has status 'FAIL'.263        @param include_warn_test:264                If True, include a view of a test which has status 'WARN'265        @param include_timeout_test:266                If True, include a view of a test which was aborted before267                started.268        @param include_self_aborted_test:269                If True, include a view of test which was aborted after270                started and hit hits own timeout.271        @param include_self_aborted_by_suite_test:272                If True, include a view of test which was aborted after273                started but has not hit its own timeout.274        @param include_good_retry:275                If True, include a test that passed after retry.276        @param include_bad_retry:277                If True, include a test that failed after retry.278        @param suite_job_status: One of 'GOOD' 'FAIL' 'ABORT' 'RUNNING'279        @returns: A ResultCollector instance.280        """281        suite_job_id = 100282        good_job_id = 101283        bad_job_id = 102284        warn_job_id = 102285        timeout_job_id = 100286        self_aborted_job_id = 104287        aborted_by_suite_job_id = 105288        good_retry_job_id = 106289        bad_retry_job_id = 107290        invalid_job_id_1 = 90291        invalid_job_id_2 = 91292        suite_name = 'dummy'293        build = 'lumpy-release/R27-3888.0.0'294        suite_job_keyvals = {295                constants.DOWNLOAD_STARTED_TIME: '2014-04-29 13:14:20',296                constants.PAYLOAD_FINISHED_TIME: '2014-04-29 13:14:25',297                constants.ARTIFACT_FINISHED_TIME: '2014-04-29 13:14:30'}298        suite_job_started_time = '2014-04-29 13:14:37'299        if suite_job_timed_out:300            suite_job_keyvals['aborted_by'] = 'test_user'301            suite_job_finished_time = '2014-04-29 13:25:37'302            suite_job_status = 'ABORT'303        else:304            suite_job_finished_time = '2014-04-29 13:23:37'305        server_job_view = self._build_view(306                10, 'SERVER_JOB', '----', suite_job_status, suite_job_id,307                'lumpy-release/R27-3888.0.0-test_suites/control.dummy',308                '', suite_job_keyvals, '2014-04-29 13:14:37',309                '2014-04-29 13:20:27', job_started_time=suite_job_started_time,310                job_finished_time=suite_job_finished_time)311        good_test = self._build_view(312                11, 'dummy_Pass', '101-user/host/dummy_Pass', 'GOOD',313                good_job_id, 'lumpy-release/R27-3888.0.0/dummy/dummy_Pass',314                '', {}, '2014-04-29 13:15:35', '2014-04-29 13:15:36')315        bad_test = self._build_view(316                12, 'dummy_Fail.Fail', '102-user/host/dummy_Fail.Fail', 'FAIL',317                bad_job_id, 'lumpy-release/R27-3888.0.0/dummy/dummy_Fail.Fail',318                'always fail', {}, '2014-04-29 13:16:00',319                '2014-04-29 13:16:02')320        warn_test = self._build_view(321                13, 'dummy_Fail.Warn', '102-user/host/dummy_Fail.Warn', 'WARN',322                warn_job_id, 'lumpy-release/R27-3888.0.0/dummy/dummy_Fail.Warn',323                'always warn', {}, '2014-04-29 13:16:00',324                '2014-04-29 13:16:02')325        timeout_test = self._build_view(326                15, 'dummy_Timeout', '', 'ABORT',327                timeout_job_id,328                'lumpy-release/R27-3888.0.0/dummy/dummy_Timeout',329                'child job did not run', {}, '2014-04-29 13:15:37',330                '2014-04-29 13:15:38')331        self_aborted_test = self._build_view(332                16, 'dummy_Abort', '104-user/host/dummy_Abort', 'ABORT',333                self_aborted_job_id,334                'lumpy-release/R27-3888.0.0/dummy/dummy_Abort',335                'child job aborted', {'aborted_by': 'test_user'},336                '2014-04-29 13:15:39', '2014-04-29 13:15:40',337                job_started_time='2014-04-29 13:15:39',338                job_finished_time='2014-04-29 13:25:40')339        aborted_by_suite = self._build_view(340                17, 'dummy_AbortBySuite', '105-user/host/dummy_AbortBySuite',341                'RUNNING', aborted_by_suite_job_id,342                'lumpy-release/R27-3888.0.0/dummy/dummy_Abort',343                'aborted by suite', {'aborted_by': 'test_user'},344                '2014-04-29 13:15:39', '2014-04-29 13:15:40',345                job_started_time='2014-04-29 13:15:39',346                job_finished_time='2014-04-29 13:15:40')347        good_retry = self._build_view(348                18, 'dummy_RetryPass', '106-user/host/dummy_RetryPass', 'GOOD',349                good_retry_job_id,350                'lumpy-release/R27-3888.0.0/dummy/dummy_RetryPass',351                '', {'retry_original_job_id': invalid_job_id_1},352                '2014-04-29 13:15:37',353                '2014-04-29 13:15:38', invalidates_test_idx=1)354        bad_retry = self._build_view(355                19, 'dummy_RetryFail', '107-user/host/dummy_RetryFail', 'FAIL',356                bad_retry_job_id,357                'lumpy-release/R27-3888.0.0/dummy/dummy_RetryFail',358                'retry failed', {'retry_original_job_id': invalid_job_id_2},359                '2014-04-29 13:15:39', '2014-04-29 13:15:40',360                invalidates_test_idx=2)361        invalid_test_1 = self._build_view(362                1, 'dummy_RetryPass', '90-user/host/dummy_RetryPass', 'GOOD',363                invalid_job_id_1,364                'lumpy-release/R27-3888.0.0/dummy/dummy_RetryPass',365                'original test failed', {}, '2014-04-29 13:10:00',366                '2014-04-29 13:10:01')367        invalid_test_2 = self._build_view(368                2, 'dummy_RetryFail', '91-user/host/dummy_RetryFail', 'FAIL',369                invalid_job_id_2,370                'lumpy-release/R27-3888.0.0/dummy/dummy_RetryFail',371                'original test failed', {},372                '2014-04-29 13:10:03', '2014-04-29 13:10:04')373        test_views = [server_job_view, good_test]374        child_jobs = set([good_job_id])375        if include_bad_test:376            test_views.append(bad_test)377            child_jobs.add(bad_job_id)378        if include_warn_test:379            test_views.append(warn_test)380            child_jobs.add(warn_job_id)381        if include_timeout_test:382            test_views.append(timeout_test)383        if include_self_aborted_test:384            test_views.append(self_aborted_test)385            child_jobs.add(self_aborted_job_id)386        if include_good_retry:387            test_views.extend([good_retry, invalid_test_1])388            child_jobs.add(good_retry_job_id)389        if include_bad_retry:390            test_views.extend([bad_retry, invalid_test_2])391            child_jobs.add(bad_retry_job_id)392        if include_aborted_by_suite_test:393            test_views.append(aborted_by_suite)394            child_jobs.add(aborted_by_suite_job_id)395        self._mock_tko_get_detailed_test_views(test_views)396        self._mock_afe_get_jobs(suite_job_id, child_jobs)397        collector = run_suite.ResultCollector(398               'fake_server', self.afe, self.tko,399               'lumpy-release/R36-5788.0.0', 'lumpy', 'dummy', suite_job_id,400               return_code_function=run_suite._ReturnCodeComputer())401        collector.run()402        return collector403    def testEndToEndSuitePass(self):404        """Test it returns code OK when all test pass."""405        collector = self._end_to_end_test_helper()406        self.assertEqual(collector.return_code, run_suite.RETURN_CODES.OK)407    def testEndToEndSuiteWarn(self):408        """Test it returns code WARNING when there is a test that warns."""409        collector = self._end_to_end_test_helper(include_warn_test=True)410        self.assertEqual(collector.return_code, run_suite.RETURN_CODES.WARNING)411    def testEndToEndSuiteFail(self):412        """Test it returns code ERROR when there is a test that fails."""413        collector = self._end_to_end_test_helper(include_bad_test=True)414        self.assertEqual(collector.return_code, run_suite.RETURN_CODES.ERROR)415    def testEndToEndSuiteJobFail(self):416        """Test it returns code SUITE_FAILURE when only the suite job failed."""417        collector = self._end_to_end_test_helper(suite_job_status='ABORT')418        self.assertEqual(419                collector.return_code, run_suite.RETURN_CODES.INFRA_FAILURE)420        collector = self._end_to_end_test_helper(suite_job_status='ERROR')421        self.assertEqual(422                collector.return_code, run_suite.RETURN_CODES.INFRA_FAILURE)423    def testEndToEndRetry(self):424        """Test it returns correct code when a test was retried."""425        collector = self._end_to_end_test_helper(include_good_retry=True)426        self.assertEqual(427                collector.return_code, run_suite.RETURN_CODES.WARNING)428        collector = self._end_to_end_test_helper(include_good_retry=True,429                include_self_aborted_test=True)430        self.assertEqual(431                collector.return_code, run_suite.RETURN_CODES.ERROR)432        collector = self._end_to_end_test_helper(include_good_retry=True,433                include_bad_test=True)434        self.assertEqual(435                collector.return_code, run_suite.RETURN_CODES.ERROR)436        collector = self._end_to_end_test_helper(include_bad_retry=True)437        self.assertEqual(438                collector.return_code, run_suite.RETURN_CODES.ERROR)439    def testEndToEndSuiteTimeout(self):440        """Test it returns correct code when a child job timed out."""441        # a child job timed out before started, none failed.442        collector = self._end_to_end_test_helper(include_timeout_test=True)443        self.assertEqual(444                collector.return_code, run_suite.RETURN_CODES.SUITE_TIMEOUT)445        # a child job timed out before started, and one test failed.446        collector = self._end_to_end_test_helper(447                include_bad_test=True, include_timeout_test=True)448        self.assertEqual(collector.return_code, run_suite.RETURN_CODES.ERROR)449        # a child job timed out before started, and one test warned.450        collector = self._end_to_end_test_helper(451                include_warn_test=True, include_timeout_test=True)452        self.assertEqual(collector.return_code,453                         run_suite.RETURN_CODES.SUITE_TIMEOUT)454        # a child job timed out before started, and one test was retried.455        collector = self._end_to_end_test_helper(include_good_retry=True,456                include_timeout_test=True)457        self.assertEqual(458                collector.return_code, run_suite.RETURN_CODES.SUITE_TIMEOUT)459        # a child jot was aborted because suite timed out.460        collector = self._end_to_end_test_helper(461                include_aborted_by_suite_test=True)462        self.assertEqual(463                collector.return_code, run_suite.RETURN_CODES.OK)464        # suite job timed out.465        collector = self._end_to_end_test_helper(suite_job_timed_out=True)466        self.assertEqual(467                collector.return_code, run_suite.RETURN_CODES.SUITE_TIMEOUT)468class LogLinkUnittests(unittest.TestCase):469    """Test the LogLink"""470    def testGenerateBuildbotLinks(self):471        """Test LogLink GenerateBuildbotLinks"""472        log_link_a = run_suite.LogLink('mock_anchor', 'mock_server',473                                      'mock_job_string',474                                      bug_info=('mock_bug_id', 1),475                                      reason='mock_reason',476                                      retry_count=1,477                                      testname='mock_testname')478        # Generate a bug link and a log link when bug_info is present479        self.assertTrue(len(list(log_link_a.GenerateBuildbotLinks())) == 2)480        log_link_b = run_suite.LogLink('mock_anchor', 'mock_server',481                                      'mock_job_string_b',482                                      reason='mock_reason',483                                      retry_count=1,484                                      testname='mock_testname')485        # Generate a log link when there is no bug_info486        self.assertTrue(len(list(log_link_b.GenerateBuildbotLinks())) == 1)487class SimpleTimerUnittests(unittest.TestCase):488    """Test the simple timer."""489    def testPoll(self):490        """Test polling the timer."""491        interval_hours = 0.0001492        t = diagnosis_utils.SimpleTimer(interval_hours=interval_hours)493        deadline = t.deadline494        self.assertTrue(deadline is not None and495                        t.interval_hours == interval_hours)496        min_deadline = (datetime.now() +497                        datetime_base.timedelta(hours=interval_hours))498        time.sleep(interval_hours * 3600)499        self.assertTrue(t.poll())500        self.assertTrue(t.deadline >= min_deadline)501    def testBadInterval(self):502        """Test a bad interval."""503        t = diagnosis_utils.SimpleTimer(interval_hours=-1)504        self.assertTrue(t.deadline is None and t.poll() == False)505        t._reset()506        self.assertTrue(t.deadline is None and t.poll() == False)507class ArgumentParserUnittests(unittest.TestCase):508    """Tests for argument parser."""509    @unittest.expectedFailure510    def test_crbug_658013(self):511        """crbug.com/658013512        Expected failure due to http://bugs.python.org/issue9334513        """514        parser = run_suite.make_parser()515        args = [516            '--board', 'heli',517            '--build', 'trybot-heli-paladin/R56-8918.0.0-b1601',518            '--suite_name', 'test_that_wrapper',519            '--pool', 'suites',520            '--max_runtime_mins', '20',521            '--suite_args', '-b heli -i trybot-heli-paladin/R56-8918.0.0-b1601 :lab: suite:bvt-inline',522        ]523        def error_handler(msg):  # pylint: disable=missing-docstring524            self.fail('Argument parsing failed: ' + msg)525        parser.error = error_handler526        got = parser.parse_args(args)527        self.assertEqual(528            got.board, 'heli')529        self.assertEqual(530            got.build, 'trybot-heli-paladin/R56-8918.0.0-b1601')531        self.assertEqual(532            got.suite_args,533            '-b heli -i trybot-heli-paladin/R56-8918.0.0-b1601 :lab: suite:bvt-inline')534    def test_crbug_658013b(self):535        """crbug.com/658013536        Unambiguous behavior.537        """538        parser = run_suite.make_parser()539        args = [540            '--board=heli',541            '--build=trybot-heli-paladin/R56-8918.0.0-b1601',542            '--suite_name=test_that_wrapper',543            '--pool=suites',544            '--max_runtime_mins=20',545            '--suite_args=-b heli -i trybot-heli-paladin/R56-8918.0.0-b1601 :lab: suite:bvt-inline',546        ]547        def error_handler(msg):  # pylint: disable=missing-docstring548            self.fail('Argument parsing failed: ' + msg)549        parser.error = error_handler550        got = parser.parse_args(args)551        self.assertEqual(552            got.board, 'heli')553        self.assertEqual(554            got.build, 'trybot-heli-paladin/R56-8918.0.0-b1601')555        self.assertEqual(556            got.suite_args,557            '-b heli -i trybot-heli-paladin/R56-8918.0.0-b1601 :lab: suite:bvt-inline')558if __name__ == '__main__':...test_event_order.py
Source:test_event_order.py  
...41        self.event_order.append(test_skipped)42    def on_test_started(self, **kwargs):43        self.event_order.append(test_started)44    def test_happy_path(self):45        def run_suite():46            class Suite(TestSuite):47                def test_nothing(self):48                    pass49        run_suite()50        expect(self.event_order).to(equal([suite_started, test_started, test_ended, suite_ended]))51    def test_suite_setup_error(self):52        def run_suite():53            class Suite(TestSuite):54                def setup_suite(self):55                    raise RuntimeError("intentional")56                def test_nothing(self):57                    pass58        run_suite()59        expect(self.event_order).to(equal([suite_started, suite_erred, test_skipped, suite_ended]))60    def test_test_setup_error(self):61        def run_suite():62            class Suite(TestSuite):63                def setup(self):64                    raise RuntimeError("intentional")65                def test_should_not_run(self):66                    pass67        run_suite()68        expect(self.event_order).to(equal([suite_started, test_started, test_erred, test_ended, suite_ended]))69    def test_test_error(self):70        def run_suite():71            class Suite(TestSuite):72                def test_go_boom(self):73                    raise RuntimeError("intentional")74        run_suite()75        expect(self.event_order).to(equal([suite_started, test_started, test_erred, test_ended, suite_ended]))76    def test_test_failure(self):77        def run_suite():78            class Suite(TestSuite):79                def test_fails(self):80                    raise AssertionError("intentional")81        run_suite()82        expect(self.event_order).to(equal([suite_started, test_started, test_failed, test_ended, suite_ended]))83    def test_test_skip(self):84        def run_suite():85            class Suite(TestSuite):86                def test_fails(self):87                    raise TestSkipped("intentional")88        run_suite()89        expect(self.event_order).to(equal([suite_started, test_started, test_skipped, test_ended, suite_ended]))90    def test_test_teardown_failure(self):91        def run_suite():92            class Suite(TestSuite):93                def test_nothing(self):94                    pass95                def teardown(self):96                    raise RuntimeError("intentional")97        run_suite()98        expect(self.event_order).to(equal([suite_started, test_started, test_erred, test_ended, suite_ended]))99    def test_suite_teardown_failure(self):100        def run_suite():101            class Suite(TestSuite):102                def test_nothing(self):103                    pass104                def teardown_suite(self):105                    raise RuntimeError("intentional")106        run_suite()107        expect(self.event_order).to(equal([suite_started, test_started, test_ended, suite_erred, suite_ended]))108if "__main__" == __name__:...runners.py
Source:runners.py  
...39        except Exception, e:40            errors.append(f[0])41            traceback.print_exc()42    return passed, failed, errors43def run_suite(modules, smoke=False, report=False):44    passed    = []45    failed    = []46    errors    = []47    target    = 048    try:49        git_dir  = os.path.dirname(os.path.dirname(__file__))50        git_sha1 = ave.git.rev_list(git_dir, 1)[0]51    except Exception, e:52        git_sha1 = ''53    for m in modules:54        args = tuple()55        if type(m) == tuple:56            args = m[1]57            m = m[0]58        package = 'ave.common.%s' % m.__name__.split('.')[-1]59        functions = inspect.getmembers(m, inspect.isfunction)60        functions = [f for f in functions if re.match('t\d+', f[0])]61        if smoke:62            functions = [f for f in functions if hasattr(f[1], 'smoke')]63        target += len(functions)64        p,f,e = run_tests(functions, package, *args)65        passed.extend(p)66        failed.extend(f)67        errors.extend(e)68    if len(passed) != target:69        return vcsjob.FAILURES70    return vcsjob.OK71def all_smoke(report, so_path):72    modules = [73        tests.config, tests.cmd, tests.documentation, tests.spool,74        tests.connection, tests.control, (tests.fdtx, (so_path,))75    ]76    return run_suite(modules, True, report)77def all_config(report=False):78    return run_suite([tests.config], False, report)79def all_cmd(report=False):80    return run_suite([tests.cmd], False, report)81def all_documentation(report=False):82    return run_suite([tests.documentation], False, report)83def all_spool(report=False):84    # tests for irrelevant functionality. don't run85    return run_suite([tests.spool], False, report)86def all_connection(report=False):87    return run_suite([tests.connection], False, report)88def all_control(report=False):89    run_suite([tests.control_sync],  False, report)90    run_suite([tests.control_async], False, report)91#    for i in range(100000):92#        tests.control_async.t28()93#        print 'num fds: %d' % len(os.listdir('/proc/%d/fd' % os.getpid()))94#        gc.collect()95#        pass96def all_fdtx(so_path=None, report=False):97    return run_suite([(tests.fdtx, (so_path,))], False, report)98def all_exception(report=False):99    return run_suite([tests.exception], False, report)100def all_hickup(report=False):101    return run_suite([tests.hickup], False, report)102def all_stress():103    return tests.stress.t1()104def all_panotti(report=False):105    return run_suite([tests.panotti], False, report)106def all_process(report=False):107    return run_suite([tests.process], False, report)108def all_pipe(report=False):109    return run_suite([tests.pipe], False, report)110def all_daemon(report=False):111    return run_suite([tests.daemon], False, report)112def all_defjoin(report=False):113    return run_suite([tests.defjoin], False, report)114def all_async_rpc(report=False):...test_gpu_updaters.py
Source:test_gpu_updaters.py  
...16    def test_gpu_exact(self):17        variable_param = {'max_depth': [2, 6, 15], }18        for param in parameter_combinations(variable_param):19            param['tree_method'] = 'gpu_exact'20            gpu_results = run_suite(param, select_datasets=datasets)21            assert_results_non_increasing(gpu_results, 1e-2)22            param['tree_method'] = 'exact'23            cpu_results = run_suite(param, select_datasets=datasets)24            assert_gpu_results(cpu_results, gpu_results)25    def test_gpu_hist(self):26        test_param = parameter_combinations({'n_gpus': [1], 'max_depth': [2, 8],27                                             'max_leaves': [255, 4],28                                             'max_bin': [2, 256],29                                             'grow_policy': ['lossguide']})30        test_param.append({'single_precision_histogram': True})31        test_param.append({'min_child_weight': 0,32                           'lambda': 0})33        for param in test_param:34            param['tree_method'] = 'gpu_hist'35            gpu_results = run_suite(param, select_datasets=datasets)36            assert_results_non_increasing(gpu_results, 1e-2)37            param['tree_method'] = 'hist'38            cpu_results = run_suite(param, select_datasets=datasets)39            assert_gpu_results(cpu_results, gpu_results)40    @pytest.mark.mgpu41    def test_gpu_hist_mgpu(self):42        variable_param = {'n_gpus': [-1], 'max_depth': [2, 10],43                          'max_leaves': [255, 4],44                          'max_bin': [2, 256],45                          'grow_policy': ['lossguide'], 'debug_synchronize': [True]}46        for param in parameter_combinations(variable_param):47            param['tree_method'] = 'gpu_hist'48            gpu_results = run_suite(param, select_datasets=datasets)49            assert_results_non_increasing(gpu_results, 1e-2)50    @pytest.mark.mgpu51    def test_specified_gpu_id_gpu_update(self):52        variable_param = {'n_gpus': [1],53                          'gpu_id': [1],54                          'max_depth': [8],55                          'max_leaves': [255, 4],56                          'max_bin': [2, 64],57                          'grow_policy': ['lossguide'],58                          'tree_method': ['gpu_hist', 'gpu_exact']}59        for param in parameter_combinations(variable_param):60            gpu_results = run_suite(param, select_datasets=datasets)...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
