blob: bd6b12dd928dd3527c438b9f8d567762fc2eb0be [file] [log] [blame]
// Copyright 2017 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.
package main
import (
"context"
"flag"
"fmt"
"sync"
"testing"
"time"
"golang.org/x/build/maintner"
"golang.org/x/build/maintner/godata"
"golang.org/x/build/maintner/maintnerd/apipb"
)
func TestGetRef(t *testing.T) {
c := getGoData(t)
s := apiService{c}
req := &apipb.GetRefRequest{
GerritServer: "go.googlesource.com",
GerritProject: "go",
Ref: "refs/heads/master",
}
res, err := s.GetRef(context.Background(), req)
if err != nil {
t.Fatal(err)
}
if len(res.Value) != 40 {
t.Errorf("go master ref = %q; want length 40 string", res.Value)
}
// Bogus ref
req.Ref = "NOT EXIST REF"
res, err = s.GetRef(context.Background(), req)
if err != nil {
t.Fatal(err)
}
if len(res.Value) != 0 {
t.Errorf("go bogus ref = %q; want empty string", res.Value)
}
// Bogus project
req.GerritProject = "NOT EXIST PROJ"
_, err = s.GetRef(context.Background(), req)
if got, want := fmt.Sprint(err), "unknown gerrit project"; got != want {
t.Errorf("error for bogus project = %q; want %q", got, want)
}
}
var hitGerrit = flag.Bool("hit_gerrit", false, "query production Gerrit in TestFindTryWork")
func TestFindTryWork(t *testing.T) {
if testing.Short() {
t.Skip("skipping in short mode")
}
if !*hitGerrit {
t.Skip("skipping without flag --hit_gerrit")
}
c := getGoData(t)
s := apiService{c}
req := &apipb.GoFindTryWorkRequest{}
t0 := time.Now()
res, err := s.GoFindTryWork(context.Background(), req)
d0 := time.Since(t0)
if err != nil {
t.Fatal(err)
}
// Just for interactive debugging. This is using live data.
// The stable tests are in TestTryWorkItem and TestTryBotStatus.
t.Logf("Current: %v", res)
t1 := time.Now()
res, err = s.GoFindTryWork(context.Background(), req)
d1 := time.Since(t1)
t.Logf("Latency: %v, then %v", d0, d1)
t.Logf("Cached: %v, %v", res, err)
}
func TestTryBotStatus(t *testing.T) {
c := getGoData(t)
tests := []struct {
proj string
clnum int32
msgCutoff int
wantTry bool
wantDone bool
}{
{"go", 51430, 1, true, false},
{"go", 51430, 2, true, false},
{"go", 51430, 3, true, true},
{"build", 48968, 5, true, false}, // adding trybot (coordinator ignores for "build" repo)
{"build", 48968, 6, false, false}, // removing it
}
for _, tt := range tests {
cl := c.Gerrit().Project("go.googlesource.com", tt.proj).CL(tt.clnum)
if cl == nil {
t.Errorf("CL %d in %s not found", tt.clnum, tt.proj)
continue
}
old := *cl // save before mutations
cl.Version = cl.Messages[tt.msgCutoff-1].Version
cl.Messages = cl.Messages[:tt.msgCutoff]
gotTry, gotDone := tryBotStatus(cl, false /* not staging */)
if gotTry != tt.wantTry || gotDone != tt.wantDone {
t.Errorf("tryBotStatus(%q, %d) after %d messages = try/done %v, %v; want %v, %v",
tt.proj, tt.clnum, tt.msgCutoff, gotTry, gotDone, tt.wantTry, tt.wantDone)
for _, msg := range cl.Messages {
t.Logf(" msg ver=%d, text=%q", msg.Version, msg.Message)
}
}
*cl = old // restore
}
}
func TestTryWorkItem(t *testing.T) {
c := getGoData(t)
tests := []struct {
proj string
clnum int32
want string
}{
// Same Change-Id, different branch:
{"go", 51430, `project:"go" branch:"master" change_id:"I0bcae339624e7d61037d9ea0885b7bd07491bbb6" commit:"45a4609c0ae214e448612e0bc0846e2f2682f1b2" `},
{"go", 51450, `project:"go" branch:"release-branch.go1.9" change_id:"I0bcae339624e7d61037d9ea0885b7bd07491bbb6" commit:"7320506bc58d3a55eff2c67b2ec65cfa94f7b0a7" `},
// Different project:
{"build", 51432, `project:"build" branch:"master" change_id:"I1f71836da7008e58d3e76e2cc3170e96cd57ddf6" commit:"9251bc9950baff61d95da0761e2e4bfab61ed210" `},
}
for _, tt := range tests {
cl := c.Gerrit().Project("go.googlesource.com", tt.proj).CL(tt.clnum)
if cl == nil {
t.Errorf("CL %d in %s not found", tt.clnum, tt.proj)
continue
}
got := fmt.Sprint(tryWorkItem(cl))
if got != tt.want {
t.Errorf("tryWorkItem(%q, %v) = %#q; want %#q", tt.proj, tt.clnum, got, tt.want)
}
}
}
var (
corpusMu sync.Mutex
corpusCache *maintner.Corpus
)
func getGoData(tb testing.TB) *maintner.Corpus {
corpusMu.Lock()
defer corpusMu.Unlock()
if corpusCache != nil {
return corpusCache
}
var err error
corpusCache, err = godata.Get(context.Background())
if err != nil {
tb.Fatalf("getting corpus: %v", err)
}
return corpusCache
}