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

Side by Side Diff: go/src/infra/appengine/test-results/model/trim.go

Issue 2231393002: test-results: Add merge and trim methods (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: Fix typo in comment Created 4 years, 4 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
(Empty)
1 package model
2
3 import (
4 "errors"
5 "strings"
6 )
7
8 const (
9 // ResultsSize is the size that "results.json" should be trimmed to.
10 ResultsSize = 500
11
12 // ResultsSmallSize is the size that "results_small.json" should
13 // be trimmed to.
14 ResultsSmallSize = 100
15
16 runtimeThresholdNormal float64 = 3
17 runtimeThresholdDebug float64 = 9
18 )
19
20 func isDebugBuilder(builder string) bool {
21 for _, s := range []string{"debug", "dbg"} {
22 if strings.Contains(strings.ToLower(builder), s) {
23 return true
24 }
25 }
26 return false
27 }
28
29 // Trim trims the leaves of Tests in ar to the specified size.
30 func (ar *AggregateResult) Trim(size int) error {
31 t := runtimeThresholdNormal
32
33 if isDebugBuilder(ar.Builder) {
34 t = runtimeThresholdDebug
35 }
36
37 return ar.Tests.trim(size, t)
38 }
39
40 func (at AggregateTest) trim(size int, threshold float64) error {
41 for k, v := range at {
42 if leaf, ok := v.(*AggregateTestLeaf); ok {
43 leaf.trim(size)
44 if leaf.shouldDelete(threshold) {
45 delete(at, k)
46 }
47 continue
48 }
49
50 child, ok := v.(AggregateTest)
51 if !ok {
52 return errors.New("model: trim: expected AggregateTest")
53 }
54 if err := child.trim(size, threshold); err != nil {
55 return err
56 }
57 if len(child) == 0 {
58 delete(at, k)
59 }
60 }
61 return nil
62 }
63
64 func (leaf *AggregateTestLeaf) trim(size int) {
martiniss 2016/08/12 00:14:24 why is size an int here, but threshold is declared
nishanths 2016/08/12 02:37:40 threshold is a float because it is used to compare
65 n := 0
66
67 for i, r := range leaf.Results {
68 leaf.Results[i].Count = min(r.Count, size)
69 n += r.Count
70 if n >= size {
71 leaf.Results = leaf.Results[:i+1]
72 break
73 }
74 }
75
76 n = 0
77
78 for i, r := range leaf.Runtimes {
79 leaf.Runtimes[i].Count = min(r.Count, size)
80 n += r.Count
81 if n >= size {
82 leaf.Runtimes = leaf.Runtimes[:i+1]
83 break
84 }
85 }
86 }
87
88 func min(a, b int) int {
89 if a < b {
90 return a
91 }
92 return b
93 }
94
95 var deletableTypes = map[string]bool{"P": true, "N": true, "Y": true}
96
97 func (leaf *AggregateTestLeaf) shouldDelete(threshold float64) bool {
98 if len(leaf.Expected) == 1 && leaf.Expected[0] != "PASS" {
99 return false
100 }
101 if leaf.Bugs != nil {
102 return false
103 }
104
105 for _, r := range leaf.Results {
106 if !deletableTypes[r.Type] {
107 return false
108 }
109 }
110 for _, r := range leaf.Runtimes {
111 if r.Runtime >= threshold {
112 return false
113 }
114 }
115
116 return true
117 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698