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) } }