| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 package analyzer | 5 package analyzer |
| 6 | 6 |
| 7 import ( | 7 import ( |
| 8 "fmt" | 8 "fmt" |
| 9 "infra/monitoring/messages" | 9 "infra/monitoring/messages" |
| 10 "reflect" | 10 "reflect" |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 94 name: "Future master", | 94 name: "Future master", |
| 95 url: "http://fake.master", | 95 url: "http://fake.master", |
| 96 be: messages.BuildExtract{ | 96 be: messages.BuildExtract{ |
| 97 CreatedTimestamp: messages.EpochTime(110), | 97 CreatedTimestamp: messages.EpochTime(110), |
| 98 }, | 98 }, |
| 99 t: time.Unix(100, 0), | 99 t: time.Unix(100, 0), |
| 100 want: []messages.Alert{}, | 100 want: []messages.Alert{}, |
| 101 }, | 101 }, |
| 102 } | 102 } |
| 103 | 103 |
| 104 » a := New(&mockClient{}, 10) | 104 » a := New(&mockClient{}, 0, 10) |
| 105 | 105 |
| 106 for _, test := range tests { | 106 for _, test := range tests { |
| 107 a.now = fakeNow(test.t) | 107 a.now = fakeNow(test.t) |
| 108 got := a.MasterAlerts(test.url, &test.be) | 108 got := a.MasterAlerts(test.url, &test.be) |
| 109 if !reflect.DeepEqual(got, test.want) { | 109 if !reflect.DeepEqual(got, test.want) { |
| 110 t.Errorf("%s failed. Got %+v, want: %+v", test.name, got
, test.want) | 110 t.Errorf("%s failed. Got %+v, want: %+v", test.name, got
, test.want) |
| 111 } | 111 } |
| 112 } | 112 } |
| 113 } | 113 } |
| 114 | 114 |
| 115 func TestBuilderAlerts(t *testing.T) { | 115 func TestBuilderAlerts(t *testing.T) { |
| 116 tests := []struct { | 116 tests := []struct { |
| 117 name string | 117 name string |
| 118 url string | 118 url string |
| 119 be messages.BuildExtract | 119 be messages.BuildExtract |
| 120 filter string | 120 filter string |
| 121 t time.Time | 121 t time.Time |
| 122 wantBuilders []messages.Alert | 122 wantBuilders []messages.Alert |
| 123 wantMasters []messages.Alert | 123 wantMasters []messages.Alert |
| 124 }{ | 124 }{ |
| 125 { | 125 { |
| 126 name: "Empty", | 126 name: "Empty", |
| 127 url: "https://build.chromium.org/p/fake.master/
json", |
| 127 wantBuilders: []messages.Alert{}, | 128 wantBuilders: []messages.Alert{}, |
| 128 wantMasters: []messages.Alert{}, | 129 wantMasters: []messages.Alert{}, |
| 129 }, | 130 }, |
| 130 { | 131 { |
| 131 name: "No Alerts", | 132 name: "No Alerts", |
| 132 » » » url: "http://fake.master", | 133 » » » url: "https://build.chromium.org/p/fake.master/json", |
| 133 be: messages.BuildExtract{ | 134 be: messages.BuildExtract{ |
| 134 CreatedTimestamp: messages.EpochTime(100), | 135 CreatedTimestamp: messages.EpochTime(100), |
| 135 }, | 136 }, |
| 136 t: time.Unix(100, 0), | 137 t: time.Unix(100, 0), |
| 137 wantBuilders: []messages.Alert{}, | 138 wantBuilders: []messages.Alert{}, |
| 138 wantMasters: []messages.Alert{}, | 139 wantMasters: []messages.Alert{}, |
| 139 }, | 140 }, |
| 140 } | 141 } |
| 141 | 142 |
| 142 » a := New(&mockClient{}, 10) | 143 » a := New(&mockClient{}, 0, 10) |
| 143 | 144 |
| 144 for _, test := range tests { | 145 for _, test := range tests { |
| 145 a.now = fakeNow(test.t) | 146 a.now = fakeNow(test.t) |
| 146 got := a.BuilderAlerts(test.url, &test.be) | 147 got := a.BuilderAlerts(test.url, &test.be) |
| 147 if !reflect.DeepEqual(got, test.wantBuilders) { | 148 if !reflect.DeepEqual(got, test.wantBuilders) { |
| 148 t.Errorf("%s failed. Got %+v, want: %+v", test.name, got
, test.wantBuilders) | 149 t.Errorf("%s failed. Got %+v, want: %+v", test.name, got
, test.wantBuilders) |
| 149 } | 150 } |
| 150 } | 151 } |
| 151 } | 152 } |
| 152 | 153 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 }, | 207 }, |
| 207 b: messages.Builders{ | 208 b: messages.Builders{ |
| 208 State: messages.StateBuilding, | 209 State: messages.StateBuilding, |
| 209 BuilderName: "fake.builder", | 210 BuilderName: "fake.builder", |
| 210 CachedBuilds: []int64{0, 1, 2, 3}, | 211 CachedBuilds: []int64{0, 1, 2, 3}, |
| 211 CurrentBuilds: []int64{5, 6, 7, 8}, | 212 CurrentBuilds: []int64{5, 6, 7, 8}, |
| 212 }, | 213 }, |
| 213 time: time.Unix(0, 0).Add(4 * time.Hour), | 214 time: time.Unix(0, 0).Add(4 * time.Hour), |
| 214 wantAlerts: []messages.Alert{ | 215 wantAlerts: []messages.Alert{ |
| 215 { | 216 { |
| 216 » » » » » Key: "fake.master.fake.builder.hung", | 217 » » » » » Key: "fake.master.fake.builder.hung
", |
| 217 » » » » » Title: "fake.master.fake.builder is hung
in step fake_step.", | 218 » » » » » Title: "fake.master.fake.builder is h
ung in step fake_step.", |
| 218 » » » » » Time: messages.TimeToEpochTime(time.Uni
x(0, 0).Add(4 * time.Hour)), | 219 » » » » » Time: messages.TimeToEpochTime(time.
Unix(0, 0).Add(4 * time.Hour)), |
| 219 » » » » » Body: "fake.master.fake.builder has bee
n building for 3h59m50s (last step update 1970-01-01 00:00:10 +0000 UTC), past t
he alerting threshold of 3h0m0s", | 220 » » » » » Body: "fake.master.fake.builder has
been building for 3h59m50s (last step update 1970-01-01 00:00:10 +0000 UTC), pas
t the alerting threshold of 3h0m0s", |
| 221 » » » » » Severity: 1, |
| 220 Links: []messages.Link{ | 222 Links: []messages.Link{ |
| 221 {Title: "Builder", Href: "https:
//build.chromium.org/p/fake.master/builders/fake.builder"}, | 223 {Title: "Builder", Href: "https:
//build.chromium.org/p/fake.master/builders/fake.builder"}, |
| 222 {Title: "Last build", Href: "htt
ps://build.chromium.org/p/fake.master/builders/fake.builder/builds/3"}, | 224 {Title: "Last build", Href: "htt
ps://build.chromium.org/p/fake.master/builders/fake.builder/builds/3"}, |
| 223 {Title: "Last build step", Href:
"https://build.chromium.org/p/fake.master/builders/fake.builder/builds/3/steps/
fake_step"}, | 225 {Title: "Last build step", Href:
"https://build.chromium.org/p/fake.master/builders/fake.builder/builds/3/steps/
fake_step"}, |
| 224 }, | 226 }, |
| 225 }, | 227 }, |
| 226 }, | 228 }, |
| 227 wantErrs: []error{}, | 229 wantErrs: []error{}, |
| 228 }, | 230 }, |
| 229 } | 231 } |
| 230 | 232 |
| 231 » a := New(nil, 10) | 233 » a := New(nil, 0, 10) |
| 232 | 234 |
| 233 for _, test := range tests { | 235 for _, test := range tests { |
| 234 a.now = fakeNow(test.time) | 236 a.now = fakeNow(test.time) |
| 235 a.Client = mockClient{ | 237 a.Client = mockClient{ |
| 236 build: test.builds, | 238 build: test.builds, |
| 237 } | 239 } |
| 238 gotAlerts, gotErrs := a.builderAlerts(test.master, test.builder,
&test.b) | 240 gotAlerts, gotErrs := a.builderAlerts(test.master, test.builder,
&test.b) |
| 239 if !reflect.DeepEqual(gotAlerts, test.wantAlerts) { | 241 if !reflect.DeepEqual(gotAlerts, test.wantAlerts) { |
| 240 t.Errorf("%s failed. Got:\n%+v, want:\n%+v", test.name,
gotAlerts, test.wantAlerts) | 242 t.Errorf("%s failed. Got:\n%+v, want:\n%+v", test.name,
gotAlerts, test.wantAlerts) |
| 241 } | 243 } |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 295 want: []string{}, | 297 want: []string{}, |
| 296 }, | 298 }, |
| 297 { | 299 { |
| 298 name: "GTests", | 300 name: "GTests", |
| 299 f: stepFailure{ | 301 f: stepFailure{ |
| 300 step: messages.Steps{ | 302 step: messages.Steps{ |
| 301 Name: "something_tests", | 303 Name: "something_tests", |
| 302 }, | 304 }, |
| 303 }, | 305 }, |
| 304 testResults: &messages.TestResults{ | 306 testResults: &messages.TestResults{ |
| 305 » » » » Tests: map[string]messages.TestResult{ | 307 » » » » Tests: map[string]interface{}{ |
| 306 » » » » » "test a": messages.TestResult{ | 308 » » » » » "test a": map[string]interface{}{ |
| 307 » » » » » » Expected: "PASS", | 309 » » » » » » "expected": "PASS", |
| 308 » » » » » » Actual: "FAIL", | 310 » » » » » » "actual": "FAIL", |
| 309 }, | 311 }, |
| 310 }, | 312 }, |
| 311 }, | 313 }, |
| 312 want: []string{"test a"}, | 314 want: []string{"test a"}, |
| 313 }, | 315 }, |
| 314 } | 316 } |
| 315 | 317 |
| 316 mc := &mockClient{} | 318 mc := &mockClient{} |
| 317 » a := New(mc, 10) | 319 » a := New(mc, 0, 10) |
| 318 | 320 |
| 319 for _, test := range tests { | 321 for _, test := range tests { |
| 320 mc.testResults = test.testResults | 322 mc.testResults = test.testResults |
| 321 got := a.reasonsForFailure(test.f) | 323 got := a.reasonsForFailure(test.f) |
| 322 if !reflect.DeepEqual(got, test.want) { | 324 if !reflect.DeepEqual(got, test.want) { |
| 323 t.Errorf("% s failed. Got: %+v, want: %+v", test.name, g
ot, test.want) | 325 t.Errorf("% s failed. Got: %+v, want: %+v", test.name, g
ot, test.want) |
| 324 } | 326 } |
| 325 } | 327 } |
| 326 } | 328 } |
| 327 | 329 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 Name: "broken_step", | 385 Name: "broken_step", |
| 384 IsFinished: true, | 386 IsFinished: true, |
| 385 Results: []interface{}{float6
4(3)}, | 387 Results: []interface{}{float6
4(3)}, |
| 386 }, | 388 }, |
| 387 }, | 389 }, |
| 388 }, | 390 }, |
| 389 }, | 391 }, |
| 390 } | 392 } |
| 391 | 393 |
| 392 mc := &mockClient{} | 394 mc := &mockClient{} |
| 393 » a := New(mc, 10) | 395 » a := New(mc, 0, 10) |
| 394 | 396 |
| 395 for _, test := range tests { | 397 for _, test := range tests { |
| 396 mc.build = test.b | 398 mc.build = test.b |
| 397 a.bCache = test.bCache | 399 a.bCache = test.bCache |
| 398 got, err := a.stepFailures(test.master, test.builder, test.bID) | 400 got, err := a.stepFailures(test.master, test.builder, test.bID) |
| 399 if !reflect.DeepEqual(got, test.want) { | 401 if !reflect.DeepEqual(got, test.want) { |
| 400 t.Errorf("%s failed.\nGot:\n%+v\nwant:\n%+v", test.name,
got, test.want) | 402 t.Errorf("%s failed.\nGot:\n%+v\nwant:\n%+v", test.name,
got, test.want) |
| 401 } | 403 } |
| 402 if !reflect.DeepEqual(err, test.wantErr) { | 404 if !reflect.DeepEqual(err, test.wantErr) { |
| 403 t.Errorf("%s failed. Got %+v, want %+v", test.name, err,
test.wantErr) | 405 t.Errorf("%s failed. Got %+v, want %+v", test.name, err,
test.wantErr) |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 517 messages.TimeToEpochTime
(time.Unix(7, 0)), | 519 messages.TimeToEpochTime
(time.Unix(7, 0)), |
| 518 }, | 520 }, |
| 519 }, | 521 }, |
| 520 }, | 522 }, |
| 521 }, | 523 }, |
| 522 wantStep: StepCompletedRun, | 524 wantStep: StepCompletedRun, |
| 523 wantUpdate: messages.TimeToEpochTime(time.Unix(42, 0)), | 525 wantUpdate: messages.TimeToEpochTime(time.Unix(42, 0)), |
| 524 }, | 526 }, |
| 525 } | 527 } |
| 526 | 528 |
| 527 » a := New(&mockClient{}, 10) | 529 » a := New(&mockClient{}, 0, 10) |
| 528 a.now = fakeNow(time.Unix(0, 0)) | 530 a.now = fakeNow(time.Unix(0, 0)) |
| 529 for _, test := range tests { | 531 for _, test := range tests { |
| 530 gotStep, gotUpdate, gotErr := a.latestBuildStep(&test.b) | 532 gotStep, gotUpdate, gotErr := a.latestBuildStep(&test.b) |
| 531 if gotStep != test.wantStep { | 533 if gotStep != test.wantStep { |
| 532 t.Errorf("%s failed. Got %q, want %q.", test.name, gotSt
ep, test.wantStep) | 534 t.Errorf("%s failed. Got %q, want %q.", test.name, gotSt
ep, test.wantStep) |
| 533 } | 535 } |
| 534 if gotUpdate != test.wantUpdate { | 536 if gotUpdate != test.wantUpdate { |
| 535 t.Errorf("%s failed. Got %v, want %v.", test.name, gotUp
date, test.wantUpdate) | 537 t.Errorf("%s failed. Got %v, want %v.", test.name, gotUp
date, test.wantUpdate) |
| 536 } | 538 } |
| 537 if gotErr != test.wantErr { | 539 if gotErr != test.wantErr { |
| 538 t.Errorf("%s failed. Got %s, want %s.", test.name, gotEr
r, test.wantErr) | 540 t.Errorf("%s failed. Got %s, want %s.", test.name, gotEr
r, test.wantErr) |
| 539 } | 541 } |
| 540 } | 542 } |
| 541 } | 543 } |
| OLD | NEW |