| """Tests for sanitizer_utils.""" |
| |
| from __future__ import absolute_import |
| import os |
| import sys |
| import unittest |
| |
| # Allow imports from cq/scripts folder |
| sys.path.insert( |
| 0, os.path.realpath(os.path.join(os.path.dirname(__file__), os.pardir))) |
| from helpers import sanitizer_utils |
| from helpers import sanitizer_utils_test_data as test_data |
| |
| |
| class SanitizerUtilsTest(unittest.TestCase): |
| |
| def testAsanToComments(self): |
| """Tests converting ASAN errors to Gerrit comments.""" |
| comment_generator = sanitizer_utils.get_sanitizer_to_comments_for('asan') |
| actual_review = comment_generator(0, test_data.ASAN_ERROR_MESSAGE, '') |
| expected_review = {'review': {'message': test_data.ASAN_COMMENT}} |
| self.assertDictEqual(expected_review, actual_review) |
| |
| def testAsanLsanToComments(self): |
| """Tests converting ASAN/LSAN combined errors to Gerrit comments.""" |
| comment_generator = sanitizer_utils.get_sanitizer_to_comments_for('asan') |
| actual_review = comment_generator(0, test_data.ASAN_LSAN_ERROR_MESSAGE, '') |
| expected_review = {'review': {'message': test_data.ASAN_LSAN_COMMENT}} |
| self.assertDictEqual(expected_review, actual_review) |
| |
| def testAsanValidator(self): |
| """Tests that ASAN errors are correctly detected from ASAN output.""" |
| validator = sanitizer_utils.get_validator_for('asan') |
| self.assertTrue(validator(0, '', '')) |
| self.assertTrue(validator(0, 'Some stdout stuff', 'Some stderr')) |
| self.assertFalse(validator(1, test_data.ASAN_ERROR_MESSAGE, '')) |
| |
| def testAsanLsanValidator(self): |
| """Tests that LSAN errors are correctly detected from ASAN/LSAN output.""" |
| validator = sanitizer_utils.get_validator_for('asan') |
| self.assertFalse(validator(1, test_data.ASAN_LSAN_ERROR_MESSAGE, '')) |
| |
| def testMsanToComments(self): |
| """Tests converting MSAN errors to Gerrit comments.""" |
| comment_generator = sanitizer_utils.get_sanitizer_to_comments_for('msan') |
| actual_review = comment_generator(0, test_data.MSAN_ERROR_MESSAGE, '') |
| expected_review = {'review': {'message': test_data.MSAN_COMMENT}} |
| self.assertDictEqual(expected_review, actual_review) |
| |
| def testMsanValidator(self): |
| """Tests that MSAN errors are correctly detected from MSAN output.""" |
| validator = sanitizer_utils.get_validator_for('msan') |
| self.assertTrue(validator(0, '', '')) |
| self.assertTrue(validator(0, 'Some stdout stuff', 'Some stderr')) |
| self.assertFalse(validator(1, test_data.MSAN_ERROR_MESSAGE, '')) |
| |
| def testTsanToComments(self): |
| """Tests converting TSAN errors to Gerrit comments.""" |
| comment_generator = sanitizer_utils.get_sanitizer_to_comments_for('tsan') |
| actual_review = comment_generator(0, test_data.TSAN_ERROR_MESSAGE, '') |
| expected_review = {'review': {'message': test_data.TSAN_COMMENT}} |
| self.maxDiff = None |
| self.assertDictEqual(expected_review, actual_review) |
| |
| def testTsanValidator(self): |
| """Tests that TSAN errors are correctly detected from TSAN output.""" |
| validator = sanitizer_utils.get_validator_for('tsan') |
| self.assertTrue(validator(0, '', '')) |
| self.assertTrue(validator(0, 'Some stdout stuff', 'Some stderr')) |
| self.assertFalse(validator(1, test_data.TSAN_ERROR_MESSAGE, '')) |
| |
| def testUbsanToComments(self): |
| """Tests converting UBSAN errors to Gerrit comments.""" |
| comment_generator = sanitizer_utils.get_sanitizer_to_comments_for('ubsan') |
| actual_review = comment_generator(0, test_data.UBSAN_ERROR_MESSAGE, '') |
| self.maxDiff = None |
| expected_review = { |
| 'review': { |
| 'message': |
| '\n\n'.join([ |
| test_data.UBSAN_COMMENT, |
| '<Too many errors to print. Check logs for more.>' |
| ]) |
| } |
| } |
| self.assertDictEqual(expected_review, actual_review) |
| |
| def testUbsanValidator(self): |
| """Tests that UBSAN errors are correctly detected from UBSAN output.""" |
| validator = sanitizer_utils.get_validator_for('ubsan') |
| self.assertTrue(validator(0, '', '')) |
| self.assertTrue(validator(0, 'Some stdout stuff', 'Some stderr')) |
| self.assertFalse(validator(1, test_data.UBSAN_ERROR_MESSAGE, '')) |
| |
| def testTruncateVeryLongErrorMessage(self): |
| """Tests that very long error messages get truncated.""" |
| very_long_comment_builder = ['WARNING: AddressSanitizer'] |
| very_long_comment_builder += ['line with error info'] * 1000 |
| very_long_comment_builder += ['SUMMARY: AddressSanitizer'] |
| very_long_comment = '\n'.join(very_long_comment_builder) |
| |
| comment_generator = sanitizer_utils.get_sanitizer_to_comments_for('asan') |
| actual_review = comment_generator(0, very_long_comment, '') |
| actual_review_message = actual_review['review']['message'] |
| |
| self.assertIn('<...snip (error too long; removed 972 lines)...>', |
| actual_review_message) |
| |
| expected_message_length = sanitizer_utils._MAX_LINES_PER_ERROR + 1 |
| actual_message_length = len(actual_review_message.splitlines()) |
| self.assertEqual(actual_message_length, expected_message_length) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |