blob: 5c14b58785ac4837e6dbfc78da10d17a7fd8fb76 [file] [log] [blame]
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2020 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.
"""Unit tests for blocked_terms.txt and unblocked_terms.txt.
Implements unit tests for the blocked terms and unblocked terms
regex processed by pre-upload.py.
"""
from __future__ import print_function
import os
import sys
# pylint: disable=W0212
# We access private members of the pre_upload module all over the place.
# Make sure we can find the chromite paths.
sys.path.insert(0, os.path.join(os.path.dirname(os.path.realpath(__file__)),
'..', '..'))
# The sys.path monkey patching confuses the linter.
# pylint: disable=wrong-import-position
from chromite.lib import cros_test_lib
from chromite.lib import osutils
assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
pre_upload = __import__('pre-upload')
class CheckFilesTest(cros_test_lib.MockTestCase, cros_test_lib.TempDirTestCase):
"""Tests for blocked and unblocked files."""
DIFF = 'diff'
MATCH = 'match'
def setUp(self):
pre_upload.CACHE.clear()
self.common_keywords = osutils.ReadFile(
os.path.join(pre_upload._get_hooks_dir(),
pre_upload.BLOCKED_TERMS_FILE))
self.unblocked_keywords = osutils.ReadFile(
os.path.join(pre_upload._get_hooks_dir(),
pre_upload.UNBLOCKED_TERMS_FILE))
self.PatchObject(pre_upload, '_get_affected_files',
return_value=['x.ebuild'])
self.PatchObject(pre_upload, '_filter_files', return_value=['x.ebuild'])
self.rf_mock = self.PatchObject(osutils, 'ReadFile')
self.diff_mock = self.PatchObject(pre_upload, '_get_file_diff')
self.desc_mock = self.PatchObject(pre_upload, '_get_commit_desc')
self.project = pre_upload.Project(name='PROJECT', dir='./', remote=None)
def CheckKeyword(self, test):
"""Test a particular keyword.
Args:
test: { DIFF: [(int, 'line to test keyword against'), ],
MATCH: number of matched terms or None, }
"""
def __check_keyword(unblocked):
self.desc_mock.return_value = 'Commit message'
self.diff_mock.return_value = test[self.DIFF]
failures = pre_upload._check_keywords(self.project, 'COMMIT', ())
if test[self.MATCH] and not unblocked:
# Check that the expected number of blocked lines are found.
self.assertNotEqual(failures, [])
self.assertEqual(test[self.MATCH], len(failures[0].items))
else:
self.assertEqual(failures, [])
# Check blocked terms.
self.rf_mock.side_effect = [self.common_keywords, str('')]
__check_keyword(unblocked=False)
# Check unblocked terms.
self.rf_mock.side_effect = [self.common_keywords, self.unblocked_keywords]
__check_keyword(unblocked=True)
def test_mitm_keyword(self):
test_instance_blocked = {
self.DIFF: [(1, 'blocked mitm '),
(2, 'blocked (mitm)'),
(3, 'blocked .mitm'),
(4, 'blocked MITM'),
(5, 'blocked mitm1'),],
}
test_instance_blocked[self.MATCH] = len(test_instance_blocked[self.DIFF])
self.CheckKeyword(test_instance_blocked)
test_instance_unblocked = {
self.DIFF: [(1, 'unblocked (commitment)'),
(2, 'unblocked DailyLimitMins'),],
self.MATCH: 0,
}
self.CheckKeyword(test_instance_unblocked)
def test_sane_keyword(self):
test_instance_blocked = {
self.DIFF: [(1, 'blocked sane '),
(2, 'blocked (sane)'),
(3, 'blocked .sane'),
(4, 'blocked SANE'),
(5, 'blocked sane1'),
(6, 'blocked insane'),
(7, 'blocked .insane'),],
}
test_instance_blocked[self.MATCH] = len(test_instance_blocked[self.DIFF])
self.CheckKeyword(test_instance_blocked)
test_instance_unblocked = {
self.DIFF: [(1, 'unblocked asanEnabled'),],
self.MATCH: 0,
}
self.CheckKeyword(test_instance_unblocked)
def test_whitelist_keyword(self):
test_instance_blocked = {
self.DIFF: [(1, 'blocked white list '),
(2, 'blocked white-list'),
(3, 'blocked whitelist'),
(4, 'blocked _whitelist'),
(5, 'blocked whitelist1'),
(6, 'blocked whitelisted'),],
}
test_instance_blocked[self.MATCH] = len(test_instance_blocked[self.DIFF])
self.CheckKeyword(test_instance_blocked)
test_instance_unblocked = {
self.DIFF: [(1, 'unblocked white dog list'),],
self.MATCH: 0,
}
self.CheckKeyword(test_instance_unblocked)
if __name__ == '__main__':
cros_test_lib.main(module=__name__)