//go:build !runOnTask // Copyright 2023 schukai GmbH // SPDX-License-Identifier: AGPL-3.0 package jobqueue import ( "fmt" "github.com/stretchr/testify/assert" "gorm.io/driver/sqlite" "gorm.io/gorm" "testing" "time" ) func TestWriteToDB6(t *testing.T) { // it is necessary to have a running mysql server // docker rm -f mysql-test && \ // docker run --name mysql-test -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=testdb -p 3306:3306 -d mysql:latest && \ // docker logs -f mysql-test //dsn := "root:my-secret-pw@tcp(localhost:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local" //db, err := gorm.Open(mysql.Open(dsn), &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 manager := NewManager() manager.SetDB(db) err = manager.AddWorker(NewLocalWorker(1)) assert.Nil(t, err) err = manager.Start() assert.Nil(t, err) mgr := manager numJobs := 1000 jobIDs := make([]JobID, numJobs) for i := 0; i < numJobs; i++ { jobID := JobID(fmt.Sprintf("burstJobA%d", i)) jobIDs[i] = jobID runner := &CounterRunnable{} job := NewJob[CounterResult](jobID, runner) scheduler := &InstantScheduler{} err = mgr.ScheduleJob(job, scheduler) assert.Nil(t, err) mgr.mu.Lock() mgr.jobSyncer.Sync(job) mgr.mu.Unlock() time.Sleep(10 * time.Millisecond) } manager.WaitSync() time.Sleep(2 * time.Second) for _, jobID := range jobIDs { var tmpJob JobPersistence err = db.First(&tmpJob, "id = ?", jobID).Error if err != nil { t.Errorf("Job id %s not found in database: %v", jobID, err) } } // check if all jobs are in the database var jobCount int64 err = db.Model(&JobPersistence{}).Count(&jobCount).Error assert.Nil(t, err) assert.Equal(t, int64(numJobs), jobCount) }