#!/usr/bin/python # Copyright (c) 2013 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. import StringIO import mox import unittest import urllib2 import common from autotest_lib.server import site_utils from autotest_lib.server.cros.dynamic_suite import constants from autotest_lib.server.cros.dynamic_suite import frontend_wrappers from autotest_lib.server.cros.dynamic_suite import reporting from autotest_lib.site_utils import phapi_lib from autotest_lib.site_utils import test_push AUTOFILED_COUNT_2 = '%s2' % reporting.Reporter.AUTOFILED_COUNT class TestPushUnittests(mox.MoxTestBase): """Unittest for test_push script.""" def setUp(self): """Initialize the unittest.""" super(TestPushUnittests, self).setUp() # Overwrite expected test results. test_push.EXPECTED_TEST_RESULTS = { '^SERVER_JOB$': 'GOOD', '.*control.dependency$': 'TEST_NA', '.*dummy_Fail.RetryFail$': 'FAIL', } def stub_out_methods(self, test_views): """Stub out methods in test_push module with given test results. @param test_views: Desired test result views. """ self.mox.UnsetStubs() response = StringIO.StringIO('some_value') self.mox.StubOutWithMock(urllib2, 'urlopen') urllib2.urlopen(mox.IgnoreArg()).AndReturn(response) self.mox.StubOutWithMock(test_push, 'get_default_build') test_push.get_default_build(mox.IgnoreArg(), mox.IgnoreArg()).AndReturn( 'stumpy-release/R36-5881-0.0') test_push.get_default_build(mox.IgnoreArg(), mox.IgnoreArg()).AndReturn( 'quawks-release/R36-5881-0.0') self.mox.StubOutWithMock(test_push, 'check_dut_image') test_push.check_dut_image(mox.IgnoreArg(), mox.IgnoreArg()).AndReturn( None) self.mox.StubOutWithMock(test_push, 'do_run_suite') test_push.do_run_suite(test_push.PUSH_TO_PROD_SUITE, mox.IgnoreArg(), mox.IgnoreArg(), mox.IgnoreArg() ).AndReturn((1)) self.mox.StubOutWithMock(site_utils, 'get_test_views_from_tko') self.mox.StubOutWithMock(frontend_wrappers, 'RetryingTKO') frontend_wrappers.RetryingTKO(timeout_min=0.1, delay_sec=10).AndReturn(None) site_utils.get_test_views_from_tko(1, None).AndReturn(test_views) def test_suite_success(self): """Test test_suite method with matching results.""" test_views = {'SERVER_JOB': 'GOOD', 'dummy_fail/control.dependency': 'TEST_NA', 'dummy_Fail.RetryFail': 'FAIL' } self.stub_out_methods(test_views) self.mox.ReplayAll() test_push.test_suite(test_push.PUSH_TO_PROD_SUITE, test_views, arguments=test_push.parse_arguments()) self.mox.VerifyAll() def test_suite_fail_with_missing_test(self): """Test test_suite method that should fail with missing test.""" test_views = {'SERVER_JOB': 'GOOD', 'dummy_fail/control.dependency': 'TEST_NA', } self.stub_out_methods(test_views) self.mox.ReplayAll() test_push.test_suite(test_push.PUSH_TO_PROD_SUITE, test_views, arguments=test_push.parse_arguments()) self.mox.VerifyAll() def test_suite_fail_with_unexpected_test_results(self): """Test test_suite method that should fail with unexpected test results. """ test_views = {'SERVER_JOB': 'FAIL', 'dummy_fail/control.dependency': 'TEST_NA', 'dummy_Fail.RetryFail': 'FAIL', } self.stub_out_methods(test_views) self.mox.ReplayAll() test_push.test_suite(test_push.PUSH_TO_PROD_SUITE, test_views, arguments=test_push.parse_arguments()) self.mox.VerifyAll() def test_suite_fail_with_extra_test(self): """Test test_suite method that should fail with extra test.""" test_views = {'SERVER_JOB': 'GOOD', 'dummy_fail/control.dependency': 'TEST_NA', 'dummy_Fail.RetryFail': 'FAIL', 'dummy_Fail.ExtraTest': 'GOOD', } self.stub_out_methods(test_views) self.mox.ReplayAll() test_push.test_suite(test_push.PUSH_TO_PROD_SUITE, test_views, arguments=test_push.parse_arguments()) self.mox.VerifyAll() def test_close_bug_fail(self): """Test close_bug method that failed to close a bug.""" issue = self.mox.CreateMock(phapi_lib.Issue) issue.id = 100 issue.labels = [] issue.state = constants.ISSUE_OPEN self.mox.StubOutWithMock(reporting.Reporter, 'find_issue_by_marker') reporting.Reporter.find_issue_by_marker(mox.IgnoreArg()).AndReturn( issue) reporting.Reporter.find_issue_by_marker(mox.IgnoreArg()).AndReturn( issue) self.mox.StubOutWithMock(reporting.Reporter, 'modify_bug_report') reporting.Reporter.modify_bug_report(mox.IgnoreArg(), comment=mox.IgnoreArg(), label_update=mox.IgnoreArg(), status=mox.IgnoreArg()).AndReturn( None) self.mox.ReplayAll() self.assertRaises(test_push.TestPushException, test_push.close_bug) self.mox.VerifyAll() def test_check_bug_filed_and_deduped_fail_to_find_bug(self): """Test check_bug_filed_and_deduped method that failed to find a bug. """ self.mox.StubOutWithMock(reporting.Reporter, 'find_issue_by_marker') reporting.Reporter.find_issue_by_marker(mox.IgnoreArg()).AndReturn( None) self.mox.ReplayAll() self.assertRaises(test_push.TestPushException, test_push.check_bug_filed_and_deduped, None) self.mox.VerifyAll() def create_mock_issue(self, id, labels=[]): """Create a mock issue with given id and lables. @param id: id of the issue. @param labels: labels of the issue. """ issue = self.mox.CreateMock(phapi_lib.Issue) issue.id = id issue.labels = labels issue.state = constants.ISSUE_OPEN return issue def test_check_bug_filed_and_deduped_fail_to_find_bug2(self): """Test check_bug_filed_and_deduped method that failed to find a bug. """ issue = self.create_mock_issue(100) self.mox.StubOutWithMock(reporting.Reporter, 'find_issue_by_marker') reporting.Reporter.find_issue_by_marker(mox.IgnoreArg()).AndReturn( issue) self.mox.ReplayAll() self.assertRaises(test_push.TestPushException, test_push.check_bug_filed_and_deduped, [100]) self.mox.VerifyAll() def test_check_bug_filed_and_deduped_fail_to_dedupe(self): """Test check_bug_filed_and_deduped method that failed with dedupe. """ issue = self.create_mock_issue(100) self.mox.StubOutWithMock(reporting.Reporter, 'find_issue_by_marker') reporting.Reporter.find_issue_by_marker(mox.IgnoreArg()).AndReturn( issue) self.mox.ReplayAll() self.assertRaises(test_push.TestPushException, test_push.check_bug_filed_and_deduped, [99]) self.mox.VerifyAll() def test_check_bug_filed_and_deduped_fail_more_than_1_bug(self): """Test check_bug_filed_and_deduped method that failed with finding more than one bug. """ issue = self.create_mock_issue(100, [AUTOFILED_COUNT_2]) second_issue = self.create_mock_issue(101) self.mox.StubOutWithMock(reporting.Reporter, 'find_issue_by_marker') reporting.Reporter.find_issue_by_marker(mox.IgnoreArg()).AndReturn( issue) reporting.Reporter.find_issue_by_marker(mox.IgnoreArg()).AndReturn( second_issue) self.mox.StubOutWithMock(reporting.Reporter, 'modify_bug_report') reporting.Reporter.modify_bug_report(mox.IgnoreArg(), comment=mox.IgnoreArg(), label_update=mox.IgnoreArg(), status=mox.IgnoreArg() ).AndReturn(None) self.mox.ReplayAll() self.assertRaises(test_push.TestPushException, test_push.check_bug_filed_and_deduped, [99]) self.mox.VerifyAll() def test_check_bug_filed_and_deduped_succeed_to_dedupe(self): """Test check_bug_filed_and_deduped method that succeeded with dedupe. """ issue = self.create_mock_issue(100, [AUTOFILED_COUNT_2]) self.mox.StubOutWithMock(reporting.Reporter, 'find_issue_by_marker') reporting.Reporter.find_issue_by_marker(mox.IgnoreArg()).AndReturn( issue) reporting.Reporter.find_issue_by_marker(mox.IgnoreArg()).AndReturn( None) self.mox.StubOutWithMock(reporting.Reporter, 'modify_bug_report') reporting.Reporter.modify_bug_report(mox.IgnoreArg(), comment=mox.IgnoreArg(), label_update=mox.IgnoreArg(), status=mox.IgnoreArg() ).AndReturn(None) self.mox.ReplayAll() test_push.check_bug_filed_and_deduped([99]) self.mox.VerifyAll() if __name__ == '__main__': unittest.main()