| Index: appengine/findit/crash/test/project_classifier_test.py
|
| diff --git a/appengine/findit/crash/test/project_classifier_test.py b/appengine/findit/crash/test/project_classifier_test.py
|
| index c8cc5ee918b42e9e93fc69ebb9dd8626f61d5851..14dda6085436fffe22efc4474b38ec7ab5f207c4 100644
|
| --- a/appengine/findit/crash/test/project_classifier_test.py
|
| +++ b/appengine/findit/crash/test/project_classifier_test.py
|
| @@ -4,169 +4,86 @@
|
|
|
| from crash.stacktrace import StackFrame
|
| from crash.stacktrace import CallStack
|
| +from crash.project import Project
|
| from crash.project_classifier import ProjectClassifier
|
| from crash.suspect import Suspect
|
| from crash.test.predator_testcase import PredatorTestCase
|
| from crash.type_enums import LanguageType
|
| +from libs.gitiles.change_log import FileChangeInfo
|
| +from libs.gitiles.diff import ChangeType
|
| from model.crash.crash_config import CrashConfig
|
|
|
|
|
| class ProjectClassifierTest(PredatorTestCase):
|
| -
|
| - def testGetProjectNameFromDepPath(self):
|
| - classifier = ProjectClassifier()
|
| - self.assertEqual(classifier._GetProjectFromDepPath('src/'),
|
| - 'chromium')
|
| -
|
| - self.assertEqual(classifier._GetProjectFromDepPath('src/abc'),
|
| - 'chromium-abc')
|
| -
|
| - self.assertEqual(classifier._GetProjectFromDepPath('unknown/unknown'),
|
| - 'chromium-unknown_unknown')
|
| -
|
| - def testGetClassFromStackFrame(self):
|
| - classifier = ProjectClassifier()
|
| -
|
| - frame = StackFrame(0, 'src/', 'func', 'f.cc', 'src/f.cc', [2])
|
| + """Tests ``ProjectClassifier`` class."""
|
| +
|
| + def setUp(self):
|
| + super(ProjectClassifierTest, self).setUp()
|
| + config = CrashConfig.Get().project_classifier
|
| + projects = [Project(name, path_regexs, function_regexs, host_directories)
|
| + for name, path_regexs, function_regexs, host_directories
|
| + in config['project_path_function_hosts']]
|
| + self.classifier = ProjectClassifier(
|
| + projects, config['top_n'], config['non_chromium_project_rank_priority'])
|
| +
|
| + def testClassifyCallStack(self):
|
| + """Tests ``ClassifyCallStack`` method."""
|
| + callstack = CallStack(
|
| + 0, [StackFrame(0, 'src/', 'func', 'f.cc', 'src/f.cc', [2])])
|
| self.assertEqual(
|
| - classifier.GetClassFromStackFrame(frame), 'chromium')
|
| + self.classifier.ClassifyCallStack(callstack), 'chromium')
|
|
|
| - frame = StackFrame(0, '', 'android.a', 'comp1.cc', 'src/comp1.cc', [2])
|
| + callstack = CallStack(
|
| + 0, [StackFrame(0, '', 'android.a', 'comp1.cc', 'src/comp1.cc', [2])])
|
| self.assertEqual(
|
| - classifier.GetClassFromStackFrame(frame), 'android_os')
|
| + self.classifier.ClassifyCallStack(callstack), 'android_os')
|
|
|
| - frame = StackFrame(0, '', 'func', 'comp2.cc',
|
| - 'googleplex-android/src/comp2.cc', [32])
|
| + callstack = CallStack(
|
| + 0, [StackFrame(0, '', 'func', 'comp2.cc',
|
| + 'googleplex-android/src/comp2.cc', [32])])
|
| self.assertEqual(
|
| - classifier.GetClassFromStackFrame(frame), 'android_os')
|
| + self.classifier.ClassifyCallStack(callstack), 'android_os')
|
|
|
| - frame = StackFrame(0, '', 'func', 'comp2.cc', 'unknown/comp2.cc', [32])
|
| - self.assertEqual(
|
| - classifier.GetClassFromStackFrame(frame), '')
|
| + callstack = CallStack(
|
| + 0, [StackFrame(0, '', 'func', 'comp2.cc', 'unknown/comp2.cc', [32])])
|
| + self.assertIsNone(self.classifier.ClassifyCallStack(callstack))
|
|
|
| - def testGetClassFromSuspect(self):
|
| - classifier = ProjectClassifier()
|
| + callstack = CallStack(
|
| + 0, [StackFrame(0, '', 'android.a.b', 'f.java', 'unknown/f.java', [32])],
|
| + language_type=LanguageType.JAVA)
|
| + self.assertEqual(
|
| + self.classifier.ClassifyCallStack(callstack), 'android_os')
|
| +
|
| + def testClassifyJavaCallstack(self):
|
| + """Tests ``ClassifyCallStack`` classify java callstack."""
|
| + callstack = CallStack(
|
| + 0, [StackFrame(0, 'src/', 'org.chromium.ab',
|
| + 'f.java', 'unknown/f.java', [32])],
|
| + language_type=LanguageType.JAVA)
|
| + self.assertEqual(
|
| + self.classifier.ClassifyCallStack(callstack), 'chromium')
|
|
|
| + def testClassifySuspect(self):
|
| + """Tests ``ClassifySuspect`` method."""
|
| suspect = Suspect(self.GetDummyChangeLog(), 'src/')
|
| - suspect.file_to_stack_infos = {'a.cc': [(
|
| - StackFrame(0, 'src/', 'func', 'a.cc', 'src/a.cc', [3]), 0
|
| - )]}
|
| - self.assertEqual(classifier.GetClassFromSuspect(suspect), 'chromium')
|
| -
|
| - suspect.file_to_stack_infos = {
|
| - 'comp1.cc': [
|
| - (StackFrame(0, 'src/', 'func', 'comp1.cc', 'src/comp1.cc', [2]), 0)
|
| - ]
|
| - }
|
| - self.assertEqual(classifier.GetClassFromSuspect(suspect), 'chromium')
|
| -
|
| - def testClassifyCrashStack(self):
|
| - classifier = ProjectClassifier()
|
| -
|
| - crash_stack = CallStack(0, frame_list=[
|
| - StackFrame(0, 'src/', 'func', 'comp1.cc', 'src/comp1.cc', [2]),
|
| - StackFrame(1, 'src/', 'ff', 'comp1.cc', 'src/comp1.cc', [21]),
|
| - StackFrame(2, 'src/', 'func2', 'comp2.cc', 'src/comp2.cc', [8])])
|
| -
|
| - self.assertEqual(classifier.Classify([], crash_stack), 'chromium')
|
| -
|
| - def testClassifyEmpty(self):
|
| - classifier = ProjectClassifier()
|
| - suspect = Suspect(self.GetDummyChangeLog(), '')
|
| - self.assertEqual(classifier.Classify([suspect], CallStack(0)), '')
|
| -
|
| - def testClassifyRankFunction(self):
|
| - classifier = ProjectClassifier()
|
| + self.assertEqual(self.classifier.ClassifySuspect(suspect), 'chromium')
|
|
|
| - suspect1 = Suspect(self.GetDummyChangeLog(), 'src/')
|
| - suspect1.file_to_stack_infos = {
|
| - 'comp1.cc': [
|
| - (StackFrame(0, 'src/', 'func', 'comp1.cc', 'src/comp1.cc', [2]), 0)
|
| - ]
|
| - }
|
| -
|
| - self.assertEqual(classifier.Classify([suspect1], CallStack(0)), 'chromium')
|
| -
|
| - suspect2 = Suspect(self.GetDummyChangeLog(), '')
|
| - suspect2.file_to_stack_infos = {
|
| - 'ad.cc': [
|
| - (StackFrame(0, '', 'android.a', 'ad.cc', 'ad.cc', [2]), 0)
|
| - ]
|
| - }
|
| -
|
| - self.assertEqual(classifier.Classify([suspect2], CallStack(0)),
|
| - 'android_os')
|
| -
|
| - self.assertEqual(classifier.Classify([suspect1, suspect2], CallStack(0)),
|
| - 'chromium')
|
| -
|
| - def testClassifyForJavaRankFunction(self):
|
| - classifier = ProjectClassifier()
|
| - crash_stack = CallStack(0,
|
| - language_type=LanguageType.JAVA,
|
| - frame_list=[
|
| - StackFrame(0, '', 'android.a.f', 'android/a/cc',
|
| - 'android/a.java', [2]),
|
| - StackFrame(1, '', 'org.chromium.c', 'org/chromium/c.java',
|
| - 'org/chromium/c.java', [8])
|
| - ])
|
| -
|
| - self.assertEqual(classifier.Classify([], crash_stack),
|
| - 'chromium')
|
| + def testClassifyEmptySuspect(self):
|
| + """Tests ``ClassifySuspect`` returns None for empty suspect."""
|
| + self.assertIsNone(self.classifier.ClassifySuspect(None))
|
|
|
| - # TODO(wrengr): what's the point of this? we're just testing that
|
| - # mocking does in fact mock.
|
| - def testClassifyReturnsNone(self):
|
| - self.mock(ProjectClassifier, 'Classify', lambda *_: None)
|
| - self.assertIsNone(ProjectClassifier().Classify([], CallStack(0)))
|
| -
|
| - def testProjectClassifierDoNotHaveConfig(self):
|
| - crash_config = CrashConfig.Get()
|
| - crash_config.project_classifier = {}
|
| - crash_config.put()
|
| -
|
| - crash_stack = CallStack(0, frame_list=[
|
| - StackFrame(0, 'src/', 'func', 'comp1.cc', 'src/comp1.cc', [2]),
|
| - StackFrame(1, 'src/', 'ff', 'comp1.cc', 'src/comp1.cc', [21]),
|
| - StackFrame(2, 'src/', 'func2', 'comp2.cc', 'src/comp2.cc', [8])])
|
| + def testClassifySuspectNoTouchedFileMatch(self):
|
| + """Tests ``ClassifySuspect`` returns None if there is no file match."""
|
| + suspect = Suspect(self.GetDummyChangeLog(), 'dummy')
|
| + suspect.touched_files = [FileChangeInfo(ChangeType.MODIFY,
|
| + 'a/b.h', 'a/b.h')]
|
| + self.assertIsNone(self.classifier.ClassifySuspect(suspect))
|
|
|
| + def testClassifySuspects(self):
|
| + """Tests ``ClassifySuspects`` classify a list of ``Suspect``s."""
|
| suspect1 = Suspect(self.GetDummyChangeLog(), 'src/')
|
| - suspect1.file_to_stack_infos = {
|
| - 'comp1.cc': [
|
| - (StackFrame(0, 'src/', 'func', 'comp1.cc', 'src/comp1.cc', [2]), 0)
|
| - ]
|
| - }
|
| -
|
| - self.assertIsNone(ProjectClassifier().Classify([suspect1], crash_stack))
|
| -
|
| - def testSortHosts(self):
|
| - host_list = [
|
| - 'src/',
|
| - 'src/chrome/browser/resources/',
|
| - 'src/media/',
|
| - 'src/sdch/',
|
| - 'src/testing/',
|
| - 'src/third_party/WebKit/',
|
| - 'src/third_party/',
|
| - 'src/tools/',
|
| - 'src/chrome/test/data/layout_tests/'
|
| - ]
|
| + suspect2 = Suspect(self.GetDummyChangeLog(), 'src/dep')
|
| + suspect3 = Suspect(self.GetDummyChangeLog(), 'src/dep')
|
|
|
| - crash_config = CrashConfig.Get()
|
| - crash_config.project_classifier['host_directories'] = host_list
|
| -
|
| - expected_sorted_host_list = [
|
| - 'src/chrome/test/data/layout_tests/',
|
| - 'src/chrome/browser/resources/',
|
| - 'src/third_party/WebKit/',
|
| - 'src/media/',
|
| - 'src/sdch/',
|
| - 'src/testing/',
|
| - 'src/third_party/',
|
| - 'src/tools/',
|
| - 'src/'
|
| - ]
|
| -
|
| - self.assertEqual(
|
| - ProjectClassifier().project_classifier_config['host_directories'],
|
| - expected_sorted_host_list)
|
| + self.assertEqual(self.classifier.ClassifySuspects(
|
| + [suspect1, suspect2, suspect3]), 'chromium-dep')
|
|
|