Skip to content

Commit d17bfad

Browse files
GiteaBotwxiaoguang
andauthored
Fix data-race during testing (#30999) (#31024)
Backport #30999 by wxiaoguang Fix #30992 Co-authored-by: wxiaoguang <[email protected]>
1 parent 8446caa commit d17bfad

File tree

3 files changed

+36
-20
lines changed

3 files changed

+36
-20
lines changed

models/unit/unit.go

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"errors"
88
"fmt"
99
"strings"
10+
"sync/atomic"
1011

1112
"code.gitea.io/gitea/models/perm"
1213
"code.gitea.io/gitea/modules/container"
@@ -106,10 +107,23 @@ var (
106107
TypeExternalTracker,
107108
}
108109

109-
// DisabledRepoUnits contains the units that have been globally disabled
110-
DisabledRepoUnits = []Type{}
110+
disabledRepoUnitsAtomic atomic.Pointer[[]Type] // the units that have been globally disabled
111111
)
112112

113+
// DisabledRepoUnitsGet returns the globally disabled units, it is a quick patch to fix data-race during testing.
114+
// Because the queue worker might read when a test is mocking the value. FIXME: refactor to a clear solution later.
115+
func DisabledRepoUnitsGet() []Type {
116+
v := disabledRepoUnitsAtomic.Load()
117+
if v == nil {
118+
return nil
119+
}
120+
return *v
121+
}
122+
123+
func DisabledRepoUnitsSet(v []Type) {
124+
disabledRepoUnitsAtomic.Store(&v)
125+
}
126+
113127
// Get valid set of default repository units from settings
114128
func validateDefaultRepoUnits(defaultUnits, settingDefaultUnits []Type) []Type {
115129
units := defaultUnits
@@ -127,7 +141,7 @@ func validateDefaultRepoUnits(defaultUnits, settingDefaultUnits []Type) []Type {
127141
}
128142

129143
// Remove disabled units
130-
for _, disabledUnit := range DisabledRepoUnits {
144+
for _, disabledUnit := range DisabledRepoUnitsGet() {
131145
for i, unit := range units {
132146
if unit == disabledUnit {
133147
units = append(units[:i], units[i+1:]...)
@@ -140,11 +154,11 @@ func validateDefaultRepoUnits(defaultUnits, settingDefaultUnits []Type) []Type {
140154

141155
// LoadUnitConfig load units from settings
142156
func LoadUnitConfig() error {
143-
var invalidKeys []string
144-
DisabledRepoUnits, invalidKeys = FindUnitTypes(setting.Repository.DisabledRepoUnits...)
157+
disabledRepoUnits, invalidKeys := FindUnitTypes(setting.Repository.DisabledRepoUnits...)
145158
if len(invalidKeys) > 0 {
146159
log.Warn("Invalid keys in disabled repo units: %s", strings.Join(invalidKeys, ", "))
147160
}
161+
DisabledRepoUnitsSet(disabledRepoUnits)
148162

149163
setDefaultRepoUnits, invalidKeys := FindUnitTypes(setting.Repository.DefaultRepoUnits...)
150164
if len(invalidKeys) > 0 {
@@ -167,7 +181,7 @@ func LoadUnitConfig() error {
167181

168182
// UnitGlobalDisabled checks if unit type is global disabled
169183
func (u Type) UnitGlobalDisabled() bool {
170-
for _, ud := range DisabledRepoUnits {
184+
for _, ud := range DisabledRepoUnitsGet() {
171185
if u == ud {
172186
return true
173187
}

models/unit/unit_test.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ import (
1414
func TestLoadUnitConfig(t *testing.T) {
1515
t.Run("regular", func(t *testing.T) {
1616
defer func(disabledRepoUnits, defaultRepoUnits, defaultForkRepoUnits []Type) {
17-
DisabledRepoUnits = disabledRepoUnits
17+
DisabledRepoUnitsSet(disabledRepoUnits)
1818
DefaultRepoUnits = defaultRepoUnits
1919
DefaultForkRepoUnits = defaultForkRepoUnits
20-
}(DisabledRepoUnits, DefaultRepoUnits, DefaultForkRepoUnits)
20+
}(DisabledRepoUnitsGet(), DefaultRepoUnits, DefaultForkRepoUnits)
2121
defer func(disabledRepoUnits, defaultRepoUnits, defaultForkRepoUnits []string) {
2222
setting.Repository.DisabledRepoUnits = disabledRepoUnits
2323
setting.Repository.DefaultRepoUnits = defaultRepoUnits
@@ -28,16 +28,16 @@ func TestLoadUnitConfig(t *testing.T) {
2828
setting.Repository.DefaultRepoUnits = []string{"repo.code", "repo.releases", "repo.issues", "repo.pulls"}
2929
setting.Repository.DefaultForkRepoUnits = []string{"repo.releases"}
3030
assert.NoError(t, LoadUnitConfig())
31-
assert.Equal(t, []Type{TypeIssues}, DisabledRepoUnits)
31+
assert.Equal(t, []Type{TypeIssues}, DisabledRepoUnitsGet())
3232
assert.Equal(t, []Type{TypeCode, TypeReleases, TypePullRequests}, DefaultRepoUnits)
3333
assert.Equal(t, []Type{TypeReleases}, DefaultForkRepoUnits)
3434
})
3535
t.Run("invalid", func(t *testing.T) {
3636
defer func(disabledRepoUnits, defaultRepoUnits, defaultForkRepoUnits []Type) {
37-
DisabledRepoUnits = disabledRepoUnits
37+
DisabledRepoUnitsSet(disabledRepoUnits)
3838
DefaultRepoUnits = defaultRepoUnits
3939
DefaultForkRepoUnits = defaultForkRepoUnits
40-
}(DisabledRepoUnits, DefaultRepoUnits, DefaultForkRepoUnits)
40+
}(DisabledRepoUnitsGet(), DefaultRepoUnits, DefaultForkRepoUnits)
4141
defer func(disabledRepoUnits, defaultRepoUnits, defaultForkRepoUnits []string) {
4242
setting.Repository.DisabledRepoUnits = disabledRepoUnits
4343
setting.Repository.DefaultRepoUnits = defaultRepoUnits
@@ -48,16 +48,16 @@ func TestLoadUnitConfig(t *testing.T) {
4848
setting.Repository.DefaultRepoUnits = []string{"repo.code", "invalid.2", "repo.releases", "repo.issues", "repo.pulls"}
4949
setting.Repository.DefaultForkRepoUnits = []string{"invalid.3", "repo.releases"}
5050
assert.NoError(t, LoadUnitConfig())
51-
assert.Equal(t, []Type{TypeIssues}, DisabledRepoUnits)
51+
assert.Equal(t, []Type{TypeIssues}, DisabledRepoUnitsGet())
5252
assert.Equal(t, []Type{TypeCode, TypeReleases, TypePullRequests}, DefaultRepoUnits)
5353
assert.Equal(t, []Type{TypeReleases}, DefaultForkRepoUnits)
5454
})
5555
t.Run("duplicate", func(t *testing.T) {
5656
defer func(disabledRepoUnits, defaultRepoUnits, defaultForkRepoUnits []Type) {
57-
DisabledRepoUnits = disabledRepoUnits
57+
DisabledRepoUnitsSet(disabledRepoUnits)
5858
DefaultRepoUnits = defaultRepoUnits
5959
DefaultForkRepoUnits = defaultForkRepoUnits
60-
}(DisabledRepoUnits, DefaultRepoUnits, DefaultForkRepoUnits)
60+
}(DisabledRepoUnitsGet(), DefaultRepoUnits, DefaultForkRepoUnits)
6161
defer func(disabledRepoUnits, defaultRepoUnits, defaultForkRepoUnits []string) {
6262
setting.Repository.DisabledRepoUnits = disabledRepoUnits
6363
setting.Repository.DefaultRepoUnits = defaultRepoUnits
@@ -68,16 +68,16 @@ func TestLoadUnitConfig(t *testing.T) {
6868
setting.Repository.DefaultRepoUnits = []string{"repo.code", "repo.releases", "repo.issues", "repo.pulls", "repo.code"}
6969
setting.Repository.DefaultForkRepoUnits = []string{"repo.releases", "repo.releases"}
7070
assert.NoError(t, LoadUnitConfig())
71-
assert.Equal(t, []Type{TypeIssues}, DisabledRepoUnits)
71+
assert.Equal(t, []Type{TypeIssues}, DisabledRepoUnitsGet())
7272
assert.Equal(t, []Type{TypeCode, TypeReleases, TypePullRequests}, DefaultRepoUnits)
7373
assert.Equal(t, []Type{TypeReleases}, DefaultForkRepoUnits)
7474
})
7575
t.Run("empty_default", func(t *testing.T) {
7676
defer func(disabledRepoUnits, defaultRepoUnits, defaultForkRepoUnits []Type) {
77-
DisabledRepoUnits = disabledRepoUnits
77+
DisabledRepoUnitsSet(disabledRepoUnits)
7878
DefaultRepoUnits = defaultRepoUnits
7979
DefaultForkRepoUnits = defaultForkRepoUnits
80-
}(DisabledRepoUnits, DefaultRepoUnits, DefaultForkRepoUnits)
80+
}(DisabledRepoUnitsGet(), DefaultRepoUnits, DefaultForkRepoUnits)
8181
defer func(disabledRepoUnits, defaultRepoUnits, defaultForkRepoUnits []string) {
8282
setting.Repository.DisabledRepoUnits = disabledRepoUnits
8383
setting.Repository.DefaultRepoUnits = defaultRepoUnits
@@ -88,7 +88,7 @@ func TestLoadUnitConfig(t *testing.T) {
8888
setting.Repository.DefaultRepoUnits = []string{}
8989
setting.Repository.DefaultForkRepoUnits = []string{"repo.releases", "repo.releases"}
9090
assert.NoError(t, LoadUnitConfig())
91-
assert.Equal(t, []Type{TypeIssues}, DisabledRepoUnits)
91+
assert.Equal(t, []Type{TypeIssues}, DisabledRepoUnitsGet())
9292
assert.ElementsMatch(t, []Type{TypeCode, TypePullRequests, TypeReleases, TypeUncyclo, TypePackages, TypeProjects, TypeActions}, DefaultRepoUnits)
9393
assert.Equal(t, []Type{TypeReleases}, DefaultForkRepoUnits)
9494
})

tests/integration/org_project_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@ import (
99
"testing"
1010

1111
unit_model "code.gitea.io/gitea/models/unit"
12-
"code.gitea.io/gitea/modules/test"
1312
"code.gitea.io/gitea/tests"
1413
)
1514

1615
func TestOrgProjectAccess(t *testing.T) {
1716
defer tests.PrepareTestEnv(t)()
18-
defer test.MockVariableValue(&unit_model.DisabledRepoUnits, append(slices.Clone(unit_model.DisabledRepoUnits), unit_model.TypeProjects))()
17+
18+
disabledRepoUnits := unit_model.DisabledRepoUnitsGet()
19+
unit_model.DisabledRepoUnitsSet(append(slices.Clone(disabledRepoUnits), unit_model.TypeProjects))
20+
defer unit_model.DisabledRepoUnitsSet(disabledRepoUnits)
1921

2022
// repo project, 404
2123
req := NewRequest(t, "GET", "/user2/repo1/projects")

0 commit comments

Comments
 (0)