gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package pull
  4. import (
  5. "strconv"
  6. "testing"
  7. "time"
  8. "code.gitea.io/gitea/models/db"
  9. issues_model "code.gitea.io/gitea/models/issues"
  10. "code.gitea.io/gitea/models/pull"
  11. repo_model "code.gitea.io/gitea/models/repo"
  12. "code.gitea.io/gitea/models/unittest"
  13. user_model "code.gitea.io/gitea/models/user"
  14. "code.gitea.io/gitea/modules/graceful"
  15. "code.gitea.io/gitea/modules/queue"
  16. "code.gitea.io/gitea/modules/setting"
  17. "code.gitea.io/gitea/modules/test"
  18. "code.gitea.io/gitea/services/automergequeue"
  19. "github.com/stretchr/testify/assert"
  20. "github.com/stretchr/testify/require"
  21. )
  22. func TestPullRequest_AddToTaskQueue(t *testing.T) {
  23. assert.NoError(t, unittest.PrepareTestDatabase())
  24. idChan := make(chan int64, 10)
  25. testHandler := func(items ...string) []string {
  26. for _, s := range items {
  27. id, _ := strconv.ParseInt(s, 10, 64)
  28. idChan <- id
  29. }
  30. return nil
  31. }
  32. cfg, err := setting.GetQueueSettings(setting.CfgProvider, "pr_patch_checker")
  33. assert.NoError(t, err)
  34. prPatchCheckerQueue, err = queue.NewWorkerPoolQueueWithContext(t.Context(), "pr_patch_checker", cfg, testHandler, true)
  35. assert.NoError(t, err)
  36. pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 2})
  37. StartPullRequestCheckImmediately(t.Context(), pr)
  38. assert.Eventually(t, func() bool {
  39. pr = unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 2})
  40. return pr.Status == issues_model.PullRequestStatusChecking
  41. }, 1*time.Second, 100*time.Millisecond)
  42. has, err := prPatchCheckerQueue.Has(strconv.FormatInt(pr.ID, 10))
  43. assert.True(t, has)
  44. assert.NoError(t, err)
  45. go prPatchCheckerQueue.Run()
  46. select {
  47. case id := <-idChan:
  48. assert.Equal(t, pr.ID, id)
  49. case <-time.After(time.Second):
  50. assert.FailNow(t, "Timeout: nothing was added to pullRequestQueue")
  51. }
  52. has, err = prPatchCheckerQueue.Has(strconv.FormatInt(pr.ID, 10))
  53. assert.False(t, has)
  54. assert.NoError(t, err)
  55. pr = unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 2})
  56. assert.Equal(t, issues_model.PullRequestStatusChecking, pr.Status)
  57. prPatchCheckerQueue.ShutdownWait(time.Second)
  58. prPatchCheckerQueue = nil
  59. }
  60. func TestMarkPullRequestAsMergeable(t *testing.T) {
  61. assert.NoError(t, unittest.PrepareTestDatabase())
  62. prPatchCheckerQueue = queue.CreateUniqueQueue(graceful.GetManager().ShutdownContext(), "pr_patch_checker", func(items ...string) []string { return nil })
  63. go prPatchCheckerQueue.Run()
  64. defer func() {
  65. prPatchCheckerQueue.ShutdownWait(time.Second)
  66. prPatchCheckerQueue = nil
  67. }()
  68. addToQueueShaChan := make(chan string, 1)
  69. defer test.MockVariableValue(&automergequeue.AddToQueue, func(pr *issues_model.PullRequest, sha string) {
  70. addToQueueShaChan <- sha
  71. })()
  72. ctx := t.Context()
  73. _, _ = db.GetEngine(ctx).ID(2).Update(&issues_model.PullRequest{Status: issues_model.PullRequestStatusChecking})
  74. pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 2})
  75. require.False(t, pr.HasMerged)
  76. require.Equal(t, issues_model.PullRequestStatusChecking, pr.Status)
  77. err := pull.ScheduleAutoMerge(ctx, &user_model.User{ID: 99999}, pr.ID, repo_model.MergeStyleMerge, "test msg", true)
  78. require.NoError(t, err)
  79. exist, scheduleMerge, err := pull.GetScheduledMergeByPullID(ctx, pr.ID)
  80. require.NoError(t, err)
  81. assert.True(t, exist)
  82. assert.True(t, scheduleMerge.Doer.IsGhost())
  83. markPullRequestAsMergeable(ctx, pr)
  84. pr = unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 2})
  85. require.Equal(t, issues_model.PullRequestStatusMergeable, pr.Status)
  86. select {
  87. case sha := <-addToQueueShaChan:
  88. assert.Equal(t, "985f0301dba5e7b34be866819cd15ad3d8f508ee", sha) // ref: refs/pull/3/head
  89. case <-time.After(1 * time.Second):
  90. assert.FailNow(t, "Timeout: nothing was added to automergequeue")
  91. }
  92. }