blob: 2834563e268d2f46fbdc2c6563c899f08230295f [file] [log] [blame]
// Copyright 2014 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 (
"io/ioutil"
"os"
"os/exec"
"path/filepath"
"reflect"
"strings"
"testing"
)
type gitTest struct {
pwd string // current directory before test
tmpdir string // temporary directory holding repos
server string // server repo root
client string // client repo root
}
func (gt *gitTest) done() {
os.RemoveAll(gt.tmpdir)
os.Chdir(gt.pwd)
}
func newGitTest(t *testing.T) *gitTest {
tmpdir, err := ioutil.TempDir("", "git-review-test")
if err != nil {
t.Fatal(err)
}
server := tmpdir + "/git-origin"
mkdir(t, server)
write(t, server+"/file", "this is master")
trun(t, server, "git", "init", ".")
trun(t, server, "git", "add", "file")
trun(t, server, "git", "commit", "-m", "on master")
for _, name := range []string{"dev.branch", "release.branch"} {
trun(t, server, "git", "checkout", "master")
trun(t, server, "git", "branch", name)
write(t, server+"/file", "this is "+name)
trun(t, server, "git", "commit", "-a", "-m", "on "+name)
}
client := tmpdir + "/git-client"
mkdir(t, client)
trun(t, client, "git", "clone", server, ".")
trun(t, client, "git", "config", "core.editor", "false")
pwd, err := os.Getwd()
if err != nil {
t.Fatal(err)
}
if err := os.Chdir(client); err != nil {
t.Fatal(err)
}
gt := &gitTest{
pwd: pwd,
tmpdir: tmpdir,
server: server,
client: client,
}
return gt
}
func mkdir(t *testing.T, dir string) {
if err := os.Mkdir(dir, 0777); err != nil {
t.Fatal(err)
}
}
func write(t *testing.T, file, data string) {
if err := ioutil.WriteFile(file, []byte(data), 0666); err != nil {
t.Fatal(err)
}
}
func trun(t *testing.T, dir string, cmdline ...string) {
cmd := exec.Command(cmdline[0], cmdline[1:]...)
cmd.Dir = dir
out, err := cmd.CombinedOutput()
if err != nil {
t.Fatalf("in %s/, ran %s: %v\n%s", filepath.Base(dir), cmdline, err, out)
}
}
func testMain(t *testing.T, args ...string) {
t.Logf("git-review %s", strings.Join(args, " "))
runLog = []string{} // non-nil, to trigger saving of commands
defer func() {
if err := recover(); err != nil {
runLog = nil
dieTrap = nil
t.Fatalf("panic: %v", err)
}
}()
dieTrap = func() {
panic("died")
}
os.Args = append([]string{"git-review"}, args...)
main()
dieTrap = nil
}
func testRan(t *testing.T, cmds ...string) {
if !reflect.DeepEqual(runLog, cmds) {
t.Errorf("ran:\n%s", strings.Join(runLog, "\n"))
t.Errorf("wanted:\n%s", strings.Join(cmds, "\n"))
}
}