mirror of
https://github.com/caddyserver/caddy.git
synced 2024-12-23 22:27:38 -05:00
219 lines
4.5 KiB
Go
219 lines
4.5 KiB
Go
|
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 "$@"
|
||
|
|
||
|
`
|