#!/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)
        urllib2.urlopen(mox.IgnoreArg()).AndReturn(response)
        if not fail_first_run_suite:
            urllib2.urlopen(mox.IgnoreArg()).AndReturn(response)

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