aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2019-07-25 16:31:25 +0200
committerDmitry Vyukov <dvyukov@google.com>2019-07-25 16:31:25 +0200
commit732bc5a0a4cc7468b8abfdf8ba14f349f6d8acfa (patch)
treec9ef98d9b05826aabbd5853c932dd8c276743202
parent0d7a12498b5f3c21ae69e98633823e357742fa31 (diff)
dashboard/app: ensure that tests consume all external reports
Ensure that tests consume all external reports as we already do for emails. Reports is the most important thing because they involve people, so tests need to be explicit and we want to notice changes in any reporting.
-rw-r--r--dashboard/app/app_test.go3
-rw-r--r--dashboard/app/fix_test.go1
-rw-r--r--dashboard/app/repro_test.go46
-rw-r--r--dashboard/app/util_test.go5
4 files changed, 39 insertions, 16 deletions
diff --git a/dashboard/app/app_test.go b/dashboard/app/app_test.go
index a131e40cc..8b4e45bab 100644
--- a/dashboard/app/app_test.go
+++ b/dashboard/app/app_test.go
@@ -310,12 +310,14 @@ func TestApp(t *testing.T) {
crash1 := testCrash(build, 1)
c.client.ReportCrash(crash1)
+ c.client.pollBug()
// Test that namespace isolation works.
c.expectFail("unknown build", apiClient2.Query("report_crash", crash1, nil))
crash2 := testCrashWithRepro(build, 2)
c.client.ReportCrash(crash2)
+ c.client.pollBug()
// Provoke purgeOldCrashes.
for i := 0; i < 30; i++ {
@@ -324,6 +326,7 @@ func TestApp(t *testing.T) {
crash.Report = []byte(fmt.Sprintf("report%v", i))
c.client.ReportCrash(crash)
}
+ c.client.pollBug()
cid := &dashapi.CrashID{
BuildID: "build1",
diff --git a/dashboard/app/fix_test.go b/dashboard/app/fix_test.go
index 448ee73a7..d79b69c94 100644
--- a/dashboard/app/fix_test.go
+++ b/dashboard/app/fix_test.go
@@ -82,6 +82,7 @@ func TestFixBasic(t *testing.T) {
// Regression test: previously upstreamming failed because the new bug had fixing commits.
c.client.ReportCrash(crash1)
c.client.updateBug(rep2.ID, dashapi.BugStatusUpstream, "")
+ c.client.pollBug()
}
// Test bug that is fixed by 2 commits.
diff --git a/dashboard/app/repro_test.go b/dashboard/app/repro_test.go
index 25f0ad938..fd08dc933 100644
--- a/dashboard/app/repro_test.go
+++ b/dashboard/app/repro_test.go
@@ -16,7 +16,7 @@ import (
// - upload crash -> need repro
// - upload syz repro -> still need repro
// - upload C repro -> don't need repro
-func testNeedRepro1(t *testing.T, crashCtor func(c *Ctx) *dashapi.Crash) {
+func testNeedRepro1(t *testing.T, crashCtor func(c *Ctx) *dashapi.Crash, newBug bool) {
c := NewCtx(t)
defer c.Close()
@@ -51,15 +51,18 @@ func testNeedRepro1(t *testing.T, crashCtor func(c *Ctx) *dashapi.Crash) {
resp, _ = c.client.ReportCrash(crash2)
c.expectEQ(resp.NeedRepro, false)
+ if newBug {
+ c.client.pollBug()
+ }
}
-func TestNeedRepro1_normal(t *testing.T) { testNeedRepro1(t, normalCrash) }
-func TestNeedRepro1_dup(t *testing.T) { testNeedRepro1(t, dupCrash) }
-func TestNeedRepro1_closed(t *testing.T) { testNeedRepro1(t, closedCrash) }
-func TestNeedRepro1_closedRepro(t *testing.T) { testNeedRepro1(t, closedWithReproCrash) }
+func TestNeedRepro1_normal(t *testing.T) { testNeedRepro1(t, normalCrash, true) }
+func TestNeedRepro1_dup(t *testing.T) { testNeedRepro1(t, dupCrash, false) }
+func TestNeedRepro1_closed(t *testing.T) { testNeedRepro1(t, closedCrash, true) }
+func TestNeedRepro1_closedRepro(t *testing.T) { testNeedRepro1(t, closedWithReproCrash, true) }
// Upload C repro with first crash -> don't need repro.
-func testNeedRepro2(t *testing.T, crashCtor func(c *Ctx) *dashapi.Crash) {
+func testNeedRepro2(t *testing.T, crashCtor func(c *Ctx) *dashapi.Crash, newBug bool) {
c := NewCtx(t)
defer c.Close()
@@ -72,12 +75,15 @@ func testNeedRepro2(t *testing.T, crashCtor func(c *Ctx) *dashapi.Crash) {
needRepro, _ := c.client.NeedRepro(testCrashID(crash1))
c.expectEQ(needRepro, false)
+ if newBug {
+ c.client.pollBug()
+ }
}
-func TestNeedRepro2_normal(t *testing.T) { testNeedRepro2(t, normalCrash) }
-func TestNeedRepro2_dup(t *testing.T) { testNeedRepro2(t, dupCrash) }
-func TestNeedRepro2_closed(t *testing.T) { testNeedRepro2(t, closedCrash) }
-func TestNeedRepro2_closedRepro(t *testing.T) { testNeedRepro2(t, closedWithReproCrash) }
+func TestNeedRepro2_normal(t *testing.T) { testNeedRepro2(t, normalCrash, true) }
+func TestNeedRepro2_dup(t *testing.T) { testNeedRepro2(t, dupCrash, false) }
+func TestNeedRepro2_closed(t *testing.T) { testNeedRepro2(t, closedCrash, true) }
+func TestNeedRepro2_closedRepro(t *testing.T) { testNeedRepro2(t, closedWithReproCrash, true) }
// Test that after uploading 5 failed repros, app stops requesting repros.
func testNeedRepro3(t *testing.T, crashCtor func(c *Ctx) *dashapi.Crash) {
@@ -119,7 +125,7 @@ func TestNeedRepro3_closed(t *testing.T) { testNeedRepro3(t, closedCrash) }
func TestNeedRepro3_closedRepro(t *testing.T) { testNeedRepro3(t, closedWithReproCrash) }
// Test that after uploading 5 syz repros, app stops requesting repros.
-func testNeedRepro4(t *testing.T, crashCtor func(c *Ctx) *dashapi.Crash) {
+func testNeedRepro4(t *testing.T, crashCtor func(c *Ctx) *dashapi.Crash, newBug bool) {
c := NewCtx(t)
defer c.Close()
@@ -147,17 +153,23 @@ func testNeedRepro4(t *testing.T, crashCtor func(c *Ctx) *dashapi.Crash) {
c.expectEQ(resp.NeedRepro, false)
needRepro, _ = c.client.NeedRepro(testCrashID(crash1))
c.expectEQ(needRepro, false)
+ if newBug {
+ c.client.pollBug()
+ }
}
-func TestNeedRepro4_normal(t *testing.T) { testNeedRepro4(t, normalCrash) }
-func TestNeedRepro4_dup(t *testing.T) { testNeedRepro4(t, dupCrash) }
-func TestNeedRepro4_closed(t *testing.T) { testNeedRepro4(t, closedCrash) }
-func TestNeedRepro4_closedRepro(t *testing.T) { testNeedRepro4(t, closedWithReproCrash) }
+func TestNeedRepro4_normal(t *testing.T) { testNeedRepro4(t, normalCrash, true) }
+func TestNeedRepro4_dup(t *testing.T) { testNeedRepro4(t, dupCrash, false) }
+func TestNeedRepro4_closed(t *testing.T) { testNeedRepro4(t, closedCrash, true) }
+func TestNeedRepro4_closedRepro(t *testing.T) { testNeedRepro4(t, closedWithReproCrash, true) }
func normalCrash(c *Ctx) *dashapi.Crash {
build := testBuild(1)
c.client.UploadBuild(build)
- return testCrash(build, 1)
+ crash := testCrash(build, 1)
+ c.client.ReportCrash(crash)
+ c.client.pollBug()
+ return crash
}
func dupCrash(c *Ctx) *dashapi.Crash {
@@ -194,5 +206,7 @@ func closedCrashImpl(c *Ctx, withRepro bool) *dashapi.Crash {
c.client.updateBug(rep.ID, dashapi.BugStatusInvalid, "")
crash.ReproC = nil
+ c.client.ReportCrash(crash)
+ c.client.pollBug()
return crash
}
diff --git a/dashboard/app/util_test.go b/dashboard/app/util_test.go
index 94b1f4578..1d98b0e6d 100644
--- a/dashboard/app/util_test.go
+++ b/dashboard/app/util_test.go
@@ -157,6 +157,11 @@ func (c *Ctx) Close() {
for len(c.emailSink) != 0 {
c.t.Errorf("ERROR: leftover email: %v", (<-c.emailSink).Body)
}
+ // No pending external reports (tests need to consume them).
+ resp, _ := c.client.ReportingPollBugs("test")
+ for _, rep := range resp.Reports {
+ c.t.Errorf("ERROR: leftover external report:\n%#v", rep)
+ }
}
unregisterContext(c)
c.inst.Close()