blob: 79389cfc9801173f1a9ab01d1fdb5d4072ccabc2 [file] [log] [blame]
// Copyright 2020 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build go1.13 && linux
// +build go1.13,linux
package dashboard
import (
"context"
"io/ioutil"
"net/http"
"net/http/httptest"
"testing"
"time"
"github.com/google/go-cmp/cmp"
"golang.org/x/build/dashboard"
"golang.org/x/build/maintner/maintnerd/apipb"
"golang.org/x/build/types"
grpc4 "grpc.go4.org"
)
type fakeMaintner struct {
resp *apipb.DashboardResponse
}
func (f *fakeMaintner) GetDashboard(ctx context.Context, in *apipb.DashboardRequest, opts ...grpc4.CallOption) (*apipb.DashboardResponse, error) {
return f.resp, nil
}
func TestHandlerServeHTTP(t *testing.T) {
fm := &fakeMaintner{
resp: &apipb.DashboardResponse{Commits: []*apipb.DashCommit{
{
Title: "x/build/cmd/coordinator: implement dashboard",
Commit: "752029e171d535b0dd4ff7bbad5ad0275a3969a8",
CommitTimeSec: 1257894000,
AuthorName: "Gopherbot",
AuthorEmail: "gopherbot@example.com",
},
}},
}
dh := &Handler{
Maintner: fm,
memoryResults: map[string][]string{
"752029e171d535b0dd4ff7bbad5ad0275a3969a8": {"linux-amd64-longtest|true|SomeLog|752029e171d535b0dd4ff7bbad5ad0275a3969a8"},
},
}
req := httptest.NewRequest("GET", "/dashboard", nil)
w := httptest.NewRecorder()
dh.ServeHTTP(w, req)
resp := w.Result()
defer resp.Body.Close()
ioutil.ReadAll(resp.Body)
if resp.StatusCode != http.StatusOK {
t.Errorf("resp.StatusCode = %d, wanted %d", resp.StatusCode, http.StatusOK)
}
}
func TestHandlerCommits(t *testing.T) {
fm := &fakeMaintner{
resp: &apipb.DashboardResponse{Commits: []*apipb.DashCommit{
{
Title: "x/build/cmd/coordinator: implement dashboard",
Commit: "752029e171d535b0dd4ff7bbad5ad0275a3969a8",
CommitTimeSec: 1257894000,
AuthorName: "Gopherbot",
AuthorEmail: "gopherbot@example.com",
},
}},
}
dh := &Handler{
Maintner: fm,
memoryResults: map[string][]string{
"752029e171d535b0dd4ff7bbad5ad0275a3969a8": {"test-builder|true|SomeLog|752029e171d535b0dd4ff7bbad5ad0275a3969a8"},
},
}
want := []*commit{
{
Desc: "x/build/cmd/coordinator: implement dashboard",
Hash: "752029e171d535b0dd4ff7bbad5ad0275a3969a8",
Time: time.Unix(1257894000, 0).Format("02 Jan 15:04"),
User: "Gopherbot <gopherbot@example.com>",
ResultData: []string{"test-builder|true|SomeLog|752029e171d535b0dd4ff7bbad5ad0275a3969a8"},
},
}
got := dh.commits(context.Background())
if diff := cmp.Diff(want, got); diff != "" {
t.Errorf("dh.Commits() mismatch (-want +got):\n%s", diff)
}
}
func TestHandlerGetBuilders(t *testing.T) {
dh := &Handler{}
builders := map[string]*dashboard.BuildConfig{
"linux-amd64-testfile": {
Name: "linux-amd64-testfile",
HostType: "this-is-a-test-file",
Notes: "",
MinimumGoVersion: types.MajorMinor{},
},
"linux-386-testfile": {
Name: "linux-386-testfile",
HostType: "this-is-a-test-file",
Notes: "",
MinimumGoVersion: types.MajorMinor{},
},
"darwin-amd64-testfile": {
Name: "darwin-amd64-testfile",
HostType: "this-is-a-test-file",
Notes: "",
MinimumGoVersion: types.MajorMinor{},
},
"android-386-testfile": {
Name: "android-386-testfile",
HostType: "this-is-a-test-file",
Notes: "",
MinimumGoVersion: types.MajorMinor{},
},
}
want := []*builder{
{
OS: "darwin",
Archs: []*arch{
{
Arch: "amd64",
Name: "darwin-amd64-testfile",
Tag: "testfile",
},
},
},
{
OS: "linux",
Archs: []*arch{
{
Arch: "386",
Name: "linux-386-testfile",
Tag: "testfile",
},
{
Arch: "amd64",
Name: "linux-amd64-testfile",
Tag: "testfile",
},
},
},
{
OS: "android",
Archs: []*arch{
{
Arch: "386",
Name: "android-386-testfile",
Tag: "testfile",
},
},
},
}
got := dh.getBuilders(builders)
if diff := cmp.Diff(want, got); diff != "" {
t.Errorf("dh.getBuilders() mismatch (-want +got):\n%s", diff)
}
}
func TestArchFirstClass(t *testing.T) {
cases := []struct {
name string
want bool
}{
{
name: "linux-amd64-longtest",
want: true,
},
{
name: "linux-buzz-longtest",
want: false,
},
{
name: "linux-amd64",
want: true,
},
{
name: "linux",
want: false,
},
}
for _, c := range cases {
a := &arch{Name: c.name}
if a.FirstClass() != c.want {
t.Errorf("%+v.FirstClass() = %v, wanted %v", a, a.FirstClass(), c.want)
}
}
}
func TestCommitResultForBuilder(t *testing.T) {
c := &commit{
Desc: "x/build/cmd/coordinator: implement dashboard",
Hash: "752029e171d535b0dd4ff7bbad5ad0275a3969a8",
Time: "10 Nov 18:00",
User: "Gopherbot <gopherbot@example.com>",
ResultData: []string{"test-builder|true|SomeLog|752029e171d535b0dd4ff7bbad5ad0275a3969a8"},
}
want := result{
OK: true,
LogHash: "SomeLog",
}
got := c.ResultForBuilder("test-builder")
if diff := cmp.Diff(want, got); diff != "" {
t.Errorf("c.ResultForBuilder(%q) mismatch (-want +got):\n%s", "test-builder", diff)
}
}