#!/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',
            }
        test_push.EXPECTED_TEST_RESULTS_AU = test_push.EXPECTED_TEST_RESULTS


    def stub_out_methods(self, test_views, fail_first_run_suite=False):
        """Stub out methods in test_push module with given test results.

        @param test_views: Desired test result views.
        @param fail_first_run_suite: If it's True, only two urlopen and one
            get_test_views_from_tko calls need to stub out.

        """
        self.mox.UnsetStubs()
        response = StringIO.StringIO('some_value')
        self.mox.StubOutWithMock(urllib2, 'urlopen')
        urllib2.urlopen(mox.IgnoreArg()).AndReturn(response)
        if not fail_first_run_suite:
            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')

        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()
                               ).AndReturn((1))
        if not fail_first_run_suite:
            test_push.do_run_suite(test_push.AU_SUITE, 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)
        if not fail_first_run_suite:
            frontend_wrappers.RetryingTKO(timeout_min=0.1,
                                          delay_sec=10).AndReturn(None)
            site_utils.get_test_views_from_tko(1, None).AndReturn(test_views)

        self.mox.StubOutWithMock(test_push, 'close_bug')
        test_push.close_bug().AndReturn(None)
        if not fail_first_run_suite:
            self.mox.StubOutWithMock(test_push, 'check_bug_filed_and_deduped')
            test_push.check_bug_filed_and_deduped(None).AndReturn(None)


    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.main()
        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, fail_first_run_suite=True)
        self.mox.ReplayAll()
        self.assertRaises(test_push.TestPushException, test_push.main)

        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, fail_first_run_suite=True)
        self.mox.ReplayAll()
        self.assertRaises(test_push.TestPushException, test_push.main)

        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, fail_first_run_suite=True)
        self.mox.ReplayAll()
        self.assertRaises(test_push.TestPushException, test_push.main)

        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()
