summaryrefslogtreecommitdiffstats
path: root/python/mozbuild/mozbuild/test/controller/test_ccachestats.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/mozbuild/mozbuild/test/controller/test_ccachestats.py')
-rw-r--r--python/mozbuild/mozbuild/test/controller/test_ccachestats.py866
1 files changed, 866 insertions, 0 deletions
diff --git a/python/mozbuild/mozbuild/test/controller/test_ccachestats.py b/python/mozbuild/mozbuild/test/controller/test_ccachestats.py
new file mode 100644
index 0000000000..f1efa78c3a
--- /dev/null
+++ b/python/mozbuild/mozbuild/test/controller/test_ccachestats.py
@@ -0,0 +1,866 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+import time
+import unittest
+
+from mozunit import main
+
+from mozbuild.controller.building import CCacheStats
+
+TIMESTAMP = time.time()
+TIMESTAMP2 = time.time() + 10
+TIMESTAMP_STR = time.strftime("%c", time.localtime(TIMESTAMP))
+TIMESTAMP2_STR = time.strftime("%c", time.localtime(TIMESTAMP2))
+
+
+class TestCcacheStats(unittest.TestCase):
+ STAT_GARBAGE = """A garbage line which should be failed to parse"""
+
+ STAT0 = """
+ cache directory /home/tlin/.ccache
+ cache hit (direct) 0
+ cache hit (preprocessed) 0
+ cache miss 0
+ files in cache 0
+ cache size 0 Kbytes
+ max cache size 16.0 Gbytes"""
+
+ STAT1 = """
+ cache directory /home/tlin/.ccache
+ cache hit (direct) 100
+ cache hit (preprocessed) 200
+ cache miss 2500
+ called for link 180
+ called for preprocessing 6
+ compile failed 11
+ preprocessor error 3
+ bad compiler arguments 6
+ unsupported source language 9
+ autoconf compile/link 60
+ unsupported compiler option 2
+ no input file 21
+ files in cache 7344
+ cache size 1.9 Gbytes
+ max cache size 16.0 Gbytes"""
+
+ STAT2 = """
+ cache directory /home/tlin/.ccache
+ cache hit (direct) 1900
+ cache hit (preprocessed) 300
+ cache miss 2600
+ called for link 361
+ called for preprocessing 12
+ compile failed 22
+ preprocessor error 6
+ bad compiler arguments 12
+ unsupported source language 18
+ autoconf compile/link 120
+ unsupported compiler option 4
+ no input file 48
+ files in cache 7392
+ cache size 2.0 Gbytes
+ max cache size 16.0 Gbytes"""
+
+ STAT3 = """
+ cache directory /Users/tlin/.ccache
+ primary config /Users/tlin/.ccache/ccache.conf
+ secondary config (readonly) /usr/local/Cellar/ccache/3.2/etc/ccache.conf
+ cache hit (direct) 12004
+ cache hit (preprocessed) 1786
+ cache miss 26348
+ called for link 2338
+ called for preprocessing 6313
+ compile failed 399
+ preprocessor error 390
+ bad compiler arguments 86
+ unsupported source language 66
+ autoconf compile/link 2439
+ unsupported compiler option 187
+ no input file 1068
+ files in cache 18044
+ cache size 7.5 GB
+ max cache size 8.6 GB
+ """
+
+ STAT4 = """
+ cache directory /Users/tlin/.ccache
+ primary config /Users/tlin/.ccache/ccache.conf
+ secondary config (readonly) /usr/local/Cellar/ccache/3.2.1/etc/ccache.conf
+ cache hit (direct) 21039
+ cache hit (preprocessed) 2315
+ cache miss 39370
+ called for link 3651
+ called for preprocessing 6693
+ compile failed 723
+ ccache internal error 1
+ preprocessor error 588
+ bad compiler arguments 128
+ unsupported source language 99
+ autoconf compile/link 3669
+ unsupported compiler option 187
+ no input file 1711
+ files in cache 18313
+ cache size 6.3 GB
+ max cache size 6.0 GB
+ """
+
+ STAT5 = """
+ cache directory /Users/tlin/.ccache
+ primary config /Users/tlin/.ccache/ccache.conf
+ secondary config (readonly) /usr/local/Cellar/ccache/3.2.1/etc/ccache.conf
+ cache hit (direct) 21039
+ cache hit (preprocessed) 2315
+ cache miss 39372
+ called for link 3653
+ called for preprocessing 6693
+ compile failed 723
+ ccache internal error 1
+ preprocessor error 588
+ bad compiler arguments 128
+ unsupported source language 99
+ autoconf compile/link 3669
+ unsupported compiler option 187
+ no input file 1711
+ files in cache 17411
+ cache size 6.0 GB
+ max cache size 6.0 GB
+ """
+
+ STAT6 = """
+ cache directory /Users/tlin/.ccache
+ primary config /Users/tlin/.ccache/ccache.conf
+ secondary config (readonly) /usr/local/Cellar/ccache/3.3.2/etc/ccache.conf
+ cache hit (direct) 319287
+ cache hit (preprocessed) 125987
+ cache miss 749959
+ cache hit rate 37.25 %
+ called for link 87978
+ called for preprocessing 418591
+ multiple source files 1861
+ compiler produced no output 122
+ compiler produced empty output 174
+ compile failed 14330
+ ccache internal error 1
+ preprocessor error 9459
+ can't use precompiled header 4
+ bad compiler arguments 2077
+ unsupported source language 18195
+ autoconf compile/link 51485
+ unsupported compiler option 322
+ no input file 309538
+ cleanups performed 1
+ files in cache 17358
+ cache size 15.4 GB
+ max cache size 17.2 GB
+ """
+
+ STAT7 = """
+ cache directory /Users/tlin/.ccache
+ primary config /Users/tlin/.ccache/ccache.conf
+ secondary config (readonly) /usr/local/Cellar/ccache/3.3.3/etc/ccache.conf
+ cache hit (direct) 27035
+ cache hit (preprocessed) 13939
+ cache miss 62630
+ cache hit rate 39.55 %
+ called for link 1280
+ called for preprocessing 736
+ compile failed 550
+ preprocessor error 638
+ bad compiler arguments 20
+ autoconf compile/link 1751
+ unsupported code directive 2
+ no input file 2378
+ cleanups performed 1792
+ files in cache 3479
+ cache size 4.4 GB
+ max cache size 5.0 GB
+ """
+
+ # Substitute a locally-generated timestamp because the timestamp format is
+ # locale-dependent.
+ STAT8 = f"""
+ cache directory /home/psimonyi/.ccache
+ primary config /home/psimonyi/.ccache/ccache.conf
+ secondary config (readonly) /etc/ccache.conf
+ stats zero time {TIMESTAMP_STR}
+ cache hit (direct) 571
+ cache hit (preprocessed) 1203
+ cache miss 11747
+ cache hit rate 13.12 %
+ called for link 623
+ called for preprocessing 7194
+ compile failed 32
+ preprocessor error 137
+ bad compiler arguments 4
+ autoconf compile/link 348
+ no input file 162
+ cleanups performed 77
+ files in cache 13464
+ cache size 6.2 GB
+ max cache size 7.0 GB
+ """
+
+ STAT9 = f"""
+ cache directory /Users/tlin/.ccache
+ primary config /Users/tlin/.ccache/ccache.conf
+ secondary config (readonly) /usr/local/Cellar/ccache/3.5/etc/ccache.conf
+ stats updated {TIMESTAMP2_STR}
+ stats zeroed {TIMESTAMP_STR}
+ cache hit (direct) 80147
+ cache hit (preprocessed) 21413
+ cache miss 191128
+ cache hit rate 34.70 %
+ called for link 5194
+ called for preprocessing 1721
+ compile failed 825
+ preprocessor error 3838
+ cache file missing 4863
+ bad compiler arguments 32
+ autoconf compile/link 3554
+ unsupported code directive 4
+ no input file 5545
+ cleanups performed 3154
+ files in cache 18525
+ cache size 13.4 GB
+ max cache size 15.0 GB
+ """
+
+ VERSION_3_5_GIT = """
+ ccache version 3.5.1+2_gf5309092_dirty
+
+ Copyright (C) 2002-2007 Andrew Tridgell
+ Copyright (C) 2009-2019 Joel Rosdahl
+
+ This program is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3 of the License, or (at your option) any later
+ version.
+ """
+
+ VERSION_4_2 = """
+ ccache version 4.2.1
+
+ Copyright (C) 2002-2007 Andrew Tridgell
+ Copyright (C) 2009-2021 Joel Rosdahl and other contributors
+
+ See <https://ccache.dev/credits.html> for a complete list of contributors.
+
+ This program is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3 of the License, or (at your option) any later
+ version.
+ """
+
+ VERSION_4_4 = """
+ ccache version 4.4
+ Features: file-storage http-storage
+
+ Copyright (C) 2002-2007 Andrew Tridgell
+ Copyright (C) 2009-2021 Joel Rosdahl and other contributors
+
+ See <https://ccache.dev/credits.html> for a complete list of contributors.
+
+ This program is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3 of the License, or (at your option) any later
+ version.
+ """
+
+ VERSION_4_4_2 = """
+ ccache version 4.4.2
+ Features: file-storage http-storage
+
+ Copyright (C) 2002-2007 Andrew Tridgell
+ Copyright (C) 2009-2021 Joel Rosdahl and other contributors
+
+ See <https://ccache.dev/credits.html> for a complete list of contributors.
+
+ This program is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3 of the License, or (at your option) any later
+ version.
+ """
+
+ VERSION_4_5 = """
+ ccache version 4.5.1
+ Features: file-storage http-storage redis-storage
+
+ Copyright (C) 2002-2007 Andrew Tridgell
+ Copyright (C) 2009-2021 Joel Rosdahl and other contributors
+
+ See <https://ccache.dev/credits.html> for a complete list of contributors.
+
+ This program is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3 of the License, or (at your option) any later
+ version.
+ """
+
+ STAT10 = f"""\
+stats_updated_timestamp\t{int(TIMESTAMP)}
+stats_zeroed_timestamp\t0
+direct_cache_hit\t197
+preprocessed_cache_hit\t719
+cache_miss\t8427
+called_for_link\t569
+called_for_preprocessing\t110
+multiple_source_files\t0
+compiler_produced_stdout\t0
+compiler_produced_no_output\t0
+compiler_produced_empty_output\t0
+compile_failed\t49
+internal_error\t1
+preprocessor_error\t90
+could_not_use_precompiled_header\t0
+could_not_use_modules\t0
+could_not_find_compiler\t0
+missing_cache_file\t1
+bad_compiler_arguments\t6
+unsupported_source_language\t0
+compiler_check_failed\t0
+autoconf_test\t418
+unsupported_compiler_option\t0
+unsupported_code_directive\t1
+output_to_stdout\t0
+bad_output_file\t0
+no_input_file\t9
+error_hashing_extra_file\t0
+cleanups_performed\t161
+files_in_cache\t4425
+cache_size_kibibyte\t4624220
+"""
+
+ STAT11 = f"""\
+stats_updated_timestamp\t{int(TIMESTAMP)}
+stats_zeroed_timestamp\t{int(TIMESTAMP2)}
+direct_cache_hit\t0
+preprocessed_cache_hit\t0
+cache_miss\t0
+called_for_link\t0
+called_for_preprocessing\t0
+multiple_source_files\t0
+compiler_produced_stdout\t0
+compiler_produced_no_output\t0
+compiler_produced_empty_output\t0
+compile_failed\t0
+internal_error\t0
+preprocessor_error\t0
+could_not_use_precompiled_header\t0
+could_not_use_modules\t0
+could_not_find_compiler\t0
+missing_cache_file\t0
+bad_compiler_arguments\t0
+unsupported_source_language\t0
+compiler_check_failed\t0
+autoconf_test\t0
+unsupported_compiler_option\t0
+unsupported_code_directive\t0
+output_to_stdout\t0
+bad_output_file\t0
+no_input_file\t0
+error_hashing_extra_file\t0
+cleanups_performed\t16
+files_in_cache\t0
+cache_size_kibibyte\t0
+"""
+
+ STAT12 = """\
+stats_updated_timestamp\t0
+stats_zeroed_timestamp\t0
+direct_cache_hit\t0
+preprocessed_cache_hit\t0
+cache_miss\t0
+called_for_link\t0
+called_for_preprocessing\t0
+multiple_source_files\t0
+compiler_produced_stdout\t0
+compiler_produced_no_output\t0
+compiler_produced_empty_output\t0
+compile_failed\t0
+internal_error\t0
+preprocessor_error\t0
+could_not_use_precompiled_header\t0
+could_not_use_modules\t0
+could_not_find_compiler\t0
+missing_cache_file\t0
+bad_compiler_arguments\t0
+unsupported_source_language\t0
+compiler_check_failed\t0
+autoconf_test\t0
+unsupported_compiler_option\t0
+unsupported_code_directive\t0
+output_to_stdout\t0
+bad_output_file\t0
+no_input_file\t0
+error_hashing_extra_file\t0
+cleanups_performed\t16
+files_in_cache\t0
+cache_size_kibibyte\t0
+"""
+
+ STAT13 = f"""\
+stats_updated_timestamp\t{int(TIMESTAMP)}
+stats_zeroed_timestamp\t{int(TIMESTAMP2)}
+direct_cache_hit\t280542
+preprocessed_cache_hit\t0
+cache_miss\t387653
+called_for_link\t0
+called_for_preprocessing\t0
+multiple_source_files\t0
+compiler_produced_stdout\t0
+compiler_produced_no_output\t0
+compiler_produced_empty_output\t0
+compile_failed\t1665
+internal_error\t1
+preprocessor_error\t0
+could_not_use_precompiled_header\t0
+could_not_use_modules\t0
+could_not_find_compiler\t0
+missing_cache_file\t0
+bad_compiler_arguments\t0
+unsupported_source_language\t0
+compiler_check_failed\t0
+autoconf_test\t0
+unsupported_compiler_option\t0
+unsupported_code_directive\t0
+output_to_stdout\t0
+bad_output_file\t0
+no_input_file\t2
+error_hashing_extra_file\t0
+cleanups_performed\t364
+files_in_cache\t335104
+cache_size_kibibyte\t18224250
+"""
+
+ maxDiff = None
+
+ def test_parse_garbage_stats_message(self):
+ self.assertRaises(ValueError, CCacheStats, self.STAT_GARBAGE)
+
+ def test_parse_zero_stats_message(self):
+ stats = CCacheStats(self.STAT0)
+ self.assertEqual(stats.hit_rates(), (0, 0, 0))
+
+ def test_hit_rate_of_diff_stats(self):
+ stats1 = CCacheStats(self.STAT1)
+ stats2 = CCacheStats(self.STAT2)
+ stats_diff = stats2 - stats1
+ self.assertEqual(stats_diff.hit_rates(), (0.9, 0.05, 0.05))
+
+ def test_stats_contains_data(self):
+ stats0 = CCacheStats(self.STAT0)
+ stats1 = CCacheStats(self.STAT1)
+ stats2 = CCacheStats(self.STAT2)
+ stats_diff_zero = stats1 - stats1
+ stats_diff_negative1 = stats0 - stats1
+ stats_diff_negative2 = stats1 - stats2
+
+ self.assertFalse(stats0)
+ self.assertTrue(stats1)
+ self.assertTrue(stats2)
+ self.assertFalse(stats_diff_zero)
+ self.assertFalse(stats_diff_negative1)
+ self.assertFalse(stats_diff_negative2)
+
+ def test_stats_version32(self):
+ stat2 = CCacheStats(self.STAT2)
+ stat3 = CCacheStats(self.STAT3)
+ stats_diff = stat3 - stat2
+ self.assertEqual(
+ str(stat3),
+ "cache hit (direct) 12004\n"
+ "cache hit (preprocessed) 1786\n"
+ "cache miss 26348\n"
+ "called for link 2338\n"
+ "called for preprocessing 6313\n"
+ "compile failed 399\n"
+ "preprocessor error 390\n"
+ "bad compiler arguments 86\n"
+ "unsupported source language 66\n"
+ "autoconf compile/link 2439\n"
+ "unsupported compiler option 187\n"
+ "no input file 1068\n"
+ "files in cache 18044\n"
+ "cache size 7.5 Gbytes\n"
+ "max cache size 8.6 Gbytes",
+ )
+ self.assertEqual(
+ str(stats_diff),
+ "cache hit (direct) 10104\n"
+ "cache hit (preprocessed) 1486\n"
+ "cache miss 23748\n"
+ "called for link 1977\n"
+ "called for preprocessing 6301\n"
+ "compile failed 377\n"
+ "preprocessor error 384\n"
+ "bad compiler arguments 74\n"
+ "unsupported source language 48\n"
+ "autoconf compile/link 2319\n"
+ "unsupported compiler option 183\n"
+ "no input file 1020\n"
+ "files in cache 18044\n"
+ "cache size 7.5 Gbytes\n"
+ "max cache size 8.6 Gbytes",
+ )
+
+ def test_cache_size_shrinking(self):
+ stat4 = CCacheStats(self.STAT4)
+ stat5 = CCacheStats(self.STAT5)
+ stats_diff = stat5 - stat4
+ self.assertEqual(
+ str(stat4),
+ "cache hit (direct) 21039\n"
+ "cache hit (preprocessed) 2315\n"
+ "cache miss 39370\n"
+ "called for link 3651\n"
+ "called for preprocessing 6693\n"
+ "compile failed 723\n"
+ "ccache internal error 1\n"
+ "preprocessor error 588\n"
+ "bad compiler arguments 128\n"
+ "unsupported source language 99\n"
+ "autoconf compile/link 3669\n"
+ "unsupported compiler option 187\n"
+ "no input file 1711\n"
+ "files in cache 18313\n"
+ "cache size 6.3 Gbytes\n"
+ "max cache size 6.0 Gbytes",
+ )
+ self.assertEqual(
+ str(stat5),
+ "cache hit (direct) 21039\n"
+ "cache hit (preprocessed) 2315\n"
+ "cache miss 39372\n"
+ "called for link 3653\n"
+ "called for preprocessing 6693\n"
+ "compile failed 723\n"
+ "ccache internal error 1\n"
+ "preprocessor error 588\n"
+ "bad compiler arguments 128\n"
+ "unsupported source language 99\n"
+ "autoconf compile/link 3669\n"
+ "unsupported compiler option 187\n"
+ "no input file 1711\n"
+ "files in cache 17411\n"
+ "cache size 6.0 Gbytes\n"
+ "max cache size 6.0 Gbytes",
+ )
+ self.assertEqual(
+ str(stats_diff),
+ "cache hit (direct) 0\n"
+ "cache hit (preprocessed) 0\n"
+ "cache miss 2\n"
+ "called for link 2\n"
+ "called for preprocessing 0\n"
+ "compile failed 0\n"
+ "ccache internal error 0\n"
+ "preprocessor error 0\n"
+ "bad compiler arguments 0\n"
+ "unsupported source language 0\n"
+ "autoconf compile/link 0\n"
+ "unsupported compiler option 0\n"
+ "no input file 0\n"
+ "files in cache 17411\n"
+ "cache size 6.0 Gbytes\n"
+ "max cache size 6.0 Gbytes",
+ )
+
+ def test_stats_version33(self):
+ # Test stats for 3.3.2.
+ stat3 = CCacheStats(self.STAT3)
+ stat6 = CCacheStats(self.STAT6)
+ stats_diff = stat6 - stat3
+ self.assertEqual(
+ str(stat6),
+ "cache hit (direct) 319287\n"
+ "cache hit (preprocessed) 125987\n"
+ "cache hit rate 37\n"
+ "cache miss 749959\n"
+ "called for link 87978\n"
+ "called for preprocessing 418591\n"
+ "multiple source files 1861\n"
+ "compiler produced no output 122\n"
+ "compiler produced empty output 174\n"
+ "compile failed 14330\n"
+ "ccache internal error 1\n"
+ "preprocessor error 9459\n"
+ "can't use precompiled header 4\n"
+ "bad compiler arguments 2077\n"
+ "unsupported source language 18195\n"
+ "autoconf compile/link 51485\n"
+ "unsupported compiler option 322\n"
+ "no input file 309538\n"
+ "cleanups performed 1\n"
+ "files in cache 17358\n"
+ "cache size 15.4 Gbytes\n"
+ "max cache size 17.2 Gbytes",
+ )
+ self.assertEqual(
+ str(stat3),
+ "cache hit (direct) 12004\n"
+ "cache hit (preprocessed) 1786\n"
+ "cache miss 26348\n"
+ "called for link 2338\n"
+ "called for preprocessing 6313\n"
+ "compile failed 399\n"
+ "preprocessor error 390\n"
+ "bad compiler arguments 86\n"
+ "unsupported source language 66\n"
+ "autoconf compile/link 2439\n"
+ "unsupported compiler option 187\n"
+ "no input file 1068\n"
+ "files in cache 18044\n"
+ "cache size 7.5 Gbytes\n"
+ "max cache size 8.6 Gbytes",
+ )
+ self.assertEqual(
+ str(stats_diff),
+ "cache hit (direct) 307283\n"
+ "cache hit (preprocessed) 124201\n"
+ "cache hit rate 37\n"
+ "cache miss 723611\n"
+ "called for link 85640\n"
+ "called for preprocessing 412278\n"
+ "multiple source files 1861\n"
+ "compiler produced no output 122\n"
+ "compiler produced empty output 174\n"
+ "compile failed 13931\n"
+ "ccache internal error 1\n"
+ "preprocessor error 9069\n"
+ "can't use precompiled header 4\n"
+ "bad compiler arguments 1991\n"
+ "unsupported source language 18129\n"
+ "autoconf compile/link 49046\n"
+ "unsupported compiler option 135\n"
+ "no input file 308470\n"
+ "cleanups performed 1\n"
+ "files in cache 17358\n"
+ "cache size 15.4 Gbytes\n"
+ "max cache size 17.2 Gbytes",
+ )
+
+ # Test stats for 3.3.3.
+ stat7 = CCacheStats(self.STAT7)
+ self.assertEqual(
+ str(stat7),
+ "cache hit (direct) 27035\n"
+ "cache hit (preprocessed) 13939\n"
+ "cache hit rate 39\n"
+ "cache miss 62630\n"
+ "called for link 1280\n"
+ "called for preprocessing 736\n"
+ "compile failed 550\n"
+ "preprocessor error 638\n"
+ "bad compiler arguments 20\n"
+ "autoconf compile/link 1751\n"
+ "unsupported code directive 2\n"
+ "no input file 2378\n"
+ "cleanups performed 1792\n"
+ "files in cache 3479\n"
+ "cache size 4.4 Gbytes\n"
+ "max cache size 5.0 Gbytes",
+ )
+
+ def test_stats_version34(self):
+ # Test parsing 3.4 output.
+ stat8 = CCacheStats(self.STAT8)
+ self.assertEqual(
+ str(stat8),
+ f"stats zeroed {int(TIMESTAMP)}\n"
+ "cache hit (direct) 571\n"
+ "cache hit (preprocessed) 1203\n"
+ "cache hit rate 13\n"
+ "cache miss 11747\n"
+ "called for link 623\n"
+ "called for preprocessing 7194\n"
+ "compile failed 32\n"
+ "preprocessor error 137\n"
+ "bad compiler arguments 4\n"
+ "autoconf compile/link 348\n"
+ "no input file 162\n"
+ "cleanups performed 77\n"
+ "files in cache 13464\n"
+ "cache size 6.2 Gbytes\n"
+ "max cache size 7.0 Gbytes",
+ )
+
+ def test_stats_version35(self):
+ # Test parsing 3.5 output.
+ stat9 = CCacheStats(self.STAT9)
+ self.assertEqual(
+ str(stat9),
+ f"stats zeroed {int(TIMESTAMP)}\n"
+ f"stats updated {int(TIMESTAMP2)}\n"
+ "cache hit (direct) 80147\n"
+ "cache hit (preprocessed) 21413\n"
+ "cache hit rate 34\n"
+ "cache miss 191128\n"
+ "called for link 5194\n"
+ "called for preprocessing 1721\n"
+ "compile failed 825\n"
+ "preprocessor error 3838\n"
+ "cache file missing 4863\n"
+ "bad compiler arguments 32\n"
+ "autoconf compile/link 3554\n"
+ "unsupported code directive 4\n"
+ "no input file 5545\n"
+ "cleanups performed 3154\n"
+ "files in cache 18525\n"
+ "cache size 13.4 Gbytes\n"
+ "max cache size 15.0 Gbytes",
+ )
+
+ def test_stats_version37(self):
+ # verify version checks
+ self.assertFalse(CCacheStats._is_version_3_7_or_newer(self.VERSION_3_5_GIT))
+ self.assertTrue(CCacheStats._is_version_3_7_or_newer(self.VERSION_4_2))
+ self.assertTrue(CCacheStats._is_version_3_7_or_newer(self.VERSION_4_4))
+ self.assertTrue(CCacheStats._is_version_3_7_or_newer(self.VERSION_4_4_2))
+ self.assertTrue(CCacheStats._is_version_3_7_or_newer(self.VERSION_4_5))
+
+ # Test parsing 3.7+ output.
+ stat10 = CCacheStats(self.STAT10, True)
+ self.assertEqual(
+ str(stat10),
+ "stats zeroed 0\n"
+ f"stats updated {int(TIMESTAMP)}\n"
+ "cache hit (direct) 197\n"
+ "cache hit (preprocessed) 719\n"
+ "cache hit rate 9\n"
+ "cache miss 8427\n"
+ "called for link 569\n"
+ "called for preprocessing 110\n"
+ "multiple source files 0\n"
+ "compiler produced stdout 0\n"
+ "compiler produced no output 0\n"
+ "compiler produced empty output 0\n"
+ "compile failed 49\n"
+ "ccache internal error 1\n"
+ "preprocessor error 90\n"
+ "can't use precompiled header 0\n"
+ "couldn't find the compiler 0\n"
+ "cache file missing 1\n"
+ "bad compiler arguments 6\n"
+ "unsupported source language 0\n"
+ "compiler check failed 0\n"
+ "autoconf compile/link 418\n"
+ "unsupported code directive 1\n"
+ "unsupported compiler option 0\n"
+ "output to stdout 0\n"
+ "no input file 9\n"
+ "error hashing extra file 0\n"
+ "cleanups performed 161\n"
+ "files in cache 4425\n"
+ "cache size 4.4 Gbytes",
+ )
+
+ stat11 = CCacheStats(self.STAT11, True)
+ self.assertEqual(
+ str(stat11),
+ f"stats zeroed {int(TIMESTAMP2)}\n"
+ f"stats updated {int(TIMESTAMP)}\n"
+ "cache hit (direct) 0\n"
+ "cache hit (preprocessed) 0\n"
+ "cache hit rate 0\n"
+ "cache miss 0\n"
+ "called for link 0\n"
+ "called for preprocessing 0\n"
+ "multiple source files 0\n"
+ "compiler produced stdout 0\n"
+ "compiler produced no output 0\n"
+ "compiler produced empty output 0\n"
+ "compile failed 0\n"
+ "ccache internal error 0\n"
+ "preprocessor error 0\n"
+ "can't use precompiled header 0\n"
+ "couldn't find the compiler 0\n"
+ "cache file missing 0\n"
+ "bad compiler arguments 0\n"
+ "unsupported source language 0\n"
+ "compiler check failed 0\n"
+ "autoconf compile/link 0\n"
+ "unsupported code directive 0\n"
+ "unsupported compiler option 0\n"
+ "output to stdout 0\n"
+ "no input file 0\n"
+ "error hashing extra file 0\n"
+ "cleanups performed 16\n"
+ "files in cache 0\n"
+ "cache size 0.0 Kbytes",
+ )
+
+ stat12 = CCacheStats(self.STAT12, True)
+ self.assertEqual(
+ str(stat12),
+ "stats zeroed 0\n"
+ "stats updated 0\n"
+ "cache hit (direct) 0\n"
+ "cache hit (preprocessed) 0\n"
+ "cache hit rate 0\n"
+ "cache miss 0\n"
+ "called for link 0\n"
+ "called for preprocessing 0\n"
+ "multiple source files 0\n"
+ "compiler produced stdout 0\n"
+ "compiler produced no output 0\n"
+ "compiler produced empty output 0\n"
+ "compile failed 0\n"
+ "ccache internal error 0\n"
+ "preprocessor error 0\n"
+ "can't use precompiled header 0\n"
+ "couldn't find the compiler 0\n"
+ "cache file missing 0\n"
+ "bad compiler arguments 0\n"
+ "unsupported source language 0\n"
+ "compiler check failed 0\n"
+ "autoconf compile/link 0\n"
+ "unsupported code directive 0\n"
+ "unsupported compiler option 0\n"
+ "output to stdout 0\n"
+ "no input file 0\n"
+ "error hashing extra file 0\n"
+ "cleanups performed 16\n"
+ "files in cache 0\n"
+ "cache size 0.0 Kbytes",
+ )
+
+ stat13 = CCacheStats(self.STAT13, True)
+ self.assertEqual(
+ str(stat13),
+ f"stats zeroed {int(TIMESTAMP2)}\n"
+ f"stats updated {int(TIMESTAMP)}\n"
+ "cache hit (direct) 280542\n"
+ "cache hit (preprocessed) 0\n"
+ "cache hit rate 41\n"
+ "cache miss 387653\n"
+ "called for link 0\n"
+ "called for preprocessing 0\n"
+ "multiple source files 0\n"
+ "compiler produced stdout 0\n"
+ "compiler produced no output 0\n"
+ "compiler produced empty output 0\n"
+ "compile failed 1665\n"
+ "ccache internal error 1\n"
+ "preprocessor error 0\n"
+ "can't use precompiled header 0\n"
+ "couldn't find the compiler 0\n"
+ "cache file missing 0\n"
+ "bad compiler arguments 0\n"
+ "unsupported source language 0\n"
+ "compiler check failed 0\n"
+ "autoconf compile/link 0\n"
+ "unsupported code directive 0\n"
+ "unsupported compiler option 0\n"
+ "output to stdout 0\n"
+ "no input file 2\n"
+ "error hashing extra file 0\n"
+ "cleanups performed 364\n"
+ "files in cache 335104\n"
+ "cache size 17.4 Gbytes",
+ )
+
+
+if __name__ == "__main__":
+ main()