Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # Copyright 2016 The Chromium Authors. All rights reserved. | 1 # Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 from common.pipeline_wrapper import pipeline_handlers | 5 from common.pipeline_wrapper import pipeline_handlers |
| 6 from crash.callstack import StackFrame, CallStack | 6 from crash.callstack import StackFrame, CallStack |
| 7 from crash.component import Component | |
| 7 from crash.component_classifier import ComponentClassifier | 8 from crash.component_classifier import ComponentClassifier |
| 8 from crash.results import Result | 9 from crash.results import Result |
| 9 from crash.test.crash_testcase import CrashTestCase | 10 from crash.test.crash_testcase import CrashTestCase |
| 10 from model.crash.crash_config import CrashConfig | 11 from model.crash.crash_config import CrashConfig |
| 11 | 12 |
| 12 | 13 |
| 14 # N.B., the call to Get() in CrashConfigComponentClassifier.__init__ | |
| 15 # must only be executed from within the testFoo methods of | |
| 16 # ComponentClassifierTest. That is, we can't just do this once and for all | |
| 17 # when doing ComponentClassifierTest.__init__, because that'll cause some | |
| 18 # strange issues in mocking. But factoring it out like this so it gets | |
|
Sharu Jiang
2016/09/20 00:31:29
You should do this in ComponentClassifierTest.setU
wrengr
2016/09/27 22:00:40
I agree it shouldn't, but it does.
| |
| 19 # (re)called ever time a testFoo is run, that works. | |
| 20 class CrashConfigComponentClassifier(ComponentClassifier): | |
| 21 """A ComponentClassifier which gets its components from CrashConfig.""" | |
| 22 def __init__(self): | |
| 23 config = CrashConfig.Get().component_classifier | |
| 24 super(CrashConfigComponentClassifier, self).__init__( | |
| 25 [ Component(name, path, function) | |
|
Sharu Jiang
2016/09/20 00:31:29
nit: no space after [
wrengr
2016/09/27 22:00:40
Done.
| |
| 26 for path, function, name | |
| 27 in config.get('path_function_component', [])], | |
| 28 config.get('top_n', 0)) | |
| 29 | |
| 30 | |
| 13 class ComponentClassifierTest(CrashTestCase): | 31 class ComponentClassifierTest(CrashTestCase): |
| 14 | 32 |
| 15 def testGetClassFromStackFrame(self): | 33 def testGetClassFromStackFrame(self): |
| 16 frame = StackFrame(0, 'src/', 'func', 'comp1.cc', 'src/comp1.cc', [2]) | 34 frame = StackFrame(0, 'src/', 'func', 'comp1.cc', 'src/comp1.cc', [2]) |
| 17 self.assertEqual( | 35 self.assertEqual( |
| 18 ComponentClassifier().GetClassFromStackFrame(frame), | 36 CrashConfigComponentClassifier().GetClassFromStackFrame(frame), |
| 19 'Comp1>Dummy') | 37 'Comp1>Dummy') |
| 20 | 38 |
| 21 frame = StackFrame(0, 'src/', 'func2', 'comp2.cc', 'src/comp2.cc', [32]) | 39 frame = StackFrame(0, 'src/', 'func2', 'comp2.cc', 'src/comp2.cc', [32]) |
| 22 self.assertEqual( | 40 self.assertEqual( |
| 23 ComponentClassifier().GetClassFromStackFrame(frame), | 41 CrashConfigComponentClassifier().GetClassFromStackFrame(frame), |
| 24 'Comp2>Dummy') | 42 'Comp2>Dummy') |
| 25 | 43 |
| 26 frame = StackFrame(0, 'src/', 'no_func', 'comp2.cc', 'src/comp2.cc', [32]) | 44 frame = StackFrame(0, 'src/', 'no_func', 'comp2.cc', 'src/comp2.cc', [32]) |
| 27 self.assertEqual( | 45 self.assertEqual( |
| 28 ComponentClassifier().GetClassFromStackFrame(frame), | 46 CrashConfigComponentClassifier().GetClassFromStackFrame(frame), |
| 29 '') | 47 '') |
| 30 | 48 |
| 31 frame = StackFrame(0, 'src/', 'func2', 'a.cc', 'src/a.cc', [6]) | 49 frame = StackFrame(0, 'src/', 'func2', 'a.cc', 'src/a.cc', [6]) |
| 32 self.assertEqual( | 50 self.assertEqual( |
| 33 ComponentClassifier().GetClassFromStackFrame(frame), | 51 CrashConfigComponentClassifier().GetClassFromStackFrame(frame), |
| 34 '') | 52 '') |
| 35 | 53 |
| 36 def testGetClassFromResult(self): | 54 def testGetClassFromResult(self): |
| 37 result = Result(self.GetDummyChangeLog(), 'src/') | 55 result = Result(self.GetDummyChangeLog(), 'src/') |
| 38 self.assertEqual(ComponentClassifier().GetClassFromResult(result), | 56 self.assertEqual( |
| 39 '') | 57 CrashConfigComponentClassifier().GetClassFromResult(result), |
| 58 '') | |
| 40 | 59 |
| 41 result.file_to_stack_infos = { | 60 result.file_to_stack_infos = { |
| 42 'comp1.cc': [ | 61 'comp1.cc': [ |
| 43 (StackFrame(0, 'src/', 'func', 'comp1.cc', 'src/comp1.cc', [2]), 0) | 62 (StackFrame(0, 'src/', 'func', 'comp1.cc', 'src/comp1.cc', [2]), 0) |
| 44 ] | 63 ] |
| 45 } | 64 } |
| 46 self.assertEqual(ComponentClassifier().GetClassFromResult(result), | 65 self.assertEqual( |
| 47 'Comp1>Dummy') | 66 CrashConfigComponentClassifier().GetClassFromResult(result), |
| 67 'Comp1>Dummy') | |
| 48 | 68 |
| 49 def testClassifyCrashStack(self): | 69 def testClassifyCrashStack(self): |
| 50 crash_stack = CallStack(0) | 70 crash_stack = CallStack(0) |
| 51 crash_stack.extend([ | 71 crash_stack.extend([ |
| 52 StackFrame(0, 'src/', 'func', 'comp1.cc', 'src/comp1.cc', [2]), | 72 StackFrame(0, 'src/', 'func', 'comp1.cc', 'src/comp1.cc', [2]), |
| 53 StackFrame(1, 'src/', 'ff', 'comp1.cc', 'src/comp1.cc', [21]), | 73 StackFrame(1, 'src/', 'ff', 'comp1.cc', 'src/comp1.cc', [21]), |
| 54 StackFrame(2, 'src/', 'func2', 'comp2.cc', 'src/comp2.cc', [8]) | 74 StackFrame(2, 'src/', 'func2', 'comp2.cc', 'src/comp2.cc', [8]) |
| 55 ]) | 75 ]) |
| 56 | 76 |
| 57 self.assertEqual(ComponentClassifier().Classify([], crash_stack), | 77 self.assertEqual(CrashConfigComponentClassifier().Classify([], crash_stack), |
| 58 ['Comp1>Dummy', 'Comp2>Dummy']) | 78 ['Comp1>Dummy', 'Comp2>Dummy']) |
| 59 | 79 |
| 60 def testClassifyResults(self): | 80 def testClassifyResults(self): |
| 61 result = Result(self.GetDummyChangeLog(), 'src/') | 81 result = Result(self.GetDummyChangeLog(), 'src/') |
| 62 result.file_to_stack_infos = { | 82 result.file_to_stack_infos = { |
| 63 'comp1.cc': [ | 83 'comp1.cc': [ |
| 64 (StackFrame(0, 'src/', 'func', 'comp1.cc', 'src/comp1.cc', [2]), 0) | 84 (StackFrame(0, 'src/', 'func', 'comp1.cc', 'src/comp1.cc', [2]), 0) |
| 65 ] | 85 ] |
| 66 } | 86 } |
| 67 | 87 |
| 68 self.assertEqual(ComponentClassifier().Classify([result], CallStack(0)), | 88 self.assertEqual( |
| 69 ['Comp1>Dummy']) | 89 CrashConfigComponentClassifier().Classify([result], CallStack(0)), |
| 90 ['Comp1>Dummy']) | |
| 70 | 91 |
| 71 def testClassifierDoNotHaveConfig(self): | 92 def testClassifierDoNotHaveConfig(self): |
| 72 crash_config = CrashConfig.Get() | 93 crash_config = CrashConfig.Get() |
| 73 crash_config.component_classifier = {} | 94 crash_config.component_classifier = {} |
| 74 | 95 |
| 75 crash_stack = CallStack(0) | 96 crash_stack = CallStack(0) |
| 76 crash_stack.extend([ | 97 crash_stack.extend([ |
| 77 StackFrame(0, 'src/', 'func', 'comp1.cc', 'src/comp1.cc', [2]), | 98 StackFrame(0, 'src/', 'func', 'comp1.cc', 'src/comp1.cc', [2]), |
| 78 StackFrame(1, 'src/', 'ff', 'comp1.cc', 'src/comp1.cc', [21]), | 99 StackFrame(1, 'src/', 'ff', 'comp1.cc', 'src/comp1.cc', [21]), |
| 79 StackFrame(2, 'src/', 'func2', 'comp2.cc', 'src/comp2.cc', [8]) | 100 StackFrame(2, 'src/', 'func2', 'comp2.cc', 'src/comp2.cc', [8]) |
| 80 ]) | 101 ]) |
| 81 | 102 |
| 82 result = Result(self.GetDummyChangeLog(), 'src/') | 103 result = Result(self.GetDummyChangeLog(), 'src/') |
| 83 result.file_to_stack_infos = { | 104 result.file_to_stack_infos = { |
| 84 'comp1.cc': [ | 105 'comp1.cc': [ |
| 85 (StackFrame(0, 'src/', 'func', 'comp1.cc', 'src/comp1.cc', [2]), 0) | 106 (StackFrame(0, 'src/', 'func', 'comp1.cc', 'src/comp1.cc', [2]), 0) |
| 86 ] | 107 ] |
| 87 } | 108 } |
| 88 | 109 |
| 89 self.assertEqual(ComponentClassifier().Classify([result], crash_stack), | 110 self.assertEqual( |
| 90 []) | 111 CrashConfigComponentClassifier().Classify([result], crash_stack), |
| 112 []) | |
| OLD | NEW |