Add an e2e against an existing test server

Change-Id: Ib4a204ac5e3c2837b130b0261099da3bc7e1fccd
diff --git a/cmd/checker/checker.go b/cmd/checker/checker.go
index 02b5921..6473174 100644
--- a/cmd/checker/checker.go
+++ b/cmd/checker/checker.go
@@ -34,8 +34,8 @@
 // gerritChecker run formatting checks against a gerrit server.
 type gerritChecker struct {
 	server *gerrit.Server
-
-	todo chan *gerrit.PendingChecksInfo
+	delay  time.Duration
+	todo   chan *gerrit.PendingChecksInfo
 }
 
 // checkerScheme is the scheme by which we are registered in the Gerrit server.
@@ -112,15 +112,17 @@
 	if len(fields) != 2 {
 		return "", false
 	}
+
 	return fields[0], true
 }
 
 // NewGerritChecker creates a server that periodically checks a gerrit
 // server for pending checks.
-func NewGerritChecker(server *gerrit.Server) (*gerritChecker, error) {
+func NewGerritChecker(server *gerrit.Server, delay time.Duration) (*gerritChecker, error) {
 	gc := &gerritChecker{
 		server: server,
 		todo:   make(chan *gerrit.PendingChecksInfo, 5),
+		delay:  delay,
 	}
 
 	return gc, nil
@@ -178,9 +180,9 @@
 				msg = "found a difference"
 			}
 			msgs = append(msgs, fmt.Sprintf("%s: %s", f.Name, msg))
-			log.Printf("file %s: %s", f.Name, f.Message)
+			log.Printf("%s/%d: file %s: %s", changeID, psID, f.Name, f.Message)
 		} else {
-			log.Printf("file %s: OK", f.Name)
+			log.Printf("%s/%d: file %s: OK", changeID, psID, f.Name)
 		}
 	}
 
@@ -257,8 +259,6 @@
 
 // executeCheck executes the pending checks specified in the argument.
 func (gc *gerritChecker) executeCheck(pc *gerrit.PendingChecksInfo) error {
-	log.Println("checking", pc)
-
 	changeID := strconv.Itoa(pc.PatchSet.ChangeNumber)
 	psID := pc.PatchSet.PatchSetID
 	for uuid := range pc.PendingChecks {
@@ -268,9 +268,8 @@
 			State:       statusRunning.String(),
 			Started:     &now,
 		}
-		log.Printf("posted %s", &checkInput)
-		_, err := gc.server.PostCheck(
-			changeID, psID, &checkInput)
+		log.Printf("change %s, %s set to %q", pc.PatchSet, uuid, statusRunning)
+		_, err := gc.server.PostCheck(changeID, psID, &checkInput)
 		if err != nil {
 			return err
 		}
@@ -279,7 +278,8 @@
 		msg := ""
 		lang, ok := checkerLanguage(uuid)
 		if !ok {
-			return fmt.Errorf("uuid %q had unknown language", uuid)
+			msg = fmt.Sprintf("uuid %q has unknown language", uuid)
+			status = statusFail
 		} else {
 			msgs, err := gc.checkChange(changeID, psID, lang)
 			if err == errIrrelevant {
@@ -299,13 +299,12 @@
 			}
 		}
 
-		log.Printf("status %s for lang %s on %v", status, lang, pc.PatchSet)
+		log.Printf("status %s for %s on %v", status, uuid, pc.PatchSet)
 		checkInput = gerrit.CheckInput{
 			CheckerUUID: uuid,
 			State:       status.String(),
 			Message:     msg,
 		}
-		log.Printf("posted %s", &checkInput)
 
 		if _, err := gc.server.PostCheck(changeID, psID, &checkInput); err != nil {
 			return err
diff --git a/cmd/checker/checker_test.go b/cmd/checker/checker_test.go
new file mode 100644
index 0000000..9d2614e
--- /dev/null
+++ b/cmd/checker/checker_test.go
@@ -0,0 +1,111 @@
+// 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 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 TestGerrit(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, err := gc.PostChecker("gerrit-linter-test", "commitmsg", true)
+	if err != nil {
+		// create
+		msgChecker, err = gc.PostChecker("gerrit-linter-test", "commitmsg", false)
+		if err != nil {
+			t.Fatalf("create PostChecker: %v", err)
+		}
+	}
+	content, err := g.PostPath("a/changes/",
+		"application/json",
+		[]byte(`{
+  "project": "gerrit-linter-test",
+  "subject": "my linter test change.",
+  "branch": "master"}
+`))
+	if err != nil {
+		t.Fatal(err)
+	}
+	var change changeInfo
+	if err := gerrit.Unmarshal(content, &change); err != nil {
+		t.Fatal(err)
+	}
+	log.Printf("created change %d", change.Number)
+
+	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)
+	}
+
+	if _, err := g.PutPath(fmt.Sprintf("a/changes/%d/message", change.Number), "application/json", []byte(
+		fmt.Sprintf(`{"message": "New Commit message\n\nChange-Id: %s\n"}`, change.ChangeId))); err != nil {
+		t.Fatalf("edit message: %v", err)
+	}
+	gc.processPendingChecks()
+
+	info, err = g.GetCheck(strconv.Itoa(change.Number), 2, msgChecker.UUID)
+	if err != nil {
+		t.Fatalf("2nd GetCheck: %v", err)
+	}
+
+	if info.State != statusSuccessful.String() {
+		t.Fatalf("got %q, want %q", info.State, statusSuccessful)
+	}
+
+	if _, err := g.PostPath(fmt.Sprintf("a/changes/%d/abandon", change.Number),
+		"application/json", []byte(`{"message": "test succeeded"}`)); err != nil {
+		t.Fatalf("abandon: %v", err)
+	}
+}
diff --git a/cmd/checker/main.go b/cmd/checker/main.go
index 77b8d9a..31fc686 100644
--- a/cmd/checker/main.go
+++ b/cmd/checker/main.go
@@ -21,6 +21,7 @@
 	"log"
 	"net/url"
 	"os"
+	"time"
 
 	linter "github.com/google/gerrit-linter"
 	"github.com/google/gerrit-linter/gerrit"
@@ -75,7 +76,7 @@
 		log.Fatalf("accounts/self: %v", err)
 	}
 
-	gc, err := NewGerritChecker(g)
+	gc, err := NewGerritChecker(g, 5*time.Second)
 	if err != nil {
 		log.Fatal(err)
 	}
diff --git a/server.go b/server.go
index 7dc7233..f73678f 100644
--- a/server.go
+++ b/server.go
@@ -139,7 +139,6 @@
 	for language, fs := range splitByLang(req.Files) {
 		var buf bytes.Buffer
 		entry := Formatters[language]
-		log.Println("init", Formatters)
 
 		out, err := entry.Formatter.Format(fs, &buf)
 		if err != nil {