blob: 2820b5a5b9218fcedcac055321a771ead21e1804 [file] [log] [blame]
#!/usr/bin/env python
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unit tests for verification/presubmit_check.py."""
import logging
import os
import sys
import unittest
ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.join(ROOT_DIR, '..'))
from verification import base
from verification import presubmit_check
import find_depot_tools # pylint: disable=W0611
from testing_support import trial_dir
# From tests/
import mocks
class PresubmitTest(mocks.TestCase, trial_dir.TrialDirMixIn):
def setUp(self):
mocks.TestCase.setUp(self)
trial_dir.TrialDirMixIn.setUp(self)
# The presubmit check assumes PWD is set accordingly.
self._old_cwd = os.getcwd()
os.chdir(self.root_dir)
with open(os.path.join(self.root_dir, 'hello.txt'), 'wb') as f:
f.write('allo')
self.pending.files = ['hello.txt']
def tearDown(self):
try:
os.chdir(self._old_cwd)
trial_dir.TrialDirMixIn.tearDown(self)
finally:
mocks.TestCase.tearDown(self)
def _presubmit(self, content):
# Creates the presubmit check.
with open(os.path.join(self.root_dir, 'PRESUBMIT.py'), 'wb') as f:
f.write(content)
def testPresubmitBuggy(self):
self._presubmit('symbol_not_defined\n')
self._check(error_message='symbol_not_defined')
def testPresubmitHangs(self):
self._presubmit('import time\ntime.sleep(5)')
self._check(error_message='The presubmit check was hung.', expiration=0.2)
def testSuccess(self):
self._presubmit('')
self._check()
def testSuccessNotify(self):
self._presubmit(
'def CheckChangeOnCommit(input_api, output_api):\n'
' return [output_api.PresubmitNotifyResult("There is no problem")]\n')
self._check()
def testFailWarning(self):
self._presubmit(
'def CheckChangeOnCommit(input_api, output_api):\n'
' return [output_api.PresubmitPromptWarning(\n'
' "There is some problems")]\n')
self._check(error_message='There is some problems\n')
def testFailError(self):
self._presubmit(
'def CheckChangeOnCommit(input_api, output_api):\n'
' return [output_api.PresubmitError("Die die please die")]\n')
self._check(error_message='Die die please die')
def _check(self, error_message=None, expiration=None):
# checkout is not used yet. To be used to get the list of modified files.
ver = presubmit_check.PresubmitCheckVerifier(self.context)
if expiration:
ver.execution_timeout = expiration
ver.verify(self.pending)
ver.update_status(None)
name = presubmit_check.PresubmitCheckVerifier.name
self.assertEqual(self.pending.verifications.keys(), [name])
if error_message:
self.assertIn(
error_message, self.pending.verifications[name].error_message)
self.assertEqual(
self.pending.verifications[name].get_state(), base.FAILED)
self.assertIn(error_message, self.pending.error_message())
else:
self.assertEqual(None, self.pending.verifications[name].error_message)
self.assertEqual(
self.pending.verifications[name].get_state(), base.SUCCEEDED)
self.assertEqual('', self.pending.error_message())
self.context.status.check_names(['presubmit'] * 2)
def testPresubmitTryJob(self):
self._presubmit(
'def CheckChangeOnCommit(input_api, output_api):\n'
' out = input_api.canned_checks.CheckRietveldTryJobExecution(\n'
' 1, 2, 3, 4, 5, 6, absurd=True)\n'
' assert [] == out\n'
' return out\n')
self._check()
def testPresubmitTreeOpen(self):
self._presubmit(
'def CheckChangeOnCommit(input_api, output_api):\n'
' out = input_api.canned_checks.CheckTreeIsOpen(\n'
' 1, 2, 3, 4, 5, 6, absurd=True)\n'
' assert [] == out\n'
' return out\n')
self._check()
def testPresubmitPendingBuilds(self):
self._presubmit(
'def CheckChangeOnCommit(input_api, output_api):\n'
' out = input_api.canned_checks.CheckBuildbotPendingBuilds(\n'
' 1, 2, 3, 4, 5, 6, absurd=True)\n'
' assert [] == out\n'
' return out\n')
self._check()
def testPresubmitRietveld(self):
self._presubmit(
('def CheckChangeOnCommit(input_api, output_api):\n'
' out = []\n'
' if input_api.rietveld.email != %r:\n'
' out.append(output_api.PresubmitError(\n'
' "email: %%r" %% input_api.rietveld.email))\n'
# TODO(maruel): Bad! Remove me.
' if input_api.rietveld.password != %r:\n'
' out.append(output_api.PresubmitError(\n'
' "password: %%r" %% input_api.rietveld.password))\n'
' if input_api.rietveld.url != %r:\n'
' out.append(output_api.PresubmitError(\n'
' "url: %%r" %% input_api.rietveld.url))\n'
' return out\n') % (
self.context.rietveld.email,
self.context.rietveld.password,
self.context.rietveld.url))
self._check()
def testPresubmitNoFiles(self):
self.pending.files = []
self._presubmit(
'def CheckChangeOnCommit(input_api, output_api):\n'
' return []\n')
# TODO(maruel): Would make sense to have a more helpful error message.
self._check(
'Presubmit check for 42-23 failed and returned exit status 2.\n\n'
'Usage: presubmit_shim.py [options] <files...>\n\n'
'presubmit_shim.py: error: For unversioned directory, <files> is not '
'optional.\n')
if __name__ == '__main__':
if '-v' in sys.argv:
logging.basicConfig(level=logging.DEBUG)
else:
logging.basicConfig(level=logging.ERROR)
unittest.main()