tests(cmd): add coverage for migrateActionsArtifacts

Also convert a comment into a warning in the logs when the deletion of
an artifact cannot find the file in the destination storage.

The case were an error happens while deleting the file is not covered
as it would require to mock the storage.Copy function.
This commit is contained in:
Earl Warren 2024-06-09 15:49:22 +02:00
parent 4afbfd3946
commit e759794408
No known key found for this signature in database
GPG key ID: 0579CB2928A78A00
2 changed files with 68 additions and 9 deletions

View file

@ -170,8 +170,8 @@ func migrateActionsArtifacts(ctx context.Context, dstStorage storage.ObjectStora
_, err := storage.Copy(dstStorage, artifact.StoragePath, storage.ActionsArtifacts, artifact.StoragePath) _, err := storage.Copy(dstStorage, artifact.StoragePath, storage.ActionsArtifacts, artifact.StoragePath)
if err != nil { if err != nil {
// ignore files that do not exist
if errors.Is(err, fs.ErrNotExist) { if errors.Is(err, fs.ErrNotExist) {
log.Warn("ignored: actions artifact %s exists in the database but not in storage", artifact.StoragePath)
return nil return nil
} }
return err return err

View file

@ -5,10 +5,12 @@ package cmd
import ( import (
"context" "context"
"io"
"os" "os"
"strings" "strings"
"testing" "testing"
"code.gitea.io/gitea/models/actions"
"code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/packages" "code.gitea.io/gitea/models/packages"
"code.gitea.io/gitea/models/unittest" "code.gitea.io/gitea/models/unittest"
@ -16,11 +18,28 @@ import (
packages_module "code.gitea.io/gitea/modules/packages" packages_module "code.gitea.io/gitea/modules/packages"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/storage" "code.gitea.io/gitea/modules/storage"
"code.gitea.io/gitea/modules/test"
packages_service "code.gitea.io/gitea/services/packages" packages_service "code.gitea.io/gitea/services/packages"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
) )
func createLocalStorage(t *testing.T) (storage.ObjectStorage, string) {
t.Helper()
p := t.TempDir()
storage, err := storage.NewLocalStorage(
context.Background(),
&setting.Storage{
Path: p,
})
require.NoError(t, err)
return storage, p
}
func TestMigratePackages(t *testing.T) { func TestMigratePackages(t *testing.T) {
assert.NoError(t, unittest.PrepareTestDatabase()) assert.NoError(t, unittest.PrepareTestDatabase())
@ -55,14 +74,7 @@ func TestMigratePackages(t *testing.T) {
ctx := context.Background() ctx := context.Background()
p := t.TempDir() dstStorage, p := createLocalStorage(t)
dstStorage, err := storage.NewLocalStorage(
ctx,
&setting.Storage{
Path: p,
})
assert.NoError(t, err)
err = migratePackages(ctx, dstStorage) err = migratePackages(ctx, dstStorage)
assert.NoError(t, err) assert.NoError(t, err)
@ -73,3 +85,50 @@ func TestMigratePackages(t *testing.T) {
assert.EqualValues(t, "01", entries[0].Name()) assert.EqualValues(t, "01", entries[0].Name())
assert.EqualValues(t, "tmp", entries[1].Name()) assert.EqualValues(t, "tmp", entries[1].Name())
} }
func TestMigrateActionsArtifacts(t *testing.T) {
assert.NoError(t, unittest.PrepareTestDatabase())
srcStorage, _ := createLocalStorage(t)
defer test.MockVariableValue(&storage.ActionsArtifacts, srcStorage)()
id := int64(0)
addArtifact := func(storagePath string, status actions.ArtifactStatus) {
id++
artifact := &actions.ActionArtifact{
ID: id,
ArtifactName: storagePath,
StoragePath: storagePath,
Status: int64(status),
}
_, err := db.GetEngine(db.DefaultContext).Insert(artifact)
require.NoError(t, err)
srcStorage.Save(storagePath, strings.NewReader(storagePath), -1)
}
exists := "/exists"
addArtifact(exists, actions.ArtifactStatusUploadConfirmed)
expired := "/expired"
addArtifact(expired, actions.ArtifactStatusExpired)
notFound := "/notfound"
addArtifact(notFound, actions.ArtifactStatusUploadConfirmed)
srcStorage.Delete(notFound)
dstStorage, _ := createLocalStorage(t)
assert.NoError(t, migrateActionsArtifacts(db.DefaultContext, dstStorage))
object, err := dstStorage.Open(exists)
assert.NoError(t, err)
buf, err := io.ReadAll(object)
require.NoError(t, err)
assert.Equal(t, exists, string(buf))
_, err = dstStorage.Stat(expired)
assert.Error(t, err)
_, err = dstStorage.Stat(notFound)
assert.Error(t, err)
}