1#!/usr/bin/python2 2# Copyright (c) 2013 The Chromium OS Authors. All rights reserved. 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5 6import six 7import mox 8import unittest 9from six.moves import urllib 10 11import mock 12 13import common 14from autotest_lib.client.common_lib.cros import retry 15from autotest_lib.server import site_utils 16 17 18# Mock retry.retry used in test_push before importing test_push. 19retry.retry = mock.create_autospec(retry.retry, return_value=lambda func: func) 20from autotest_lib.site_utils import test_push 21 22class TestPushUnittests(mox.MoxTestBase): 23 """Unittest for test_push script.""" 24 25 _ARGV = [ 26 'command', 27 '--build', 'stumpy-release/R36-5881-0.0', 28 '--shard_build', 'quawks-release/R36-5881-0.0' 29 ] 30 31 def setUp(self): 32 """Initialize the unittest.""" 33 super(TestPushUnittests, self).setUp() 34 # Overwrite expected test results. 35 test_push.EXPECTED_TEST_RESULTS = { 36 '^SERVER_JOB$': ['GOOD'], 37 '.*control.dependency$': ['TEST_NA'], 38 '.*dummy_Fail.RetryFail$': ['FAIL', 'FAIL'], 39 } 40 test_push.TKO = None 41 42 43 def stub_out_methods(self, test_views): 44 """Stub out methods in test_push module with given test results. 45 46 @param test_views: Desired test result views. 47 48 """ 49 self.mox.UnsetStubs() 50 response = six.StringIO('some_value') 51 self.mox.StubOutWithMock(urllib.request, 'urlopen') 52 urllib.request.urlopen(mox.IgnoreArg()).AndReturn(response) 53 54 self.mox.StubOutWithMock(test_push, 'check_dut_image') 55 test_push.check_dut_image(mox.IgnoreArg(), mox.IgnoreArg()).AndReturn( 56 None) 57 58 self.mox.StubOutWithMock(test_push, 'do_run_suite') 59 test_push.do_run_suite( 60 test_push.PUSH_TO_PROD_SUITE, mox.IgnoreArg(), mox.IgnoreArg(), 61 mox.IgnoreArg()).AndReturn((1)) 62 63 self.mox.StubOutWithMock(site_utils, 'get_test_views_from_tko') 64 site_utils.get_test_views_from_tko(1, None).AndReturn(test_views) 65 66 67 def test_suite_success(self): 68 """Test test_suite method with matching results.""" 69 test_views = {'SERVER_JOB': ['GOOD'], 70 'dummy_fail/control.dependency': ['TEST_NA'], 71 'dummy_Fail.RetryFail': ['FAIL', 'FAIL'], 72 } 73 74 self.stub_out_methods(test_views) 75 self.mox.ReplayAll() 76 test_push.test_suite(test_push.PUSH_TO_PROD_SUITE, test_views, 77 arguments=test_push.parse_arguments(self._ARGV)) 78 self.mox.VerifyAll() 79 80 81 def test_suite_fail_with_missing_test(self): 82 """Test test_suite method that should fail with missing test.""" 83 test_views = {'SERVER_JOB': ['GOOD'], 84 'dummy_fail/control.dependency': ['TEST_NA'], 85 } 86 87 self.stub_out_methods(test_views) 88 self.mox.ReplayAll() 89 test_push.test_suite(test_push.PUSH_TO_PROD_SUITE, test_views, 90 arguments=test_push.parse_arguments(self._ARGV)) 91 self.mox.VerifyAll() 92 93 94 def test_suite_fail_with_unexpected_test_results(self): 95 """Test test_suite method that should fail with unexpected test results. 96 """ 97 test_views = {'SERVER_JOB': ['FAIL'], 98 'dummy_fail/control.dependency': ['TEST_NA'], 99 'dummy_Fail.RetryFail': ['FAIL', 'FAIL'], 100 } 101 102 self.stub_out_methods(test_views) 103 self.mox.ReplayAll() 104 test_push.test_suite(test_push.PUSH_TO_PROD_SUITE, test_views, 105 arguments=test_push.parse_arguments(self._ARGV)) 106 self.mox.VerifyAll() 107 108 109 def test_suite_fail_with_extra_test(self): 110 """Test test_suite method that should fail with extra test.""" 111 test_views = {'SERVER_JOB': ['GOOD'], 112 'dummy_fail/control.dependency': ['TEST_NA'], 113 'dummy_Fail.RetryFail': ['FAIL', 'FAIL'], 114 'dummy_Fail.ExtraTest': ['GOOD'], 115 } 116 117 self.stub_out_methods(test_views) 118 self.mox.ReplayAll() 119 test_push.test_suite(test_push.PUSH_TO_PROD_SUITE, test_views, 120 arguments=test_push.parse_arguments(self._ARGV)) 121 self.mox.VerifyAll() 122 123 124if __name__ == '__main__': 125 unittest.main() 126