dashboard: add tests for ShouldRunDistTest

Fixes a TODO that this was untested. (It used to be scattered all over
and hard to test, but now we have all the policy behind a single
method, so test it.)

And add tests for golang/go#29509 too, which seems like it should work.

Change-Id: I6d1f517e2014766c26538193c6b42106a4078a9b
Reviewed-on: https://go-review.googlesource.com/c/build/+/170398
Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
diff --git a/dashboard/builders.go b/dashboard/builders.go
index c1425e6..0bc8e8b 100644
--- a/dashboard/builders.go
+++ b/dashboard/builders.go
@@ -972,7 +972,6 @@
 // otherwise. Certain portable, slow tests are only run on fast builders in
 // trybot mode.
 func (c *BuildConfig) ShouldRunDistTest(distTest string, isTry bool) bool {
-	// TODO: add a table of tests in builders_test.go.
 	if c.shouldRunDistTest != nil {
 		return c.shouldRunDistTest(distTest, isTry)
 	}
diff --git a/dashboard/builders_test.go b/dashboard/builders_test.go
index cbae025..8e6d5f2 100644
--- a/dashboard/builders_test.go
+++ b/dashboard/builders_test.go
@@ -489,3 +489,49 @@
 		t.Error("got = false; want true")
 	}
 }
+
+func TestShouldRunDistTest(t *testing.T) {
+	type buildMode int
+	const (
+		tryMode    buildMode = 0
+		postSubmit buildMode = 1
+	)
+
+	tests := []struct {
+		builder string
+		test    string
+		mode    buildMode
+		want    bool
+	}{
+		{"linux-amd64", "api", postSubmit, true},
+		{"linux-amd64", "api", tryMode, true},
+
+		{"linux-amd64", "reboot", tryMode, true},
+		{"linux-amd64-race", "reboot", tryMode, false},
+
+		{"darwin-amd64-10_10", "test:foo", postSubmit, false},
+		{"darwin-amd64-10_11", "test:foo", postSubmit, false},
+		{"darwin-amd64-10_12", "test:foo", postSubmit, false},
+		{"darwin-amd64-10_14", "test:foo", postSubmit, false},
+		{"darwin-amd64-10_14", "test:foo", postSubmit, false},
+		{"darwin-amd64-10_14", "reboot", postSubmit, false},
+		{"darwin-amd64-10_14", "api", postSubmit, false},
+		{"darwin-amd64-10_14", "codewalk", postSubmit, false},
+	}
+	for _, tt := range tests {
+		bc, ok := Builders[tt.builder]
+		if !ok {
+			t.Errorf("unknown builder %q", tt.builder)
+			continue
+		}
+		isTry := tt.mode == tryMode
+		if isTry && !bc.BuildsRepoTryBot("go", "master", "master") {
+			t.Errorf("builder %q is not a trybot, so can't run test %q in try mode", tt.builder, tt.test)
+			continue
+		}
+		got := bc.ShouldRunDistTest(tt.test, isTry)
+		if got != tt.want {
+			t.Errorf("%q.ShouldRunDistTest(%q, try %v) = %v; want %v", tt.builder, tt.test, isTry, got, tt.want)
+		}
+	}
+}