Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(58)

Side by Side Diff: appengine/findit/waterfall/test/build_failure_analysis_pipelines_test.py

Issue 838003004: [Findit] Add three sub-pipelines to analyze build failure. (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: Address comments. Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 # Copyright 2014 The Chromium Authors. All rights reserved. 1 # Copyright 2014 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 import os 5 import os
6 6
7 from pipeline_utils.appengine_third_party_pipeline_src_pipeline import handlers 7 from pipeline_utils.appengine_third_party_pipeline_src_pipeline import handlers
8 from testing_utils import testing 8 from testing_utils import testing
9 9
10 from model.build_analysis import BuildAnalysis 10 from model.build_analysis import BuildAnalysis
11 from model.build_analysis_status import BuildAnalysisStatus 11 from model.build_analysis_status import BuildAnalysisStatus
12 from waterfall import build_failure_analysis_pipelines 12 from waterfall import build_failure_analysis_pipelines
13 from waterfall import buildbot 13 from waterfall import buildbot
14 from waterfall import lock_util 14 from waterfall import lock_util
15 15
16 16
17 class BuildFailureAnalysisPipelinesTest(testing.AppengineTestCase): 17 class BuildFailureAnalysisPipelinesTest(testing.AppengineTestCase):
18 app_module = handlers._APP 18 app_module = handlers._APP
19 19
20 def _CreateAndSaveBuildAnanlysis( 20 def _CreateAndSaveBuildAnanlysis(
21 self, master_name, builder_name, build_number, status): 21 self, master_name, builder_name, build_number, status):
22 analysis = BuildAnalysis.CreateBuildAnalysis( 22 analysis = BuildAnalysis.CreateBuildAnalysis(
23 master_name, builder_name, build_number) 23 master_name, builder_name, build_number)
24 analysis.status = status 24 analysis.status = status
25 analysis.put() 25 analysis.put()
26 26
27 def testAnanlysIsNeededWhenBuildWasNeverAnalyzed(self): 27 def testAnanlysIsNeededWhenBuildWasNeverAnalyzed(self):
qyearsley 2015/01/16 22:55:26 Ananlys -> Analysis (also below)
stgao 2015/01/21 20:29:23 Ooops, good catch! Done.
28 master_name = 'm' 28 master_name = 'm'
29 builder_name = 'b 1' 29 builder_name = 'b 1'
30 build_number = 123 30 build_number = 123
31 31
32 need_analysis = build_failure_analysis_pipelines.NeedANewAnalysis( 32 need_analysis = build_failure_analysis_pipelines.NeedANewAnalysis(
33 master_name, builder_name, build_number, False) 33 master_name, builder_name, build_number, False)
34 34
35 self.assertTrue(need_analysis) 35 self.assertTrue(need_analysis)
36 36
37 def testNewAnalysisIsNotNeededWhenNotForced(self): 37 def testNewAnalysisIsNotNeededWhenNotForced(self):
38 master_name = 'm' 38 master_name = 'm'
39 builder_name = 'b 1' 39 builder_name = 'b 1'
40 build_number = 123 40 build_number = 123
41 self._CreateAndSaveBuildAnanlysis(master_name, builder_name, build_number, 41 self._CreateAndSaveBuildAnanlysis(master_name, builder_name, build_number,
qyearsley 2015/01/16 22:55:26 Ananlysis -> Analysis (also below)
stgao 2015/01/21 20:29:23 Done.
42 BuildAnalysisStatus.ANALYZED) 42 BuildAnalysisStatus.ANALYZED)
43 43
44 need_analysis = build_failure_analysis_pipelines.NeedANewAnalysis( 44 need_analysis = build_failure_analysis_pipelines.NeedANewAnalysis(
45 master_name, builder_name, build_number, False) 45 master_name, builder_name, build_number, False)
46 46
47 self.assertFalse(need_analysis) 47 self.assertFalse(need_analysis)
48 48
49 def testNewAnanlysIsNeededWhenForced(self): 49 def testNewAnanlysIsNeededWhenForced(self):
50 master_name = 'm' 50 master_name = 'm'
51 builder_name = 'b 1' 51 builder_name = 'b 1'
52 build_number = 123 52 build_number = 123
53 self._CreateAndSaveBuildAnanlysis(master_name, builder_name, build_number, 53 self._CreateAndSaveBuildAnanlysis(master_name, builder_name, build_number,
54 BuildAnalysisStatus.ANALYZED) 54 BuildAnalysisStatus.ANALYZED)
qyearsley 2015/01/16 22:55:26 Style nit: Alignment.
stgao 2015/01/21 20:29:23 Done.
55 55
56 need_analysis = build_failure_analysis_pipelines.NeedANewAnalysis( 56 need_analysis = build_failure_analysis_pipelines.NeedANewAnalysis(
57 master_name, builder_name, build_number, True) 57 master_name, builder_name, build_number, True)
58 58
59 self.assertTrue(need_analysis) 59 self.assertTrue(need_analysis)
60 60
61 def _MockChangeLog(
62 self, urlfetch, user_name, revision, commit_position, file_path):
63 url = ('https://chromium.googlesource.com/chromium/src/+/%s?format=json'
64 % revision)
65
66 COMMIT_LOG_TEMPLATE = """)]}'
67 {
68 "commit": "REVISION",
69 "tree": "tree_rev",
70 "parents": [
71 "revX"
72 ],
73 "author": {
74 "name": "USER_NAME@chromium.org",
75 "email": "USER_NAME@chromium.org",
76 "time": "Wed Jun 11 19:35:32 2014"
77 },
78 "committer": {
79 "name": "USER_NAME@chromium.org",
80 "email": "USER_NAME@chromium.org",
81 "time": "Wed Jun 11 19:35:32 2014"
82 },
83 "message":
84 "git-svn-id: svn://svn.chromium.org/chromium/src@COMMIT_POSITION bla",
85 "tree_diff": [
86 {
87 "type": "modify",
88 "old_id": "idX",
89 "old_mode": 33188,
90 "old_path": "FILE_PATH",
91 "new_id": "idY",
92 "new_mode": 33188,
93 "new_path": "FILE_PATH"
94 }
95 ]
96 }
97 """
98 commit_log = COMMIT_LOG_TEMPLATE.replace(
99 'REVISION', revision).replace('USER_NAME', user_name).replace(
100 'COMMIT_POSITION', str(commit_position)).replace('FILE_PATH', file_path)
101 urlfetch.register_handler(url, commit_log)
102
103
61 def testSuccessfulAnalysisOfBuildFailure(self): 104 def testSuccessfulAnalysisOfBuildFailure(self):
62 master_name = 'm' 105 master_name = 'm'
63 builder_name = 'b' 106 builder_name = 'b'
64 build_number = 123 107 build_number = 124
65 108
66 def _WaitUntilDownloadAllowed(*_): 109 def _WaitUntilDownloadAllowed(*_):
67 return True 110 return True
68 111
69 self.mock(lock_util, 'WaitUntilDownloadAllowed', _WaitUntilDownloadAllowed) 112 self.mock(lock_util, 'WaitUntilDownloadAllowed', _WaitUntilDownloadAllowed)
70 113
71 # Mock build data in urlfetch.
72 with self.mock_urlfetch() as urlfetch: 114 with self.mock_urlfetch() as urlfetch:
73 for i in range(3): 115 # Mock build data.
116 for i in range(2):
74 build_url = buildbot.CreateBuildUrl( 117 build_url = buildbot.CreateBuildUrl(
75 master_name, builder_name, build_number - i, json_api=True) 118 master_name, builder_name, build_number - i, json_api=True)
76 file_name = os.path.join(os.path.dirname(__file__), 'data', 119 file_name = os.path.join(os.path.dirname(__file__), 'data',
77 'm_b_%s.json' % (build_number - i)) 120 'm_b_%s.json' % (build_number - i))
78 with open(file_name, 'r') as f: 121 with open(file_name, 'r') as f:
79 urlfetch.register_handler(build_url, f.read()) 122 urlfetch.register_handler(build_url, f.read())
80 123
124 # Mock step log.
125 step_log_url = buildbot.CreateStdioLogUrl(
126 master_name, builder_name, build_number, 'a')
127 urlfetch.register_handler(
128 step_log_url, 'error in file a/b/x.cc:89 ...')
129
130 # Mock change logs.
131 self._MockChangeLog(urlfetch, 'user1', 'some_git_hash', 8888, 'a/b/x.cc')
132 self._MockChangeLog(
133 urlfetch, 'user1', '64c72819e898e952103b63eabc12772f9640af07',
134 8887, 'd/e/y.cc')
135
81 build_failure_analysis_pipelines.ScheduleAnalysisIfNeeded( 136 build_failure_analysis_pipelines.ScheduleAnalysisIfNeeded(
82 master_name, builder_name, build_number, False, 'default') 137 master_name, builder_name, build_number, False, 'default')
83 138
84 self.execute_queued_tasks() 139 self.execute_queued_tasks()
85 140
86 analysis = BuildAnalysis.GetBuildAnalysis( 141 analysis = BuildAnalysis.GetBuildAnalysis(
87 master_name, builder_name, build_number) 142 master_name, builder_name, build_number)
88 self.assertIsNotNone(analysis) 143 self.assertIsNotNone(analysis)
89 self.assertEqual(BuildAnalysisStatus.ANALYZED, analysis.status) 144 self.assertEqual(BuildAnalysisStatus.ANALYZED, analysis.status)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698