209 lines
5.0 KiB
Go
209 lines
5.0 KiB
Go
|
// Copyright 2024 The Forgejo Authors. All rights reserved.
|
||
|
// SPDX-License-Identifier: MIT
|
||
|
|
||
|
package quota_test
|
||
|
|
||
|
import (
|
||
|
"testing"
|
||
|
|
||
|
quota_model "code.gitea.io/gitea/models/quota"
|
||
|
|
||
|
"github.com/stretchr/testify/assert"
|
||
|
)
|
||
|
|
||
|
func TestQuotaGroupAllRulesMustPass(t *testing.T) {
|
||
|
unlimitedRule := quota_model.Rule{
|
||
|
Limit: -1,
|
||
|
Subjects: quota_model.LimitSubjects{
|
||
|
quota_model.LimitSubjectSizeAll,
|
||
|
},
|
||
|
}
|
||
|
denyRule := quota_model.Rule{
|
||
|
Limit: 0,
|
||
|
Subjects: quota_model.LimitSubjects{
|
||
|
quota_model.LimitSubjectSizeAll,
|
||
|
},
|
||
|
}
|
||
|
group := quota_model.Group{
|
||
|
Rules: []quota_model.Rule{
|
||
|
unlimitedRule,
|
||
|
denyRule,
|
||
|
},
|
||
|
}
|
||
|
|
||
|
used := quota_model.Used{}
|
||
|
used.Size.Repos.Public = 1024
|
||
|
|
||
|
// Within a group, *all* rules must pass. Thus, if we have a deny-all rule,
|
||
|
// and an unlimited rule, that will always fail.
|
||
|
ok, has := group.Evaluate(used, quota_model.LimitSubjectSizeAll)
|
||
|
assert.True(t, has)
|
||
|
assert.False(t, ok)
|
||
|
}
|
||
|
|
||
|
func TestQuotaGroupRuleScenario1(t *testing.T) {
|
||
|
group := quota_model.Group{
|
||
|
Rules: []quota_model.Rule{
|
||
|
{
|
||
|
Limit: 1024,
|
||
|
Subjects: quota_model.LimitSubjects{
|
||
|
quota_model.LimitSubjectSizeAssetsAttachmentsReleases,
|
||
|
quota_model.LimitSubjectSizeGitLFS,
|
||
|
quota_model.LimitSubjectSizeAssetsPackagesAll,
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
Limit: 0,
|
||
|
Subjects: quota_model.LimitSubjects{
|
||
|
quota_model.LimitSubjectSizeGitLFS,
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
|
||
|
used := quota_model.Used{}
|
||
|
used.Size.Assets.Attachments.Releases = 512
|
||
|
used.Size.Assets.Packages.All = 256
|
||
|
used.Size.Git.LFS = 16
|
||
|
|
||
|
ok, has := group.Evaluate(used, quota_model.LimitSubjectSizeAssetsAttachmentsReleases)
|
||
|
assert.True(t, has, "size:assets:attachments:releases is covered")
|
||
|
assert.True(t, ok, "size:assets:attachments:releases passes")
|
||
|
|
||
|
ok, has = group.Evaluate(used, quota_model.LimitSubjectSizeAssetsPackagesAll)
|
||
|
assert.True(t, has, "size:assets:packages:all is covered")
|
||
|
assert.True(t, ok, "size:assets:packages:all passes")
|
||
|
|
||
|
ok, has = group.Evaluate(used, quota_model.LimitSubjectSizeGitLFS)
|
||
|
assert.True(t, has, "size:git:lfs is covered")
|
||
|
assert.False(t, ok, "size:git:lfs fails")
|
||
|
|
||
|
ok, has = group.Evaluate(used, quota_model.LimitSubjectSizeAll)
|
||
|
assert.True(t, has, "size:all is covered")
|
||
|
assert.False(t, ok, "size:all fails")
|
||
|
}
|
||
|
|
||
|
func TestQuotaGroupRuleCombination(t *testing.T) {
|
||
|
repoRule := quota_model.Rule{
|
||
|
Limit: 4096,
|
||
|
Subjects: quota_model.LimitSubjects{
|
||
|
quota_model.LimitSubjectSizeReposAll,
|
||
|
},
|
||
|
}
|
||
|
packagesRule := quota_model.Rule{
|
||
|
Limit: 0,
|
||
|
Subjects: quota_model.LimitSubjects{
|
||
|
quota_model.LimitSubjectSizeAssetsPackagesAll,
|
||
|
},
|
||
|
}
|
||
|
|
||
|
used := quota_model.Used{}
|
||
|
used.Size.Repos.Public = 1024
|
||
|
used.Size.Assets.Packages.All = 1024
|
||
|
|
||
|
group := quota_model.Group{
|
||
|
Rules: []quota_model.Rule{
|
||
|
repoRule,
|
||
|
packagesRule,
|
||
|
},
|
||
|
}
|
||
|
|
||
|
// Git LFS isn't covered by any rule
|
||
|
_, has := group.Evaluate(used, quota_model.LimitSubjectSizeGitLFS)
|
||
|
assert.False(t, has)
|
||
|
|
||
|
// repos:all is covered, and is passing
|
||
|
ok, has := group.Evaluate(used, quota_model.LimitSubjectSizeReposAll)
|
||
|
assert.True(t, has)
|
||
|
assert.True(t, ok)
|
||
|
|
||
|
// packages:all is covered, and is failing
|
||
|
ok, has = group.Evaluate(used, quota_model.LimitSubjectSizeAssetsPackagesAll)
|
||
|
assert.True(t, has)
|
||
|
assert.False(t, ok)
|
||
|
|
||
|
// size:all is covered, and is failing (due to packages:all being over quota)
|
||
|
ok, has = group.Evaluate(used, quota_model.LimitSubjectSizeAll)
|
||
|
assert.True(t, has, "size:all should be covered")
|
||
|
assert.False(t, ok, "size:all should fail")
|
||
|
}
|
||
|
|
||
|
func TestQuotaGroupListsRequireOnlyOnePassing(t *testing.T) {
|
||
|
unlimitedRule := quota_model.Rule{
|
||
|
Limit: -1,
|
||
|
Subjects: quota_model.LimitSubjects{
|
||
|
quota_model.LimitSubjectSizeAll,
|
||
|
},
|
||
|
}
|
||
|
denyRule := quota_model.Rule{
|
||
|
Limit: 0,
|
||
|
Subjects: quota_model.LimitSubjects{
|
||
|
quota_model.LimitSubjectSizeAll,
|
||
|
},
|
||
|
}
|
||
|
|
||
|
denyGroup := quota_model.Group{
|
||
|
Rules: []quota_model.Rule{
|
||
|
denyRule,
|
||
|
},
|
||
|
}
|
||
|
unlimitedGroup := quota_model.Group{
|
||
|
Rules: []quota_model.Rule{
|
||
|
unlimitedRule,
|
||
|
},
|
||
|
}
|
||
|
|
||
|
groups := quota_model.GroupList{&denyGroup, &unlimitedGroup}
|
||
|
|
||
|
used := quota_model.Used{}
|
||
|
used.Size.Repos.Public = 1024
|
||
|
|
||
|
// In a group list, if any group passes, the entire evaluation passes.
|
||
|
ok := groups.Evaluate(used, quota_model.LimitSubjectSizeAll)
|
||
|
assert.True(t, ok)
|
||
|
}
|
||
|
|
||
|
func TestQuotaGroupListAllFailing(t *testing.T) {
|
||
|
denyRule := quota_model.Rule{
|
||
|
Limit: 0,
|
||
|
Subjects: quota_model.LimitSubjects{
|
||
|
quota_model.LimitSubjectSizeAll,
|
||
|
},
|
||
|
}
|
||
|
limitedRule := quota_model.Rule{
|
||
|
Limit: 1024,
|
||
|
Subjects: quota_model.LimitSubjects{
|
||
|
quota_model.LimitSubjectSizeAll,
|
||
|
},
|
||
|
}
|
||
|
|
||
|
denyGroup := quota_model.Group{
|
||
|
Rules: []quota_model.Rule{
|
||
|
denyRule,
|
||
|
},
|
||
|
}
|
||
|
limitedGroup := quota_model.Group{
|
||
|
Rules: []quota_model.Rule{
|
||
|
limitedRule,
|
||
|
},
|
||
|
}
|
||
|
|
||
|
groups := quota_model.GroupList{&denyGroup, &limitedGroup}
|
||
|
|
||
|
used := quota_model.Used{}
|
||
|
used.Size.Repos.Public = 2048
|
||
|
|
||
|
ok := groups.Evaluate(used, quota_model.LimitSubjectSizeAll)
|
||
|
assert.False(t, ok)
|
||
|
}
|
||
|
|
||
|
func TestQuotaGroupListEmpty(t *testing.T) {
|
||
|
groups := quota_model.GroupList{}
|
||
|
|
||
|
used := quota_model.Used{}
|
||
|
used.Size.Repos.Public = 2048
|
||
|
|
||
|
ok := groups.Evaluate(used, quota_model.LimitSubjectSizeAll)
|
||
|
assert.True(t, ok)
|
||
|
}
|