mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-27 13:39:19 -05:00
43cd6e34e0
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.
(cherry picked from commit e759794408
)
134 lines
3.5 KiB
Go
134 lines
3.5 KiB
Go
// Copyright 2022 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package cmd
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
"os"
|
|
"strings"
|
|
"testing"
|
|
|
|
"code.gitea.io/gitea/models/actions"
|
|
"code.gitea.io/gitea/models/db"
|
|
"code.gitea.io/gitea/models/packages"
|
|
"code.gitea.io/gitea/models/unittest"
|
|
user_model "code.gitea.io/gitea/models/user"
|
|
packages_module "code.gitea.io/gitea/modules/packages"
|
|
"code.gitea.io/gitea/modules/setting"
|
|
"code.gitea.io/gitea/modules/storage"
|
|
"code.gitea.io/gitea/modules/test"
|
|
packages_service "code.gitea.io/gitea/services/packages"
|
|
|
|
"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) {
|
|
assert.NoError(t, unittest.PrepareTestDatabase())
|
|
|
|
creator := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
|
|
|
|
content := "package main\n\nfunc main() {\nfmt.Println(\"hi\")\n}\n"
|
|
buf, err := packages_module.CreateHashedBufferFromReaderWithSize(strings.NewReader(content), 1024)
|
|
assert.NoError(t, err)
|
|
defer buf.Close()
|
|
|
|
v, f, err := packages_service.CreatePackageAndAddFile(db.DefaultContext, &packages_service.PackageCreationInfo{
|
|
PackageInfo: packages_service.PackageInfo{
|
|
Owner: creator,
|
|
PackageType: packages.TypeGeneric,
|
|
Name: "test",
|
|
Version: "1.0.0",
|
|
},
|
|
Creator: creator,
|
|
SemverCompatible: true,
|
|
VersionProperties: map[string]string{},
|
|
}, &packages_service.PackageFileCreationInfo{
|
|
PackageFileInfo: packages_service.PackageFileInfo{
|
|
Filename: "a.go",
|
|
},
|
|
Creator: creator,
|
|
Data: buf,
|
|
IsLead: true,
|
|
})
|
|
assert.NoError(t, err)
|
|
assert.NotNil(t, v)
|
|
assert.NotNil(t, f)
|
|
|
|
ctx := context.Background()
|
|
|
|
dstStorage, p := createLocalStorage(t)
|
|
|
|
err = migratePackages(ctx, dstStorage)
|
|
assert.NoError(t, err)
|
|
|
|
entries, err := os.ReadDir(p)
|
|
assert.NoError(t, err)
|
|
assert.Len(t, entries, 2)
|
|
assert.EqualValues(t, "01", entries[0].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)
|
|
}
|