blob: 43e382ec369c63b358652b76db6afe0c02446229 [file] [log] [blame]
# Copyright (C) 2011 Google Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
# * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
'''Unit tests for watchlist.py.'''
import unittest
from webkitpy.common.checkout.diff_test_data import DIFF_TEST_DATA
from webkitpy.common.watchlist.watchlistparser import WatchListParser
class WatchListTest(unittest.TestCase):
def setUp(self):
self._watch_list_parser = WatchListParser()
def test_filename_definition_no_matches(self):
watch_list = self._watch_list_parser.parse(
'{'
' "DEFINITIONS": {'
' "WatchList1": {'
' "filename": r".*MyFileName\\.cpp",'
' },'
' },'
' "CC_RULES": {'
' "WatchList1": ['
' "levin@chromium.org",'
' ],'
' },'
'}')
self.assertEqual(set([]), watch_list.find_matching_definitions(DIFF_TEST_DATA))
def test_filename_definition(self):
watch_list = self._watch_list_parser.parse(
'{'
' "DEFINITIONS": {'
' "WatchList1": {'
' "filename": r"WebCore/rendering/style/StyleFlexibleBoxData\\.h",'
' },'
' },'
' "CC_RULES": {'
' "WatchList1": ['
' "levin@chromium.org",'
' ],'
' },'
'}')
self.assertEqual(set(['WatchList1']), watch_list.find_matching_definitions(DIFF_TEST_DATA))
def test_cc_rules_simple(self):
watch_list = self._watch_list_parser.parse(
'{'
' "DEFINITIONS": {'
' "WatchList1": {'
' "filename": r"WebCore/rendering/style/StyleFlexibleBoxData\\.h",'
' },'
' },'
' "CC_RULES": {'
' "WatchList1": ['
' "levin@chromium.org",'
' ],'
' },'
'}')
cc_and_messages = watch_list.determine_cc_and_messages(DIFF_TEST_DATA)
self.assertEqual({
'cc_list': ['levin@chromium.org'],
'messages': [],
}, cc_and_messages)
def test_cc_rules_complex(self):
watch_list = self._watch_list_parser.parse(
'{'
' "DEFINITIONS": {'
' "WatchList1": {'
' "filename": r"WebCore/rendering/style/StyleFlexibleBoxData\\.h",'
' },'
' "WatchList2": {'
' "filename": r"WillNotMatch",'
' },'
' "WatchList3": {'
' "filename": r"WillNotMatch",'
' },'
' },'
' "CC_RULES": {'
' "WatchList2|WatchList1|WatchList3": [ "levin@chromium.org", ],'
' },'
'}')
cc_and_messages = watch_list.determine_cc_and_messages(DIFF_TEST_DATA)
self.assertEqual({
'cc_list': ['levin@chromium.org'],
'messages': [],
}, cc_and_messages)
def test_cc_and_message_rules_complex(self):
watch_list = self._watch_list_parser.parse(
'{'
' "DEFINITIONS": {'
' "WatchList1": {'
' "filename": r"WebCore/rendering/style/StyleFlexibleBoxData\\.h",'
' },'
' "WatchList2": {'
' "filename": r"WillNotMatch",'
' },'
' "WatchList3": {'
' "filename": r"WillNotMatch",'
' },'
' },'
' "CC_RULES": {'
' "WatchList2|WatchList1|WatchList3": [ "levin@chromium.org", ],'
' },'
' "MESSAGE_RULES": {'
' "WatchList2|WatchList1|WatchList3": [ "msg1", "msg2", ],'
' },'
'}')
cc_and_messages = watch_list.determine_cc_and_messages(DIFF_TEST_DATA)
self.assertEqual({
'cc_list': ['levin@chromium.org'],
'messages': ['msg1', 'msg2'],
}, cc_and_messages)
def test_cc_and_message_rules_no_matches(self):
watch_list = self._watch_list_parser.parse(
'{'
' "DEFINITIONS": {'
' "WatchList1": {'
' "filename": r"WebCore/rendering/style/ThisFileDoesNotExist\\.h",'
' },'
' "WatchList2": {'
' "filename": r"WillNotMatch",'
' },'
' "WatchList3": {'
' "filename": r"WillNotMatch",'
' },'
' },'
' "CC_RULES": {'
' "WatchList2|WatchList1|WatchList3": [ "levin@chromium.org", ],'
' },'
' "MESSAGE_RULES": {'
' "WatchList2|WatchList1|WatchList3": [ "msg1", "msg2", ],'
' },'
'}')
cc_and_messages = watch_list.determine_cc_and_messages(DIFF_TEST_DATA)
self.assertEqual({
'cc_list': [],
'messages': [],
}, cc_and_messages)
def test_added_match(self):
watch_list = self._watch_list_parser.parse(
'{'
' "DEFINITIONS": {'
' "WatchList1": {'
' "in_added_lines": r"RenderStyle::initialBoxOrient",'
' },'
' "WatchList2": {'
' "in_deleted_lines": r"RenderStyle::initialBoxOrient",'
' },'
' },'
' "CC_RULES": {'
' "WatchList1": [ "eric@webkit.org", ],'
' "WatchList2": [ "abarth@webkit.org", ],'
' },'
'}')
cc_and_messages = watch_list.determine_cc_and_messages(DIFF_TEST_DATA)
self.assertEqual({
'cc_list': ['eric@webkit.org'],
'messages': [],
}, cc_and_messages)
def test_deleted_match(self):
watch_list = self._watch_list_parser.parse(
'{'
' "DEFINITIONS": {'
' "WatchList1": {'
' "in_added_lines": r"unsigned orient: 1;",'
' },'
' "WatchList2": {'
' "in_deleted_lines": r"unsigned orient: 1;",'
' },'
' },'
' "CC_RULES": {'
' "WatchList1": [ "eric@webkit.org", ],'
' "WatchList2": [ "abarth@webkit.org", ],'
' },'
'}')
cc_and_messages = watch_list.determine_cc_and_messages(DIFF_TEST_DATA)
self.assertEqual({
'cc_list': ['abarth@webkit.org'],
'messages': [],
}, cc_and_messages)
def test_more_and_less_match(self):
watch_list = self._watch_list_parser.parse(
'{'
' "DEFINITIONS": {'
' "WatchList1": {'
# This pattern is in both added and deleted lines, so no match.
' "more": r"userSelect == o\\.userSelect",'
' },'
' "WatchList2": {'
' "more": r"boxOrient\\(o\\.boxOrient\\)",'
' },'
' "WatchList3": {'
' "less": r"unsigned orient"'
' },'
' },'
' "CC_RULES": {'
' "WatchList1": [ "eric@webkit.org", ],'
' "WatchList2": [ "levin@chromium.org", ],'
' },'
' "MESSAGE_RULES": {'
' "WatchList3": ["Test message."],'
' },'
'}')
cc_and_messages = watch_list.determine_cc_and_messages(DIFF_TEST_DATA)
self.assertEqual({
'cc_list': ['levin@chromium.org'],
'messages': ["Test message."],
}, cc_and_messages)
def test_complex_match(self):
watch_list = self._watch_list_parser.parse(
'{'
' "DEFINITIONS": {'
' "WatchList1": {'
' "filename": r"WebCore/rendering/style/StyleRareInheritedData\\.cpp",'
' "in_added_lines": r"\\&\\& boxOrient == o\\.boxOrient;",'
' "in_deleted_lines": r"\\&\\& userSelect == o\\.userSelect;",'
' "more": r"boxOrient\\(o\\.boxOrient\\)",'
' },'
' "WatchList2": {'
' "filename": r"WebCore/rendering/style/StyleRareInheritedData\\.cpp",'
' "in_added_lines": r"RenderStyle::initialBoxOrient",'
' "less": r"userSelect;"'
' },'
# WatchList3 won't match because these two patterns aren't in the same file.
' "WatchList3": {'
' "in_added_lines": r"RenderStyle::initialBoxOrient",'
' "in_deleted_lines": r"unsigned orient: 1;",'
' },'
' },'
' "CC_RULES": {'
' "WatchList1": [ "eric@webkit.org", ],'
' "WatchList3": [ "abarth@webkit.org", ],'
' },'
' "MESSAGE_RULES": {'
' "WatchList2": ["This is a test message."],'
' },'
'}')
cc_and_messages = watch_list.determine_cc_and_messages(DIFF_TEST_DATA)
self.assertEqual({
'cc_list': ['eric@webkit.org'],
'messages': ["This is a test message."],
}, cc_and_messages)