Skip to content

Commit 7fcdd75

Browse files
committed
test: integration add git cli tests
Extracted form for easing review process and debug #3152
1 parent cc0c4a3 commit 7fcdd75

File tree

5 files changed

+241
-139
lines changed

5 files changed

+241
-139
lines changed

integrations/git_test.go

Lines changed: 214 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ package integrations
66

77
import (
88
"context"
9+
"crypto/rand"
10+
"fmt"
911
"io/ioutil"
10-
"math/rand"
1112
"net"
1213
"net/http"
1314
"net/url"
@@ -17,14 +18,16 @@ import (
1718
"time"
1819

1920
"code.gitea.io/git"
21+
"code.gitea.io/gitea/models"
2022
"code.gitea.io/gitea/modules/setting"
2123
api "code.gitea.io/sdk/gitea"
2224

2325
"github.com/Unknwon/com"
2426
"github.com/stretchr/testify/assert"
2527
)
2628

27-
func onGiteaWebRun(t *testing.T, callback func(*testing.T, *url.URL)) {
29+
func onGiteaRun(t *testing.T, callback func(*testing.T, *url.URL)) {
30+
prepareTestEnv(t)
2831
s := http.Server{
2932
Handler: mac,
3033
}
@@ -35,150 +38,241 @@ func onGiteaWebRun(t *testing.T, callback func(*testing.T, *url.URL)) {
3538
assert.NoError(t, err)
3639

3740
defer func() {
38-
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
41+
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)
3942
s.Shutdown(ctx)
4043
cancel()
4144
}()
4245

4346
go s.Serve(listener)
47+
//Started by config go ssh.Listen(setting.SSH.ListenHost, setting.SSH.ListenPort, setting.SSH.ServerCiphers, setting.SSH.ServerKeyExchanges, setting.SSH.ServerMACs)
4448

4549
callback(t, u)
4650
}
4751

48-
func TestGit(t *testing.T) {
49-
prepareTestEnv(t)
52+
func generateCommitWithNewData(repoPath, email, fullName string) error {
53+
//Generate random file
54+
data := make([]byte, 1024)
55+
_, err := rand.Read(data)
56+
if err != nil {
57+
return err
58+
}
59+
tmpFile, err := ioutil.TempFile(repoPath, "data-file-")
60+
if err != nil {
61+
return err
62+
}
63+
defer tmpFile.Close()
64+
_, err = tmpFile.Write(data)
65+
if err != nil {
66+
return err
67+
}
68+
69+
//Commit
70+
err = git.AddChanges(repoPath, false, filepath.Base(tmpFile.Name()))
71+
if err != nil {
72+
return err
73+
}
74+
err = git.CommitChanges(repoPath, git.CommitChangesOptions{
75+
Committer: &git.Signature{
76+
Email: email,
77+
Name: fullName,
78+
When: time.Now(),
79+
},
80+
Author: &git.Signature{
81+
Email: email,
82+
Name: fullName,
83+
When: time.Now(),
84+
},
85+
Message: fmt.Sprintf("Testing commit @ %v", time.Now()),
86+
})
87+
return err
88+
}
5089

51-
onGiteaWebRun(t, func(t *testing.T, u *url.URL) {
52-
dstPath, err := ioutil.TempDir("", "repo-tmp-17")
53-
assert.NoError(t, err)
54-
defer os.RemoveAll(dstPath)
90+
func TestGit(t *testing.T) {
91+
onGiteaRun(t, func(t *testing.T, u *url.URL) {
5592
u.Path = "user2/repo1.git"
5693

57-
t.Run("Standard", func(t *testing.T) {
94+
t.Run("HTTP", func(t *testing.T) {
95+
dstPath, err := ioutil.TempDir("", "repo-tmp-17")
96+
assert.NoError(t, err)
97+
defer os.RemoveAll(dstPath)
98+
t.Run("Standard", func(t *testing.T) {
99+
t.Run("CloneNoLogin", func(t *testing.T) {
100+
dstLocalPath, err := ioutil.TempDir("", "repo1")
101+
assert.NoError(t, err)
102+
defer os.RemoveAll(dstLocalPath)
103+
err = git.Clone(u.String(), dstLocalPath, git.CloneRepoOptions{})
104+
assert.NoError(t, err)
105+
assert.True(t, com.IsExist(filepath.Join(dstLocalPath, "README.md")))
106+
})
58107

59-
t.Run("CloneNoLogin", func(t *testing.T) {
60-
dstLocalPath, err := ioutil.TempDir("", "repo1")
61-
assert.NoError(t, err)
62-
defer os.RemoveAll(dstLocalPath)
63-
err = git.Clone(u.String(), dstLocalPath, git.CloneRepoOptions{})
64-
assert.NoError(t, err)
65-
assert.True(t, com.IsExist(filepath.Join(dstLocalPath, "README.md")))
66-
})
108+
t.Run("CreateRepo", func(t *testing.T) {
109+
session := loginUser(t, "user2")
110+
req := NewRequestWithJSON(t, "POST", "/api/v1/user/repos", &api.CreateRepoOption{
111+
AutoInit: true,
112+
Description: "Temporary repo",
113+
Name: "repo-tmp-17",
114+
Private: false,
115+
Gitignores: "",
116+
License: "WTFPL",
117+
Readme: "Default",
118+
})
119+
session.MakeRequest(t, req, http.StatusCreated)
120+
})
67121

68-
t.Run("CreateRepo", func(t *testing.T) {
69-
session := loginUser(t, "user2")
70-
req := NewRequestWithJSON(t, "POST", "/api/v1/user/repos", &api.CreateRepoOption{
71-
AutoInit: true,
72-
Description: "Temporary repo",
73-
Name: "repo-tmp-17",
74-
Private: false,
75-
Gitignores: "",
76-
License: "WTFPL",
77-
Readme: "Default",
122+
u.Path = "user2/repo-tmp-17.git"
123+
u.User = url.UserPassword("user2", userPassword)
124+
t.Run("Clone", func(t *testing.T) {
125+
err = git.Clone(u.String(), dstPath, git.CloneRepoOptions{})
126+
assert.NoError(t, err)
127+
assert.True(t, com.IsExist(filepath.Join(dstPath, "README.md")))
78128
})
79-
session.MakeRequest(t, req, http.StatusCreated)
80-
})
81129

82-
u.Path = "user2/repo-tmp-17.git"
83-
u.User = url.UserPassword("user2", userPassword)
84-
t.Run("Clone", func(t *testing.T) {
85-
err = git.Clone(u.String(), dstPath, git.CloneRepoOptions{})
86-
assert.NoError(t, err)
87-
assert.True(t, com.IsExist(filepath.Join(dstPath, "README.md")))
130+
t.Run("PushCommit", func(t *testing.T) {
131+
err = generateCommitWithNewData(dstPath, "user2@example.com", "User Two")
132+
assert.NoError(t, err)
133+
//Push
134+
err = git.Push(dstPath, git.PushOptions{
135+
Branch: "master",
136+
Remote: u.String(),
137+
Force: false,
138+
})
139+
assert.NoError(t, err)
140+
})
88141
})
142+
t.Run("LFS", func(t *testing.T) {
143+
t.Run("PushCommit", func(t *testing.T) {
144+
//Setup git LFS
145+
_, err = git.NewCommand("lfs").AddArguments("install").RunInDir(dstPath)
146+
assert.NoError(t, err)
147+
_, err = git.NewCommand("lfs").AddArguments("track", "data-file-*").RunInDir(dstPath)
148+
assert.NoError(t, err)
149+
err = git.AddChanges(dstPath, false, ".gitattributes")
150+
assert.NoError(t, err)
89151

90-
t.Run("PushCommit", func(t *testing.T) {
91-
data := make([]byte, 1024)
92-
_, err := rand.Read(data)
93-
assert.NoError(t, err)
94-
tmpFile, err := ioutil.TempFile(dstPath, "data-file-")
95-
defer tmpFile.Close()
96-
_, err = tmpFile.Write(data)
97-
assert.NoError(t, err)
98-
99-
//Commit
100-
err = git.AddChanges(dstPath, false, filepath.Base(tmpFile.Name()))
101-
assert.NoError(t, err)
102-
err = git.CommitChanges(dstPath, git.CommitChangesOptions{
103-
Committer: &git.Signature{
104-
Email: "user2@example.com",
105-
Name: "User Two",
106-
When: time.Now(),
107-
},
108-
Author: &git.Signature{
109-
Email: "user2@example.com",
110-
Name: "User Two",
111-
When: time.Now(),
112-
},
113-
Message: "Testing commit",
152+
err = generateCommitWithNewData(dstPath, "user2@example.com", "User Two")
153+
//Push
154+
u.User = url.UserPassword("user2", userPassword)
155+
err = git.Push(dstPath, git.PushOptions{
156+
Branch: "master",
157+
Remote: u.String(),
158+
Force: false,
159+
})
160+
assert.NoError(t, err)
114161
})
115-
assert.NoError(t, err)
116-
117-
//Push
118-
err = git.Push(dstPath, git.PushOptions{
119-
Branch: "master",
120-
Remote: u.String(),
121-
Force: false,
162+
t.Run("Locks", func(t *testing.T) {
163+
_, err = git.NewCommand("remote").AddArguments("set-url", "origin", u.String()).RunInDir(dstPath) //TODO add test ssh git-lfs-creds
164+
assert.NoError(t, err)
165+
_, err = git.NewCommand("lfs").AddArguments("locks").RunInDir(dstPath)
166+
assert.NoError(t, err)
167+
_, err = git.NewCommand("lfs").AddArguments("lock", "README.md").RunInDir(dstPath)
168+
assert.NoError(t, err)
169+
_, err = git.NewCommand("lfs").AddArguments("locks").RunInDir(dstPath)
170+
assert.NoError(t, err)
171+
_, err = git.NewCommand("lfs").AddArguments("unlock", "README.md").RunInDir(dstPath)
172+
assert.NoError(t, err)
122173
})
123-
assert.NoError(t, err)
124174
})
125175
})
126-
t.Run("LFS", func(t *testing.T) {
127-
t.Run("PushCommit", func(t *testing.T) {
128-
/* Generate random file */
129-
data := make([]byte, 1024)
130-
_, err := rand.Read(data)
131-
assert.NoError(t, err)
132-
tmpFile, err := ioutil.TempFile(dstPath, "data-file-")
133-
defer tmpFile.Close()
134-
_, err = tmpFile.Write(data)
135-
assert.NoError(t, err)
136-
137-
//Setup git LFS
138-
_, err = git.NewCommand("lfs").AddArguments("install").RunInDir(dstPath)
139-
assert.NoError(t, err)
140-
_, err = git.NewCommand("lfs").AddArguments("track", "data-file-*").RunInDir(dstPath)
141-
assert.NoError(t, err)
142-
143-
//Commit
144-
err = git.AddChanges(dstPath, false, ".gitattributes", filepath.Base(tmpFile.Name()))
145-
assert.NoError(t, err)
146-
err = git.CommitChanges(dstPath, git.CommitChangesOptions{
147-
Committer: &git.Signature{
148-
Email: "user2@example.com",
149-
Name: "User Two",
150-
When: time.Now(),
151-
},
152-
Author: &git.Signature{
153-
Email: "user2@example.com",
154-
Name: "User Two",
155-
When: time.Now(),
156-
},
157-
Message: "Testing LFS ",
158-
})
159-
assert.NoError(t, err)
176+
t.Run("SSH", func(t *testing.T) {
177+
//Setup remote link
178+
u.Scheme = "ssh"
179+
u.User = url.User("git")
180+
u.Host = fmt.Sprintf("%s:%d", setting.SSH.ListenHost, setting.SSH.ListenPort)
181+
u.Path = "user2/repo-tmp-18.git"
160182

161-
//Push
162-
u.User = url.UserPassword("user2", userPassword)
163-
err = git.Push(dstPath, git.PushOptions{
164-
Branch: "master",
165-
Remote: u.String(),
166-
Force: false,
183+
//Setup key
184+
keyFile := filepath.Join(setting.AppDataPath, "my-testing-key")
185+
_, _, err := com.ExecCmd("ssh-keygen", "-f", keyFile, "-t", "rsa", "-N", "")
186+
assert.NoError(t, err)
187+
defer os.RemoveAll(keyFile)
188+
defer os.RemoveAll(keyFile + ".pub")
189+
190+
session := loginUser(t, "user1")
191+
keyOwner := models.AssertExistsAndLoadBean(t, &models.User{Name: "user2"}).(*models.User)
192+
urlStr := fmt.Sprintf("/api/v1/admin/users/%s/keys", keyOwner.Name)
193+
194+
dataPubKey, err := ioutil.ReadFile(keyFile + ".pub")
195+
assert.NoError(t, err)
196+
req := NewRequestWithValues(t, "POST", urlStr, map[string]string{
197+
"key": string(dataPubKey),
198+
"title": "test-key",
199+
})
200+
session.MakeRequest(t, req, http.StatusCreated)
201+
202+
//Setup ssh wrapper
203+
sshWrapper, err := ioutil.TempFile(setting.AppDataPath, "tmp-ssh-wrapper")
204+
sshWrapper.WriteString("#!/bin/sh\n\n")
205+
sshWrapper.WriteString("ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i \"" + filepath.Join(setting.AppWorkPath, keyFile) + "\" $* \n\n")
206+
err = sshWrapper.Chmod(os.ModePerm)
207+
assert.NoError(t, err)
208+
sshWrapper.Close()
209+
defer os.RemoveAll(sshWrapper.Name())
210+
211+
//Setup clone folder
212+
dstPath, err := ioutil.TempDir("", "repo-tmp-18")
213+
assert.NoError(t, err)
214+
defer os.RemoveAll(dstPath)
215+
216+
t.Run("Standard", func(t *testing.T) {
217+
t.Run("CreateRepo", func(t *testing.T) {
218+
session := loginUser(t, "user2")
219+
req := NewRequestWithJSON(t, "POST", "/api/v1/user/repos", &api.CreateRepoOption{
220+
AutoInit: true,
221+
Description: "Temporary repo",
222+
Name: "repo-tmp-18",
223+
Private: false,
224+
Gitignores: "",
225+
License: "WTFPL",
226+
Readme: "Default",
227+
})
228+
session.MakeRequest(t, req, http.StatusCreated)
229+
})
230+
//TODO get url from api
231+
t.Run("Clone", func(t *testing.T) {
232+
_, err = git.NewCommand("clone").AddArguments("--config", "core.sshCommand="+filepath.Join(setting.AppWorkPath, sshWrapper.Name()), u.String(), dstPath).Run()
233+
assert.NoError(t, err)
234+
assert.True(t, com.IsExist(filepath.Join(dstPath, "README.md")))
235+
})
236+
//time.Sleep(5 * time.Minute)
237+
t.Run("PushCommit", func(t *testing.T) {
238+
err = generateCommitWithNewData(dstPath, "user2@example.com", "User Two")
239+
assert.NoError(t, err)
240+
//Push
241+
_, err = git.NewCommand("push").RunInDir(dstPath)
242+
assert.NoError(t, err)
167243
})
168-
assert.NoError(t, err)
169244
})
170-
t.Run("Locks", func(t *testing.T) {
171-
_, err = git.NewCommand("remote").AddArguments("set-url", "origin", u.String()).RunInDir(dstPath) //TODO add test ssh git-lfs-creds
172-
assert.NoError(t, err)
173-
_, err = git.NewCommand("lfs").AddArguments("locks").RunInDir(dstPath)
174-
assert.NoError(t, err)
175-
_, err = git.NewCommand("lfs").AddArguments("lock", "README.md").RunInDir(dstPath)
176-
assert.NoError(t, err)
177-
_, err = git.NewCommand("lfs").AddArguments("locks").RunInDir(dstPath)
178-
assert.NoError(t, err)
179-
_, err = git.NewCommand("lfs").AddArguments("unlock", "README.md").RunInDir(dstPath)
180-
assert.NoError(t, err)
245+
t.Run("LFS", func(t *testing.T) {
246+
os.Setenv("GIT_SSH_COMMAND", filepath.Join(setting.AppWorkPath, sshWrapper.Name())) //TODO remove when fixed https://github.com/git-lfs/git-lfs/issues/2215
247+
defer os.Unsetenv("GIT_SSH_COMMAND")
248+
t.Run("PushCommit", func(t *testing.T) {
249+
//Setup git LFS
250+
_, err = git.NewCommand("lfs").AddArguments("install").RunInDir(dstPath)
251+
assert.NoError(t, err)
252+
_, err = git.NewCommand("lfs").AddArguments("track", "data-file-*").RunInDir(dstPath)
253+
assert.NoError(t, err)
254+
err = git.AddChanges(dstPath, false, ".gitattributes")
255+
assert.NoError(t, err)
256+
257+
err = generateCommitWithNewData(dstPath, "user2@example.com", "User Two")
258+
//Push
259+
_, err = git.NewCommand("push").RunInDir(dstPath)
260+
assert.NoError(t, err)
261+
})
262+
t.Run("Locks", func(t *testing.T) {
263+
_, err = git.NewCommand("remote").AddArguments("set-url", "origin", u.String()).RunInDir(dstPath) //TODO add test ssh git-lfs-creds
264+
assert.NoError(t, err)
265+
_, err = git.NewCommand("lfs").AddArguments("locks").RunInDir(dstPath)
266+
assert.NoError(t, err)
267+
_, err = git.NewCommand("lfs").AddArguments("lock", "README.md").RunInDir(dstPath)
268+
assert.NoError(t, err)
269+
_, err = git.NewCommand("lfs").AddArguments("locks").RunInDir(dstPath)
270+
assert.NoError(t, err)
271+
_, err = git.NewCommand("lfs").AddArguments("unlock", "README.md").RunInDir(dstPath)
272+
assert.NoError(t, err)
273+
})
181274
})
275+
//TODO ADD big file to LFS tests for validating #2930
182276

183277
})
184278
})

0 commit comments

Comments
 (0)