gitea源码

mirror_push_test.go 5.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package integration
  4. import (
  5. "fmt"
  6. "net/http"
  7. "net/url"
  8. "strconv"
  9. "testing"
  10. "time"
  11. "code.gitea.io/gitea/models/db"
  12. repo_model "code.gitea.io/gitea/models/repo"
  13. "code.gitea.io/gitea/models/unittest"
  14. user_model "code.gitea.io/gitea/models/user"
  15. "code.gitea.io/gitea/modules/gitrepo"
  16. "code.gitea.io/gitea/modules/setting"
  17. "code.gitea.io/gitea/services/migrations"
  18. mirror_service "code.gitea.io/gitea/services/mirror"
  19. repo_service "code.gitea.io/gitea/services/repository"
  20. "code.gitea.io/gitea/tests"
  21. "github.com/stretchr/testify/assert"
  22. )
  23. func TestMirrorPush(t *testing.T) {
  24. onGiteaRun(t, testMirrorPush)
  25. }
  26. func testMirrorPush(t *testing.T, u *url.URL) {
  27. setting.Migrations.AllowLocalNetworks = true
  28. assert.NoError(t, migrations.Init())
  29. _ = db.TruncateBeans(t.Context(), &repo_model.PushMirror{})
  30. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
  31. srcRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  32. mirrorRepo, err := repo_service.CreateRepositoryDirectly(t.Context(), user, user, repo_service.CreateRepoOptions{
  33. Name: "test-push-mirror",
  34. }, true)
  35. assert.NoError(t, err)
  36. session := loginUser(t, user.Name)
  37. pushMirrorURL := fmt.Sprintf("%s%s/%s", u.String(), url.PathEscape(user.Name), url.PathEscape(mirrorRepo.Name))
  38. testCreatePushMirror(t, session, user.Name, srcRepo.Name, pushMirrorURL, user.LowerName, userPassword, "0")
  39. mirrors, _, err := repo_model.GetPushMirrorsByRepoID(t.Context(), srcRepo.ID, db.ListOptions{})
  40. assert.NoError(t, err)
  41. assert.Len(t, mirrors, 1)
  42. ok := mirror_service.SyncPushMirror(t.Context(), mirrors[0].ID)
  43. assert.True(t, ok)
  44. srcGitRepo, err := gitrepo.OpenRepository(t.Context(), srcRepo)
  45. assert.NoError(t, err)
  46. defer srcGitRepo.Close()
  47. srcCommit, err := srcGitRepo.GetBranchCommit("master")
  48. assert.NoError(t, err)
  49. mirrorGitRepo, err := gitrepo.OpenRepository(t.Context(), mirrorRepo)
  50. assert.NoError(t, err)
  51. defer mirrorGitRepo.Close()
  52. mirrorCommit, err := mirrorGitRepo.GetBranchCommit("master")
  53. assert.NoError(t, err)
  54. assert.Equal(t, srcCommit.ID, mirrorCommit.ID)
  55. // Cleanup
  56. assert.True(t, doRemovePushMirror(t, session, user.Name, srcRepo.Name, mirrors[0].ID))
  57. mirrors, _, err = repo_model.GetPushMirrorsByRepoID(t.Context(), srcRepo.ID, db.ListOptions{})
  58. assert.NoError(t, err)
  59. assert.Empty(t, mirrors)
  60. }
  61. func testCreatePushMirror(t *testing.T, session *TestSession, owner, repo, address, username, password, interval string) {
  62. req := NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/%s/settings", url.PathEscape(owner), url.PathEscape(repo)), map[string]string{
  63. "_csrf": GetUserCSRFToken(t, session),
  64. "action": "push-mirror-add",
  65. "push_mirror_address": address,
  66. "push_mirror_username": username,
  67. "push_mirror_password": password,
  68. "push_mirror_interval": interval,
  69. })
  70. session.MakeRequest(t, req, http.StatusSeeOther)
  71. flashMsg := session.GetCookieFlashMessage()
  72. assert.NotEmpty(t, flashMsg.SuccessMsg)
  73. }
  74. func doRemovePushMirror(t *testing.T, session *TestSession, owner, repo string, pushMirrorID int64) bool {
  75. req := NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/%s/settings", url.PathEscape(owner), url.PathEscape(repo)), map[string]string{
  76. "_csrf": GetUserCSRFToken(t, session),
  77. "action": "push-mirror-remove",
  78. "push_mirror_id": strconv.FormatInt(pushMirrorID, 10),
  79. })
  80. resp := session.MakeRequest(t, req, NoExpectedStatus)
  81. flashMsg := session.GetCookieFlashMessage()
  82. return resp.Code == http.StatusSeeOther && assert.NotEmpty(t, flashMsg.SuccessMsg)
  83. }
  84. func doUpdatePushMirror(t *testing.T, session *TestSession, owner, repo string, pushMirrorID int64, interval string) bool {
  85. req := NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/%s/settings", owner, repo), map[string]string{
  86. "_csrf": GetUserCSRFToken(t, session),
  87. "action": "push-mirror-update",
  88. "push_mirror_id": strconv.FormatInt(pushMirrorID, 10),
  89. "push_mirror_interval": interval,
  90. "push_mirror_defer_sync": "true",
  91. })
  92. resp := session.MakeRequest(t, req, NoExpectedStatus)
  93. return resp.Code == http.StatusSeeOther
  94. }
  95. func TestRepoSettingPushMirrorUpdate(t *testing.T) {
  96. defer tests.PrepareTestEnv(t)()
  97. setting.Migrations.AllowLocalNetworks = true
  98. assert.NoError(t, migrations.Init())
  99. session := loginUser(t, "user2")
  100. repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
  101. testCreatePushMirror(t, session, "user2", "repo2", "https://127.0.0.1/user1/repo1.git", "", "", "24h")
  102. pushMirrors, cnt, err := repo_model.GetPushMirrorsByRepoID(t.Context(), repo2.ID, db.ListOptions{})
  103. assert.NoError(t, err)
  104. assert.EqualValues(t, 1, cnt)
  105. assert.Equal(t, 24*time.Hour, pushMirrors[0].Interval)
  106. repo2PushMirrorID := pushMirrors[0].ID
  107. // update repo2 push mirror
  108. assert.True(t, doUpdatePushMirror(t, session, "user2", "repo2", repo2PushMirrorID, "10m0s"))
  109. pushMirror := unittest.AssertExistsAndLoadBean(t, &repo_model.PushMirror{ID: repo2PushMirrorID})
  110. assert.Equal(t, 10*time.Minute, pushMirror.Interval)
  111. // avoid updating repo2 push mirror from repo1
  112. assert.False(t, doUpdatePushMirror(t, session, "user2", "repo1", repo2PushMirrorID, "20m0s"))
  113. pushMirror = unittest.AssertExistsAndLoadBean(t, &repo_model.PushMirror{ID: repo2PushMirrorID})
  114. assert.Equal(t, 10*time.Minute, pushMirror.Interval) // not changed
  115. // avoid deleting repo2 push mirror from repo1
  116. assert.False(t, doRemovePushMirror(t, session, "user2", "repo1", repo2PushMirrorID))
  117. unittest.AssertExistsAndLoadBean(t, &repo_model.PushMirror{ID: repo2PushMirrorID})
  118. // delete repo2 push mirror
  119. assert.True(t, doRemovePushMirror(t, session, "user2", "repo2", repo2PushMirrorID))
  120. unittest.AssertNotExistsBean(t, &repo_model.PushMirror{ID: repo2PushMirrorID})
  121. }