OLD | NEW |
1 package analysis | 1 package analysis |
2 | 2 |
3 import ( | 3 import ( |
4 "sort" | 4 "sort" |
5 | 5 |
6 "github.com/skia-dev/glog" | 6 "github.com/skia-dev/glog" |
7 | 7 |
8 "skia.googlesource.com/buildbot.git/golden/go/types" | 8 "skia.googlesource.com/buildbot.git/golden/go/types" |
9 ptypes "skia.googlesource.com/buildbot.git/perf/go/types" | 9 ptypes "skia.googlesource.com/buildbot.git/perf/go/types" |
10 ) | 10 ) |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
75 | 75 |
76 // GUITestDetailSortable is a wrapper to sort a slice of GUITestDetail. | 76 // GUITestDetailSortable is a wrapper to sort a slice of GUITestDetail. |
77 type GUITestDetailSortable []*GUITestDetail | 77 type GUITestDetailSortable []*GUITestDetail |
78 | 78 |
79 func (g GUITestDetailSortable) Len() int { return len(g) } | 79 func (g GUITestDetailSortable) Len() int { return len(g) } |
80 func (g GUITestDetailSortable) Swap(i, j int) { g[i], g[j] = g[j], g[i] } | 80 func (g GUITestDetailSortable) Swap(i, j int) { g[i], g[j] = g[j], g[i] } |
81 func (g GUITestDetailSortable) Less(i, j int) bool { return g[i].Name < g[j].Nam
e } | 81 func (g GUITestDetailSortable) Less(i, j int) bool { return g[i].Name < g[j].Nam
e } |
82 | 82 |
83 // getTestDetails processes a tile and calculates the diff metrics for all | 83 // getTestDetails processes a tile and calculates the diff metrics for all |
84 // untriaged digests. | 84 // untriaged digests. |
85 func (a *Analyzer) getTestDetails(labeledTile *LabeledTile) *GUITestDetails { | 85 func (a *Analyzer) getTestDetails(state *AnalyzeState) *GUITestDetails { |
86 » glog.Infof("Latest commit: %v", labeledTile.Commits[len(labeledTile.Comm
its)-1]) | 86 » glog.Infof("Latest commit: %v", state.Tile.Commits[len(state.Tile.Commit
s)-1]) |
87 glog.Infoln("Starting to extract test details.") | 87 glog.Infoln("Starting to extract test details.") |
88 » nTests := len(labeledTile.Traces) | 88 » nTests := len(state.Tile.Traces) |
89 resultCh := make(chan *GUITestDetail, nTests) | 89 resultCh := make(chan *GUITestDetail, nTests) |
90 | 90 |
91 » for testName, testTraces := range labeledTile.Traces { | 91 » for testName, testTraces := range state.Tile.Traces { |
92 go a.processOneTestDetail(testName, testTraces, resultCh) | 92 go a.processOneTestDetail(testName, testTraces, resultCh) |
93 } | 93 } |
94 | 94 |
95 // Wait for the results to finish. | 95 // Wait for the results to finish. |
96 result := make([]*GUITestDetail, 0, nTests) | 96 result := make([]*GUITestDetail, 0, nTests) |
97 for i := 0; i < nTests; i++ { | 97 for i := 0; i < nTests; i++ { |
98 result = append(result, <-resultCh) | 98 result = append(result, <-resultCh) |
99 glog.Infof("Processed %d/%d tests. (%f%%)", len(result), nTests,
float64(len(result))/float64(nTests)*100.0) | 99 glog.Infof("Processed %d/%d tests. (%f%%)", len(result), nTests,
float64(len(result))/float64(nTests)*100.0) |
100 } | 100 } |
101 | 101 |
102 // Sort the resulting tests by name. | 102 // Sort the resulting tests by name. |
103 sort.Sort(GUITestDetailSortable(result)) | 103 sort.Sort(GUITestDetailSortable(result)) |
104 | 104 |
105 // Build the test lookup map. | 105 // Build the test lookup map. |
106 testsMap := make(map[string]int, nTests) | 106 testsMap := make(map[string]int, nTests) |
107 for idx, t := range result { | 107 for idx, t := range result { |
108 testsMap[t.Name] = idx | 108 testsMap[t.Name] = idx |
109 } | 109 } |
110 | 110 |
111 glog.Infoln("Done extracting test details.") | 111 glog.Infoln("Done extracting test details.") |
112 | 112 |
113 return &GUITestDetails{ | 113 return &GUITestDetails{ |
114 » » Commits: labeledTile.Commits, | 114 » » Commits: state.Tile.Commits, |
115 » » CommitsByDigest: labeledTile.CommitsByDigest, | 115 » » CommitsByDigest: state.Tile.CommitsByDigest, |
116 » » AllParams: a.currentIndex.getAllParams(nil), | 116 » » AllParams: state.Index.getAllParams(nil), |
117 Tests: result, | 117 Tests: result, |
118 testsMap: testsMap, | 118 testsMap: testsMap, |
119 } | 119 } |
120 } | 120 } |
121 | 121 |
122 func (a *Analyzer) updateTestDetails(labeledTestDigests map[string]types.TestCla
ssification) { | 122 func (a *Analyzer) updateTestDetails(labeledTestDigests map[string]types.TestCla
ssification, state *AnalyzeState) { |
123 » glog.Infof("Latest commit: %v", a.currentTestDetails.Commits[len(a.curre
ntTestDetails.Commits)-1]) | 123 » glog.Infof("Latest commit: %v", state.TestDetails.Commits[len(state.Test
Details.Commits)-1]) |
124 glog.Infoln("Starting to update test details.") | 124 glog.Infoln("Starting to update test details.") |
125 nTests := len(labeledTestDigests) | 125 nTests := len(labeledTestDigests) |
126 resultCh := make(chan *GUITestDetail, nTests) | 126 resultCh := make(chan *GUITestDetail, nTests) |
127 | 127 |
128 for testName := range labeledTestDigests { | 128 for testName := range labeledTestDigests { |
129 » » go a.processOneTestDetail(testName, a.currentTile.Traces[testNam
e], resultCh) | 129 » » go a.processOneTestDetail(testName, state.Tile.Traces[testName],
resultCh) |
130 } | 130 } |
131 | 131 |
132 // Wait for the results to finish. | 132 // Wait for the results to finish. |
133 » curr := a.currentTestDetails.Tests | 133 » curr := state.TestDetails.Tests |
134 for i := 0; i < nTests; i++ { | 134 for i := 0; i < nTests; i++ { |
135 result := <-resultCh | 135 result := <-resultCh |
136 | 136 |
137 // find the result in the current tile and replace it. | 137 // find the result in the current tile and replace it. |
138 idx := sort.Search(len(curr), func(j int) bool { return curr[j].
Name >= result.Name }) | 138 idx := sort.Search(len(curr), func(j int) bool { return curr[j].
Name >= result.Name }) |
139 // We found the entry. | 139 // We found the entry. |
140 if (idx < len(curr)) && (curr[idx].Name == result.Name) { | 140 if (idx < len(curr)) && (curr[idx].Name == result.Name) { |
141 curr[idx] = result | 141 curr[idx] = result |
142 } else { | |
143 glog.Errorf("Unable to find test '%s'", result.Name) | |
144 } | 142 } |
145 } | 143 } |
146 | 144 |
147 glog.Infoln("Done updating test details.") | 145 glog.Infoln("Done updating test details.") |
148 } | 146 } |
149 | 147 |
150 func (a *Analyzer) processOneTestDetail(testName string, testTraces []*LabeledTr
ace, resultCh chan<- *GUITestDetail) { | 148 func (a *Analyzer) processOneTestDetail(testName string, testTraces []*LabeledTr
ace, resultCh chan<- *GUITestDetail) { |
151 untriagedDigests := map[string]*GUIUntriagedDigest{} | 149 untriagedDigests := map[string]*GUIUntriagedDigest{} |
152 positiveDigests := map[string]*DigestInfo{} | 150 positiveDigests := map[string]*DigestInfo{} |
153 negativeDigests := map[string]*DigestInfo{} | 151 negativeDigests := map[string]*DigestInfo{} |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
310 result = append(result, &GUIDiffMetric{ | 308 result = append(result, &GUIDiffMetric{ |
311 NumDiffPixels: dm.NumDiffPixels, | 309 NumDiffPixels: dm.NumDiffPixels, |
312 PixelDiffPercent: dm.PixelDiffPercent, | 310 PixelDiffPercent: dm.PixelDiffPercent, |
313 MaxRGBADiffs: dm.MaxRGBADiffs, | 311 MaxRGBADiffs: dm.MaxRGBADiffs, |
314 DiffImgUrl: a.pathToURLConverter(dm.PixelDiffFileP
ath), | 312 DiffImgUrl: a.pathToURLConverter(dm.PixelDiffFileP
ath), |
315 PosDigest: posDigest, | 313 PosDigest: posDigest, |
316 }) | 314 }) |
317 } | 315 } |
318 return result | 316 return result |
319 } | 317 } |
OLD | NEW |