From 205aa841f049d63c3eeda273c2603a7a92761497 Mon Sep 17 00:00:00 2001
From: Volker Schukai <volker.schukai@schukai.com>
Date: Tue, 24 Oct 2023 01:04:48 +0200
Subject: [PATCH] feat: #1

---
 Taskfile.yml      |  4 ++++
 devenv.nix        |  6 ++++--
 go.mod            |  2 ++
 go.sum            |  4 ++++
 issue-1_test.go   |  3 +--
 logger.go         | 20 ++++++++++++++++++++
 manager.go        |  7 ++++++-
 scheduler_test.go | 14 ++++++++++----
 8 files changed, 51 insertions(+), 9 deletions(-)
 create mode 100644 logger.go

diff --git a/Taskfile.yml b/Taskfile.yml
index b7313f4..1c9a46e 100644
--- a/Taskfile.yml
+++ b/Taskfile.yml
@@ -17,6 +17,8 @@ tasks:
     
   test:
     desc: Execute unit tests in Go.
+    env:
+      TEST_BY_TASK: true
     cmds:
       - echo "Execute unit tests in Go."
       - go test -cover -v ./...
@@ -25,6 +27,8 @@ tasks:
 
   test-fuzz:
     desc: Conduct fuzzing tests.#
+    env:
+      TEST_BY_TASK: true
     cmds:  
       - echo "Conduct fuzzing tests."
       - go test -v -fuzztime=30s -fuzz=Fuzz ./...
diff --git a/devenv.nix b/devenv.nix
index 4a6a252..9c0b1eb 100644
--- a/devenv.nix
+++ b/devenv.nix
@@ -133,8 +133,6 @@ EOF
     #set -euo pipefail
     set -x
     
-    export TEST_BY_TASK=true
-
     PATH="''${PATH}":${pkgs.coreutils}/bin
     PATH="''${PATH}":${pkgs.findutils}/bin
     PATH="''${PATH}":${pkgs.jq}/bin/
@@ -256,6 +254,8 @@ tasks:
     
   test:
     desc: Execute unit tests in Go.
+    env:
+      TEST_BY_TASK: true
     cmds:
       - echo "Execute unit tests in Go."
       - go test -cover -v ./...
@@ -264,6 +264,8 @@ tasks:
 
   test-fuzz:
     desc: Conduct fuzzing tests.#
+    env:
+      TEST_BY_TASK: true
     cmds:  
       - echo "Conduct fuzzing tests."
       - go test -v -fuzztime=30s -fuzz=Fuzz ./...
diff --git a/go.mod b/go.mod
index 4f9576d..453b642 100644
--- a/go.mod
+++ b/go.mod
@@ -40,6 +40,8 @@ require (
 	github.com/tklauser/go-sysconf v0.3.12 // indirect
 	github.com/tklauser/numcpus v0.6.1 // indirect
 	github.com/yusufpapurcu/wmi v1.2.3 // indirect
+	go.uber.org/multierr v1.11.0 // indirect
+	go.uber.org/zap v1.26.0 // indirect
 	golang.org/x/mod v0.8.0 // indirect
 	golang.org/x/net v0.10.0 // indirect
 	golang.org/x/sys v0.13.0 // indirect
diff --git a/go.sum b/go.sum
index 8181d58..996f88a 100644
--- a/go.sum
+++ b/go.sum
@@ -80,6 +80,10 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec
 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
 github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
+go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
+go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
+go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
+go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
diff --git a/issue-1_test.go b/issue-1_test.go
index 63578ba..ce9a16c 100644
--- a/issue-1_test.go
+++ b/issue-1_test.go
@@ -12,8 +12,7 @@ import (
 func TestRoundTrip(t *testing.T) {
 
 	if os.Getenv("TEST_BY_TASK") != "" {
-		t.Skip("Skipping test because CI_SERVER is set")
-		// TODO: run this test in CI
+		t.Skip("Skipping test because TEST_BY_TASK is set")
 	}
 
 	// type JobImport struct {
diff --git a/logger.go b/logger.go
new file mode 100644
index 0000000..46e253a
--- /dev/null
+++ b/logger.go
@@ -0,0 +1,20 @@
+package jobqueue
+
+import "go.uber.org/zap"
+
+type Logger interface {
+	Info(msg string, keysAndValues ...interface{})
+	Error(msg string, keysAndValues ...interface{})
+}
+
+type ZapAdapter struct {
+	logger *zap.Logger
+}
+
+func (z *ZapAdapter) Info(msg string, keysAndValues ...interface{}) {
+	z.logger.Info(msg, zap.Any("info", keysAndValues))
+}
+
+func (z *ZapAdapter) Error(msg string, keysAndValues ...interface{}) {
+	z.logger.Error(msg, zap.Any("error", keysAndValues))
+}
diff --git a/manager.go b/manager.go
index 3edc059..7771d2e 100644
--- a/manager.go
+++ b/manager.go
@@ -26,6 +26,7 @@ type Manager struct {
 	stateManager StateManager
 
 	cronInstance *cron.Cron
+	logger       Logger
 
 	mu sync.Mutex
 }
@@ -212,7 +213,7 @@ func (m *Manager) Stop() error {
 
 	m.eventBus.Unsubscribe(QueueJob, m.jobEventCh)
 	m.eventBus.Unsubscribe(JobReady, m.jobEventCh)
-	
+
 	close(m.jobEventCh)
 
 	var wrappedErr error
@@ -247,6 +248,10 @@ func (m *Manager) Stop() error {
 	return wrappedErr
 }
 
+func (m *Manager) SetLogger(logger Logger) {
+	m.logger = logger
+}
+
 func (m *Manager) handleJobEvents() {
 
 	for event := range m.jobEventCh {
diff --git a/scheduler_test.go b/scheduler_test.go
index 9b6da3f..c2ce7f5 100644
--- a/scheduler_test.go
+++ b/scheduler_test.go
@@ -82,10 +82,16 @@ func TestCronScheduler_BasicFunctionality(t *testing.T) {
 	eventBus := NewEventBus()
 
 	job := NewJob[DummyResult]("test-job", &DummyRunnable{})
+	c := cron.New(cron.WithSeconds())
 
 	genericJob := GenericJob(job)
-	cronScheduler := CronScheduler{cron: cron.New(cron.WithSeconds()), Spec: "*/1 * * * * *"}
+	cronScheduler := CronScheduler{
+		cron: c,
+		Spec: "* * * * * *",
+	}
 	_ = cronScheduler.Schedule(genericJob, eventBus)
+	c.Start()
+	defer c.Stop()
 
 	jobChannel := make(chan interface{})
 
@@ -109,20 +115,20 @@ func TestCronScheduler_StopScheduler(t *testing.T) {
 
 	c := cron.New(cron.WithSeconds())
 
-	cronScheduler := CronScheduler{cron: c, Spec: "*/1 * * * * *"}
+	cronScheduler := CronScheduler{cron: c, Spec: "* * * * * *"}
 
 	job := NewJob[DummyResult]("test-job", &DummyRunnable{})
 
 	genericJob := GenericJob(job)
 	_ = cronScheduler.Schedule(genericJob, eventBus)
+	c.Start()
+	defer c.Stop()
 
 	jobChannel := make(chan interface{})
 
 	go func() {
 		for _ = range jobChannel {
-
 			atomic.AddInt32(&count, 1)
-
 		}
 	}()
 
-- 
GitLab