Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 """Unit tests for git_cl.py.""" | 6 """Unit tests for git_cl.py.""" |
| 7 | 7 |
| 8 import os | 8 import os |
| 9 import StringIO | 9 import StringIO |
| 10 import stat | 10 import stat |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 90 def read(self): | 90 def read(self): |
| 91 return ("CODE_REVIEW_SERVER: gerrit.chromium.org\n" + | 91 return ("CODE_REVIEW_SERVER: gerrit.chromium.org\n" + |
| 92 "GERRIT_HOST: True\n") | 92 "GERRIT_HOST: True\n") |
| 93 | 93 |
| 94 | 94 |
| 95 class AuthenticatorMock(object): | 95 class AuthenticatorMock(object): |
| 96 def __init__(self, *_args): | 96 def __init__(self, *_args): |
| 97 pass | 97 pass |
| 98 def has_cached_credentials(self): | 98 def has_cached_credentials(self): |
| 99 return True | 99 return True |
| 100 def authorize(self, http): | |
| 101 return http | |
| 100 | 102 |
| 101 | 103 |
| 102 def CookiesAuthenticatorMockFactory(hosts_with_creds=None, same_cookie=False): | 104 def CookiesAuthenticatorMockFactory(hosts_with_creds=None, same_cookie=False): |
| 103 """Use to mock Gerrit/Git credentials from ~/.netrc or ~/.gitcookies. | 105 """Use to mock Gerrit/Git credentials from ~/.netrc or ~/.gitcookies. |
| 104 | 106 |
| 105 Usage: | 107 Usage: |
| 106 >>> self.mock(git_cl.gerrit_util, "CookiesAuthenticator", | 108 >>> self.mock(git_cl.gerrit_util, "CookiesAuthenticator", |
| 107 CookiesAuthenticatorMockFactory({'host1': 'cookie1'})) | 109 CookiesAuthenticatorMockFactory({'host1': 'cookie1'})) |
| 108 | 110 |
| 109 OR | 111 OR |
| (...skipping 1738 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1848 ((['DoGetTrySlaves'], ), None), | 1850 ((['DoGetTrySlaves'], ), None), |
| 1849 ((['SetCQState', git_cl._CQState.DRY_RUN], ), None), | 1851 ((['SetCQState', git_cl._CQState.DRY_RUN], ), None), |
| 1850 ] | 1852 ] |
| 1851 out = StringIO.StringIO() | 1853 out = StringIO.StringIO() |
| 1852 self.mock(git_cl.sys, 'stdout', out) | 1854 self.mock(git_cl.sys, 'stdout', out) |
| 1853 self.assertEqual(0, git_cl.main(['try'])) | 1855 self.assertEqual(0, git_cl.main(['try'])) |
| 1854 self.assertEqual( | 1856 self.assertEqual( |
| 1855 out.getvalue(), | 1857 out.getvalue(), |
| 1856 'scheduled CQ Dry Run on https://codereview.chromium.org/123\n') | 1858 'scheduled CQ Dry Run on https://codereview.chromium.org/123\n') |
| 1857 | 1859 |
| 1858 def test_write_try_results_json(self): | |
|
tandrii(chromium)
2016/10/06 13:21:10
this isn't changed, just moved + builds below made
| |
| 1859 builds = { | |
| 1860 '9000': { | |
| 1861 'id': '9000', | |
| 1862 'status': 'STARTED', | |
| 1863 'url': 'http://build.cr.org/p/x.y/builders/my-builder/builds/2', | |
| 1864 'result_details_json': '{"properties": {}}', | |
| 1865 'bucket': 'master.x.y', | |
| 1866 'created_by': 'user:someone@chromium.org', | |
| 1867 'created_ts': '147200002222000', | |
| 1868 'parameters_json': '{"builder_name": "my-builder", "category": ""}', | |
| 1869 }, | |
| 1870 '8000': { | |
| 1871 'id': '8000', | |
| 1872 'status': 'COMPLETED', | |
| 1873 'result': 'FAILURE', | |
| 1874 'failure_reason': 'BUILD_FAILURE', | |
| 1875 'url': 'http://build.cr.org/p/x.y/builders/my-builder/builds/1', | |
| 1876 'result_details_json': '{"properties": {}}', | |
| 1877 'bucket': 'master.x.y', | |
| 1878 'created_by': 'user:someone@chromium.org', | |
| 1879 'created_ts': '147200001111000', | |
| 1880 'parameters_json': '{"builder_name": "my-builder", "category": ""}', | |
| 1881 }, | |
| 1882 } | |
| 1883 expected_output = [ | |
| 1884 { | |
| 1885 'buildbucket_id': '8000', | |
| 1886 'bucket': 'master.x.y', | |
| 1887 'builder_name': 'my-builder', | |
| 1888 'status': 'COMPLETED', | |
| 1889 'result': 'FAILURE', | |
| 1890 'failure_reason': 'BUILD_FAILURE', | |
| 1891 'url': 'http://build.cr.org/p/x.y/builders/my-builder/builds/1', | |
| 1892 }, | |
| 1893 { | |
| 1894 'buildbucket_id': '9000', | |
| 1895 'bucket': 'master.x.y', | |
| 1896 'builder_name': 'my-builder', | |
| 1897 'status': 'STARTED', | |
| 1898 'result': None, | |
| 1899 'failure_reason': None, | |
| 1900 'url': 'http://build.cr.org/p/x.y/builders/my-builder/builds/2', | |
| 1901 } | |
| 1902 ] | |
| 1903 self.calls = [(('write_json', 'output.json', expected_output), '')] | |
| 1904 git_cl.write_try_results_json('output.json', builds) | |
| 1905 | |
| 1906 def _common_GerritCommitMsgHookCheck(self): | 1860 def _common_GerritCommitMsgHookCheck(self): |
| 1907 self.mock(git_cl.sys, 'stdout', StringIO.StringIO()) | 1861 self.mock(git_cl.sys, 'stdout', StringIO.StringIO()) |
| 1908 self.mock(git_cl.os.path, 'abspath', | 1862 self.mock(git_cl.os.path, 'abspath', |
| 1909 lambda path: self._mocked_call(['abspath', path])) | 1863 lambda path: self._mocked_call(['abspath', path])) |
| 1910 self.mock(git_cl.os.path, 'exists', | 1864 self.mock(git_cl.os.path, 'exists', |
| 1911 lambda path: self._mocked_call(['exists', path])) | 1865 lambda path: self._mocked_call(['exists', path])) |
| 1912 self.mock(git_cl.gclient_utils, 'FileRead', | 1866 self.mock(git_cl.gclient_utils, 'FileRead', |
| 1913 lambda path: self._mocked_call(['FileRead', path])) | 1867 lambda path: self._mocked_call(['FileRead', path])) |
| 1914 self.mock(git_cl.gclient_utils, 'rm_file_or_tree', | 1868 self.mock(git_cl.gclient_utils, 'rm_file_or_tree', |
| 1915 lambda path: self._mocked_call(['rm_file_or_tree', path])) | 1869 lambda path: self._mocked_call(['rm_file_or_tree', path])) |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1960 cl._codereview_impl._GetChangeDetail = lambda _: { | 1914 cl._codereview_impl._GetChangeDetail = lambda _: { |
| 1961 'labels': {}, | 1915 'labels': {}, |
| 1962 'current_revision': 'deadbeaf', | 1916 'current_revision': 'deadbeaf', |
| 1963 } | 1917 } |
| 1964 cl._codereview_impl.SubmitIssue = lambda wait_for_merge: None | 1918 cl._codereview_impl.SubmitIssue = lambda wait_for_merge: None |
| 1965 out = StringIO.StringIO() | 1919 out = StringIO.StringIO() |
| 1966 self.mock(sys, 'stdout', out) | 1920 self.mock(sys, 'stdout', out) |
| 1967 self.assertEqual(0, cl.CMDLand(force=True, bypass_hooks=True, verbose=True)) | 1921 self.assertEqual(0, cl.CMDLand(force=True, bypass_hooks=True, verbose=True)) |
| 1968 self.assertRegexpMatches(out.getvalue(), 'Issue.*123 has been submitted') | 1922 self.assertRegexpMatches(out.getvalue(), 'Issue.*123 has been submitted') |
| 1969 | 1923 |
| 1924 BUILDBUCKET_BUILDS_MAP = { | |
| 1925 '9000': { | |
| 1926 'id': '9000', | |
| 1927 'status': 'STARTED', | |
| 1928 'url': 'http://build.cr.org/p/x.y/builders/my-builder/builds/2', | |
| 1929 'result_details_json': '{"properties": {}}', | |
| 1930 'bucket': 'master.x.y', | |
| 1931 'created_by': 'user:someone@chromium.org', | |
| 1932 'created_ts': '147200002222000', | |
| 1933 'parameters_json': '{"builder_name": "my-builder", "category": ""}', | |
| 1934 }, | |
| 1935 '8000': { | |
| 1936 'id': '8000', | |
| 1937 'status': 'COMPLETED', | |
| 1938 'result': 'FAILURE', | |
| 1939 'failure_reason': 'BUILD_FAILURE', | |
| 1940 'url': 'http://build.cr.org/p/x.y/builders/my-builder/builds/1', | |
| 1941 'result_details_json': '{"properties": {}}', | |
| 1942 'bucket': 'master.x.y', | |
| 1943 'created_by': 'user:someone@chromium.org', | |
| 1944 'created_ts': '147200001111000', | |
| 1945 'parameters_json': '{"builder_name": "my-builder", "category": ""}', | |
| 1946 }, | |
| 1947 } | |
| 1948 | |
| 1949 def test_write_try_results_json(self): | |
|
tandrii(chromium)
2016/10/06 13:21:10
same as before.
| |
| 1950 expected_output = [ | |
| 1951 { | |
| 1952 'buildbucket_id': '8000', | |
| 1953 'bucket': 'master.x.y', | |
| 1954 'builder_name': 'my-builder', | |
| 1955 'status': 'COMPLETED', | |
| 1956 'result': 'FAILURE', | |
| 1957 'failure_reason': 'BUILD_FAILURE', | |
| 1958 'url': 'http://build.cr.org/p/x.y/builders/my-builder/builds/1', | |
| 1959 }, | |
| 1960 { | |
| 1961 'buildbucket_id': '9000', | |
| 1962 'bucket': 'master.x.y', | |
| 1963 'builder_name': 'my-builder', | |
| 1964 'status': 'STARTED', | |
| 1965 'result': None, | |
| 1966 'failure_reason': None, | |
| 1967 'url': 'http://build.cr.org/p/x.y/builders/my-builder/builds/2', | |
| 1968 } | |
| 1969 ] | |
| 1970 self.calls = [(('write_json', 'output.json', expected_output), '')] | |
| 1971 git_cl.write_try_results_json('output.json', self.BUILDBUCKET_BUILDS_MAP) | |
| 1972 | |
| 1973 def _setup_fetch_try_jobs_rietveld(self, *request_results): | |
|
tandrii(chromium)
2016/10/06 13:21:10
this and below is actually new code -- adding test
| |
| 1974 out = StringIO.StringIO() | |
| 1975 self.mock(sys, 'stdout', out) | |
| 1976 self.mock(git_cl.Changelist, 'GetMostRecentPatchset', lambda *args: 20001) | |
| 1977 self.mock(git_cl.auth, 'get_authenticator_for_host', lambda host, _cfg: | |
| 1978 self._mocked_call(['get_authenticator_for_host', host])) | |
| 1979 self.mock(git_cl, '_buildbucket_retry', lambda *_, **__: | |
| 1980 self._mocked_call(['_buildbucket_retry'])) | |
| 1981 self.calls += [ | |
| 1982 ((['git', 'symbolic-ref', 'HEAD'],), 'feature'), | |
| 1983 ((['git', 'config', 'branch.feature.rietveldissue'],), '1'), | |
| 1984 ((['git', 'config', 'rietveld.autoupdate'],), CERR1), | |
| 1985 ((['git', 'config', 'rietveld.server'],), 'codereview.example.com'), | |
| 1986 ((['git', 'config', 'branch.feature.rietveldpatchset'],), '20001'), | |
| 1987 ((['git', 'config', 'branch.feature.rietveldserver'],), | |
| 1988 'codereview.example.com'), | |
| 1989 ((['get_authenticator_for_host', 'codereview.example.com'],), | |
| 1990 AuthenticatorMock()), | |
| 1991 ] + [((['_buildbucket_retry'],), r) for r in request_results] | |
| 1992 | |
| 1993 def test_fetch_try_jobs_none_rietveld(self): | |
| 1994 self._setup_fetch_try_jobs_rietveld({}) | |
| 1995 self.assertEqual(0, git_cl.main(['try-results'])) | |
| 1996 self.assertRegexpMatches(sys.stdout.getvalue(), 'No try jobs') | |
| 1997 | |
| 1998 def test_fetch_try_jobs_some_rietveld(self): | |
| 1999 self._setup_fetch_try_jobs_rietveld({ | |
| 2000 'builds': self.BUILDBUCKET_BUILDS_MAP.values(), | |
| 2001 }) | |
| 2002 self.assertEqual(0, git_cl.main(['try-results'])) | |
| 2003 self.assertRegexpMatches(sys.stdout.getvalue(), 'Failures:') | |
| 2004 self.assertRegexpMatches(sys.stdout.getvalue(), 'Started:') | |
| 2005 self.assertRegexpMatches(sys.stdout.getvalue(), '2 try jobs') | |
| 2006 | |
| 1970 | 2007 |
| 1971 if __name__ == '__main__': | 2008 if __name__ == '__main__': |
| 1972 git_cl.logging.basicConfig( | 2009 git_cl.logging.basicConfig( |
| 1973 level=git_cl.logging.DEBUG if '-v' in sys.argv else git_cl.logging.ERROR) | 2010 level=git_cl.logging.DEBUG if '-v' in sys.argv else git_cl.logging.ERROR) |
| 1974 unittest.main() | 2011 unittest.main() |
| OLD | NEW |