blob: 33023d7b4bebd6be84291c6424e3ecf3d7c24c64 [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.
# 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
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'
common_file_terms = None
unblocked_file_terms = None
hooks_dir = None
@classmethod
def setUpClass(cls):
"""Initialize the class instance mocks."""
cls.hooks_dir = pre_upload._get_hooks_dir()
cls.common_file_terms = pre_upload._read_terms_file(
os.path.join(cls.hooks_dir, pre_upload.BLOCKED_TERMS_FILE))
cls.unblocked_file_terms = pre_upload._read_terms_file(
os.path.join(cls.hooks_dir, pre_upload.UNBLOCKED_TERMS_FILE))
def setUp(self):
"""Initialize the test instance mockers."""
pre_upload.CACHE.clear()
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(pre_upload, '_read_terms_file')
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)
self.hooks_dir_mock = self.PatchObject(pre_upload, '_get_hooks_dir')
self.hooks_dir_mock.return_value = self.hooks_dir
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:
self.assertNotEqual(failures, [])
self.assertEqual(test[self.MATCH], len(failures[0].items),
msg=failures[0].items)
else:
self.assertEqual(failures, [])
# Check blocked terms.
self.rf_mock.side_effect = [self.common_file_terms, set(), set()]
_check_keyword(unblocked=False)
# Check unblocked terms.
self.rf_mock.side_effect = [self.common_file_terms,
self.unblocked_file_terms,
self.unblocked_file_terms]
_check_keyword(unblocked=True)
def check_lines(self, blocked_lines, unblocked_lines):
"""Check each lines for blocked or unblocked terms."""
self.CheckKeyword({self.DIFF: blocked_lines,
self.MATCH: len(blocked_lines)})
self.CheckKeyword({self.DIFF: unblocked_lines, self.MATCH: 0})
def test_mitm_keyword(self):
"""Test mitm term."""
self.check_lines([
# blocked
(1, 'blocked mitm '),
(2, 'blocked (mitm)'),
(3, 'blocked .mitm'),
(4, 'blocked MITM'),
(5, 'blocked mitm1'),
], [
# unblocked
(11, 'unblocked (commitment)'),
(12, 'unblocked DailyLimitMins'),
])
def test_sane_keyword(self):
"""Test sane term."""
self.check_lines([
# blocked
(1, 'blocked sane '),
(2, 'blocked (sane)'),
(3, 'blocked .sane'),
(4, 'blocked SANE'),
(5, 'blocked sane1'),
(6, 'blocked insane'),
(7, 'blocked .insane'),
], [
# unblocked
(11, 'unblocked asanEnabled'),
])
def test_whitelist_keyword(self):
"""Test whitelist term."""
self.check_lines([
# blocked
(1, 'blocked white list '),
(2, 'blocked white-list'),
(3, 'blocked whitelist'),
(4, 'blocked _whitelist'),
(5, 'blocked whitelist1'),
(6, 'blocked whitelisted'),
], [
# unblocked
(11, 'unblocked white dog list'),
])
def test_sanity_keyword(self):
"""Test sanity term."""
self.check_lines([
# blocked
(1, 'blocked sanity '),
(2, 'blocked (sanity)'),
(3, 'blocked struct.sanity'),
(4, 'blocked SANITY'),
(5, 'blocked AndroidSanityCheck'),
], [
# unblocked
])
if __name__ == '__main__':
cros_test_lib.main(module=__name__)