Improve git test (#7086)
* Ensure that the lfs files are created with a different prefix * Reduce the replication in git_test.go
This commit is contained in:
		
							parent
							
								
									de6ef14d04
								
							
						
					
					
						commit
						fb4438a815
					
				
					 3 changed files with 277 additions and 221 deletions
				
			
		|  | @ -5,11 +5,14 @@ | |||
| package integrations | ||||
| 
 | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"io/ioutil" | ||||
| 	"net/http" | ||||
| 	"testing" | ||||
| 
 | ||||
| 	"code.gitea.io/gitea/models" | ||||
| 	"code.gitea.io/gitea/modules/auth" | ||||
| 	api "code.gitea.io/gitea/modules/structs" | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| ) | ||||
|  | @ -150,3 +153,42 @@ func doAPICreateDeployKey(ctx APITestContext, keyname, keyFile string, readOnly | |||
| 		ctx.Session.MakeRequest(t, req, http.StatusCreated) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func doAPICreatePullRequest(ctx APITestContext, owner, repo, baseBranch, headBranch string) func(*testing.T) (api.PullRequest, error) { | ||||
| 	return func(t *testing.T) (api.PullRequest, error) { | ||||
| 		urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/pulls?token=%s", | ||||
| 			owner, repo, ctx.Token) | ||||
| 		req := NewRequestWithJSON(t, http.MethodPost, urlStr, &api.CreatePullRequestOption{ | ||||
| 			Head:  headBranch, | ||||
| 			Base:  baseBranch, | ||||
| 			Title: fmt.Sprintf("create a pr from %s to %s", headBranch, baseBranch), | ||||
| 		}) | ||||
| 
 | ||||
| 		expected := 201 | ||||
| 		if ctx.ExpectedCode != 0 { | ||||
| 			expected = ctx.ExpectedCode | ||||
| 		} | ||||
| 		resp := ctx.Session.MakeRequest(t, req, expected) | ||||
| 		decoder := json.NewDecoder(resp.Body) | ||||
| 		pr := api.PullRequest{} | ||||
| 		err := decoder.Decode(&pr) | ||||
| 		return pr, err | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func doAPIMergePullRequest(ctx APITestContext, owner, repo string, index int64) func(*testing.T) { | ||||
| 	return func(t *testing.T) { | ||||
| 		urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/merge?token=%s", | ||||
| 			owner, repo, index, ctx.Token) | ||||
| 		req := NewRequestWithJSON(t, http.MethodPost, urlStr, &auth.MergePullRequestForm{ | ||||
| 			MergeMessageField: "doAPIMergePullRequest Merge", | ||||
| 			Do:                string(models.MergeStyleMerge), | ||||
| 		}) | ||||
| 
 | ||||
| 		if ctx.ExpectedCode != 0 { | ||||
| 			ctx.Session.MakeRequest(t, req, ctx.ExpectedCode) | ||||
| 			return | ||||
| 		} | ||||
| 		ctx.Session.MakeRequest(t, req, 200) | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -112,16 +112,44 @@ func doGitAddRemote(dstPath, remoteName string, u *url.URL) func(*testing.T) { | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| func doGitPushTestRepository(dstPath, remoteName, branch string) func(*testing.T) { | ||||
| func doGitPushTestRepository(dstPath string, args ...string) func(*testing.T) { | ||||
| 	return func(t *testing.T) { | ||||
| 		_, err := git.NewCommand("push", "-u", remoteName, branch).RunInDir(dstPath) | ||||
| 		_, err := git.NewCommand(append([]string{"push", "-u"}, args...)...).RunInDir(dstPath) | ||||
| 		assert.NoError(t, err) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func doGitPushTestRepositoryFail(dstPath, remoteName, branch string) func(*testing.T) { | ||||
| func doGitPushTestRepositoryFail(dstPath string, args ...string) func(*testing.T) { | ||||
| 	return func(t *testing.T) { | ||||
| 		_, err := git.NewCommand("push", "-u", remoteName, branch).RunInDir(dstPath) | ||||
| 		_, err := git.NewCommand(append([]string{"push"}, args...)...).RunInDir(dstPath) | ||||
| 		assert.Error(t, err) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func doGitCreateBranch(dstPath, branch string) func(*testing.T) { | ||||
| 	return func(t *testing.T) { | ||||
| 		_, err := git.NewCommand("checkout", "-b", branch).RunInDir(dstPath) | ||||
| 		assert.NoError(t, err) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func doGitCheckoutBranch(dstPath string, args ...string) func(*testing.T) { | ||||
| 	return func(t *testing.T) { | ||||
| 		_, err := git.NewCommand(append([]string{"checkout"}, args...)...).RunInDir(dstPath) | ||||
| 		assert.NoError(t, err) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func doGitMerge(dstPath string, args ...string) func(*testing.T) { | ||||
| 	return func(t *testing.T) { | ||||
| 		_, err := git.NewCommand(append([]string{"merge"}, args...)...).RunInDir(dstPath) | ||||
| 		assert.NoError(t, err) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func doGitPull(dstPath string, args ...string) func(*testing.T) { | ||||
| 	return func(t *testing.T) { | ||||
| 		_, err := git.NewCommand(append([]string{"pull"}, args...)...).RunInDir(dstPath) | ||||
| 		assert.NoError(t, err) | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -13,11 +13,13 @@ import ( | |||
| 	"os" | ||||
| 	"path" | ||||
| 	"path/filepath" | ||||
| 	"strconv" | ||||
| 	"testing" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"code.gitea.io/gitea/models" | ||||
| 	"code.gitea.io/gitea/modules/git" | ||||
| 	api "code.gitea.io/gitea/modules/structs" | ||||
| 
 | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| ) | ||||
|  | @ -43,119 +45,23 @@ func testGit(t *testing.T, u *url.URL) { | |||
| 		httpContext.Reponame = "repo-tmp-17" | ||||
| 
 | ||||
| 		dstPath, err := ioutil.TempDir("", httpContext.Reponame) | ||||
| 		var little, big, littleLFS, bigLFS string | ||||
| 
 | ||||
| 		assert.NoError(t, err) | ||||
| 		defer os.RemoveAll(dstPath) | ||||
| 		t.Run("Standard", func(t *testing.T) { | ||||
| 			PrintCurrentTest(t) | ||||
| 			ensureAnonymousClone(t, u) | ||||
| 
 | ||||
| 			t.Run("CreateRepo", doAPICreateRepository(httpContext, false)) | ||||
| 		t.Run("CreateRepo", doAPICreateRepository(httpContext, false)) | ||||
| 		ensureAnonymousClone(t, u) | ||||
| 
 | ||||
| 			u.Path = httpContext.GitPath() | ||||
| 			u.User = url.UserPassword(username, userPassword) | ||||
| 		u.Path = httpContext.GitPath() | ||||
| 		u.User = url.UserPassword(username, userPassword) | ||||
| 
 | ||||
| 			t.Run("Clone", doGitClone(dstPath, u)) | ||||
| 		t.Run("Clone", doGitClone(dstPath, u)) | ||||
| 
 | ||||
| 			t.Run("PushCommit", func(t *testing.T) { | ||||
| 				PrintCurrentTest(t) | ||||
| 				t.Run("Little", func(t *testing.T) { | ||||
| 					PrintCurrentTest(t) | ||||
| 					little = commitAndPush(t, littleSize, dstPath) | ||||
| 				}) | ||||
| 				t.Run("Big", func(t *testing.T) { | ||||
| 					if testing.Short() { | ||||
| 						t.Skip("skipping test in short mode.") | ||||
| 						return | ||||
| 					} | ||||
| 					PrintCurrentTest(t) | ||||
| 					big = commitAndPush(t, bigSize, dstPath) | ||||
| 				}) | ||||
| 			}) | ||||
| 		}) | ||||
| 		t.Run("LFS", func(t *testing.T) { | ||||
| 			PrintCurrentTest(t) | ||||
| 			t.Run("PushCommit", func(t *testing.T) { | ||||
| 				PrintCurrentTest(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) { | ||||
| 					PrintCurrentTest(t) | ||||
| 					littleLFS = commitAndPush(t, littleSize, dstPath) | ||||
| 					lockFileTest(t, littleLFS, dstPath) | ||||
| 				}) | ||||
| 				t.Run("Big", func(t *testing.T) { | ||||
| 					if testing.Short() { | ||||
| 						t.Skip("skipping test in short mode.") | ||||
| 						return | ||||
| 					} | ||||
| 					PrintCurrentTest(t) | ||||
| 					bigLFS = commitAndPush(t, bigSize, dstPath) | ||||
| 					lockFileTest(t, bigLFS, dstPath) | ||||
| 				}) | ||||
| 			}) | ||||
| 			t.Run("Locks", func(t *testing.T) { | ||||
| 				PrintCurrentTest(t) | ||||
| 				lockTest(t, u.String(), dstPath) | ||||
| 			}) | ||||
| 		}) | ||||
| 		t.Run("Raw", func(t *testing.T) { | ||||
| 			PrintCurrentTest(t) | ||||
| 			session := loginUser(t, "user2") | ||||
| 
 | ||||
| 			// Request raw paths
 | ||||
| 			req := NewRequest(t, "GET", path.Join("/user2/repo-tmp-17/raw/branch/master/", little)) | ||||
| 			resp := session.MakeRequest(t, req, http.StatusOK) | ||||
| 			assert.Equal(t, littleSize, resp.Body.Len()) | ||||
| 
 | ||||
| 			req = NewRequest(t, "GET", path.Join("/user2/repo-tmp-17/raw/branch/master/", littleLFS)) | ||||
| 			resp = session.MakeRequest(t, req, http.StatusOK) | ||||
| 			assert.NotEqual(t, littleSize, resp.Body.Len()) | ||||
| 			assert.Contains(t, resp.Body.String(), models.LFSMetaFileIdentifier) | ||||
| 
 | ||||
| 			if !testing.Short() { | ||||
| 				req = NewRequest(t, "GET", path.Join("/user2/repo-tmp-17/raw/branch/master/", big)) | ||||
| 				nilResp := session.MakeRequestNilResponseRecorder(t, req, http.StatusOK) | ||||
| 				assert.Equal(t, bigSize, nilResp.Length) | ||||
| 
 | ||||
| 				req = NewRequest(t, "GET", path.Join("/user2/repo-tmp-17/raw/branch/master/", bigLFS)) | ||||
| 				resp = session.MakeRequest(t, req, http.StatusOK) | ||||
| 				assert.NotEqual(t, bigSize, resp.Body.Len()) | ||||
| 				assert.Contains(t, resp.Body.String(), models.LFSMetaFileIdentifier) | ||||
| 			} | ||||
| 
 | ||||
| 		}) | ||||
| 		t.Run("Media", func(t *testing.T) { | ||||
| 			PrintCurrentTest(t) | ||||
| 			session := loginUser(t, "user2") | ||||
| 
 | ||||
| 			// Request media paths
 | ||||
| 			req := NewRequest(t, "GET", path.Join("/user2/repo-tmp-17/media/branch/master/", little)) | ||||
| 			resp := session.MakeRequestNilResponseRecorder(t, req, http.StatusOK) | ||||
| 			assert.Equal(t, littleSize, resp.Length) | ||||
| 
 | ||||
| 			req = NewRequest(t, "GET", path.Join("/user2/repo-tmp-17/media/branch/master/", littleLFS)) | ||||
| 			resp = session.MakeRequestNilResponseRecorder(t, req, http.StatusOK) | ||||
| 			assert.Equal(t, littleSize, resp.Length) | ||||
| 
 | ||||
| 			if !testing.Short() { | ||||
| 				req = NewRequest(t, "GET", path.Join("/user2/repo-tmp-17/media/branch/master/", big)) | ||||
| 				resp = session.MakeRequestNilResponseRecorder(t, req, http.StatusOK) | ||||
| 				assert.Equal(t, bigSize, resp.Length) | ||||
| 
 | ||||
| 				req = NewRequest(t, "GET", path.Join("/user2/repo-tmp-17/media/branch/master/", bigLFS)) | ||||
| 				resp = session.MakeRequestNilResponseRecorder(t, req, http.StatusOK) | ||||
| 				assert.Equal(t, bigSize, resp.Length) | ||||
| 			} | ||||
| 		}) | ||||
| 		little, big := standardCommitAndPushTest(t, dstPath) | ||||
| 		littleLFS, bigLFS := lfsCommitAndPushTest(t, dstPath) | ||||
| 		rawTest(t, &httpContext, little, big, littleLFS, bigLFS) | ||||
| 		mediaTest(t, &httpContext, little, big, littleLFS, bigLFS) | ||||
| 
 | ||||
| 		t.Run("BranchProtectMerge", doBranchProtectPRMerge(&httpContext, dstPath)) | ||||
| 	}) | ||||
| 	t.Run("SSH", func(t *testing.T) { | ||||
| 		PrintCurrentTest(t) | ||||
|  | @ -165,123 +71,26 @@ func testGit(t *testing.T, u *url.URL) { | |||
| 		//Setup key the user ssh key
 | ||||
| 		withKeyFile(t, keyname, func(keyFile string) { | ||||
| 			t.Run("CreateUserKey", doAPICreateUserKey(sshContext, "test-key", keyFile)) | ||||
| 			PrintCurrentTest(t) | ||||
| 
 | ||||
| 			//Setup remote link
 | ||||
| 			//TODO: get url from api
 | ||||
| 			sshURL := createSSHUrl(sshContext.GitPath(), u) | ||||
| 
 | ||||
| 			//Setup clone folder
 | ||||
| 			dstPath, err := ioutil.TempDir("", sshContext.Reponame) | ||||
| 			assert.NoError(t, err) | ||||
| 			defer os.RemoveAll(dstPath) | ||||
| 			var little, big, littleLFS, bigLFS string | ||||
| 
 | ||||
| 			t.Run("Standard", func(t *testing.T) { | ||||
| 				PrintCurrentTest(t) | ||||
| 				t.Run("CreateRepo", doAPICreateRepository(sshContext, false)) | ||||
| 			t.Run("CreateRepo", doAPICreateRepository(sshContext, false)) | ||||
| 
 | ||||
| 				//TODO get url from api
 | ||||
| 				t.Run("Clone", doGitClone(dstPath, sshURL)) | ||||
| 			t.Run("Clone", doGitClone(dstPath, sshURL)) | ||||
| 
 | ||||
| 				//time.Sleep(5 * time.Minute)
 | ||||
| 				t.Run("PushCommit", func(t *testing.T) { | ||||
| 					PrintCurrentTest(t) | ||||
| 					t.Run("Little", func(t *testing.T) { | ||||
| 						PrintCurrentTest(t) | ||||
| 						little = commitAndPush(t, littleSize, dstPath) | ||||
| 					}) | ||||
| 					t.Run("Big", func(t *testing.T) { | ||||
| 						if testing.Short() { | ||||
| 							t.Skip("skipping test in short mode.") | ||||
| 							return | ||||
| 						} | ||||
| 						PrintCurrentTest(t) | ||||
| 						big = commitAndPush(t, bigSize, dstPath) | ||||
| 					}) | ||||
| 				}) | ||||
| 			}) | ||||
| 			t.Run("LFS", func(t *testing.T) { | ||||
| 				PrintCurrentTest(t) | ||||
| 				t.Run("PushCommit", func(t *testing.T) { | ||||
| 					PrintCurrentTest(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) { | ||||
| 						PrintCurrentTest(t) | ||||
| 						littleLFS = commitAndPush(t, littleSize, dstPath) | ||||
| 						lockFileTest(t, littleLFS, dstPath) | ||||
| 
 | ||||
| 					}) | ||||
| 					t.Run("Big", func(t *testing.T) { | ||||
| 						if testing.Short() { | ||||
| 							return | ||||
| 						} | ||||
| 						PrintCurrentTest(t) | ||||
| 						bigLFS = commitAndPush(t, bigSize, dstPath) | ||||
| 						lockFileTest(t, bigLFS, dstPath) | ||||
| 
 | ||||
| 					}) | ||||
| 				}) | ||||
| 				t.Run("Locks", func(t *testing.T) { | ||||
| 					PrintCurrentTest(t) | ||||
| 					lockTest(t, u.String(), dstPath) | ||||
| 				}) | ||||
| 			}) | ||||
| 			t.Run("Raw", func(t *testing.T) { | ||||
| 				PrintCurrentTest(t) | ||||
| 				session := loginUser(t, "user2") | ||||
| 
 | ||||
| 				// Request raw paths
 | ||||
| 				req := NewRequest(t, "GET", path.Join("/user2/repo-tmp-18/raw/branch/master/", little)) | ||||
| 				resp := session.MakeRequest(t, req, http.StatusOK) | ||||
| 				assert.Equal(t, littleSize, resp.Body.Len()) | ||||
| 
 | ||||
| 				req = NewRequest(t, "GET", path.Join("/user2/repo-tmp-18/raw/branch/master/", littleLFS)) | ||||
| 				resp = session.MakeRequest(t, req, http.StatusOK) | ||||
| 				assert.NotEqual(t, littleSize, resp.Body.Len()) | ||||
| 				assert.Contains(t, resp.Body.String(), models.LFSMetaFileIdentifier) | ||||
| 
 | ||||
| 				if !testing.Short() { | ||||
| 					req = NewRequest(t, "GET", path.Join("/user2/repo-tmp-18/raw/branch/master/", big)) | ||||
| 					resp = session.MakeRequest(t, req, http.StatusOK) | ||||
| 					assert.Equal(t, bigSize, resp.Body.Len()) | ||||
| 
 | ||||
| 					req = NewRequest(t, "GET", path.Join("/user2/repo-tmp-18/raw/branch/master/", bigLFS)) | ||||
| 					resp = session.MakeRequest(t, req, http.StatusOK) | ||||
| 					assert.NotEqual(t, bigSize, resp.Body.Len()) | ||||
| 					assert.Contains(t, resp.Body.String(), models.LFSMetaFileIdentifier) | ||||
| 				} | ||||
| 			}) | ||||
| 			t.Run("Media", func(t *testing.T) { | ||||
| 				PrintCurrentTest(t) | ||||
| 				session := loginUser(t, "user2") | ||||
| 
 | ||||
| 				// Request media paths
 | ||||
| 				req := NewRequest(t, "GET", path.Join("/user2/repo-tmp-18/media/branch/master/", little)) | ||||
| 				resp := session.MakeRequest(t, req, http.StatusOK) | ||||
| 				assert.Equal(t, littleSize, resp.Body.Len()) | ||||
| 
 | ||||
| 				req = NewRequest(t, "GET", path.Join("/user2/repo-tmp-18/media/branch/master/", littleLFS)) | ||||
| 				resp = session.MakeRequest(t, req, http.StatusOK) | ||||
| 				assert.Equal(t, littleSize, resp.Body.Len()) | ||||
| 
 | ||||
| 				if !testing.Short() { | ||||
| 					req = NewRequest(t, "GET", path.Join("/user2/repo-tmp-18/media/branch/master/", big)) | ||||
| 					resp = session.MakeRequest(t, req, http.StatusOK) | ||||
| 					assert.Equal(t, bigSize, resp.Body.Len()) | ||||
| 
 | ||||
| 					req = NewRequest(t, "GET", path.Join("/user2/repo-tmp-18/media/branch/master/", bigLFS)) | ||||
| 					resp = session.MakeRequest(t, req, http.StatusOK) | ||||
| 					assert.Equal(t, bigSize, resp.Body.Len()) | ||||
| 				} | ||||
| 			}) | ||||
| 			little, big := standardCommitAndPushTest(t, dstPath) | ||||
| 			littleLFS, bigLFS := lfsCommitAndPushTest(t, dstPath) | ||||
| 			rawTest(t, &sshContext, little, big, littleLFS, bigLFS) | ||||
| 			mediaTest(t, &sshContext, little, big, littleLFS, bigLFS) | ||||
| 
 | ||||
| 			t.Run("BranchProtectMerge", doBranchProtectPRMerge(&sshContext, dstPath)) | ||||
| 		}) | ||||
| 
 | ||||
| 	}) | ||||
|  | @ -295,7 +104,116 @@ func ensureAnonymousClone(t *testing.T, u *url.URL) { | |||
| 
 | ||||
| } | ||||
| 
 | ||||
| func lockTest(t *testing.T, remote, repoPath string) { | ||||
| func standardCommitAndPushTest(t *testing.T, dstPath string) (little, big string) { | ||||
| 	t.Run("Standard", func(t *testing.T) { | ||||
| 		PrintCurrentTest(t) | ||||
| 		little, big = commitAndPushTest(t, dstPath, "data-file-") | ||||
| 	}) | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| func lfsCommitAndPushTest(t *testing.T, dstPath string) (littleLFS, bigLFS string) { | ||||
| 	t.Run("LFS", func(t *testing.T) { | ||||
| 		PrintCurrentTest(t) | ||||
| 		prefix := "lfs-data-file-" | ||||
| 		_, err := git.NewCommand("lfs").AddArguments("install").RunInDir(dstPath) | ||||
| 		assert.NoError(t, err) | ||||
| 		_, err = git.NewCommand("lfs").AddArguments("track", prefix+"*").RunInDir(dstPath) | ||||
| 		assert.NoError(t, err) | ||||
| 		err = git.AddChanges(dstPath, false, ".gitattributes") | ||||
| 		assert.NoError(t, err) | ||||
| 
 | ||||
| 		littleLFS, bigLFS = commitAndPushTest(t, dstPath, prefix) | ||||
| 
 | ||||
| 		t.Run("Locks", func(t *testing.T) { | ||||
| 			PrintCurrentTest(t) | ||||
| 			lockTest(t, dstPath) | ||||
| 		}) | ||||
| 	}) | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| func commitAndPushTest(t *testing.T, dstPath, prefix string) (little, big string) { | ||||
| 	t.Run("PushCommit", func(t *testing.T) { | ||||
| 		PrintCurrentTest(t) | ||||
| 		t.Run("Little", func(t *testing.T) { | ||||
| 			PrintCurrentTest(t) | ||||
| 			little = doCommitAndPush(t, littleSize, dstPath, prefix) | ||||
| 		}) | ||||
| 		t.Run("Big", func(t *testing.T) { | ||||
| 			if testing.Short() { | ||||
| 				t.Skip("Skipping test in short mode.") | ||||
| 				return | ||||
| 			} | ||||
| 			PrintCurrentTest(t) | ||||
| 			big = doCommitAndPush(t, bigSize, dstPath, prefix) | ||||
| 		}) | ||||
| 	}) | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| func rawTest(t *testing.T, ctx *APITestContext, little, big, littleLFS, bigLFS string) { | ||||
| 	t.Run("Raw", func(t *testing.T) { | ||||
| 		PrintCurrentTest(t) | ||||
| 		username := ctx.Username | ||||
| 		reponame := ctx.Reponame | ||||
| 
 | ||||
| 		session := loginUser(t, username) | ||||
| 
 | ||||
| 		// Request raw paths
 | ||||
| 		req := NewRequest(t, "GET", path.Join("/", username, reponame, "/raw/branch/master/", little)) | ||||
| 		resp := session.MakeRequest(t, req, http.StatusOK) | ||||
| 		assert.Equal(t, littleSize, resp.Body.Len()) | ||||
| 
 | ||||
| 		req = NewRequest(t, "GET", path.Join("/", username, reponame, "/raw/branch/master/", littleLFS)) | ||||
| 		resp = session.MakeRequest(t, req, http.StatusOK) | ||||
| 		assert.NotEqual(t, littleSize, resp.Body.Len()) | ||||
| 		assert.Contains(t, resp.Body.String(), models.LFSMetaFileIdentifier) | ||||
| 
 | ||||
| 		if !testing.Short() { | ||||
| 			req = NewRequest(t, "GET", path.Join("/", username, reponame, "/raw/branch/master/", big)) | ||||
| 			resp = session.MakeRequest(t, req, http.StatusOK) | ||||
| 			assert.Equal(t, bigSize, resp.Body.Len()) | ||||
| 
 | ||||
| 			req = NewRequest(t, "GET", path.Join("/", username, reponame, "/raw/branch/master/", bigLFS)) | ||||
| 			resp = session.MakeRequest(t, req, http.StatusOK) | ||||
| 			assert.NotEqual(t, bigSize, resp.Body.Len()) | ||||
| 			assert.Contains(t, resp.Body.String(), models.LFSMetaFileIdentifier) | ||||
| 		} | ||||
| 	}) | ||||
| } | ||||
| 
 | ||||
| func mediaTest(t *testing.T, ctx *APITestContext, little, big, littleLFS, bigLFS string) { | ||||
| 	t.Run("Media", func(t *testing.T) { | ||||
| 		PrintCurrentTest(t) | ||||
| 
 | ||||
| 		username := ctx.Username | ||||
| 		reponame := ctx.Reponame | ||||
| 
 | ||||
| 		session := loginUser(t, username) | ||||
| 
 | ||||
| 		// Request media paths
 | ||||
| 		req := NewRequest(t, "GET", path.Join("/", username, reponame, "/media/branch/master/", little)) | ||||
| 		resp := session.MakeRequestNilResponseRecorder(t, req, http.StatusOK) | ||||
| 		assert.Equal(t, littleSize, resp.Length) | ||||
| 
 | ||||
| 		req = NewRequest(t, "GET", path.Join("/", username, reponame, "/media/branch/master/", littleLFS)) | ||||
| 		resp = session.MakeRequestNilResponseRecorder(t, req, http.StatusOK) | ||||
| 		assert.Equal(t, littleSize, resp.Length) | ||||
| 
 | ||||
| 		if !testing.Short() { | ||||
| 			req = NewRequest(t, "GET", path.Join("/", username, reponame, "/media/branch/master/", big)) | ||||
| 			resp = session.MakeRequestNilResponseRecorder(t, req, http.StatusOK) | ||||
| 			assert.Equal(t, bigSize, resp.Length) | ||||
| 
 | ||||
| 			req = NewRequest(t, "GET", path.Join("/", username, reponame, "/media/branch/master/", bigLFS)) | ||||
| 			resp = session.MakeRequestNilResponseRecorder(t, req, http.StatusOK) | ||||
| 			assert.Equal(t, bigSize, resp.Length) | ||||
| 		} | ||||
| 	}) | ||||
| } | ||||
| 
 | ||||
| func lockTest(t *testing.T, repoPath string) { | ||||
| 	lockFileTest(t, "README.md", repoPath) | ||||
| } | ||||
| 
 | ||||
|  | @ -310,22 +228,22 @@ func lockFileTest(t *testing.T, filename, repoPath string) { | |||
| 	assert.NoError(t, err) | ||||
| } | ||||
| 
 | ||||
| func commitAndPush(t *testing.T, size int, repoPath string) string { | ||||
| 	name, err := generateCommitWithNewData(size, repoPath, "user2@example.com", "User Two") | ||||
| func doCommitAndPush(t *testing.T, size int, repoPath, prefix string) string { | ||||
| 	name, err := generateCommitWithNewData(size, repoPath, "user2@example.com", "User Two", prefix) | ||||
| 	assert.NoError(t, err) | ||||
| 	_, err = git.NewCommand("push").RunInDir(repoPath) //Push
 | ||||
| 	_, err = git.NewCommand("push", "origin", "master").RunInDir(repoPath) //Push
 | ||||
| 	assert.NoError(t, err) | ||||
| 	return name | ||||
| } | ||||
| 
 | ||||
| func generateCommitWithNewData(size int, repoPath, email, fullName string) (string, error) { | ||||
| func generateCommitWithNewData(size int, repoPath, email, fullName, prefix string) (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-") | ||||
| 	tmpFile, err := ioutil.TempFile(repoPath, prefix) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
|  | @ -355,3 +273,71 @@ func generateCommitWithNewData(size int, repoPath, email, fullName string) (stri | |||
| 	}) | ||||
| 	return filepath.Base(tmpFile.Name()), err | ||||
| } | ||||
| 
 | ||||
| func doBranchProtectPRMerge(baseCtx *APITestContext, dstPath string) func(t *testing.T) { | ||||
| 	return func(t *testing.T) { | ||||
| 		PrintCurrentTest(t) | ||||
| 		t.Run("CreateBranchProtected", doGitCreateBranch(dstPath, "protected")) | ||||
| 		t.Run("PushProtectedBranch", doGitPushTestRepository(dstPath, "origin", "protected")) | ||||
| 
 | ||||
| 		ctx := NewAPITestContext(t, baseCtx.Username, baseCtx.Reponame) | ||||
| 		t.Run("ProtectProtectedBranchNoWhitelist", doProtectBranch(ctx, "protected", "")) | ||||
| 		t.Run("GenerateCommit", func(t *testing.T) { | ||||
| 			_, err := generateCommitWithNewData(littleSize, dstPath, "user2@example.com", "User Two", "branch-data-file-") | ||||
| 			assert.NoError(t, err) | ||||
| 		}) | ||||
| 		t.Run("FailToPushToProtectedBranch", doGitPushTestRepositoryFail(dstPath, "origin", "protected")) | ||||
| 		t.Run("PushToUnprotectedBranch", doGitPushTestRepository(dstPath, "origin", "protected:unprotected")) | ||||
| 		var pr api.PullRequest | ||||
| 		var err error | ||||
| 		t.Run("CreatePullRequest", func(t *testing.T) { | ||||
| 			pr, err = doAPICreatePullRequest(ctx, baseCtx.Username, baseCtx.Reponame, "protected", "unprotected")(t) | ||||
| 			assert.NoError(t, err) | ||||
| 		}) | ||||
| 		t.Run("MergePR", doAPIMergePullRequest(ctx, baseCtx.Username, baseCtx.Reponame, pr.Index)) | ||||
| 		t.Run("PullProtected", doGitPull(dstPath, "origin", "protected")) | ||||
| 		t.Run("ProtectProtectedBranchWhitelist", doProtectBranch(ctx, "protected", baseCtx.Username)) | ||||
| 
 | ||||
| 		t.Run("CheckoutMaster", doGitCheckoutBranch(dstPath, "master")) | ||||
| 		t.Run("CreateBranchForced", doGitCreateBranch(dstPath, "toforce")) | ||||
| 		t.Run("GenerateCommit", func(t *testing.T) { | ||||
| 			_, err := generateCommitWithNewData(littleSize, dstPath, "user2@example.com", "User Two", "branch-data-file-") | ||||
| 			assert.NoError(t, err) | ||||
| 		}) | ||||
| 		t.Run("FailToForcePushToProtectedBranch", doGitPushTestRepositoryFail(dstPath, "-f", "origin", "toforce:protected")) | ||||
| 		t.Run("MergeProtectedToToforce", doGitMerge(dstPath, "protected")) | ||||
| 		t.Run("PushToProtectedBranch", doGitPushTestRepository(dstPath, "origin", "toforce:protected")) | ||||
| 		t.Run("CheckoutMasterAgain", doGitCheckoutBranch(dstPath, "master")) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func doProtectBranch(ctx APITestContext, branch string, userToWhitelist string) func(t *testing.T) { | ||||
| 	// We are going to just use the owner to set the protection.
 | ||||
| 	return func(t *testing.T) { | ||||
| 		csrf := GetCSRF(t, ctx.Session, fmt.Sprintf("/%s/%s/settings/branches", url.PathEscape(ctx.Username), url.PathEscape(ctx.Reponame))) | ||||
| 
 | ||||
| 		if userToWhitelist == "" { | ||||
| 			// Change branch to protected
 | ||||
| 			req := NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/%s/settings/branches/%s", url.PathEscape(ctx.Username), url.PathEscape(ctx.Reponame), url.PathEscape(branch)), map[string]string{ | ||||
| 				"_csrf":     csrf, | ||||
| 				"protected": "on", | ||||
| 			}) | ||||
| 			ctx.Session.MakeRequest(t, req, http.StatusFound) | ||||
| 		} else { | ||||
| 			user, err := models.GetUserByName(userToWhitelist) | ||||
| 			assert.NoError(t, err) | ||||
| 			// Change branch to protected
 | ||||
| 			req := NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/%s/settings/branches/%s", url.PathEscape(ctx.Username), url.PathEscape(ctx.Reponame), url.PathEscape(branch)), map[string]string{ | ||||
| 				"_csrf":            csrf, | ||||
| 				"protected":        "on", | ||||
| 				"enable_whitelist": "on", | ||||
| 				"whitelist_users":  strconv.FormatInt(user.ID, 10), | ||||
| 			}) | ||||
| 			ctx.Session.MakeRequest(t, req, http.StatusFound) | ||||
| 		} | ||||
| 		// Check if master branch has been locked successfully
 | ||||
| 		flashCookie := ctx.Session.GetCookie("macaron_flash") | ||||
| 		assert.NotNil(t, flashCookie) | ||||
| 		assert.EqualValues(t, "success%3DBranch%2Bprotection%2Bfor%2Bbranch%2B%2527"+url.QueryEscape(branch)+"%2527%2Bhas%2Bbeen%2Bupdated.", flashCookie.Value) | ||||
| 	} | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue