blob: c8c91737e41f89105b403a07ba633e2fdb05463b [file] [log] [blame]
package config
import (
"context"
"encoding/json"
"errors"
"testing"
"go.skia.org/infra/task_scheduler/go/specs"
"github.com/stretchr/testify/require"
allowed_mocks "go.skia.org/infra/go/allowed/mocks"
"go.skia.org/infra/go/gerrit"
gitiles_mocks "go.skia.org/infra/go/gitiles/mocks"
"go.skia.org/infra/go/testutils"
"go.skia.org/infra/go/testutils/unittest"
cr_mocks "go.skia.org/infra/skcq/go/codereview/mocks"
)
func setupGetSkCQCfg(t *testing.T, match bool, cfgContents []byte, readFileError error, changedFiles []string, cfgPath string, updatedInChange bool) *GitilesConfigReader {
matchedUser := "batman@gotham.com"
unmatchedUser := "superman@krypton.com"
changeOwner := unmatchedUser
if match {
changeOwner = matchedUser
}
ci := &gerrit.ChangeInfo{
Issue: int64(123),
Owner: &gerrit.Person{Email: changeOwner},
Project: "test-repo",
Branch: "test-branch",
}
ref := "refs/changes/22/401222/140"
// Setup codereview mock.
cr := &cr_mocks.CodeReview{}
if updatedInChange {
cr.On("GetChangeRef", ci).Return(ref).Once()
}
// Mock gitilesRepo.
gitilesRepo := &gitiles_mocks.GitilesRepo{}
if updatedInChange {
gitilesRepo.On("ReadFileAtRef", testutils.AnyContext, cfgPath, ref).Return(cfgContents, readFileError).Once()
} else {
gitilesRepo.On("ReadFileAtRef", testutils.AnyContext, cfgPath, ci.Branch).Return(cfgContents, readFileError).Once()
}
// Mock allow.
allow := &allowed_mocks.Allow{}
allow.On("Member", matchedUser).Return(true).Once()
allow.On("Member", unmatchedUser).Return(false).Once()
return &GitilesConfigReader{
gitilesRepo: gitilesRepo,
cr: cr,
ci: ci,
changedFiles: changedFiles,
canModifyCfgsOnTheFly: allow,
}
}
func TestGetSkCQCfg_UpdatedInChange(t *testing.T) {
unittest.SmallTest(t)
treeStatusURL := "http://tree-status-url"
skCfg := &SkCQCfg{
VisibilityType: InternalVisibility,
TreeStatusURL: treeStatusURL,
CommitterList: "test-list",
DryRunAccessList: "test-list",
}
skCfgContents, err := json.Marshal(skCfg)
require.Nil(t, err)
configReader := setupGetSkCQCfg(t, true, skCfgContents, nil, []string{"dir1/*", SkCQCfgPath}, SkCQCfgPath, true)
cfg, err := configReader.GetSkCQCfg(context.Background())
require.Nil(t, err)
require.Equal(t, treeStatusURL, cfg.TreeStatusURL)
require.Equal(t, InternalVisibility, cfg.VisibilityType)
}
func TestGetSkCQCfg_UpdatedInChange_NotAllowed(t *testing.T) {
unittest.SmallTest(t)
configReader := setupGetSkCQCfg(t, false, []byte{}, nil, []string{"dir1/*", SkCQCfgPath}, SkCQCfgPath, true)
cfg, err := configReader.GetSkCQCfg(context.Background())
require.Nil(t, cfg)
require.NotNil(t, err)
_, ok := err.(*CannotModifyCfgsOnTheFlyError)
require.True(t, ok)
}
func TestGetSkCQCfg_NotUpdatedInChange(t *testing.T) {
unittest.SmallTest(t)
treeStatusURL := "http://tree-status-url"
skCfg := &SkCQCfg{
VisibilityType: PublicVisibility,
TreeStatusURL: treeStatusURL,
CommitterList: "test-list",
DryRunAccessList: "test-list",
}
skCfgContents, err := json.Marshal(skCfg)
require.Nil(t, err)
configReader := setupGetSkCQCfg(t, true, skCfgContents, nil, []string{"dir1/*", "dir2/dir3/DEPS"}, SkCQCfgPath, false)
cfg, err := configReader.GetSkCQCfg(context.Background())
require.Nil(t, err)
require.Equal(t, treeStatusURL, cfg.TreeStatusURL)
require.Equal(t, PublicVisibility, cfg.VisibilityType)
}
func TestGetSkCQCfg_NotFound(t *testing.T) {
unittest.SmallTest(t)
configReader := setupGetSkCQCfg(t, true, []byte{}, errors.New("NOT_FOUND"), []string{"dir1/*", "dir2/dir3/DEPS"}, SkCQCfgPath, false)
cfg, err := configReader.GetSkCQCfg(context.Background())
require.Nil(t, cfg)
require.NotNil(t, err)
_, ok := err.(*ConfigNotFoundError)
require.True(t, ok)
}
func TestGetSkCQCfg_ValidationFailed(t *testing.T) {
unittest.SmallTest(t)
treeStatusURL := "http://tree-status-url"
// Missing CommitterList and DryRunAccessList.
skCfg := &SkCQCfg{
TreeStatusURL: treeStatusURL,
}
skCfgContents, err := json.Marshal(skCfg)
require.Nil(t, err)
configReader := setupGetSkCQCfg(t, true, skCfgContents, nil, []string{"dir1/*", "dir2/dir3/DEPS"}, SkCQCfgPath, false)
cfg, err := configReader.GetSkCQCfg(context.Background())
require.Nil(t, cfg)
require.NotNil(t, err)
}
func TestGetTasksCfg_UpdatedInChange(t *testing.T) {
unittest.SmallTest(t)
tasksJSONPath := "test/path/tasks.json"
tasksJSON := &specs.TasksCfg{}
tasksJSONContents, err := json.Marshal(tasksJSON)
require.Nil(t, err)
configReader := setupGetSkCQCfg(t, true, tasksJSONContents, nil, []string{"dir1/*", tasksJSONPath}, tasksJSONPath, true)
cfg, err := configReader.GetTasksCfg(context.Background(), tasksJSONPath)
require.Nil(t, err)
require.NotNil(t, cfg)
}
func TestGetTasksCfg_NotUpdatedInChange(t *testing.T) {
unittest.SmallTest(t)
tasksJSONPath := "test/path/tasks.json"
tasksJSON := &specs.TasksCfg{}
tasksJSONContents, err := json.Marshal(tasksJSON)
require.Nil(t, err)
configReader := setupGetSkCQCfg(t, true, tasksJSONContents, nil, []string{"dir1/*"}, tasksJSONPath, false)
cfg, err := configReader.GetTasksCfg(context.Background(), tasksJSONPath)
require.Nil(t, err)
require.NotNil(t, cfg)
}