blob: 7813e8bed3ce3da11fd247849caaf845ea251157 [file] [log] [blame] [edit]
"""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()