Circleci project setup (#727)

* skip test goroutine leak detection in github actions

* CircleCI Commit

* skip leak detection in circle ci as well
This commit is contained in:
John Roesler 2024-05-02 14:50:11 -05:00 committed by GitHub
parent e46cdc9d11
commit ce96452c3e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 79 additions and 27 deletions

27
.circleci/config.yml Normal file
View File

@ -0,0 +1,27 @@
version: 2.1
orbs:
go: circleci/go@1.11.0
jobs:
test-go:
parameters:
go-version:
type: string
executor:
name: go/default
tag: << parameters.go-version >>
steps:
- checkout
- go/load-cache
- go/mod-download
- go/save-cache
- run:
name: Run tests
command: make test_ci
workflows:
test:
jobs:
- test-go:
matrix:
parameters:
go-version: ["1.20", "1.21", "1.22"]

View File

@ -29,4 +29,4 @@ jobs:
with:
version: v1.55.2
- name: test
run: make test
run: make test_ci

View File

@ -1,4 +1,4 @@
.PHONY: fmt lint test mocks test_coverage
.PHONY: fmt lint test mocks test_coverage test_ci
GO_PKGS := $(shell go list -f {{.Dir}} ./...)
@ -15,5 +15,8 @@ test:
test_coverage:
@go test -race -v $(GO_FLAGS) -count=1 -coverprofile=coverage.out -covermode=atomic $(GO_PKGS)
test_ci:
@TEST_ENV=ci go test -race -v $(GO_FLAGS) -count=1 $(GO_PKGS)
mocks:
@go generate ./...

View File

@ -3,6 +3,7 @@ package gocron
import (
"context"
"fmt"
"os"
"sync"
"testing"
"time"
@ -13,6 +14,27 @@ import (
"go.uber.org/goleak"
)
// ci/cd produces a lot of false positive goroutine leaks for reasons
// I have not been able to pin down. All tests pass locally without leaks.
// Tests run in ci will use the TEST_ENV 'ci' to skip running leak detection.
const testEnvLocal = "local"
var testEnv = testEnvLocal
func init() {
tmp := os.Getenv("TEST_ENV")
if tmp != "" {
testEnv = tmp
}
}
var verifyNoGoroutineLeaks = func(t *testing.T) {
if testEnv != testEnvLocal {
return
}
goleak.VerifyNone(t)
}
func newTestScheduler(t *testing.T, options ...SchedulerOption) Scheduler {
// default test options
out := []SchedulerOption{
@ -28,7 +50,7 @@ func newTestScheduler(t *testing.T, options ...SchedulerOption) Scheduler {
}
func TestScheduler_OneSecond_NoOptions(t *testing.T) {
defer goleak.VerifyNone(t)
defer verifyNoGoroutineLeaks(t)
cronNoOptionsCh := make(chan struct{}, 10)
durationNoOptionsCh := make(chan struct{}, 10)
@ -97,7 +119,7 @@ func TestScheduler_OneSecond_NoOptions(t *testing.T) {
}
func TestScheduler_LongRunningJobs(t *testing.T) {
defer goleak.VerifyNone(t)
defer verifyNoGoroutineLeaks(t)
durationCh := make(chan struct{}, 10)
durationSingletonCh := make(chan struct{}, 10)
@ -178,7 +200,7 @@ func TestScheduler_LongRunningJobs(t *testing.T) {
}
func TestScheduler_Update(t *testing.T) {
defer goleak.VerifyNone(t)
defer verifyNoGoroutineLeaks(t)
durationJobCh := make(chan struct{})
@ -253,7 +275,7 @@ func TestScheduler_Update(t *testing.T) {
}
func TestScheduler_StopTimeout(t *testing.T) {
defer goleak.VerifyNone(t)
defer verifyNoGoroutineLeaks(t)
tests := []struct {
name string
@ -308,7 +330,7 @@ func TestScheduler_StopTimeout(t *testing.T) {
}
func TestScheduler_Shutdown(t *testing.T) {
defer goleak.VerifyNone(t)
defer verifyNoGoroutineLeaks(t)
t.Run("start, stop, start, shutdown", func(t *testing.T) {
s := newTestScheduler(t,
@ -365,7 +387,7 @@ func TestScheduler_Shutdown(t *testing.T) {
}
func TestScheduler_NewJob(t *testing.T) {
defer goleak.VerifyNone(t)
defer verifyNoGoroutineLeaks(t)
tests := []struct {
name string
jd JobDefinition
@ -462,7 +484,7 @@ func TestScheduler_NewJob(t *testing.T) {
}
func TestScheduler_NewJobErrors(t *testing.T) {
defer goleak.VerifyNone(t)
defer verifyNoGoroutineLeaks(t)
tests := []struct {
name string
jd JobDefinition
@ -762,7 +784,7 @@ func TestScheduler_NewJobErrors(t *testing.T) {
}
func TestScheduler_NewJobTask(t *testing.T) {
defer goleak.VerifyNone(t)
defer verifyNoGoroutineLeaks(t)
testFuncPtr := func() {}
testFuncWithParams := func(one, two string) {}
@ -867,7 +889,7 @@ func TestScheduler_NewJobTask(t *testing.T) {
}
func TestScheduler_WithOptionsErrors(t *testing.T) {
defer goleak.VerifyNone(t)
defer verifyNoGoroutineLeaks(t)
tests := []struct {
name string
opt SchedulerOption
@ -929,7 +951,7 @@ func TestScheduler_WithOptionsErrors(t *testing.T) {
}
func TestScheduler_Singleton(t *testing.T) {
defer goleak.VerifyNone(t)
defer verifyNoGoroutineLeaks(t)
tests := []struct {
name string
duration time.Duration
@ -992,7 +1014,7 @@ func TestScheduler_Singleton(t *testing.T) {
}
func TestScheduler_LimitMode(t *testing.T) {
defer goleak.VerifyNone(t)
defer verifyNoGoroutineLeaks(t)
tests := []struct {
name string
numJobs int
@ -1064,7 +1086,7 @@ func TestScheduler_LimitMode(t *testing.T) {
}
func TestScheduler_LimitModeAndSingleton(t *testing.T) {
defer goleak.VerifyNone(t)
defer verifyNoGoroutineLeaks(t)
tests := []struct {
name string
numJobs int
@ -1202,7 +1224,7 @@ func (t testLock) Unlock(_ context.Context) error {
}
func TestScheduler_WithDistributed(t *testing.T) {
defer goleak.VerifyNone(t)
defer verifyNoGoroutineLeaks(t)
notLocked := make(chan struct{}, 10)
notLeader := make(chan struct{}, 10)
@ -1354,7 +1376,7 @@ func TestScheduler_WithDistributed(t *testing.T) {
}
func TestScheduler_RemoveJob(t *testing.T) {
defer goleak.VerifyNone(t)
defer verifyNoGoroutineLeaks(t)
tests := []struct {
name string
addJob bool
@ -1393,7 +1415,7 @@ func TestScheduler_RemoveJob(t *testing.T) {
}
func TestScheduler_JobsWaitingInQueue(t *testing.T) {
defer goleak.VerifyNone(t)
defer verifyNoGoroutineLeaks(t)
tests := []struct {
name string
limit uint
@ -1446,7 +1468,7 @@ func TestScheduler_JobsWaitingInQueue(t *testing.T) {
}
func TestScheduler_RemoveLotsOfJobs(t *testing.T) {
defer goleak.VerifyNone(t)
defer verifyNoGoroutineLeaks(t)
tests := []struct {
name string
numJobs int
@ -1488,7 +1510,7 @@ func TestScheduler_RemoveLotsOfJobs(t *testing.T) {
}
func TestScheduler_RemoveJob_RemoveSelf(t *testing.T) {
defer goleak.VerifyNone(t)
defer verifyNoGoroutineLeaks(t)
s := newTestScheduler(t)
s.Start()
@ -1511,7 +1533,7 @@ func TestScheduler_RemoveJob_RemoveSelf(t *testing.T) {
}
func TestScheduler_WithEventListeners(t *testing.T) {
defer goleak.VerifyNone(t)
defer verifyNoGoroutineLeaks(t)
listenerRunCh := make(chan error, 1)
testErr := fmt.Errorf("test error")
@ -1605,7 +1627,7 @@ func TestScheduler_WithEventListeners(t *testing.T) {
}
func TestScheduler_ManyJobs(t *testing.T) {
defer goleak.VerifyNone(t)
defer verifyNoGoroutineLeaks(t)
s := newTestScheduler(t)
jobsRan := make(chan struct{}, 20000)
@ -1640,7 +1662,7 @@ func TestScheduler_ManyJobs(t *testing.T) {
}
func TestScheduler_RunJobNow(t *testing.T) {
defer goleak.VerifyNone(t)
defer verifyNoGoroutineLeaks(t)
chDuration := make(chan struct{}, 10)
chMonthly := make(chan struct{}, 10)
@ -1790,7 +1812,7 @@ func TestScheduler_RunJobNow(t *testing.T) {
}
func TestScheduler_LastRunSingleton(t *testing.T) {
defer goleak.VerifyNone(t)
defer verifyNoGoroutineLeaks(t)
tests := []struct {
name string
@ -1851,7 +1873,7 @@ func TestScheduler_LastRunSingleton(t *testing.T) {
}
func TestScheduler_OneTimeJob(t *testing.T) {
defer goleak.VerifyNone(t)
defer verifyNoGoroutineLeaks(t)
tests := []struct {
name string
@ -1905,7 +1927,7 @@ func TestScheduler_OneTimeJob(t *testing.T) {
}
func TestScheduler_WithLimitedRuns(t *testing.T) {
defer goleak.VerifyNone(t)
defer verifyNoGoroutineLeaks(t)
tests := []struct {
name string
@ -1980,7 +2002,7 @@ func TestScheduler_WithLimitedRuns(t *testing.T) {
}
func TestScheduler_Jobs(t *testing.T) {
defer goleak.VerifyNone(t)
defer verifyNoGoroutineLeaks(t)
tests := []struct {
name string
@ -2045,7 +2067,7 @@ func (t *testMonitor) RecordJobTiming(startTime, endTime time.Time, _ uuid.UUID,
}
func TestScheduler_WithMonitor(t *testing.T) {
defer goleak.VerifyNone(t)
defer verifyNoGoroutineLeaks(t)
tests := []struct {
name string
jd JobDefinition