blob: 511643f0e9540f52d3cd210d7e2c3873ad425120 [file] [log] [blame]
// Copyright 2020 Google Inc. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (
"fmt"
"log"
"net/url"
"strconv"
"testing"
"time"
"github.com/google/gerrit-linter/gerrit"
)
func TestSchemeLanguage(t *testing.T) {
lang, ok := checkerLanguage("fmt:commitfooter-Change-Id.1234")
if !ok {
t.Fatalf("checkerLanguage failed")
}
if want := "commitfooter-Change-Id"; lang != want {
t.Errorf("got %q, want %q", lang, want)
}
}
func urlParse(s string) url.URL {
u, err := url.Parse(s)
if err != nil {
panic(err)
}
return *u
}
type ChangeInfo struct {
ChangeId string `json:"change_id"`
Number int `json:"_number"`
}
func createUpdateChecker(t *testing.T, gc *gerritChecker, formatter string) *gerrit.CheckerInfo {
checker, err := gc.PostChecker("gerrit-linter-test", "commitmsg", true)
if err != nil {
// create
checker, err = gc.PostChecker("gerrit-linter-test", "commitmsg", false)
if err != nil {
t.Fatalf("create PostChecker: %v", err)
}
}
return checker
}
type ChangeInput struct {
Project string `json:"project"`
Subject string `json:"subject"`
Branch string `json:"branch"`
}
type EditMessageInput struct {
Message string `json:"message"`
}
func TestBasic(t *testing.T) {
g := gerrit.New(urlParse("http://localhost:8080/"))
g.Authenticator = gerrit.NewBasicAuth("admin:secret")
g.Debug = true
gc, err := NewGerritChecker(g, 75*time.Millisecond)
if err != nil {
t.Fatal(err)
}
go gc.Serve()
if _, err := g.GetPath("/projects/gerrit-linter-test/"); err != nil {
t.Fatalf("GetPath: %v", err)
}
msgChecker := createUpdateChecker(t, gc, "commitmsg")
footerLang := "commitfooter-User-Visible"
footerChecker := createUpdateChecker(t, gc, footerLang)
changeInput := ChangeInput{
Project: "gerrit-linter-test",
Subject: "my linter test change.",
Branch: "master",
}
var change ChangeInfo
if err := g.PostPathJSON("a/changes/",
"application/json",
&changeInput, &change); err != nil {
t.Fatal(err)
}
log.Printf("created change %d", change.Number)
defer func() {
if err := g.PostPathJSON(fmt.Sprintf("a/changes/%d/abandon", change.Number),
"application/json", &EditMessageInput{Message: "test succeeded"}, &struct{}{}); err != nil {
log.Printf("abandon: %v", err)
}
}()
gc.processPendingChecks()
info, err := g.GetCheck(fmt.Sprintf("%d", change.Number), 1, msgChecker.UUID)
if err != nil {
t.Fatal(err)
}
if info.State != statusFail.String() {
t.Fatalf("got %q, want %q", info.State, statusFail)
}
ignored := ""
if err := g.PutPathJSON(fmt.Sprintf("a/changes/%d/message", change.Number), "application/json",
&EditMessageInput{Message: fmt.Sprintf("New Commit message\n\nChange-Id: %s\n", change.ChangeId)},
&ignored); err != nil {
t.Fatalf("edit message: %v", err)
}
gc.processPendingChecks()
if info, err = g.GetCheck(strconv.Itoa(change.Number), 2, msgChecker.UUID); err != nil {
t.Fatalf("2nd GetCheck: %v", err)
} else if info.State != statusSuccessful.String() {
t.Fatalf("got %q, want %q", info.State, statusSuccessful)
}
if info, err = g.GetCheck(strconv.Itoa(change.Number), 2, footerChecker.UUID); err != nil {
t.Fatalf("2nd GetCheck: %v", err)
} else if info.State != statusSuccessful.String() {
t.Fatalf("got %q, want %q", info.State, statusSuccessful)
}
}