#!/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
        test_push.EXPECTED_TEST_RESULTS_DUMMY = 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)
            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(),
                               False
                               ).AndReturn((1))
        if not fail_first_run_suite:
            test_push.do_run_suite(test_push.DUMMY_SUITE, mox.IgnoreArg(),
                                   True
                                   ).AndReturn((1))
            test_push.do_run_suite(test_push.AU_SUITE, mox.IgnoreArg(), False
                                   ).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)
            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()
