| # Copyright 2021 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import unittest |
| from export_dtrace import DTraceParser |
| |
| |
| class DTraceReadTest(unittest.TestCase): |
| def testEmpty(self): |
| """Tests that a directory with no valid stacks triggers a failure.""" |
| |
| with self.assertRaises(SystemExit): |
| collapser = DTraceParser() |
| collapser.ParseDir('./test_data/empty/') |
| |
| def testValidBlock(self): |
| """Tests basic parsing of the DTrace format.""" |
| |
| collapser = DTraceParser() |
| collapser.ParseDir('./test_data/valid/') |
| self.assertEquals(collapser.GetSamplesListForTesting(), [{ |
| 'frames': [('fake_module', 'baz'), ('fake_module', 'bar'), |
| ('fake_module', 'foo')], |
| 'weight': |
| 12 |
| }]) |
| |
| def testRepeatedFunction(self): |
| """Tests accumulation of samples of the same function over many files.""" |
| |
| collapser = DTraceParser() |
| collapser.ParseDir('./test_data/repeated/') |
| self.assertEquals(collapser.GetSamplesListForTesting(), [{ |
| 'frames': [('fake_module', 'baz'), ('fake_module', 'bar'), |
| ('fake_module', 'foo')], |
| 'weight': |
| 24 |
| }]) |
| |
| def testUnsymbolized(self): |
| """Tests that absolute addresses are parsed as unsymbolized frames. |
| """ |
| |
| collapser = DTraceParser() |
| collapser.ParseDir('./test_data/absolute_offset/') |
| self.assertEquals(collapser.GetSamplesListForTesting(), [{ |
| 'frames': [ |
| ('unsymbolized module', '0x21'), |
| ('unsymbolized module', '+0x85'), |
| ('unsymbolized module', '0x37'), |
| ], |
| 'weight': |
| 12 |
| }]) |
| |
| |
| class StackCollapseTest(unittest.TestCase): |
| def testDoublePostProcessStackSamplesFails(self): |
| """Tests that calling post_process_samples() twice triggers a failure.""" |
| |
| samples = [{ |
| 'frames': [('fake_module', 'foo'), ('fake_module', 'bar'), |
| ('fake_module', 'baz')], |
| 'weight': |
| 24 |
| }] |
| stack_collapser = DTraceParser() |
| stack_collapser.AddSamplesForTesting(samples) |
| |
| with self.assertRaises(SystemExit): |
| stack_collapser.PostProcessStackSamples() |
| stack_collapser.PostProcessStackSamples() |