aboutsummaryrefslogtreecommitdiff
path: root/crosperf/results_cache_unittest.py
diff options
context:
space:
mode:
authorZhizhou Yang <zhizhouy@google.com>2019-03-04 17:25:28 -0800
committerZhizhou Yang <zhizhouy@google.com>2019-03-06 23:40:20 +0000
commitd8beb17b6028fbe0a9594462a6173cc16be884c5 (patch)
tree0224d615bcba33a1185ddbaa595a8837993d4692 /crosperf/results_cache_unittest.py
parenta1a431178f52d1b7b8b24ea2851b509627ddb89d (diff)
downloadtoolchain-utils-d8beb17b6028fbe0a9594462a6173cc16be884c5.tar.gz
crosperf: enabling result caching for cwp mode
This patch provides support for result caching when cwp_dso is specified. This patch introduced cwp_dso into ResultsCache class, so that cwp_dso info will be stored while caching. When populating from cache, samples will be re-calculated with the perf.data file that has been cached before. This patch also: 1) Fixed return value of GetSamples(). 2) Not need to pass weight to result. 3) Added unit tests. BUG=chromium:905854 TEST=Passed all unit tests; Tested with --rerun=True/False, both on cwp and general mode, to make sure cache works. Change-Id: I297fa0aaad781b4a665a4a29bb6fdb4bca0d790b Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/toolchain-utils/+/1501458 Reviewed-by: Manoj Gupta <manojgupta@chromium.org> Reviewed-by: Caroline Tice <cmtice@chromium.org> Tested-by: Zhizhou Yang <zhizhouy@google.com>
Diffstat (limited to 'crosperf/results_cache_unittest.py')
-rw-r--r--[-rwxr-xr-x]crosperf/results_cache_unittest.py301
1 files changed, 189 insertions, 112 deletions
diff --git a/crosperf/results_cache_unittest.py b/crosperf/results_cache_unittest.py
index db1c6edd..17fba8d9 100755..100644
--- a/crosperf/results_cache_unittest.py
+++ b/crosperf/results_cache_unittest.py
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
#!/usr/bin/env python2
# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
@@ -199,7 +200,7 @@ class ResultTest(unittest.TestCase):
def testCreateFromRun(self):
result = MockResult.CreateFromRun(logger.GetLogger(), 'average',
self.mock_label, 'remote1', OUTPUT, error,
- 0, True, 0)
+ 0, True)
self.assertEqual(result.keyvals, keyvals)
self.assertEqual(result.chroot_results_dir,
'/tmp/test_that.PO1234567/platform_LibCBench')
@@ -268,10 +269,10 @@ class ResultTest(unittest.TestCase):
self.result.CopyResultsTo('/tmp/results/')
self.assertEqual(mockCopyFilesTo.call_count, 2)
self.assertEqual(len(mockCopyFilesTo.call_args_list), 2)
- self.assertEqual(mockCopyFilesTo.call_args_list[0][0], ('/tmp/results/',
- perf_data_files))
- self.assertEqual(mockCopyFilesTo.call_args_list[1][0], ('/tmp/results/',
- perf_report_files))
+ self.assertEqual(mockCopyFilesTo.call_args_list[0][0],
+ ('/tmp/results/', perf_data_files))
+ self.assertEqual(mockCopyFilesTo.call_args_list[1][0],
+ ('/tmp/results/', perf_report_files))
def test_get_new_keyvals(self):
kv_dict = {}
@@ -282,50 +283,52 @@ class ResultTest(unittest.TestCase):
self.result.GetDataMeasurementsFiles = FakeGetDataMeasurementsFiles
kv_dict2, udict = self.result.GetNewKeyvals(kv_dict)
- self.assertEqual(kv_dict2, {
- u'Box2D__Box2D': 4775,
- u'Mandreel__Mandreel': 6620,
- u'Gameboy__Gameboy': 9901,
- u'Crypto__Crypto': 8737,
- u'telemetry_page_measurement_results__num_errored': 0,
- u'telemetry_page_measurement_results__num_failed': 0,
- u'PdfJS__PdfJS': 6455,
- u'Total__Score': 7918,
- u'EarleyBoyer__EarleyBoyer': 14340,
- u'MandreelLatency__MandreelLatency': 5188,
- u'CodeLoad__CodeLoad': 6271,
- u'DeltaBlue__DeltaBlue': 14401,
- u'Typescript__Typescript': 9815,
- u'SplayLatency__SplayLatency': 7653,
- u'zlib__zlib': 16094,
- u'Richards__Richards': 10358,
- u'RegExp__RegExp': 1765,
- u'NavierStokes__NavierStokes': 9815,
- u'Splay__Splay': 4425,
- u'RayTrace__RayTrace': 16600
- })
- self.assertEqual(udict, {
- u'Box2D__Box2D': u'score',
- u'Mandreel__Mandreel': u'score',
- u'Gameboy__Gameboy': u'score',
- u'Crypto__Crypto': u'score',
- u'telemetry_page_measurement_results__num_errored': u'count',
- u'telemetry_page_measurement_results__num_failed': u'count',
- u'PdfJS__PdfJS': u'score',
- u'Total__Score': u'score',
- u'EarleyBoyer__EarleyBoyer': u'score',
- u'MandreelLatency__MandreelLatency': u'score',
- u'CodeLoad__CodeLoad': u'score',
- u'DeltaBlue__DeltaBlue': u'score',
- u'Typescript__Typescript': u'score',
- u'SplayLatency__SplayLatency': u'score',
- u'zlib__zlib': u'score',
- u'Richards__Richards': u'score',
- u'RegExp__RegExp': u'score',
- u'NavierStokes__NavierStokes': u'score',
- u'Splay__Splay': u'score',
- u'RayTrace__RayTrace': u'score'
- })
+ self.assertEqual(
+ kv_dict2, {
+ u'Box2D__Box2D': 4775,
+ u'Mandreel__Mandreel': 6620,
+ u'Gameboy__Gameboy': 9901,
+ u'Crypto__Crypto': 8737,
+ u'telemetry_page_measurement_results__num_errored': 0,
+ u'telemetry_page_measurement_results__num_failed': 0,
+ u'PdfJS__PdfJS': 6455,
+ u'Total__Score': 7918,
+ u'EarleyBoyer__EarleyBoyer': 14340,
+ u'MandreelLatency__MandreelLatency': 5188,
+ u'CodeLoad__CodeLoad': 6271,
+ u'DeltaBlue__DeltaBlue': 14401,
+ u'Typescript__Typescript': 9815,
+ u'SplayLatency__SplayLatency': 7653,
+ u'zlib__zlib': 16094,
+ u'Richards__Richards': 10358,
+ u'RegExp__RegExp': 1765,
+ u'NavierStokes__NavierStokes': 9815,
+ u'Splay__Splay': 4425,
+ u'RayTrace__RayTrace': 16600
+ })
+ self.assertEqual(
+ udict, {
+ u'Box2D__Box2D': u'score',
+ u'Mandreel__Mandreel': u'score',
+ u'Gameboy__Gameboy': u'score',
+ u'Crypto__Crypto': u'score',
+ u'telemetry_page_measurement_results__num_errored': u'count',
+ u'telemetry_page_measurement_results__num_failed': u'count',
+ u'PdfJS__PdfJS': u'score',
+ u'Total__Score': u'score',
+ u'EarleyBoyer__EarleyBoyer': u'score',
+ u'MandreelLatency__MandreelLatency': u'score',
+ u'CodeLoad__CodeLoad': u'score',
+ u'DeltaBlue__DeltaBlue': u'score',
+ u'Typescript__Typescript': u'score',
+ u'SplayLatency__SplayLatency': u'score',
+ u'zlib__zlib': u'score',
+ u'Richards__Richards': u'score',
+ u'RegExp__RegExp': u'score',
+ u'NavierStokes__NavierStokes': u'score',
+ u'Splay__Splay': u'score',
+ u'RayTrace__RayTrace': u'score'
+ })
def test_append_telemetry_units(self):
kv_dict = {
@@ -370,26 +373,27 @@ class ResultTest(unittest.TestCase):
}
results_dict = self.result.AppendTelemetryUnits(kv_dict, units_dict)
- self.assertEqual(results_dict, {
- u'Box2D__Box2D': [4775, u'score'],
- u'Splay__Splay': [4425, u'score'],
- u'Gameboy__Gameboy': [9901, u'score'],
- u'Crypto__Crypto': [8737, u'score'],
- u'PdfJS__PdfJS': [6455, u'score'],
- u'Total__Score': [7918, u'score'],
- u'EarleyBoyer__EarleyBoyer': [14340, u'score'],
- u'MandreelLatency__MandreelLatency': [5188, u'score'],
- u'DeltaBlue__DeltaBlue': [14401, u'score'],
- u'SplayLatency__SplayLatency': [7653, u'score'],
- u'Mandreel__Mandreel': [6620, u'score'],
- u'Richards__Richards': [10358, u'score'],
- u'zlib__zlib': [16094, u'score'],
- u'CodeLoad__CodeLoad': [6271, u'score'],
- u'Typescript__Typescript': [9815, u'score'],
- u'RegExp__RegExp': [1765, u'score'],
- u'RayTrace__RayTrace': [16600, u'score'],
- u'NavierStokes__NavierStokes': [9815, u'score']
- })
+ self.assertEqual(
+ results_dict, {
+ u'Box2D__Box2D': [4775, u'score'],
+ u'Splay__Splay': [4425, u'score'],
+ u'Gameboy__Gameboy': [9901, u'score'],
+ u'Crypto__Crypto': [8737, u'score'],
+ u'PdfJS__PdfJS': [6455, u'score'],
+ u'Total__Score': [7918, u'score'],
+ u'EarleyBoyer__EarleyBoyer': [14340, u'score'],
+ u'MandreelLatency__MandreelLatency': [5188, u'score'],
+ u'DeltaBlue__DeltaBlue': [14401, u'score'],
+ u'SplayLatency__SplayLatency': [7653, u'score'],
+ u'Mandreel__Mandreel': [6620, u'score'],
+ u'Richards__Richards': [10358, u'score'],
+ u'zlib__zlib': [16094, u'score'],
+ u'CodeLoad__CodeLoad': [6271, u'score'],
+ u'Typescript__Typescript': [9815, u'score'],
+ u'RegExp__RegExp': [1765, u'score'],
+ u'RayTrace__RayTrace': [16600, u'score'],
+ u'NavierStokes__NavierStokes': [9815, u'score']
+ })
@mock.patch.object(misc, 'GetInsideChrootPath')
@mock.patch.object(tempfile, 'mkdtemp')
@@ -470,6 +474,19 @@ class ResultTest(unittest.TestCase):
res = self.result.GetKeyvals()
self.assertEqual(res, {'Total': 10, 'first_time': 680})
+ @mock.patch.object(misc, 'GetInsideChrootPath')
+ @mock.patch.object(command_executer.CommandExecuter,
+ 'ChrootRunCommandWOutput')
+ def test_get_samples(self, mock_chrootruncmd, mock_getpath):
+ fake_file = '/usr/chromeos/chroot/tmp/results/fake_file'
+ self.result.perf_data_files = ['/tmp/results/perf.data']
+ self.result.board = 'samus'
+ mock_getpath.return_value = fake_file
+ self.result.ce.ChrootRunCommandWOutput = mock_chrootruncmd
+ mock_chrootruncmd.return_value = ['', '45.42% 237210 chrome ', '']
+ samples = self.result.GetSamples()
+ self.assertEqual(samples, [237210, u'samples'])
+
def test_get_results_dir(self):
self.result.out = ''
@@ -593,7 +610,7 @@ class ResultTest(unittest.TestCase):
self.result.ProcessResults = FakeProcessResults
self.result.PopulateFromRun(OUTPUT, '', 0, 'test', 'telemetry_Crosperf',
- '', 0.0)
+ 'chrome')
self.assertTrue(self.callGetResultsDir)
self.assertTrue(self.callGetResultsFile)
self.assertTrue(self.callGetPerfDataFiles)
@@ -611,6 +628,9 @@ class ResultTest(unittest.TestCase):
def FakeGatherPerfResults():
self.callGatherPerfResults = True
+ def FakeGetSamples():
+ return 1
+
self.callGatherPerfResults = False
self.result.GetKeyvals = FakeGetKeyvals
@@ -627,6 +647,17 @@ class ResultTest(unittest.TestCase):
self.assertEqual(len(self.result.keyvals), 2)
self.assertEqual(self.result.keyvals, {'Total': 10, 'retval': 1})
+ self.result.cwp_dso = 'chrome'
+ self.result.retval = 0
+ self.result.GetSamples = FakeGetSamples
+ self.result.ProcessResults()
+ self.assertEqual(len(self.result.keyvals), 3)
+ self.assertEqual(self.result.keyvals, {
+ 'Total': 10,
+ 'samples': 1,
+ 'retval': 0
+ })
+
@mock.patch.object(misc, 'GetInsideChrootPath')
@mock.patch.object(command_executer.CommandExecuter,
'ChrootRunCommandWOutput')
@@ -638,6 +669,9 @@ class ResultTest(unittest.TestCase):
pass
return self.tmpdir
+ def FakeGetSamples():
+ return [1, u'samples']
+
current_path = os.getcwd()
cache_dir = os.path.join(current_path, 'test_cache/test_input')
self.result.ce = command_executer.GetCommandExecuter(log_level='average')
@@ -652,40 +686,82 @@ class ResultTest(unittest.TestCase):
tempfile.mkdtemp = FakeMkdtemp
self.result.PopulateFromCacheDir(cache_dir, 'sunspider',
- 'telemetry_Crosperf')
- self.assertEqual(self.result.keyvals, {
- u'Total__Total': [444.0, u'ms'],
- u'regexp-dna__regexp-dna': [16.2, u'ms'],
- u'telemetry_page_measurement_results__num_failed': [0, u'count'],
- u'telemetry_page_measurement_results__num_errored': [0, u'count'],
- u'string-fasta__string-fasta': [23.2, u'ms'],
- u'crypto-sha1__crypto-sha1': [11.6, u'ms'],
- u'bitops-3bit-bits-in-byte__bitops-3bit-bits-in-byte': [3.2, u'ms'],
- u'access-nsieve__access-nsieve': [7.9, u'ms'],
- u'bitops-nsieve-bits__bitops-nsieve-bits': [9.4, u'ms'],
- u'string-validate-input__string-validate-input': [19.3, u'ms'],
- u'3d-raytrace__3d-raytrace': [24.7, u'ms'],
- u'3d-cube__3d-cube': [28.0, u'ms'],
- u'string-unpack-code__string-unpack-code': [46.7, u'ms'],
- u'date-format-tofte__date-format-tofte': [26.3, u'ms'],
- u'math-partial-sums__math-partial-sums': [22.0, u'ms'],
- '\telemetry_Crosperf': ['PASS', ''],
- u'crypto-aes__crypto-aes': [15.2, u'ms'],
- u'bitops-bitwise-and__bitops-bitwise-and': [8.4, u'ms'],
- u'crypto-md5__crypto-md5': [10.5, u'ms'],
- u'string-tagcloud__string-tagcloud': [52.8, u'ms'],
- u'access-nbody__access-nbody': [8.5, u'ms'],
- 'retval': 0,
- u'math-spectral-norm__math-spectral-norm': [6.6, u'ms'],
- u'math-cordic__math-cordic': [8.7, u'ms'],
- u'access-binary-trees__access-binary-trees': [4.5, u'ms'],
- u'controlflow-recursive__controlflow-recursive': [4.4, u'ms'],
- u'access-fannkuch__access-fannkuch': [17.8, u'ms'],
- u'string-base64__string-base64': [16.0, u'ms'],
- u'date-format-xparb__date-format-xparb': [20.9, u'ms'],
- u'3d-morph__3d-morph': [22.1, u'ms'],
- u'bitops-bits-in-byte__bitops-bits-in-byte': [9.1, u'ms']
- })
+ 'telemetry_Crosperf', '')
+ self.assertEqual(
+ self.result.keyvals, {
+ u'Total__Total': [444.0, u'ms'],
+ u'regexp-dna__regexp-dna': [16.2, u'ms'],
+ u'telemetry_page_measurement_results__num_failed': [0, u'count'],
+ u'telemetry_page_measurement_results__num_errored': [0, u'count'],
+ u'string-fasta__string-fasta': [23.2, u'ms'],
+ u'crypto-sha1__crypto-sha1': [11.6, u'ms'],
+ u'bitops-3bit-bits-in-byte__bitops-3bit-bits-in-byte': [3.2, u'ms'],
+ u'access-nsieve__access-nsieve': [7.9, u'ms'],
+ u'bitops-nsieve-bits__bitops-nsieve-bits': [9.4, u'ms'],
+ u'string-validate-input__string-validate-input': [19.3, u'ms'],
+ u'3d-raytrace__3d-raytrace': [24.7, u'ms'],
+ u'3d-cube__3d-cube': [28.0, u'ms'],
+ u'string-unpack-code__string-unpack-code': [46.7, u'ms'],
+ u'date-format-tofte__date-format-tofte': [26.3, u'ms'],
+ u'math-partial-sums__math-partial-sums': [22.0, u'ms'],
+ '\telemetry_Crosperf': ['PASS', ''],
+ u'crypto-aes__crypto-aes': [15.2, u'ms'],
+ u'bitops-bitwise-and__bitops-bitwise-and': [8.4, u'ms'],
+ u'crypto-md5__crypto-md5': [10.5, u'ms'],
+ u'string-tagcloud__string-tagcloud': [52.8, u'ms'],
+ u'access-nbody__access-nbody': [8.5, u'ms'],
+ 'retval':
+ 0,
+ u'math-spectral-norm__math-spectral-norm': [6.6, u'ms'],
+ u'math-cordic__math-cordic': [8.7, u'ms'],
+ u'access-binary-trees__access-binary-trees': [4.5, u'ms'],
+ u'controlflow-recursive__controlflow-recursive': [4.4, u'ms'],
+ u'access-fannkuch__access-fannkuch': [17.8, u'ms'],
+ u'string-base64__string-base64': [16.0, u'ms'],
+ u'date-format-xparb__date-format-xparb': [20.9, u'ms'],
+ u'3d-morph__3d-morph': [22.1, u'ms'],
+ u'bitops-bits-in-byte__bitops-bits-in-byte': [9.1, u'ms']
+ })
+
+ self.result.GetSamples = FakeGetSamples
+ self.result.PopulateFromCacheDir(cache_dir, 'sunspider',
+ 'telemetry_Crosperf', 'chrome')
+ self.assertEqual(
+ self.result.keyvals, {
+ u'Total__Total': [444.0, u'ms'],
+ u'regexp-dna__regexp-dna': [16.2, u'ms'],
+ u'telemetry_page_measurement_results__num_failed': [0, u'count'],
+ u'telemetry_page_measurement_results__num_errored': [0, u'count'],
+ u'string-fasta__string-fasta': [23.2, u'ms'],
+ u'crypto-sha1__crypto-sha1': [11.6, u'ms'],
+ u'bitops-3bit-bits-in-byte__bitops-3bit-bits-in-byte': [3.2, u'ms'],
+ u'access-nsieve__access-nsieve': [7.9, u'ms'],
+ u'bitops-nsieve-bits__bitops-nsieve-bits': [9.4, u'ms'],
+ u'string-validate-input__string-validate-input': [19.3, u'ms'],
+ u'3d-raytrace__3d-raytrace': [24.7, u'ms'],
+ u'3d-cube__3d-cube': [28.0, u'ms'],
+ u'string-unpack-code__string-unpack-code': [46.7, u'ms'],
+ u'date-format-tofte__date-format-tofte': [26.3, u'ms'],
+ u'math-partial-sums__math-partial-sums': [22.0, u'ms'],
+ '\telemetry_Crosperf': ['PASS', ''],
+ u'crypto-aes__crypto-aes': [15.2, u'ms'],
+ u'bitops-bitwise-and__bitops-bitwise-and': [8.4, u'ms'],
+ u'crypto-md5__crypto-md5': [10.5, u'ms'],
+ u'string-tagcloud__string-tagcloud': [52.8, u'ms'],
+ u'access-nbody__access-nbody': [8.5, u'ms'],
+ 'retval':
+ 0,
+ u'math-spectral-norm__math-spectral-norm': [6.6, u'ms'],
+ u'math-cordic__math-cordic': [8.7, u'ms'],
+ u'access-binary-trees__access-binary-trees': [4.5, u'ms'],
+ u'controlflow-recursive__controlflow-recursive': [4.4, u'ms'],
+ u'access-fannkuch__access-fannkuch': [17.8, u'ms'],
+ u'string-base64__string-base64': [16.0, u'ms'],
+ u'date-format-xparb__date-format-xparb': [20.9, u'ms'],
+ u'3d-morph__3d-morph': [22.1, u'ms'],
+ u'bitops-bits-in-byte__bitops-bits-in-byte': [9.1, u'ms'],
+ u'samples': [1, u'samples']
+ })
# Clean up after test.
tempfile.mkdtemp = save_real_mkdtemp
@@ -915,7 +991,7 @@ class TelemetryResultTest(unittest.TestCase):
self.mock_cmd_exec)
self.result.ProcessResults = FakeProcessResults
self.result.PopulateFromRun(OUTPUT, error, 3, 'fake_test',
- 'telemetry_Crosperf', '', 0.0)
+ 'telemetry_Crosperf', '')
self.assertTrue(self.callFakeProcessResults)
self.assertEqual(self.result.out, OUTPUT)
self.assertEqual(self.result.err, error)
@@ -928,7 +1004,7 @@ class TelemetryResultTest(unittest.TestCase):
current_path = os.getcwd()
cache_dir = os.path.join(current_path,
'test_cache/test_puretelemetry_input')
- self.result.PopulateFromCacheDir(cache_dir, '', '')
+ self.result.PopulateFromCacheDir(cache_dir, '', '', '')
self.assertEqual(self.result.out.strip(), PURE_TELEMETRY_OUTPUT.strip())
self.assertEqual(self.result.err, '')
self.assertEqual(self.result.retval, 0)
@@ -973,7 +1049,8 @@ class ResultsCacheTest(unittest.TestCase):
'', # benchmark_run.share_cache
'telemetry_Crosperf',
True, # benchmark_run.show_all_results
- False) # benchmark_run.run_local
+ False, # benchmark_run.run_local
+ '') # benchmark_run.cwp_dso
@mock.patch.object(image_checksummer.ImageChecksummer, 'Checksum')
def test_get_cache_dir_for_write(self, mock_checksum):
@@ -997,11 +1074,11 @@ class ResultsCacheTest(unittest.TestCase):
# Verify that the returned directory is correct (since the label
# contained a cache_dir, named 'cache_dir', that's what is expected in
# the result, rather than '~/cros_scratch').
- comp_path = os.path.join(os.getcwd(),
- 'cache_dir/54524606abaae4fdf7b02f49f7ae7127_'
- 'sunspider_1_fda29412ceccb72977516c4785d08e2c_'
- 'FakeImageChecksumabc123_FakeMachineChecksum'
- 'abc987__6')
+ comp_path = os.path.join(
+ os.getcwd(), 'cache_dir/54524606abaae4fdf7b02f49f7ae7127_'
+ 'sunspider_1_fda29412ceccb72977516c4785d08e2c_'
+ 'FakeImageChecksumabc123_FakeMachineChecksum'
+ 'abc987__6')
self.assertEqual(result_path, comp_path)
def test_form_cache_dir(self):