Files
codit/backend/tests/store_rpm_mirror_test.go

209 lines
5.9 KiB
Go

package tests
import "testing"
import "codit/internal/db"
import "codit/internal/models"
func createTestProject(t *testing.T, store *db.Store, user models.User, slug string) models.Project {
var project models.Project
var err error
t.Helper()
project = models.Project{
Slug: slug,
Name: slug,
Description: slug + " project",
CreatedBy: user.ID,
UpdatedBy: user.ID,
HomePage: "info",
}
project, err = store.CreateProject(project)
if err != nil {
t.Fatalf("create project: %v", err)
}
return project
}
func createTestRPMRepo(t *testing.T, store *db.Store, project models.Project, user models.User, name string) models.Repo {
var repo models.Repo
var err error
t.Helper()
repo = models.Repo{
ProjectID: project.ID,
Name: name,
Type: "rpm",
Path: "rpm/test/" + name,
CreatedBy: user.ID,
}
repo, err = store.CreateRepo(repo)
if err != nil {
t.Fatalf("create repo: %v", err)
}
return repo
}
func createTestRPMMirrorDir(t *testing.T, store *db.Store, repo models.Repo, path string, interval int64) models.RPMRepoDir {
var item models.RPMRepoDir
var err error
t.Helper()
item = models.RPMRepoDir{
RepoID: repo.ID,
Path: path,
Mode: "mirror",
RemoteURL: "https://example.invalid/repo",
SyncIntervalSec: interval,
SyncEnabled: true,
}
err = store.UpsertRPMRepoDir(item)
if err != nil {
t.Fatalf("upsert rpm mirror dir: %v", err)
}
item, err = store.GetRPMRepoDir(repo.ID, path)
if err != nil {
t.Fatalf("get rpm mirror dir: %v", err)
}
return item
}
func TestResetRunningRPMMirrorTasksMarksRunsFailed(t *testing.T) {
var store *db.Store
var user models.User
var project models.Project
var repo models.Repo
var dir models.RPMRepoDir
var runID string
var started bool
var runs []models.RPMMirrorRun
var err error
store = openTestStore(t)
defer store.Close()
user = createTestUser(t, store, "mirror-reset")
project = createTestProject(t, store, user, "mirror-reset")
repo = createTestRPMRepo(t, store, project, user, "repo")
dir = createTestRPMMirrorDir(t, store, repo, "x86_64", 600)
runID, started, err = store.TryStartRPMMirrorRun(repo.ID, dir.Path, 1000)
if err != nil {
t.Fatalf("try start mirror run: %v", err)
}
if !started {
t.Fatalf("expected mirror run to start")
}
err = store.ResetRunningRPMMirrorTasks()
if err != nil {
t.Fatalf("reset running mirror tasks: %v", err)
}
dir, err = store.GetRPMRepoDir(repo.ID, dir.Path)
if err != nil {
t.Fatalf("get rpm repo dir after reset: %v", err)
}
if dir.SyncRunning {
t.Fatalf("expected sync_running=false after reset")
}
if dir.SyncStatus != "failed" {
t.Fatalf("unexpected sync status: got=%s want=failed", dir.SyncStatus)
}
if dir.SyncError != "aborted by restart" {
t.Fatalf("unexpected sync error: got=%q", dir.SyncError)
}
runs, err = store.ListRPMMirrorRuns(repo.ID, dir.Path, 10)
if err != nil {
t.Fatalf("list mirror runs after reset: %v", err)
}
if len(runs) != 1 {
t.Fatalf("expected one mirror run, got %d", len(runs))
}
if runs[0].ID != runID {
t.Fatalf("unexpected run id: got=%s want=%s", runs[0].ID, runID)
}
if runs[0].Status != "failed" {
t.Fatalf("unexpected run status: got=%s want=failed", runs[0].Status)
}
if runs[0].Error != "aborted by restart" {
t.Fatalf("unexpected run error: got=%q", runs[0].Error)
}
if runs[0].FinishedAt <= 0 {
t.Fatalf("expected finished_at to be set")
}
}
func TestFinishRPMMirrorTaskRunUpdatesTaskAndRun(t *testing.T) {
var store *db.Store
var user models.User
var project models.Project
var repo models.Repo
var dir models.RPMRepoDir
var runID string
var started bool
var runs []models.RPMMirrorRun
var err error
store = openTestStore(t)
defer store.Close()
user = createTestUser(t, store, "mirror-finish")
project = createTestProject(t, store, user, "mirror-finish")
repo = createTestRPMRepo(t, store, project, user, "repo")
dir = createTestRPMMirrorDir(t, store, repo, "x86_64", 600)
runID, started, err = store.TryStartRPMMirrorRun(repo.ID, dir.Path, 1000)
if err != nil {
t.Fatalf("try start mirror run: %v", err)
}
if !started {
t.Fatalf("expected mirror run to start")
}
err = store.FinishRPMMirrorTaskRun(repo.ID, dir.Path, runID, true, 1700, "done", 4, 4, 0, 0, "rev-1", "")
if err != nil {
t.Fatalf("finish mirror task run: %v", err)
}
dir, err = store.GetRPMRepoDir(repo.ID, dir.Path)
if err != nil {
t.Fatalf("get rpm repo dir after finish: %v", err)
}
if dir.SyncRunning {
t.Fatalf("expected sync_running=false after finish")
}
if dir.Dirty {
t.Fatalf("expected dirty=false after success")
}
if dir.SyncStatus != "success" {
t.Fatalf("unexpected sync status: got=%s want=success", dir.SyncStatus)
}
if dir.LastSyncFinishedAt != 1700 {
t.Fatalf("unexpected last sync finished at: got=%d want=1700", dir.LastSyncFinishedAt)
}
if dir.LastSyncSuccessAt != 1700 {
t.Fatalf("unexpected last sync success at: got=%d want=1700", dir.LastSyncSuccessAt)
}
if dir.LastSyncedRevision != "rev-1" {
t.Fatalf("unexpected last synced revision: got=%s want=rev-1", dir.LastSyncedRevision)
}
if dir.NextSyncAt != 2300 {
t.Fatalf("unexpected next sync at: got=%d want=2300", dir.NextSyncAt)
}
runs, err = store.ListRPMMirrorRuns(repo.ID, dir.Path, 10)
if err != nil {
t.Fatalf("list mirror runs after finish: %v", err)
}
if len(runs) != 1 {
t.Fatalf("expected one mirror run, got %d", len(runs))
}
if runs[0].ID != runID {
t.Fatalf("unexpected run id: got=%s want=%s", runs[0].ID, runID)
}
if runs[0].Status != "success" {
t.Fatalf("unexpected run status: got=%s want=success", runs[0].Status)
}
if runs[0].Step != "done" {
t.Fatalf("unexpected run step: got=%s want=done", runs[0].Step)
}
if runs[0].Revision != "rev-1" {
t.Fatalf("unexpected run revision: got=%s want=rev-1", runs[0].Revision)
}
if runs[0].Done != 4 || runs[0].Total != 4 {
t.Fatalf("unexpected run counts: total=%d done=%d", runs[0].Total, runs[0].Done)
}
}