@@ -6,8 +6,9 @@ package integrations
6
6
7
7
import (
8
8
"context"
9
+ "crypto/rand"
10
+ "fmt"
9
11
"io/ioutil"
10
- "math/rand"
11
12
"net"
12
13
"net/http"
13
14
"net/url"
@@ -17,14 +18,16 @@ import (
17
18
"time"
18
19
19
20
"code.gitea.io/git"
21
+ "code.gitea.io/gitea/models"
20
22
"code.gitea.io/gitea/modules/setting"
21
23
api "code.gitea.io/sdk/gitea"
22
24
23
25
"github.com/Unknwon/com"
24
26
"github.com/stretchr/testify/assert"
25
27
)
26
28
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 )
28
31
s := http.Server {
29
32
Handler : mac ,
30
33
}
@@ -35,150 +38,241 @@ func onGiteaWebRun(t *testing.T, callback func(*testing.T, *url.URL)) {
35
38
assert .NoError (t , err )
36
39
37
40
defer func () {
38
- ctx , cancel := context .WithTimeout (context .Background (), time .Second * 10 )
41
+ ctx , cancel := context .WithTimeout (context .Background (), 2 * time .Minute )
39
42
s .Shutdown (ctx )
40
43
cancel ()
41
44
}()
42
45
43
46
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)
44
48
45
49
callback (t , u )
46
50
}
47
51
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
+ }
50
89
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 ) {
55
92
u .Path = "user2/repo1.git"
56
93
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
+ })
58
107
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
+ })
67
121
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" )))
78
128
})
79
- session .MakeRequest (t , req , http .StatusCreated )
80
- })
81
129
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
+ })
88
141
})
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 )
89
151
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 )
114
161
})
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 )
122
173
})
123
- assert .NoError (t , err )
124
174
})
125
175
})
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"
160
182
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 )
167
243
})
168
- assert .NoError (t , err )
169
244
})
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
+ })
181
274
})
275
+ //TODO ADD big file to LFS tests for validating #2930
182
276
183
277
})
184
278
})
0 commit comments