diff --git a/.idea/workspace.xml b/.idea/workspace.xml index d736d357be36cc09f467425811f388b08cc27655..bccf6a0e3f4d308f023312647a6da8179e990180 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -5,14 +5,20 @@ </component> <component name="ChangeListManager"> <list default="true" id="9979eb22-471e-4f2f-b624-fd3edb5e8c6e" name="Changes" comment=""> - <change afterPath="$PROJECT_DIR$/nix/scripts/cleanup.nix" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/.back/scripts/hello.nix" beforeDir="false" /> - <change beforePath="$PROJECT_DIR$/.gitlab-ci.yml" beforeDir="false" afterPath="$PROJECT_DIR$/.gitlab-ci.yml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/flake.nix" beforeDir="false" afterPath="$PROJECT_DIR$/flake.nix" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/nix/scripts/check-code.nix" beforeDir="false" afterPath="$PROJECT_DIR$/nix/scripts/check-code.nix" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/nix/scripts/deploy.nix" beforeDir="false" afterPath="$PROJECT_DIR$/nix/scripts/deploy.nix" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/database-1_test.go" beforeDir="false" afterPath="$PROJECT_DIR$/database-1_test.go" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/database-2_test.go" beforeDir="false" afterPath="$PROJECT_DIR$/database-2_test.go" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/database-3_test.go" beforeDir="false" afterPath="$PROJECT_DIR$/database-3_test.go" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/database-4_test.go" beforeDir="false" afterPath="$PROJECT_DIR$/database-4_test.go" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/database-5_test.go" beforeDir="false" afterPath="$PROJECT_DIR$/database-5_test.go" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/database-7_test.go" beforeDir="false" afterPath="$PROJECT_DIR$/database-7_test.go" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/database-8_test.go" beforeDir="false" afterPath="$PROJECT_DIR$/database-8_test.go" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/database.go" beforeDir="false" afterPath="$PROJECT_DIR$/database.go" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/database_test.go" beforeDir="false" afterPath="$PROJECT_DIR$/database_test.go" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/job-syncer.go" beforeDir="false" afterPath="$PROJECT_DIR$/job-syncer.go" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/job-syncer_test.go" beforeDir="false" afterPath="$PROJECT_DIR$/job-syncer_test.go" afterDir="false" /> <change beforePath="$PROJECT_DIR$/nix/scripts/go-task.nix" beforeDir="false" afterPath="$PROJECT_DIR$/nix/scripts/go-task.nix" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/nix/scripts/run-tests.nix" beforeDir="false" afterPath="$PROJECT_DIR$/nix/scripts/run-tests.nix" afterDir="false" /> </list> <option name="SHOW_DIALOG" value="false" /> <option name="HIGHLIGHT_CONFLICTS" value="true" /> @@ -50,10 +56,14 @@ <component name="PropertiesComponent">< - assert.NoError(t, saveJob(job, db)) + assert.NoError(t, saveJob(job.GetPersistence(), db)) var jobPersistence JobPersistence assert.NoError(t, db.First(&jobPersistence, "id = ?", job.GetID()).Error) @@ -29,7 +40,7 @@ func TestCreateOrUpdateJob(t *testing.T) { assert.Equal(t, "", jobPersistence.Description) assert.Equal(t, Priority(1), jobPersistence.Priority) job.description = "Updated description" - assert.NoError(t, saveJob(job, db)) + assert.NoError(t, saveJob(job.GetPersistence(), db)) assert.NoError(t, db.First(&jobPersistence, "id = ?", job.GetID()).Error) assert.Equal(t, "Updated description", jobPersistence.Description) diff --git a/database-8_test.go b/database-8_test.go index dfaa323ad4db1f904765a7ec1df74a4a6807d804..a87cdacf655b331d53447d888185740dd6f523d7 100644 --- a/database-8_test.go +++ b/database-8_test.go @@ -7,31 +7,39 @@ import ( "github.com/stretchr/testify/assert" "gorm.io/driver/sqlite" "gorm.io/gorm" - "gorm.io/gorm/logger" - "log" - "os" "testing" "time" ) func TestUpdateJob(t *testing.T) { - db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{}) - assert.NoError(t, err) + gormDB, err := gorm.Open(sqlite.Open("file:unique_id?mode=memory&cache=shared"), &gorm.Config{}) + if err != nil { + t.Fatalf("a error occurred while opening the database: %v", err) + } + t.Cleanup(func() { + sqlDB, err := gormDB.DB() + if err != nil { + t.Fatalf("failed to get generic database object from GORM DB: %v", err) + } + _ = sqlDB.Close() + }) + + db := gormDB assert.NoError(t, db.AutoMigrate(&JobPersistence{}, &JobLog{}, &JobStats{})) runner := &CounterRunnable{} job := NewJob[CounterResult]("job1", runner) - assert.NoError(t, saveJob(job, db)) + assert.NoError(t, saveJob(job.GetPersistence(), db)) job.SetPriority(PriorityHigh) - assert.NoError(t, updateJob(job, db)) + assert.NoError(t, updateJob(job.GetPersistence(), db)) var jobPersistence JobPersistence assert.NoError(t, db.First(&jobPersistence, "id = ?", job.GetID()).Error) assert.Equal(t, PriorityDefault, jobPersistence.Priority) // PriorityDefault because the update should not update the priority - assert.NoError(t, saveJob(job, db)) + assert.NoError(t, saveJob(job.GetPersistence(), db)) assert.NoError(t, db.First(&jobPersistence, "id = ?", job.GetID()).Error) assert.Equal(t, PriorityHigh, jobPersistence.Priority) @@ -43,19 +51,19 @@ func TestUpdateJob(t *testing.T) { func TestCheckAndSaveOrUpdate(t *testing.T) { - newLogger := logger.New( - log.New(os.Stdout, "\r\n", log.LstdFlags), - logger.Config{ - SlowThreshold: time.Second, - LogLevel: logger.Info, - Colorful: true, - }, - ) - - db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{ - Logger: newLogger, + gormDB, err := gorm.Open(sqlite.Open("file:unique_id?mode=memory&cache=shared"), &gorm.Config{}) + if err != nil { + t.Fatalf("a error occurred while opening the database: %v", err) + } + t.Cleanup(func() { + sqlDB, err := gormDB.DB() + if err != nil { + t.Fatalf("failed to get generic database object from GORM DB: %v", err) + } + _ = sqlDB.Close() }) - assert.NoError(t, err) + + db := gormDB assert.NoError(t, db.AutoMigrate(&JobPersistence{}, &JobLog{}, &JobStats{})) @@ -66,13 +74,13 @@ func TestCheckAndSaveOrUpdate(t *testing.T) { var jobPersistence JobPersistence - assert.NoError(t, syncer.CheckAndSaveOrUpdate(job)) + assert.NoError(t, syncer.CheckAndSaveOrUpdate(job.GetPersistence())) jobPersistence = JobPersistence{} assert.NoError(t, db.First(&jobPersistence, "id = ?", job.GetID()).Error) assert.Equal(t, PriorityDefault, jobPersistence.Priority) job.SetPriority(PriorityHigh) - assert.NoError(t, syncer.CheckAndSaveOrUpdate(job)) + assert.NoError(t, syncer.CheckAndSaveOrUpdate(job.GetPersistence())) jobPersistence = JobPersistence{} assert.NoError(t, db.First(&jobPersistence, "id = ?", job.GetID()).Error) assert.Equal(t, PriorityDefault, jobPersistence.Priority) // second update should not update the priority, because update only update stats and logs @@ -94,10 +102,10 @@ func TestCheckAndSaveOrUpdate(t *testing.T) { JobID: job.GetID(), }} - assert.NoError(t, syncer.CheckAndSaveOrUpdate(job)) + assert.NoError(t, syncer.CheckAndSaveOrUpdate(job.GetPersistence())) job.stats.RunCount = 9 - assert.NoError(t, syncer.CheckAndSaveOrUpdate(job)) + assert.NoError(t, syncer.CheckAndSaveOrUpdate(job.GetPersistence())) jobPersistence = JobPersistence{} assert.NoError(t, db.First(&jobPersistence, "id = ?", job.GetID()).Error) diff --git a/database.go b/database.go index 8e09113a6628f4c18d5f406d21a100c8b9b8eac5..ea33671c4701a5e4f0636e1da02fb49eda232e78 100644 --- a/database.go +++ b/database.go @@ -5,12 +5,13 @@ package jobqueue import ( "errors" + "fmt" "gorm.io/gorm" "strings" "time" ) -func (s *JobSyncer) CheckAndSaveOrUpdate(job GenericJob) error { +func (s *JobSyncer) CheckAndSaveOrUpdate(job JobPersistence) error { s.mu.Lock() defer s.mu.Unlock() @@ -19,7 +20,7 @@ func (s *JobSyncer) CheckAndSaveOrUpdate(job GenericJob) error { } db := s.manager.database - + fmt.Println("Database: ", db) var existing JobPersistence result := db.Where("id = ?", job.GetID()).First(&existing) @@ -87,7 +88,7 @@ func (s *JobSyncer) ResetStats(job GenericJob) error { if s.manager == nil || s.manager.database == nil { return ErrNoDatabaseConnection } - return updateJob(job, s.manager.database) + return updateJob(job.GetPersistence(), s.manager.database) } @@ -97,21 +98,19 @@ func (s *JobSyncer) UpdateJob(job GenericJob) error { if s.manager == nil || s.manager.database == nil { return ErrNoDatabaseConnection } - return updateJob(job, s.manager.database) + return updateJob(job.GetPersistence(), s.manager.database) } -func updateJob(job GenericJob, db *gorm.DB) error { +func updateJob(job JobPersistence, db *gorm.DB) error { if db == nil { return ErrNoDatabaseConnection } - permJob := job.GetPersistence() - maxRetries := 3 var attempt int for attempt = 0; attempt < maxRetries; attempt++ { - err := update(&permJob, db) + err := update(&job, db) if err != nil { if strings.Contains(err.Error(), "lock") { time.Sleep(time.Millisecond * 100) @@ -169,7 +168,7 @@ func (s *JobSyncer) SaveJob(job GenericJob) error { if s.manager == nil || s.manager.database == nil { return ErrNoDatabaseConnection } - return saveJob(job, s.manager.database) + return saveJob(job.GetPersistence(), s.manager.database) } func save(job *JobPersistence, db *gorm.DB) error { @@ -216,18 +215,16 @@ func save(job *JobPersistence, db *gorm.DB) error { }) } -func saveJob(job GenericJob, db *gorm.DB) error { +func saveJob(job JobPersistence, db *gorm.DB) error { if db == nil { return ErrNoDatabaseConnection } - permJob := job.GetPersistence() - maxRetries := 3 var attempt int for attempt = 0; attempt < maxRetries; attempt++ { - err := save(&permJob, db) + err := save(&job, db) if err != nil { if strings.Contains(err.Error(), "lock") { time.Sleep(time.Millisecond * 100) diff --git a/database_test.go b/database_test.go index 7ee5f23cef13f0b76541e94e857c4f0e6bb3055f..69a0035672156301ad3b9038e77313ed1b9b00a1 100644 --- a/database_test.go +++ b/database_test.go @@ -12,8 +12,19 @@ import ( ) func TestDeleteJob(t *testing.T) { - db, err := gorm.Open(sqlite.Open("file::memory:?cache=shared"), &gorm.Config{}) - + gormDB, err := gorm.Open(sqlite.Open("file:unique_id?mode=memory&cache=shared"), &gorm.Config{}) + if err != nil { + t.Fatalf("a error occurred while opening the database: %v", err) + } + t.Cleanup(func() { + sqlDB, err := gormDB.DB() + if err != nil { + t.Fatalf("failed to get generic database object from GORM DB: %v", err) + } + _ = sqlDB.Close() + }) + + db := gormDB db.Logger = db.Logger.LogMode(4) assert.Nil(t, err) @@ -27,7 +38,7 @@ func TestDeleteJob(t *testing.T) { // Erstelle einen Job zum Löschen runner := &CounterRunnable{} job := NewJob[CounterResult]("testJobID", runner) - err = saveJob(job, db) + err = saveJob(job.GetPersistence(), db) assert.Nil(t, err) var count int64 @@ -44,8 +55,19 @@ func TestDeleteJob(t *testing.T) { } func TestResetLogs(t *testing.T) { - db, err := gorm.Open(sqlite.Open("file::memory:?cache=shared"), &gorm.Config{}) - assert.Nil(t, err) + gormDB, err := gorm.Open(sqlite.Open("file:unique_id?mode=memory&cache=shared"), &gorm.Config{}) + if err != nil { + t.Fatalf("a error occurred while opening the database: %v", err) + } + t.Cleanup(func() { + sqlDB, err := gormDB.DB() + if err != nil { + t.Fatalf("failed to get generic database object from GORM DB: %v", err) + } + _ = sqlDB.Close() + }) + + db := gormDB db.Logger = db.Logger.LogMode(4) @@ -60,7 +82,7 @@ func TestResetLogs(t *testing.T) { // Erstelle einen Job und füge einige Logs hinzu runner := &CounterRunnable{} job := NewJob[CounterResult]("testJobID", runner) - err = saveJob(job, db) + err = saveJob(job.GetPersistence(), db) assert.Nil(t, err) // Füge Logs zum Job hinzu @@ -85,8 +107,19 @@ func TestResetLogs(t *testing.T) { } func TestResetStats(t *testing.T) { - db, err := gorm.Open(sqlite.Open("file::memory:?cache=shared"), &gorm.Config{}) - assert.Nil(t, err) + gormDB, err := gorm.Open(sqlite.Open("file:unique_id?mode=memory&cache=shared"), &gorm.Config{}) + if err != nil { + t.Fatalf("a error occurred while opening the database: %v", err) + } + t.Cleanup(func() { + sqlDB, err := gormDB.DB() + if err != nil { + t.Fatalf("failed to get generic database object from GORM DB: %v", err) + } + _ = sqlDB.Close() + }) + + db := gormDB db.Logger = db.Logger.LogMode(4) @@ -101,7 +134,7 @@ func TestResetStats(t *testing.T) { // Erstelle einen Job und setze einige Statistiken runner := &CounterRunnable{} job := NewJob[CounterResult]("testJobID", runner) - err = saveJob(job, db) + err = saveJob(job.GetPersistence(), db) assert.Nil(t, err) // Aktualisiere die Job-Statistiken diff --git a/job-syncer.go b/job-syncer.go index c7349ca6e3cb6fb0cda27de05d228f08b1eda1f4..5fcb1ae5504bc17113a2257c7915ad70794e6768 100644 --- a/job-syncer.go +++ b/job-syncer.go @@ -60,11 +60,13 @@ func (js *JobSyncer) Sync(job GenericJob) error { js.mu.Lock() defer js.mu.Unlock() + persistenceJob := job.GetPersistence() + js.running.Add(1) go func() { defer js.running.Done() - err := js.CheckAndSaveOrUpdate(job) + err := js.CheckAndSaveOrUpdate(persistenceJob) if err != nil { Error("Error while creating or updating the job", err) } diff --git a/job-syncer_test.go b/job-syncer_test.go index b67929698d15146d34a0e2b41c4cf2b7bcf35999..09e796bc8345b61cc4ae128de2a02f33303d9aca 100644 --- a/job-syncer_test.go +++ b/job-syncer_test.go @@ -15,10 +15,17 @@ import ( func TestSaveJobWithSQLite(t *testing.T) { - gormDB, err := gorm.Open(sqlite.Open("file::memory:?cache=shared"), &gorm.Config{}) + gormDB, err := gorm.Open(sqlite.Open("file:unique_id?mode=memory&cache=shared"), &gorm.Config{}) if err != nil { t.Fatalf("a error occurred while opening the database: %v", err) } + t.Cleanup(func() { + sqlDB, err := gormDB.DB() + if err != nil { + t.Fatalf("failed to get generic database object from GORM DB: %v", err) + } + _ = sqlDB.Close() + }) manager := &Manager{database: gormDB} //saver := NewJobSyncer(manager) diff --git a/nix/scripts/go-task.nix b/nix/scripts/go-task.nix index 99a206f8d02443ca01d101cef9bbd37053d27863..406aeacae8a4e6b19d2296bfe1b72d38b18a6c53 100644 --- a/nix/scripts/go-task.nix +++ b/nix/scripts/go-task.nix @@ -13,6 +13,7 @@ - rt env: TEST_BY_TASK: true + USER_WORKING_DIR: "{{.USER_WORKING_DIR}}" cmds: - run-tests silent: true diff --git a/nix/scripts/run-tests.nix b/nix/scripts/run-tests.nix index 8278344cb4d1e1b7cad258fa9cef7ab2f00a99fa..befcdfaa35c76772ceb25864068d6c30cce4a98d 100644 --- a/nix/scripts/run-tests.nix +++ b/nix/scripts/run-tests.nix @@ -11,8 +11,7 @@ in echo_header "Running tests" - - selection=$(${pkgs.gum}/bin/gum choose "run specific test" "run all tests" "Cancel") + selection=$(${pkgs.gum}/bin/gum choose "run all tests" "run specific test" "Cancel") if [[ "$selection" == "Cancel" ]]; then echo_ok "Exiting." @@ -21,6 +20,7 @@ in download_test_images setup_go_env + cd_working_dir if [[ "$selection" == "run all tests" ]]; then echo_ok "Running all tests" @@ -52,8 +52,7 @@ in echo_ok "No tests selected, exiting." exit 0 fi - - + if ! ${pkgs.go}/bin/go test -run "$(echo $selected_tests | tr '\n' "")" then echo_fail "ERROR: Tests failed, check your Go!"