mirror of
https://github.com/caddyserver/caddy.git
synced 2026-05-30 18:45:18 -04:00
Git: Minor fixes. Refactor. Added tests.
This commit is contained in:
@@ -0,0 +1,218 @@
|
||||
package git
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/mholt/caddy/middleware/git/gittest"
|
||||
)
|
||||
|
||||
// init sets the OS used to fakeOS.
|
||||
func init() {
|
||||
SetOS(gittest.FakeOS)
|
||||
}
|
||||
|
||||
func check(t *testing.T, err error) {
|
||||
if err != nil {
|
||||
t.Errorf("Error not expected but found %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestInit(t *testing.T) {
|
||||
err := Init()
|
||||
check(t, err)
|
||||
}
|
||||
|
||||
func TestHelpers(t *testing.T) {
|
||||
f, err := writeScriptFile([]byte("script"))
|
||||
check(t, err)
|
||||
var b [6]byte
|
||||
_, err = f.Read(b[:])
|
||||
check(t, err)
|
||||
if string(b[:]) != "script" {
|
||||
t.Errorf("Expected script found %v", string(b[:]))
|
||||
}
|
||||
|
||||
out, err := runCmdOutput(gitBinary, []string{"-version"}, "")
|
||||
check(t, err)
|
||||
if out != gittest.CmdOutput {
|
||||
t.Errorf("Expected %v found %v", gittest.CmdOutput, out)
|
||||
}
|
||||
|
||||
err = runCmd(gitBinary, []string{"-version"}, "")
|
||||
check(t, err)
|
||||
|
||||
wScript := gitWrapperScript()
|
||||
if string(wScript) != expectedWrapperScript {
|
||||
t.Errorf("Expected %v found %v", expectedWrapperScript, string(wScript))
|
||||
}
|
||||
|
||||
f, err = writeScriptFile(wScript)
|
||||
check(t, err)
|
||||
|
||||
repo := &Repo{Host: "github.com", KeyPath: "~/.key"}
|
||||
script := string(bashScript(f.Name(), repo, []string{"clone", "git@github.com/repo/user"}))
|
||||
if script != expectedBashScript {
|
||||
t.Errorf("Expected %v found %v", expectedBashScript, script)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGit(t *testing.T) {
|
||||
// prepare
|
||||
repos := []*Repo{
|
||||
nil,
|
||||
&Repo{Path: "gitdir", Url: "success.git"},
|
||||
}
|
||||
for _, r := range repos {
|
||||
repo := createRepo(r)
|
||||
err := repo.Prepare()
|
||||
check(t, err)
|
||||
}
|
||||
|
||||
// pull with success
|
||||
logFile := gittest.Open("file")
|
||||
Logger = log.New(logFile, "", 0)
|
||||
tests := []struct {
|
||||
repo *Repo
|
||||
output string
|
||||
}{
|
||||
{
|
||||
&Repo{Path: "gitdir", Url: "git@github.com:user/repo.git", KeyPath: "~/.key", Then: "echo Hello"},
|
||||
`git@github.com:user/repo.git pulled.
|
||||
Command echo Hello successful.
|
||||
`,
|
||||
},
|
||||
{
|
||||
&Repo{Path: "gitdir", Url: "https://github.com/user/repo.git", Then: "echo Hello"},
|
||||
`https://github.com/user/repo.git pulled.
|
||||
Command echo Hello successful.
|
||||
`,
|
||||
},
|
||||
{
|
||||
&Repo{Url: "git@github.com:user/repo"},
|
||||
`git@github.com:user/repo pulled.
|
||||
`,
|
||||
},
|
||||
}
|
||||
|
||||
for i, test := range tests {
|
||||
gittest.CmdOutput = test.repo.Url
|
||||
|
||||
test.repo = createRepo(test.repo)
|
||||
|
||||
err := test.repo.Prepare()
|
||||
check(t, err)
|
||||
|
||||
err = test.repo.Pull()
|
||||
check(t, err)
|
||||
|
||||
out, err := ioutil.ReadAll(logFile)
|
||||
check(t, err)
|
||||
if test.output != string(out) {
|
||||
t.Errorf("Pull with Success %v: Expected %v found %v", i, test.output, string(out))
|
||||
}
|
||||
}
|
||||
|
||||
// pull with error
|
||||
repos = []*Repo{
|
||||
&Repo{Path: "gitdir", Url: "http://github.com:u/repo.git"},
|
||||
&Repo{Path: "gitdir", Url: "https://github.com/user/repo.git", Then: "echo Hello"},
|
||||
&Repo{Path: "gitdir"},
|
||||
&Repo{Path: "gitdir", KeyPath: ".key"},
|
||||
}
|
||||
|
||||
gittest.CmdOutput = "git@github.com:u1/repo.git"
|
||||
for i, repo := range repos {
|
||||
repo = createRepo(repo)
|
||||
|
||||
err := repo.Prepare()
|
||||
if err == nil {
|
||||
t.Errorf("Pull with Error %v: Error expected but not found %v", i, err)
|
||||
continue
|
||||
}
|
||||
|
||||
expected := "Another git repo 'git@github.com:u1/repo.git' exists at gitdir"
|
||||
if expected != err.Error() {
|
||||
t.Errorf("Pull with Error %v: Expected %v found %v", i, expected, err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func createRepo(r *Repo) *Repo {
|
||||
repo := &Repo{
|
||||
Url: "git@github.com/user/test",
|
||||
Path: ".",
|
||||
Host: "github.com",
|
||||
Branch: "master",
|
||||
Interval: time.Second * 60,
|
||||
}
|
||||
if r == nil {
|
||||
return repo
|
||||
}
|
||||
if r.Branch != "" {
|
||||
repo.Branch = r.Branch
|
||||
}
|
||||
if r.Host != "" {
|
||||
repo.Branch = r.Branch
|
||||
}
|
||||
if r.Interval != 0 {
|
||||
repo.Interval = r.Interval
|
||||
}
|
||||
if r.KeyPath != "" {
|
||||
repo.KeyPath = r.KeyPath
|
||||
}
|
||||
if r.Path != "" {
|
||||
repo.Path = r.Path
|
||||
}
|
||||
if r.Then != "" {
|
||||
repo.Then = r.Then
|
||||
}
|
||||
if r.Url != "" {
|
||||
repo.Url = r.Url
|
||||
}
|
||||
|
||||
return repo
|
||||
}
|
||||
|
||||
var expectedBashScript = `#!/bin/bash
|
||||
|
||||
mkdir -p ~/.ssh;
|
||||
touch ~/.ssh/known_hosts;
|
||||
ssh-keyscan -t rsa,dsa github.com 2>&1 | sort -u - ~/.ssh/known_hosts > ~/.ssh/tmp_hosts;
|
||||
cat ~/.ssh/tmp_hosts >> ~/.ssh/known_hosts;
|
||||
` + gittest.TempFileName + ` -i ~/.key clone git@github.com/repo/user;
|
||||
`
|
||||
|
||||
var expectedWrapperScript = `#!/bin/bash
|
||||
|
||||
# The MIT License (MIT)
|
||||
# Copyright (c) 2013 Alvin Abad
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "Git wrapper script that can specify an ssh-key file
|
||||
Usage:
|
||||
git.sh -i ssh-key-file git-command
|
||||
"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# remove temporary file on exit
|
||||
trap 'rm -f /tmp/.git_ssh.$$' 0
|
||||
|
||||
if [ "$1" = "-i" ]; then
|
||||
SSH_KEY=$2; shift; shift
|
||||
echo "ssh -i $SSH_KEY \$@" > /tmp/.git_ssh.$$
|
||||
chmod +x /tmp/.git_ssh.$$
|
||||
export GIT_SSH=/tmp/.git_ssh.$$
|
||||
fi
|
||||
|
||||
# in case the git command is repeated
|
||||
[ "$1" = "git" ] && shift
|
||||
|
||||
# Run the git command
|
||||
/usr/bin/git "$@"
|
||||
|
||||
`
|
||||
Reference in New Issue
Block a user