aboutsummaryrefslogtreecommitdiffstats
path: root/integrations/git_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'integrations/git_test.go')
-rw-r--r--integrations/git_test.go340
1 files changed, 219 insertions, 121 deletions
diff --git a/integrations/git_test.go b/integrations/git_test.go
index 53814cf410..05b2c366b1 100644
--- a/integrations/git_test.go
+++ b/integrations/git_test.go
@@ -6,8 +6,9 @@ package integrations
import (
"context"
+ "crypto/rand"
+ "fmt"
"io/ioutil"
- "math/rand"
"net"
"net/http"
"net/url"
@@ -17,6 +18,7 @@ import (
"time"
"code.gitea.io/git"
+ "code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/setting"
api "code.gitea.io/sdk/gitea"
@@ -24,7 +26,13 @@ import (
"github.com/stretchr/testify/assert"
)
-func onGiteaWebRun(t *testing.T, callback func(*testing.T, *url.URL)) {
+const (
+ littleSize = 1024 //1ko
+ bigSize = 128 * 1024 * 1024 //128Mo
+)
+
+func onGiteaRun(t *testing.T, callback func(*testing.T, *url.URL)) {
+ prepareTestEnv(t)
s := http.Server{
Handler: mac,
}
@@ -35,151 +43,241 @@ func onGiteaWebRun(t *testing.T, callback func(*testing.T, *url.URL)) {
assert.NoError(t, err)
defer func() {
- ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
+ ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)
s.Shutdown(ctx)
cancel()
}()
go s.Serve(listener)
+ //Started by config go ssh.Listen(setting.SSH.ListenHost, setting.SSH.ListenPort, setting.SSH.ServerCiphers, setting.SSH.ServerKeyExchanges, setting.SSH.ServerMACs)
callback(t, u)
}
func TestGit(t *testing.T) {
- prepareTestEnv(t)
-
- onGiteaWebRun(t, func(t *testing.T, u *url.URL) {
- dstPath, err := ioutil.TempDir("", "repo-tmp-17")
- assert.NoError(t, err)
- defer os.RemoveAll(dstPath)
+ onGiteaRun(t, func(t *testing.T, u *url.URL) {
u.Path = "user2/repo1.git"
- t.Run("Standard", func(t *testing.T) {
+ t.Run("HTTP", func(t *testing.T) {
+ dstPath, err := ioutil.TempDir("", "repo-tmp-17")
+ assert.NoError(t, err)
+ defer os.RemoveAll(dstPath)
+ t.Run("Standard", func(t *testing.T) {
+ t.Run("CloneNoLogin", func(t *testing.T) {
+ dstLocalPath, err := ioutil.TempDir("", "repo1")
+ assert.NoError(t, err)
+ defer os.RemoveAll(dstLocalPath)
+ err = git.Clone(u.String(), dstLocalPath, git.CloneRepoOptions{})
+ assert.NoError(t, err)
+ assert.True(t, com.IsExist(filepath.Join(dstLocalPath, "README.md")))
+ })
- t.Run("CloneNoLogin", func(t *testing.T) {
- dstLocalPath, err := ioutil.TempDir("", "repo1")
- assert.NoError(t, err)
- defer os.RemoveAll(dstLocalPath)
- err = git.Clone(u.String(), dstLocalPath, git.CloneRepoOptions{})
- assert.NoError(t, err)
- assert.True(t, com.IsExist(filepath.Join(dstLocalPath, "README.md")))
- })
+ t.Run("CreateRepo", func(t *testing.T) {
+ session := loginUser(t, "user2")
+ req := NewRequestWithJSON(t, "POST", "/api/v1/user/repos", &api.CreateRepoOption{
+ AutoInit: true,
+ Description: "Temporary repo",
+ Name: "repo-tmp-17",
+ Private: false,
+ Gitignores: "",
+ License: "WTFPL",
+ Readme: "Default",
+ })
+ session.MakeRequest(t, req, http.StatusCreated)
+ })
- t.Run("CreateRepo", func(t *testing.T) {
- session := loginUser(t, "user2")
- req := NewRequestWithJSON(t, "POST", "/api/v1/user/repos", &api.CreateRepoOption{
- AutoInit: true,
- Description: "Temporary repo",
- Name: "repo-tmp-17",
- Private: false,
- Gitignores: "",
- License: "WTFPL",
- Readme: "Default",
+ u.Path = "user2/repo-tmp-17.git"
+ u.User = url.UserPassword("user2", userPassword)
+ t.Run("Clone", func(t *testing.T) {
+ err = git.Clone(u.String(), dstPath, git.CloneRepoOptions{})
+ assert.NoError(t, err)
+ assert.True(t, com.IsExist(filepath.Join(dstPath, "README.md")))
})
- session.MakeRequest(t, req, http.StatusCreated)
- })
- u.Path = "user2/repo-tmp-17.git"
- u.User = url.UserPassword("user2", userPassword)
- t.Run("Clone", func(t *testing.T) {
- err = git.Clone(u.String(), dstPath, git.CloneRepoOptions{})
- assert.NoError(t, err)
- assert.True(t, com.IsExist(filepath.Join(dstPath, "README.md")))
+ t.Run("PushCommit", func(t *testing.T) {
+ t.Run("Little", func(t *testing.T) {
+ commitAndPush(t, littleSize, dstPath)
+ })
+ t.Run("Big", func(t *testing.T) {
+ commitAndPush(t, bigSize, dstPath)
+ })
+ })
})
+ t.Run("LFS", func(t *testing.T) {
+ t.Run("PushCommit", func(t *testing.T) {
+ //Setup git LFS
+ _, err = git.NewCommand("lfs").AddArguments("install").RunInDir(dstPath)
+ assert.NoError(t, err)
+ _, err = git.NewCommand("lfs").AddArguments("track", "data-file-*").RunInDir(dstPath)
+ assert.NoError(t, err)
+ err = git.AddChanges(dstPath, false, ".gitattributes")
+ assert.NoError(t, err)
- t.Run("PushCommit", func(t *testing.T) {
- data := make([]byte, 1024)
- _, err := rand.Read(data)
- assert.NoError(t, err)
- tmpFile, err := ioutil.TempFile(dstPath, "data-file-")
- defer tmpFile.Close()
- _, err = tmpFile.Write(data)
- assert.NoError(t, err)
-
- //Commit
- err = git.AddChanges(dstPath, false, filepath.Base(tmpFile.Name()))
- assert.NoError(t, err)
- err = git.CommitChanges(dstPath, git.CommitChangesOptions{
- Committer: &git.Signature{
- Email: "user2@example.com",
- Name: "User Two",
- When: time.Now(),
- },
- Author: &git.Signature{
- Email: "user2@example.com",
- Name: "User Two",
- When: time.Now(),
- },
- Message: "Testing commit",
+ t.Run("Little", func(t *testing.T) {
+ commitAndPush(t, littleSize, dstPath)
+ })
+ t.Run("Big", func(t *testing.T) {
+ commitAndPush(t, bigSize, dstPath)
+ })
})
- assert.NoError(t, err)
-
- //Push
- err = git.Push(dstPath, git.PushOptions{
- Branch: "master",
- Remote: u.String(),
- Force: false,
+ t.Run("Locks", func(t *testing.T) {
+ lockTest(t, u.String(), dstPath)
})
- assert.NoError(t, err)
})
})
- t.Run("LFS", func(t *testing.T) {
- t.Run("PushCommit", func(t *testing.T) {
- /* Generate random file */
- data := make([]byte, 1024)
- _, err := rand.Read(data)
- assert.NoError(t, err)
- tmpFile, err := ioutil.TempFile(dstPath, "data-file-")
- defer tmpFile.Close()
- _, err = tmpFile.Write(data)
- assert.NoError(t, err)
-
- //Setup git LFS
- _, err = git.NewCommand("lfs").AddArguments("install").RunInDir(dstPath)
- assert.NoError(t, err)
- _, err = git.NewCommand("lfs").AddArguments("track", "data-file-*").RunInDir(dstPath)
- assert.NoError(t, err)
-
- //Commit
- err = git.AddChanges(dstPath, false, ".gitattributes", filepath.Base(tmpFile.Name()))
- assert.NoError(t, err)
- err = git.CommitChanges(dstPath, git.CommitChangesOptions{
- Committer: &git.Signature{
- Email: "user2@example.com",
- Name: "User Two",
- When: time.Now(),
- },
- Author: &git.Signature{
- Email: "user2@example.com",
- Name: "User Two",
- When: time.Now(),
- },
- Message: "Testing LFS ",
- })
- assert.NoError(t, err)
+ t.Run("SSH", func(t *testing.T) {
+ //Setup remote link
+ u.Scheme = "ssh"
+ u.User = url.User("git")
+ u.Host = fmt.Sprintf("%s:%d", setting.SSH.ListenHost, setting.SSH.ListenPort)
+ u.Path = "user2/repo-tmp-18.git"
- //Push
- u.User = url.UserPassword("user2", userPassword)
- err = git.Push(dstPath, git.PushOptions{
- Branch: "master",
- Remote: u.String(),
- Force: false,
- })
- assert.NoError(t, err)
+ //Setup key
+ keyFile := filepath.Join(setting.AppDataPath, "my-testing-key")
+ _, _, err := com.ExecCmd("ssh-keygen", "-f", keyFile, "-t", "rsa", "-N", "")
+ assert.NoError(t, err)
+ defer os.RemoveAll(keyFile)
+ defer os.RemoveAll(keyFile + ".pub")
+
+ session := loginUser(t, "user1")
+ keyOwner := models.AssertExistsAndLoadBean(t, &models.User{Name: "user2"}).(*models.User)
+ urlStr := fmt.Sprintf("/api/v1/admin/users/%s/keys", keyOwner.Name)
+
+ dataPubKey, err := ioutil.ReadFile(keyFile + ".pub")
+ assert.NoError(t, err)
+ req := NewRequestWithValues(t, "POST", urlStr, map[string]string{
+ "key": string(dataPubKey),
+ "title": "test-key",
})
- t.Run("Locks", func(t *testing.T) {
- _, err = git.NewCommand("remote").AddArguments("set-url", "origin", u.String()).RunInDir(dstPath) //TODO add test ssh git-lfs-creds
- assert.NoError(t, err)
- _, err = git.NewCommand("lfs").AddArguments("locks").RunInDir(dstPath)
- assert.NoError(t, err)
- _, err = git.NewCommand("lfs").AddArguments("lock", "README.md").RunInDir(dstPath)
- assert.NoError(t, err)
- _, err = git.NewCommand("lfs").AddArguments("locks").RunInDir(dstPath)
- assert.NoError(t, err)
- _, err = git.NewCommand("lfs").AddArguments("unlock", "README.md").RunInDir(dstPath)
- assert.NoError(t, err)
+ session.MakeRequest(t, req, http.StatusCreated)
+
+ //Setup ssh wrapper
+ sshWrapper, err := ioutil.TempFile(setting.AppDataPath, "tmp-ssh-wrapper")
+ sshWrapper.WriteString("#!/bin/sh\n\n")
+ sshWrapper.WriteString("ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i \"" + filepath.Join(setting.AppWorkPath, keyFile) + "\" $* \n\n")
+ err = sshWrapper.Chmod(os.ModePerm)
+ assert.NoError(t, err)
+ sshWrapper.Close()
+ defer os.RemoveAll(sshWrapper.Name())
+
+ //Setup clone folder
+ dstPath, err := ioutil.TempDir("", "repo-tmp-18")
+ assert.NoError(t, err)
+ defer os.RemoveAll(dstPath)
+
+ t.Run("Standard", func(t *testing.T) {
+ t.Run("CreateRepo", func(t *testing.T) {
+ session := loginUser(t, "user2")
+ req := NewRequestWithJSON(t, "POST", "/api/v1/user/repos", &api.CreateRepoOption{
+ AutoInit: true,
+ Description: "Temporary repo",
+ Name: "repo-tmp-18",
+ Private: false,
+ Gitignores: "",
+ License: "WTFPL",
+ Readme: "Default",
+ })
+ session.MakeRequest(t, req, http.StatusCreated)
+ })
+ //TODO get url from api
+ t.Run("Clone", func(t *testing.T) {
+ _, err = git.NewCommand("clone").AddArguments("--config", "core.sshCommand="+filepath.Join(setting.AppWorkPath, sshWrapper.Name()), u.String(), dstPath).Run()
+ assert.NoError(t, err)
+ assert.True(t, com.IsExist(filepath.Join(dstPath, "README.md")))
+ })
+ //time.Sleep(5 * time.Minute)
+ t.Run("PushCommit", func(t *testing.T) {
+ t.Run("Little", func(t *testing.T) {
+ commitAndPush(t, littleSize, dstPath)
+ })
+ t.Run("Big", func(t *testing.T) {
+ commitAndPush(t, bigSize, dstPath)
+ })
+ })
})
+ t.Run("LFS", func(t *testing.T) {
+ os.Setenv("GIT_SSH_COMMAND", filepath.Join(setting.AppWorkPath, sshWrapper.Name())) //TODO remove when fixed https://github.com/git-lfs/git-lfs/issues/2215
+ defer os.Unsetenv("GIT_SSH_COMMAND")
+ t.Run("PushCommit", func(t *testing.T) {
+ //Setup git LFS
+ _, err = git.NewCommand("lfs").AddArguments("install").RunInDir(dstPath)
+ assert.NoError(t, err)
+ _, err = git.NewCommand("lfs").AddArguments("track", "data-file-*").RunInDir(dstPath)
+ assert.NoError(t, err)
+ err = git.AddChanges(dstPath, false, ".gitattributes")
+ assert.NoError(t, err)
+ t.Run("Little", func(t *testing.T) {
+ commitAndPush(t, littleSize, dstPath)
+ })
+ t.Run("Big", func(t *testing.T) {
+ commitAndPush(t, bigSize, dstPath)
+ })
+ })
+ /* Failed without #3152. TODO activate with fix.
+ t.Run("Locks", func(t *testing.T) {
+ lockTest(t, u.String(), dstPath)
+ })
+ */
+ })
})
})
}
+
+func lockTest(t *testing.T, remote, repoPath string) {
+ _, err := git.NewCommand("remote").AddArguments("set-url", "origin", remote).RunInDir(repoPath) //TODO add test ssh git-lfs-creds
+ assert.NoError(t, err)
+ _, err = git.NewCommand("lfs").AddArguments("locks").RunInDir(repoPath)
+ assert.NoError(t, err)
+ _, err = git.NewCommand("lfs").AddArguments("lock", "README.md").RunInDir(repoPath)
+ assert.NoError(t, err)
+ _, err = git.NewCommand("lfs").AddArguments("locks").RunInDir(repoPath)
+ assert.NoError(t, err)
+ _, err = git.NewCommand("lfs").AddArguments("unlock", "README.md").RunInDir(repoPath)
+ assert.NoError(t, err)
+}
+
+func commitAndPush(t *testing.T, size int, repoPath string) {
+ err := generateCommitWithNewData(size, repoPath, "user2@example.com", "User Two")
+ assert.NoError(t, err)
+ _, err = git.NewCommand("push").RunInDir(repoPath) //Push
+ assert.NoError(t, err)
+}
+
+func generateCommitWithNewData(size int, repoPath, email, fullName string) error {
+ //Generate random file
+ data := make([]byte, size)
+ _, err := rand.Read(data)
+ if err != nil {
+ return err
+ }
+ tmpFile, err := ioutil.TempFile(repoPath, "data-file-")
+ if err != nil {
+ return err
+ }
+ defer tmpFile.Close()
+ _, err = tmpFile.Write(data)
+ if err != nil {
+ return err
+ }
+
+ //Commit
+ err = git.AddChanges(repoPath, false, filepath.Base(tmpFile.Name()))
+ if err != nil {
+ return err
+ }
+ err = git.CommitChanges(repoPath, git.CommitChangesOptions{
+ Committer: &git.Signature{
+ Email: email,
+ Name: fullName,
+ When: time.Now(),
+ },
+ Author: &git.Signature{
+ Email: email,
+ Name: fullName,
+ When: time.Now(),
+ },
+ Message: fmt.Sprintf("Testing commit @ %v", time.Now()),
+ })
+ return err
+}