# Copyright lowRISC contributors. | |
# Licensed under the Apache License, Version 2.0, see LICENSE for details. | |
# SPDX-License-Identifier: Apache-2.0 | |
import unittest | |
import zlib | |
from device_profile_data import extract_profile_data | |
class TestExtractProfileData(unittest.TestCase): | |
def test_missing_profile_header(self): | |
# Missing header. | |
DEVICE_OUTPUT = """ | |
I00001 coverage_test.c:37] Collecting coverage data.\r | |
|\r/\r-\r\\r|\r/\r-\r\\r|\r/\r-\r\\r|\r/\r-\r\\rI00002 ottf_main.c:100] Finished sw/device/tests/coverage_test.c\r | |
I00004 coverage_llvm.c:49] 0x00000000000021f394013fcb9ab28abed597d935c6d97871b5c22d4be3bf454ff545a1a3a088fb\r | |
I00005 coverage_llvm.c:55] 3952aa7a33c228d552a9b24f3bec051b44b406c4090b85b38cf6982e5287fb61c7a56d0c0e7b34c5\r | |
\x04\r | |
I00034 status.c:28] PASS!\r | |
""" # noqa: E501 | |
with self.assertRaisesRegex(ValueError, ".*detect LLVM profile data.*"): | |
extract_profile_data(DEVICE_OUTPUT) | |
def test_incomplete_data(self): | |
# 79 bytes of profile data with a bad checksum. | |
DEVICE_OUTPUT = """ | |
I00001 coverage_test.c:37] Collecting coverage data.\r | |
|\r/\r-\r\\r|\r/\r-\r\\r|\r/\r-\r\\r|\r/\r-\r\\rI00002 ottf_main.c:100] Finished sw/device/tests/coverage_test.c\r | |
I00003 coverage_llvm.c:40] LLVM profile data (length: 1184 bytes, CRC32: 0x79a3fcf1):\r | |
I00004 coverage_llvm.c:49] 0x00000000000021f394013fcb9ab28abed597d935c6d97871b5c22d4be3bf454ff545a1a3a088fb\r | |
I00005 coverage_llvm.c:55] 3952aa7a33c228d552a9b24f3bec051b44b406c4090b85b38cf6982e5287fb61c7a56d0c0e7b34c5\r | |
\x04\r | |
I00034 status.c:28] PASS!\r | |
""" # noqa: E501 | |
with self.assertRaisesRegex(ValueError, "Length.*1184.*79"): | |
extract_profile_data(DEVICE_OUTPUT) | |
def test_extra_data(self): | |
# 79 bytes of profile data with a bad checksum. | |
DEVICE_OUTPUT = """ | |
I00001 coverage_test.c:37] Collecting coverage data.\r | |
|\r/\r-\r\\r|\r/\r-\r\\r|\r/\r-\r\\r|\r/\r-\r\\rI00002 ottf_main.c:100] Finished sw/device/tests/coverage_test.c\r | |
I00003 coverage_llvm.c:40] LLVM profile data (length: 10 bytes, CRC32: 0x79a3fcf1):\r | |
I00004 coverage_llvm.c:49] 0x00000000000021f394013fcb9ab28abed597d935c6d97871b5c22d4be3bf454ff545a1a3a088fb\r | |
I00005 coverage_llvm.c:55] 3952aa7a33c228d552a9b24f3bec051b44b406c4090b85b38cf6982e5287fb61c7a56d0c0e7b34c5\r | |
\x04\r | |
I00034 status.c:28] PASS!\r | |
""" # noqa: E501 | |
with self.assertRaisesRegex(ValueError, "Length.*10.*79"): | |
extract_profile_data(DEVICE_OUTPUT) | |
def test_bad_data(self): | |
# LSB is incremented. | |
DEVICE_OUTPUT = """ | |
I00001 coverage_test.c:37] Collecting coverage data.\r | |
|\r/\r-\r\\r|\r/\r-\r\\r|\r/\r-\r\\r|\r/\r-\r\\rI00002 ottf_main.c:100] Finished sw/device/tests/coverage_test.c\r | |
I00003 coverage_llvm.c:40] LLVM profile data (length: 1184 bytes, CRC32: 0x79a3fcf1):\r | |
I00004 coverage_llvm.c:49] 0x00000000000021f394013fcb9ab28abed597d935c6d97871b5c22d4be3bf454ff545a1a3a088fb\r | |
I00005 coverage_llvm.c:55] 3952aa7a33c228d552a9b24f3bec051b44b406c4090b85b38cf6982e5287fb61c7a56d0c0e7b34c5\r | |
I00006 coverage_llvm.c:55] 21b5c39055cf3e522491837772d58214efb175afb67fa75921d375aff63d3170acbb0b258e4fbf9d\r | |
I00007 coverage_llvm.c:55] 71a8309b0df2e74ce77a7c5a7cc3c14c36b35552a3d8180c0c9ddd0e6ed93e91253b8051342b20b4\r | |
I00008 coverage_llvm.c:55] 5b00bc66f5fdf731fc858fa3be43ba74ac22d76cffd1068e5b686758a673f44f49901f04c5a8405e\r | |
I00009 coverage_llvm.c:55] f4113c55d8e64903086e9341fd35c05aeed3facf17810084057d386e0595d8319a245b08d1b7a5e7\r | |
I00010 coverage_llvm.c:55] f51b87840c3083725d906dda7801f6058cc6a9e2031feb0e20d852cd71f0bdbf1fdd52a7b75c7407\r | |
I00011 coverage_llvm.c:55] 973eb601ae27538bb483be5da633bbcd90e7ee0e40ca07cf7f486e28ca999a1a6df9275286d4ae3d\r | |
I00012 coverage_llvm.c:55] e15775281fed2ad11181648aad8734261abeadd492d1c8bcf5fd8a6514ffa66b380edac12d3bfe12\r | |
I00013 coverage_llvm.c:55] 1f196fb35e482501b905675ac17ede534dd32bdc220c24a5869b1af052b58e754971425f082834b9\r | |
I00014 coverage_llvm.c:55] 0baeb2a6272ff99760be528401bbde859d0de23c74061a1c72503d707b49cd818733e31243a44fdd\r | |
I00015 coverage_llvm.c:55] 1534b704e0a6ab8dd182da6817938e70e9ded660ded169c3025a2e95a73d34e6e07c39766ae7a71b\r | |
I00016 coverage_llvm.c:55] a4299ae6493291d78f6e493019a0edb36675080b9de3f3d60a36a3d48aeef7b4060da47929b3a32a\r | |
I00017 coverage_llvm.c:55] 1cd4c68fa17e9845f097e4918c0cce83af01f2e7e4de8c8ba916804f0a24bcf74f4d82f6482eea28\r | |
I00018 coverage_llvm.c:55] cfafd10860608b53370162999f95b2e487287f2c10208472cb527dda7802cc08e600000000000000\r | |
I00019 coverage_llvm.c:55] 00000000000000000000000000000000000000000000000000000000000000000000000000000000\r | |
I00020 coverage_llvm.c:55] 00000000000000000000000000000000000000000000000000000000000000000000000000000000\r | |
I00021 coverage_llvm.c:55] 00000000000000000000000000000000000000000000000000000000010000000000000000100020\r | |
I00022 coverage_llvm.c:55] b80000000000000000e5c91135ef4ad0040000000000000000000000010000000000000000100020\r | |
I00023 coverage_llvm.c:55] b000000000000000001e6f988c0f30fc690000000000000000000000010000000000000000100020\r | |
I00024 coverage_llvm.c:55] a80000000000000018033aa10a754487ea0000000000000000000000010000000000000000100020\r | |
I00025 coverage_llvm.c:55] a000000000000000182866785ba88630d10000000000000000000000020000000000000000100020\r | |
I00026 coverage_llvm.c:55] 900000000000002458432fb3b3752212ac0000000000000000000000010000000000000000100020\r | |
I00027 coverage_llvm.c:55] 88000000000000001855b0dadd552fc7f40000000000000000000000010000000000000000100020\r | |
I00028 coverage_llvm.c:55] 800000000000000018f68439af15ff54f00000000000000000000000030000000000000000100020\r | |
I00029 coverage_llvm.c:55] 680000000002442691b76b703b9eedfc350000000000000000000000010000000000000000100020\r | |
I00030 coverage_llvm.c:55] 600000000000000000e244489b389e5e0b0000000000000000000000010000000000000000100020\r | |
I00031 coverage_llvm.c:55] 5800000000000000189e484bc850eb41db00000000000000010000000020004c1400000000100020\r | |
I00032 coverage_llvm.c:55] 58000000000000024a0000000000000000000000000000000d000000000000000000000000000000\r | |
I00033 coverage_llvm.c:55] 0a00000000000000000000000000000007ff6c70726f665282\r | |
\x04\r | |
I00034 status.c:28] PASS!\r | |
""" # noqa: E501 | |
with self.assertRaisesRegex(ValueError, "Checksum.*"): | |
extract_profile_data(DEVICE_OUTPUT) | |
def test_missing_eot(self): | |
# Missing EOT character, wrong length, bad checksum. | |
DEVICE_OUTPUT = """ | |
I00001 coverage_test.c:37] Collecting coverage data.\r | |
|\r/\r-\r\\r|\r/\r-\r\\r|\r/\r-\r\\r|\r/\r-\r\\rI00002 ottf_main.c:100] Finished sw/device/tests/coverage_test.c\r | |
I00003 coverage_llvm.c:40] LLVM profile data (length: 1184 bytes, CRC32: 0x79a3fcf1):\r | |
I00031 coverage_llvm.c:55] 5800000000000000189e484bc850eb41db00000000000000010000000020004c1400000000100020\r | |
I00032 coverage_llvm.c:55] 58000000000000024a0000000000000000000000000000000d000000000000000000000000000000\r | |
\r | |
I00034 status.c:28] PASS!\r | |
""" # noqa: E501 | |
with self.assertRaisesRegex(ValueError, ".*detect LLVM profile data.*"): | |
extract_profile_data(DEVICE_OUTPUT) | |
def test_bad_checksum(self): | |
# Checksum is incremented. | |
DEVICE_OUTPUT = """ | |
I00001 coverage_test.c:37] Collecting coverage data.\r | |
|\r/\r-\r\\r|\r/\r-\r\\r|\r/\r-\r\\r|\r/\r-\r\\rI00002 ottf_main.c:100] Finished sw/device/tests/coverage_test.c\r | |
I00003 coverage_llvm.c:40] LLVM profile data (length: 1184 bytes, CRC32: 0x79a3fcf2):\r | |
I00004 coverage_llvm.c:49] 0x00000000000021f394013fcb9ab28abed597d935c6d97871b5c22d4be3bf454ff545a1a3a088fb\r | |
I00005 coverage_llvm.c:55] 3952aa7a33c228d552a9b24f3bec051b44b406c4090b85b38cf6982e5287fb61c7a56d0c0e7b34c5\r | |
I00006 coverage_llvm.c:55] 21b5c39055cf3e522491837772d58214efb175afb67fa75921d375aff63d3170acbb0b258e4fbf9d\r | |
I00007 coverage_llvm.c:55] 71a8309b0df2e74ce77a7c5a7cc3c14c36b35552a3d8180c0c9ddd0e6ed93e91253b8051342b20b4\r | |
I00008 coverage_llvm.c:55] 5b00bc66f5fdf731fc858fa3be43ba74ac22d76cffd1068e5b686758a673f44f49901f04c5a8405e\r | |
I00009 coverage_llvm.c:55] f4113c55d8e64903086e9341fd35c05aeed3facf17810084057d386e0595d8319a245b08d1b7a5e7\r | |
I00010 coverage_llvm.c:55] f51b87840c3083725d906dda7801f6058cc6a9e2031feb0e20d852cd71f0bdbf1fdd52a7b75c7407\r | |
I00011 coverage_llvm.c:55] 973eb601ae27538bb483be5da633bbcd90e7ee0e40ca07cf7f486e28ca999a1a6df9275286d4ae3d\r | |
I00012 coverage_llvm.c:55] e15775281fed2ad11181648aad8734261abeadd492d1c8bcf5fd8a6514ffa66b380edac12d3bfe12\r | |
I00013 coverage_llvm.c:55] 1f196fb35e482501b905675ac17ede534dd32bdc220c24a5869b1af052b58e754971425f082834b9\r | |
I00014 coverage_llvm.c:55] 0baeb2a6272ff99760be528401bbde859d0de23c74061a1c72503d707b49cd818733e31243a44fdd\r | |
I00015 coverage_llvm.c:55] 1534b704e0a6ab8dd182da6817938e70e9ded660ded169c3025a2e95a73d34e6e07c39766ae7a71b\r | |
I00016 coverage_llvm.c:55] a4299ae6493291d78f6e493019a0edb36675080b9de3f3d60a36a3d48aeef7b4060da47929b3a32a\r | |
I00017 coverage_llvm.c:55] 1cd4c68fa17e9845f097e4918c0cce83af01f2e7e4de8c8ba916804f0a24bcf74f4d82f6482eea28\r | |
I00018 coverage_llvm.c:55] cfafd10860608b53370162999f95b2e487287f2c10208472cb527dda7802cc08e600000000000000\r | |
I00019 coverage_llvm.c:55] 00000000000000000000000000000000000000000000000000000000000000000000000000000000\r | |
I00020 coverage_llvm.c:55] 00000000000000000000000000000000000000000000000000000000000000000000000000000000\r | |
I00021 coverage_llvm.c:55] 00000000000000000000000000000000000000000000000000000000010000000000000000100020\r | |
I00022 coverage_llvm.c:55] b80000000000000000e5c91135ef4ad0040000000000000000000000010000000000000000100020\r | |
I00023 coverage_llvm.c:55] b000000000000000001e6f988c0f30fc690000000000000000000000010000000000000000100020\r | |
I00024 coverage_llvm.c:55] a80000000000000018033aa10a754487ea0000000000000000000000010000000000000000100020\r | |
I00025 coverage_llvm.c:55] a000000000000000182866785ba88630d10000000000000000000000020000000000000000100020\r | |
I00026 coverage_llvm.c:55] 900000000000002458432fb3b3752212ac0000000000000000000000010000000000000000100020\r | |
I00027 coverage_llvm.c:55] 88000000000000001855b0dadd552fc7f40000000000000000000000010000000000000000100020\r | |
I00028 coverage_llvm.c:55] 800000000000000018f68439af15ff54f00000000000000000000000030000000000000000100020\r | |
I00029 coverage_llvm.c:55] 680000000002442691b76b703b9eedfc350000000000000000000000010000000000000000100020\r | |
I00030 coverage_llvm.c:55] 600000000000000000e244489b389e5e0b0000000000000000000000010000000000000000100020\r | |
I00031 coverage_llvm.c:55] 5800000000000000189e484bc850eb41db00000000000000010000000020004c1400000000100020\r | |
I00032 coverage_llvm.c:55] 58000000000000024a0000000000000000000000000000000d000000000000000000000000000000\r | |
I00033 coverage_llvm.c:55] 0a00000000000000000000000000000007ff6c70726f665281\r | |
\x04\r | |
I00034 status.c:28] PASS!\r | |
""" # noqa: E501 | |
with self.assertRaisesRegex(ValueError, "Checksum.*"): | |
extract_profile_data(DEVICE_OUTPUT) | |
def test_good_data(self): | |
DEVICE_OUTPUT = """ | |
I00001 coverage_test.c:37] Collecting coverage data.\r | |
|\r/\r-\r\\r|\r/\r-\r\\r|\r/\r-\r\\r|\r/\r-\r\\rI00002 ottf_main.c:100] Finished sw/device/tests/coverage_test.c\r | |
I00003 coverage_llvm.c:40] LLVM profile data (length: 1184 bytes, CRC32: 0x79a3fcf1):\r | |
I00004 coverage_llvm.c:49] 0x00000000000021f394013fcb9ab28abed597d935c6d97871b5c22d4be3bf454ff545a1a3a088fb\r | |
I00005 coverage_llvm.c:55] 3952aa7a33c228d552a9b24f3bec051b44b406c4090b85b38cf6982e5287fb61c7a56d0c0e7b34c5\r | |
I00006 coverage_llvm.c:55] 21b5c39055cf3e522491837772d58214efb175afb67fa75921d375aff63d3170acbb0b258e4fbf9d\r | |
I00007 coverage_llvm.c:55] 71a8309b0df2e74ce77a7c5a7cc3c14c36b35552a3d8180c0c9ddd0e6ed93e91253b8051342b20b4\r | |
I00008 coverage_llvm.c:55] 5b00bc66f5fdf731fc858fa3be43ba74ac22d76cffd1068e5b686758a673f44f49901f04c5a8405e\r | |
I00009 coverage_llvm.c:55] f4113c55d8e64903086e9341fd35c05aeed3facf17810084057d386e0595d8319a245b08d1b7a5e7\r | |
I00010 coverage_llvm.c:55] f51b87840c3083725d906dda7801f6058cc6a9e2031feb0e20d852cd71f0bdbf1fdd52a7b75c7407\r | |
I00011 coverage_llvm.c:55] 973eb601ae27538bb483be5da633bbcd90e7ee0e40ca07cf7f486e28ca999a1a6df9275286d4ae3d\r | |
I00012 coverage_llvm.c:55] e15775281fed2ad11181648aad8734261abeadd492d1c8bcf5fd8a6514ffa66b380edac12d3bfe12\r | |
I00013 coverage_llvm.c:55] 1f196fb35e482501b905675ac17ede534dd32bdc220c24a5869b1af052b58e754971425f082834b9\r | |
I00014 coverage_llvm.c:55] 0baeb2a6272ff99760be528401bbde859d0de23c74061a1c72503d707b49cd818733e31243a44fdd\r | |
I00015 coverage_llvm.c:55] 1534b704e0a6ab8dd182da6817938e70e9ded660ded169c3025a2e95a73d34e6e07c39766ae7a71b\r | |
I00016 coverage_llvm.c:55] a4299ae6493291d78f6e493019a0edb36675080b9de3f3d60a36a3d48aeef7b4060da47929b3a32a\r | |
I00017 coverage_llvm.c:55] 1cd4c68fa17e9845f097e4918c0cce83af01f2e7e4de8c8ba916804f0a24bcf74f4d82f6482eea28\r | |
I00018 coverage_llvm.c:55] cfafd10860608b53370162999f95b2e487287f2c10208472cb527dda7802cc08e600000000000000\r | |
I00019 coverage_llvm.c:55] 00000000000000000000000000000000000000000000000000000000000000000000000000000000\r | |
I00020 coverage_llvm.c:55] 00000000000000000000000000000000000000000000000000000000000000000000000000000000\r | |
I00021 coverage_llvm.c:55] 00000000000000000000000000000000000000000000000000000000010000000000000000100020\r | |
I00022 coverage_llvm.c:55] b80000000000000000e5c91135ef4ad0040000000000000000000000010000000000000000100020\r | |
I00023 coverage_llvm.c:55] b000000000000000001e6f988c0f30fc690000000000000000000000010000000000000000100020\r | |
I00024 coverage_llvm.c:55] a80000000000000018033aa10a754487ea0000000000000000000000010000000000000000100020\r | |
I00025 coverage_llvm.c:55] a000000000000000182866785ba88630d10000000000000000000000020000000000000000100020\r | |
I00026 coverage_llvm.c:55] 900000000000002458432fb3b3752212ac0000000000000000000000010000000000000000100020\r | |
I00027 coverage_llvm.c:55] 88000000000000001855b0dadd552fc7f40000000000000000000000010000000000000000100020\r | |
I00028 coverage_llvm.c:55] 800000000000000018f68439af15ff54f00000000000000000000000030000000000000000100020\r | |
I00029 coverage_llvm.c:55] 680000000002442691b76b703b9eedfc350000000000000000000000010000000000000000100020\r | |
I00030 coverage_llvm.c:55] 600000000000000000e244489b389e5e0b0000000000000000000000010000000000000000100020\r | |
I00031 coverage_llvm.c:55] 5800000000000000189e484bc850eb41db00000000000000010000000020004c1400000000100020\r | |
I00032 coverage_llvm.c:55] 58000000000000024a0000000000000000000000000000000d000000000000000000000000000000\r | |
I00033 coverage_llvm.c:55] 0a00000000000000000000000000000007ff6c70726f665281\r | |
\x04\r | |
I00034 status.c:28] PASS!\r | |
""" # noqa: E501 | |
raw_profile_data = extract_profile_data(DEVICE_OUTPUT) | |
self.assertEqual(len(raw_profile_data), 1184) | |
self.assertEqual(zlib.crc32(raw_profile_data), 0x79a3fcf1) | |
if __name__ == '__main__': | |
unittest.main() |