| # -*- coding: utf-8 -*- |
| # Copyright 2017 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Unit tests for hwtest_results.""" |
| |
| from __future__ import print_function |
| |
| import mock |
| |
| from chromite.lib import constants |
| from chromite.lib import cros_test_lib |
| from chromite.lib import fake_cidb |
| from chromite.lib import git |
| from chromite.lib import hwtest_results |
| from chromite.lib import patch_unittest |
| |
| |
| class HWTestResultTest(cros_test_lib.MockTestCase): |
| """Tests for HWTestResult.""" |
| |
| def testNormalizeTestName(self): |
| """Test NormalizeTestName.""" |
| self.assertEqual(hwtest_results.HWTestResult.NormalizeTestName( |
| 'Suite job'), None) |
| self.assertEqual(hwtest_results.HWTestResult.NormalizeTestName( |
| 'cheets_CTS.com.android.cts.dram'), 'cheets_CTS') |
| self.assertEqual(hwtest_results.HWTestResult.NormalizeTestName( |
| 'security_NetworkListeners'), 'security_NetworkListeners') |
| |
| |
| class HWTestResultManagerTest(cros_test_lib.MockTestCase): |
| """Tests for HWTestResultManager.""" |
| |
| def setUp(self): |
| self.manager = hwtest_results.HWTestResultManager() |
| self.db = fake_cidb.FakeCIDBConnection() |
| self._patch_factory = patch_unittest.MockPatchFactory() |
| |
| def _ReportHWTestResults(self): |
| build_1 = self.db.InsertBuild('build_1', 1, |
| 'build_1', 'bot_hostname') |
| build_2 = self.db.InsertBuild('build_2', 2, |
| 'build_2', 'bot_hostname') |
| r1 = hwtest_results.HWTestResult.FromReport( |
| build_1, 'Suite job', 'pass') |
| r2 = hwtest_results.HWTestResult.FromReport( |
| build_1, 'test_b.test', 'fail') |
| r3 = hwtest_results.HWTestResult.FromReport( |
| build_1, 'test_c.test', 'abort') |
| r4 = hwtest_results.HWTestResult.FromReport( |
| build_2, 'test_d.test', 'other') |
| r5 = hwtest_results.HWTestResult.FromReport( |
| build_2, 'test_e', 'pass') |
| |
| self.db.InsertHWTestResults([r1, r2, r3, r4, r5]) |
| |
| return ((build_1, build_2), (r1, r2, r3, r4, r5)) |
| |
| def GetHWTestResultsFromCIDB(self): |
| """Test GetHWTestResultsFromCIDB.""" |
| (build_1, build_2), _ = self._ReportHWTestResults() |
| |
| expect_r1 = hwtest_results.HWTestResult(0, build_1, 'Suite job', 'pass') |
| expect_r2 = hwtest_results.HWTestResult(1, build_1, 'test_b.test', 'fail') |
| expect_r3 = hwtest_results.HWTestResult(2, build_1, 'test_c.test', 'abort') |
| expect_r4 = hwtest_results.HWTestResult(3, build_2, 'test_d.test', 'other') |
| expect_r5 = hwtest_results.HWTestResult(4, build_2, 'test_e', 'pass') |
| |
| results = self.manager.GetHWTestResultsFromCIDB(self.db, [build_1]) |
| self.assertItemsEqual(results, [expect_r1, expect_r2, expect_r3]) |
| |
| results = self.manager.GetHWTestResultsFromCIDB( |
| self.db, [build_1], test_statues=constants.HWTEST_STATUES_NOT_PASSED) |
| self.assertItemsEqual(results, [expect_r2, expect_r3]) |
| |
| results = self.manager.GetHWTestResultsFromCIDB(self.db, [build_1, build_2]) |
| self.assertItemsEqual( |
| results, [expect_r1, expect_r2, expect_r3, expect_r4, expect_r5]) |
| |
| results = self.manager.GetHWTestResultsFromCIDB( |
| self.db, [build_1, build_2], |
| test_statues=constants.HWTEST_STATUES_NOT_PASSED) |
| self.assertItemsEqual(results, [expect_r2, expect_r3, expect_r4]) |
| |
| def testGetFailedHWTestsFromCIDB(self): |
| """Test GetFailedHWTestsFromCIDB.""" |
| (build_1, build_2), (r1, r2, r3, r4, r5) = self._ReportHWTestResults() |
| mock_get_hwtest_results = self.PatchObject( |
| hwtest_results.HWTestResultManager, 'GetHWTestResultsFromCIDB', |
| return_value=[r1, r2, r3, r4, r5]) |
| failed_tests = self.manager.GetFailedHWTestsFromCIDB( |
| self.db, [build_1, build_2]) |
| |
| self.assertItemsEqual(failed_tests, |
| ['test_b', 'test_c', 'test_d', 'test_e']) |
| mock_get_hwtest_results.assert_called_once_with( |
| self.db, [build_1, build_2], |
| test_statues=constants.HWTEST_STATUES_NOT_PASSED) |
| |
| def testGetFailedHwtestsAffectedByChange(self): |
| """Test GetFailedHwtestsAffectedByChange.""" |
| manifest = mock.Mock() |
| mock_change = mock.Mock() |
| diffs = {'client/site_tests/graphics_dEQP/graphics_dEQP.py': 'M', |
| 'client/site_tests/graphics_Gbm/graphics_Gbm.py': 'M'} |
| mock_change.GetDiffStatus.return_value = diffs |
| self.PatchObject(git.ProjectCheckout, 'GetPath') |
| |
| failed_hwtests = {'graphics_dEQP'} |
| self.assertItemsEqual(self.manager.GetFailedHwtestsAffectedByChange( |
| mock_change, manifest, failed_hwtests), failed_hwtests) |
| |
| failed_hwtests = {'graphics_Gbm'} |
| self.assertItemsEqual(self.manager.GetFailedHwtestsAffectedByChange( |
| mock_change, manifest, failed_hwtests), failed_hwtests) |
| |
| failed_hwtests = {'graphics_dEQP', 'graphics_Gbm'} |
| self.assertItemsEqual(self.manager.GetFailedHwtestsAffectedByChange( |
| mock_change, manifest, failed_hwtests), failed_hwtests) |
| |
| failed_hwtests = {'audio_ActiveStreamStress'} |
| self.assertItemsEqual(self.manager.GetFailedHwtestsAffectedByChange( |
| mock_change, manifest, failed_hwtests), set()) |
| |
| failed_hwtests = {'graphics_dEQP', 'graphics_Gbm', |
| 'audio_ActiveStreamStress'} |
| self.assertItemsEqual(self.manager.GetFailedHwtestsAffectedByChange( |
| mock_change, manifest, failed_hwtests), |
| {'graphics_dEQP', 'graphics_Gbm'}) |
| |
| def testFindHWTestFailureSuspects(self): |
| """Test FindHWTestFailureSuspects.""" |
| self.PatchObject(git.ManifestCheckout, 'Cached') |
| c1 = self._patch_factory.MockPatch(change_id=1, patch_number=1) |
| c2 = self._patch_factory.MockPatch(change_id=2, patch_number=1) |
| test_1 = mock.Mock() |
| test_2 = mock.Mock() |
| self.PatchObject(hwtest_results.HWTestResultManager, |
| 'GetFailedHwtestsAffectedByChange', |
| return_value={test_1}) |
| suspects, no_assignee_hwtests = self.manager.FindHWTestFailureSuspects( |
| [c1, c2], mock.Mock(), {test_1, test_2}) |
| |
| self.assertItemsEqual(suspects, {c1, c2}) |
| self.assertTrue(no_assignee_hwtests) |
| |
| def testFindHWTestFailureSuspectsNoAssignees(self): |
| """Test FindHWTestFailureSuspects when failures don't have assignees.""" |
| self.PatchObject(git.ManifestCheckout, 'Cached') |
| c1 = self._patch_factory.MockPatch(change_id=1, patch_number=1) |
| c2 = self._patch_factory.MockPatch(change_id=2, patch_number=1) |
| test_1 = mock.Mock() |
| test_2 = mock.Mock() |
| self.PatchObject(hwtest_results.HWTestResultManager, |
| 'GetFailedHwtestsAffectedByChange', |
| return_value=set()) |
| suspects, no_assignee_hwtests = self.manager.FindHWTestFailureSuspects( |
| [c1, c2], mock.Mock(), {test_1, test_2}) |
| |
| self.assertItemsEqual(suspects, set()) |
| self.assertTrue(no_assignee_hwtests) |
| |
| def testFindHWTestFailureSuspectsNoFailedHWTests(self): |
| """Test FindHWTestFailureSuspects with empty failed HWTests.""" |
| self.PatchObject(git.ManifestCheckout, 'Cached') |
| c1 = self._patch_factory.MockPatch(change_id=1, patch_number=1) |
| c2 = self._patch_factory.MockPatch(change_id=2, patch_number=1) |
| suspects, no_assignee_hwtests = self.manager.FindHWTestFailureSuspects( |
| [c1, c2], mock.Mock(), set()) |
| |
| self.assertItemsEqual(suspects, set()) |
| self.assertFalse(no_assignee_hwtests) |