diff --git a/.custom-gcl.yml b/.custom-gcl.yml new file mode 100644 index 00000000..6af35e39 --- /dev/null +++ b/.custom-gcl.yml @@ -0,0 +1,7 @@ +# The golangci-lint version used to build the custom binary. +version: v2.0.0 +name: goworkflows +destination: . +plugins: + - module: 'github.com/cschleiden/go-workflows' + path: ./analyzer \ No newline at end of file diff --git a/.golangci.yml b/.golangci.yml index f4dcaaac..1e57c93e 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,13 +1,53 @@ +--- +version: "2" run: - tests: false - + allow-parallel-runners: true linters: enable: - - goworkflows - -linters-settings: - custom: - goworkflows: - path: ./plugin.so - description: go-workflows - original-url: github.com/cschleiden/go-workflows/analyzer \ No newline at end of file + - "bidichk" + - "bodyclose" + - "errcheck" + - "errname" + - "errorlint" + # - "gocritic" + - "goprintffuncname" + # - "gosec" + - "govet" + - "importas" + - "ineffassign" + - "makezero" + - "prealloc" + - "predeclared" + - "promlinter" + # - "revive" + - "rowserrcheck" + - "spancheck" + - "staticcheck" + - "tagalign" + - "testifylint" + - "tparallel" + - "unconvert" + - "usetesting" + - "wastedassign" + - "whitespace" + - "unused" + settings: + staticcheck: + checks: + - "all" +formatters: + enable: + - "gci" + - "gofmt" + - "gofumpt" + - "goimports" + settings: + gci: + sections: + - "standard" + - "default" + - "prefix(github.com/cschleiden)" + - "localmodule" + goimports: + local-prefixes: + - "github.com/cschleiden/go-workflows" \ No newline at end of file diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 62ca98d2..c356d7a6 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -2,6 +2,3 @@ 1. `docker-compose up` -### Use custom linter - -1. Build analyzer `go build -tags analyzerplugin -buildmode=plugin analyzer/plugin/plugin.go` diff --git a/activitytester/activitytester_test.go b/activitytester/activitytester_test.go index 79b2ad95..684dfa45 100644 --- a/activitytester/activitytester_test.go +++ b/activitytester/activitytester_test.go @@ -4,8 +4,9 @@ import ( "context" "testing" - "github.com/cschleiden/go-workflows/activity" "github.com/stretchr/testify/require" + + "github.com/cschleiden/go-workflows/activity" ) func Activity(ctx context.Context, a int, b int) (int, error) { diff --git a/analyzer/README.md b/analyzer/README.md index b591a004..00d8316f 100644 --- a/analyzer/README.md +++ b/analyzer/README.md @@ -2,4 +2,18 @@ This package implements a basic analyzer for checking various common workflow error conditions. -It can be used with golangci-lint as a custom linter to provide feedback in editors or in CI runs. \ No newline at end of file +In your own .golangci.yaml configuration file, you can enable it like this: + +```yaml +version: "2" + +linters: + enable: + - goworkflows + + settings: + custom: + goworkflows: + type: module + original-url: github.com/cschleiden/go-workflows/analyzer +``` \ No newline at end of file diff --git a/analyzer/analyzer.go b/analyzer/analyzer.go index 7bc2a802..4a1a58b3 100644 --- a/analyzer/analyzer.go +++ b/analyzer/analyzer.go @@ -4,27 +4,55 @@ import ( "go/ast" "go/types" + "github.com/golangci/plugin-module-register/register" "golang.org/x/tools/go/analysis" "golang.org/x/tools/go/analysis/passes/inspect" "golang.org/x/tools/go/ast/inspector" ) -var checkPrivateReturnValues bool +func init() { + register.Plugin("goworkflows", New) +} -func New() *analysis.Analyzer { - a := &analysis.Analyzer{ - Name: "goworkflows", - Doc: "Checks for common errors when writing workflows", - Run: run, - Requires: []*analysis.Analyzer{inspect.Analyzer}, +func New(settings any) (register.LinterPlugin, error) { + // The configuration type will be map[string]any or []interface, it depends on your configuration. + // You can use https://github.com/go-viper/mapstructure to convert map to struct. + s, err := register.DecodeSettings[Settings](settings) + if err != nil { + return nil, err } - a.Flags.BoolVar(&checkPrivateReturnValues, "checkprivatereturnvalues", false, "Check return values of workflows which aren't exported") + return &GoWorkflowsPlugin{Settings: s}, nil +} + +type GoWorkflowsPlugin struct { + Settings Settings +} + +type Settings struct { + CheckPrivateReturnValues bool `json:"checkprivatereturnvalues"` +} + +func (w *GoWorkflowsPlugin) BuildAnalyzers() ([]*analysis.Analyzer, error) { + return []*analysis.Analyzer{ + { + Name: "goworkflows", + Doc: "Checks for common errors when writing workflows", + Run: w.run, + Requires: []*analysis.Analyzer{inspect.Analyzer}, + }, + }, nil +} + +func (w *GoWorkflowsPlugin) GetLoadMode() string { + // NOTE: the mode can be `register.LoadModeSyntax` or `register.LoadModeTypesInfo`. + // - `register.LoadModeSyntax`: if the linter doesn't use types information. + // - `register.LoadModeTypesInfo`: if the linter uses types information. - return a + return register.LoadModeSyntax } -func run(pass *analysis.Pass) (interface{}, error) { +func (w *GoWorkflowsPlugin) run(pass *analysis.Pass) (interface{}, error) { inspector := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector) // Expect workflows to be top level functions in a file. Therefore it should be enough to just keep track if the current @@ -84,7 +112,7 @@ func run(pass *analysis.Pass) (interface{}, error) { inWorkflow = true // Check return types - if n.Name.IsExported() || checkPrivateReturnValues { + if n.Name.IsExported() || w.Settings.CheckPrivateReturnValues { if n.Type.Results == nil || len(n.Type.Results.List) == 0 { pass.Reportf(n.Pos(), "workflow `%v` doesn't return anything. needs to return at least `error`", n.Name.Name) } else { diff --git a/analyzer/analyzer_test.go b/analyzer/analyzer_test.go index 05435670..436ccbd8 100644 --- a/analyzer/analyzer_test.go +++ b/analyzer/analyzer_test.go @@ -3,20 +3,39 @@ package analyzer import ( "testing" + "github.com/golangci/plugin-module-register/register" "github.com/stretchr/testify/require" "golang.org/x/tools/go/analysis/analysistest" ) func TestAll(t *testing.T) { - a := New() - a.Flags.Set("checkprivatereturnvalues", "true") - analysistest.Run(t, analysistest.TestData(), a, "p", "q") + newPlugin, err := register.GetPlugin("goworkflows") + require.NoError(t, err) + + plugin, err := newPlugin(map[string]any{ + "checkprivatereturnvalues": true, + }) + require.NoError(t, err) + + analyzers, err := plugin.BuildAnalyzers() + require.NoError(t, err) + + analysistest.Run(t, analysistest.TestData(), analyzers[0], "p", "q") } func TestComplex(t *testing.T) { - a := New() - a.Flags.Set("checkprivatereturnvalues", "true") - result := analysistest.Run(t, analysistest.TestData(), a, "q") + newPlugin, err := register.GetPlugin("goworkflows") + require.NoError(t, err) + + plugin, err := newPlugin(map[string]any{ + "checkprivatereturnvalues": true, + }) + require.NoError(t, err) + + analyzers, err := plugin.BuildAnalyzers() + require.NoError(t, err) + + result := analysistest.Run(t, analysistest.TestData(), analyzers[0], "q") for _, r := range result { require.NoError(t, r.Err) require.Equal(t, 1, len(r.Diagnostics)) diff --git a/analyzer/go.mod b/analyzer/go.mod new file mode 100644 index 00000000..68b54d61 --- /dev/null +++ b/analyzer/go.mod @@ -0,0 +1,17 @@ +module github.com/cschleiden/go-workflows/analyzer + +go 1.24.5 + +require ( + github.com/golangci/plugin-module-register v0.1.1 + github.com/stretchr/testify v1.10.0 + golang.org/x/tools v0.31.0 +) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + golang.org/x/mod v0.24.0 // indirect + golang.org/x/sync v0.12.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/analyzer/go.sum b/analyzer/go.sum new file mode 100644 index 00000000..d23f4cf7 --- /dev/null +++ b/analyzer/go.sum @@ -0,0 +1,20 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/golangci/plugin-module-register v0.1.1 h1:TCmesur25LnyJkpsVrupv1Cdzo+2f7zX0H6Jkw1Ol6c= +github.com/golangci/plugin-module-register v0.1.1/go.mod h1:TTpqoB6KkwOJMV8u7+NyXMrkwwESJLOkfl9TxR1DGFc= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= +golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= +golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/tools v0.31.0 h1:0EedkvKDbh+qistFTd0Bcwe/YLh4vHwWEkiI0toFIBU= +golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/analyzer/plugin/plugin.go b/analyzer/plugin/plugin.go deleted file mode 100644 index aa3abc5f..00000000 --- a/analyzer/plugin/plugin.go +++ /dev/null @@ -1,16 +0,0 @@ -//go:build analyzerplugin -// +build analyzerplugin - -// Custom plugin for golangci-lint -package main - -import ( - "github.com/cschleiden/go-workflows/analyzer" - "golang.org/x/tools/go/analysis" -) - -func New(conf any) ([]*analysis.Analyzer, error) { - // The configuration type will be map[string]any or []interface, it depends - // on your configuration. - return []*analysis.Analyzer{analyzer.New()}, nil -} diff --git a/backend/backend.go b/backend/backend.go index 8d1723f1..8255eb69 100644 --- a/backend/backend.go +++ b/backend/backend.go @@ -5,16 +5,19 @@ import ( "errors" "fmt" + "go.opentelemetry.io/otel/trace" + "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/backend/metrics" "github.com/cschleiden/go-workflows/core" "github.com/cschleiden/go-workflows/workflow" - "go.opentelemetry.io/otel/trace" ) -var ErrInstanceNotFound = errors.New("workflow instance not found") -var ErrInstanceAlreadyExists = errors.New("workflow instance already exists") -var ErrInstanceNotFinished = errors.New("workflow instance is not finished") +var ( + ErrInstanceNotFound = errors.New("workflow instance not found") + ErrInstanceAlreadyExists = errors.New("workflow instance already exists") + ErrInstanceNotFinished = errors.New("workflow instance is not finished") +) type ErrNotSupported struct { Message string diff --git a/backend/history/grouping_test.go b/backend/history/grouping_test.go index c25496b9..4f6bbd95 100644 --- a/backend/history/grouping_test.go +++ b/backend/history/grouping_test.go @@ -4,9 +4,10 @@ import ( "testing" "time" - "github.com/cschleiden/go-workflows/core" "github.com/google/uuid" "github.com/stretchr/testify/require" + + "github.com/cschleiden/go-workflows/core" ) func TestGrouping_MultipleEventsSameInstance(t *testing.T) { @@ -26,6 +27,6 @@ func TestGrouping_MultipleEventsSameInstance(t *testing.T) { require.Len(t, r, 1) require.Len(t, r[*instance], 2) - require.Equal(t, r[*instance][0].HistoryEvent.Type, EventType_SubWorkflowScheduled) - require.Equal(t, r[*instance][1].HistoryEvent.Type, EventType_SignalReceived) + require.Equal(t, EventType_SubWorkflowScheduled, r[*instance][0].HistoryEvent.Type) + require.Equal(t, EventType_SignalReceived, r[*instance][1].HistoryEvent.Type) } diff --git a/backend/history/workflow_canceled.go b/backend/history/workflow_canceled.go index 5ea7747e..0d339183 100644 --- a/backend/history/workflow_canceled.go +++ b/backend/history/workflow_canceled.go @@ -1,4 +1,3 @@ package history -type ExecutionCanceledAttributes struct { -} +type ExecutionCanceledAttributes struct{} diff --git a/backend/history/workflow_task_started.go b/backend/history/workflow_task_started.go index 421e51d8..66312871 100644 --- a/backend/history/workflow_task_started.go +++ b/backend/history/workflow_task_started.go @@ -1,4 +1,3 @@ package history -type WorkflowTaskStartedAttributes struct { -} +type WorkflowTaskStartedAttributes struct{} diff --git a/backend/metrics/metrics.go b/backend/metrics/metrics.go index b6e37236..d2c0b48c 100644 --- a/backend/metrics/metrics.go +++ b/backend/metrics/metrics.go @@ -5,7 +5,7 @@ import "time" type Tags map[string]string type Client interface { - //Counter records a value at a point in time. + // Counter records a value at a point in time. Counter(name string, tags Tags, value int64) // Distribution records a value at a point in time. diff --git a/backend/monoprocess/monoprocess_test.go b/backend/monoprocess/monoprocess_test.go index 6919e579..df09ea2b 100644 --- a/backend/monoprocess/monoprocess_test.go +++ b/backend/monoprocess/monoprocess_test.go @@ -5,11 +5,12 @@ import ( "errors" "testing" + "github.com/stretchr/testify/require" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/backend/sqlite" "github.com/cschleiden/go-workflows/backend/test" - "github.com/stretchr/testify/require" ) func Test_MonoprocessBackend(t *testing.T) { diff --git a/backend/mysql/diagnostics.go b/backend/mysql/diagnostics.go index 8430a7c6..bf0e4a28 100644 --- a/backend/mysql/diagnostics.go +++ b/backend/mysql/diagnostics.go @@ -3,6 +3,7 @@ package mysql import ( "context" "database/sql" + "errors" "time" "github.com/cschleiden/go-workflows/core" @@ -108,7 +109,7 @@ func (mb *mysqlBackend) GetWorkflowInstance(ctx context.Context, instance *core. err = res.Scan(&id, &executionID, &parentID, &parentExecutionID, &parentScheduleEventID, &createdAt, &completedAt, &queue) if err != nil { - if err == sql.ErrNoRows { + if errors.Is(err, sql.ErrNoRows) { return nil, nil } diff --git a/backend/mysql/mysql.go b/backend/mysql/mysql.go index 724fbcff..4a73d9db 100644 --- a/backend/mysql/mysql.go +++ b/backend/mysql/mysql.go @@ -11,6 +11,13 @@ import ( "strings" "time" + _ "github.com/go-sql-driver/mysql" + "github.com/golang-migrate/migrate/v4" + "github.com/golang-migrate/migrate/v4/database/mysql" + "github.com/golang-migrate/migrate/v4/source/iofs" + "github.com/google/uuid" + "go.opentelemetry.io/otel/trace" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/backend/metadata" @@ -19,13 +26,6 @@ import ( "github.com/cschleiden/go-workflows/internal/metrickeys" "github.com/cschleiden/go-workflows/internal/workflowerrors" "github.com/cschleiden/go-workflows/workflow" - _ "github.com/go-sql-driver/mysql" - "github.com/google/uuid" - "go.opentelemetry.io/otel/trace" - - "github.com/golang-migrate/migrate/v4" - "github.com/golang-migrate/migrate/v4/database/mysql" - "github.com/golang-migrate/migrate/v4/source/iofs" ) //go:embed db/migrations/*.sql @@ -734,7 +734,7 @@ func (b *mysqlBackend) CompleteWorkflowTask( // Create new instance if err := createInstance(ctx, tx, queue, m.WorkflowInstance, a.Metadata); err != nil { - if err == backend.ErrInstanceAlreadyExists { + if errors.Is(err, backend.ErrInstanceAlreadyExists) { if err := insertPendingEvents(ctx, tx, instance, []*history.Event{ history.NewPendingEvent(time.Now(), history.EventType_SubWorkflowFailed, &history.SubWorkflowFailedAttributes{ Error: workflowerrors.FromError(backend.ErrInstanceAlreadyExists), @@ -977,8 +977,8 @@ func scheduleActivity(ctx context.Context, tx *sql.Tx, queue workflow.Queue, ins // getWorkerName returns the worker name from options, or generates a UUID-based name if not set. func getWorkerName(options *options) string { - if options.Options.WorkerName != "" { - return options.Options.WorkerName + if options.WorkerName != "" { + return options.WorkerName } return fmt.Sprintf("worker-%v", uuid.NewString()) } diff --git a/backend/mysql/mysql_test.go b/backend/mysql/mysql_test.go index b8dcc55c..02bf7ea8 100644 --- a/backend/mysql/mysql_test.go +++ b/backend/mysql/mysql_test.go @@ -7,14 +7,17 @@ import ( "strings" "testing" + "github.com/google/uuid" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/backend/test" - "github.com/google/uuid" ) -const testUser = "root" -const testPassword = "root" +const ( + testUser = "root" + testPassword = "root" +) // Creating and dropping databases is terribly inefficient, but easiest for complete test isolation. For // the future consider nested transactions, or manually TRUNCATE-ing the tables in-between tests. @@ -32,7 +35,7 @@ func Test_MysqlBackend(t *testing.T) { panic(err) } - dbName = "test_" + strings.Replace(uuid.NewString(), "-", "", -1) + dbName = "test_" + strings.ReplaceAll(uuid.NewString(), "-", "") if _, err := db.Exec("CREATE DATABASE " + dbName); err != nil { panic(fmt.Errorf("creating database: %w", err)) } @@ -77,7 +80,7 @@ func TestMySqlBackendE2E(t *testing.T) { panic(err) } - dbName = "test_" + strings.Replace(uuid.NewString(), "-", "", -1) + dbName = "test_" + strings.ReplaceAll(uuid.NewString(), "-", "") if _, err := db.Exec("CREATE DATABASE " + dbName); err != nil { panic(fmt.Errorf("creating database: %w", err)) } diff --git a/backend/options.go b/backend/options.go index 80e208d9..c5077bcb 100644 --- a/backend/options.go +++ b/backend/options.go @@ -4,13 +4,14 @@ import ( "log/slog" "time" + "go.opentelemetry.io/otel/trace" + "go.opentelemetry.io/otel/trace/noop" + "github.com/cschleiden/go-workflows/backend/converter" "github.com/cschleiden/go-workflows/backend/metrics" mi "github.com/cschleiden/go-workflows/internal/metrics" "github.com/cschleiden/go-workflows/internal/propagators" "github.com/cschleiden/go-workflows/workflow" - "go.opentelemetry.io/otel/trace" - "go.opentelemetry.io/otel/trace/noop" ) type Options struct { diff --git a/backend/redis/delete.go b/backend/redis/delete.go index 984c8deb..f525fed8 100644 --- a/backend/redis/delete.go +++ b/backend/redis/delete.go @@ -4,8 +4,9 @@ import ( "context" "fmt" - "github.com/cschleiden/go-workflows/core" redis "github.com/redis/go-redis/v9" + + "github.com/cschleiden/go-workflows/core" ) // KEYS[1] - instance key diff --git a/backend/redis/diagnostics.go b/backend/redis/diagnostics.go index 89d28b93..873d7104 100644 --- a/backend/redis/diagnostics.go +++ b/backend/redis/diagnostics.go @@ -5,10 +5,11 @@ import ( "encoding/json" "fmt" + redis "github.com/redis/go-redis/v9" + "github.com/cschleiden/go-workflows/core" "github.com/cschleiden/go-workflows/diag" "github.com/cschleiden/go-workflows/internal/log" - redis "github.com/redis/go-redis/v9" ) var _ diag.Backend = (*redisBackend)(nil) diff --git a/backend/redis/diagnostics_test.go b/backend/redis/diagnostics_test.go index be9e67fd..bf4fa78a 100644 --- a/backend/redis/diagnostics_test.go +++ b/backend/redis/diagnostics_test.go @@ -4,9 +4,10 @@ import ( "context" "testing" + "github.com/stretchr/testify/require" + "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/diag" - "github.com/stretchr/testify/require" ) func Test_Diag_GetWorkflowInstances(t *testing.T) { @@ -28,7 +29,7 @@ func Test_Diag_GetWorkflowInstances(t *testing.T) { ctx := context.Background() instances, err := bd.GetWorkflowInstances(ctx, "", "", 5) require.NoError(t, err) - require.Len(t, instances, 0) + require.Empty(t, instances) c := client.New(b) diff --git a/backend/redis/events.go b/backend/redis/events.go index 4f7313ec..3a3f9c60 100644 --- a/backend/redis/events.go +++ b/backend/redis/events.go @@ -5,9 +5,10 @@ import ( "encoding/json" "fmt" + "github.com/redis/go-redis/v9" + "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/core" - "github.com/redis/go-redis/v9" ) type eventWithoutAttributes struct { diff --git a/backend/redis/events_future.go b/backend/redis/events_future.go index 790204a4..bee9cf77 100644 --- a/backend/redis/events_future.go +++ b/backend/redis/events_future.go @@ -2,6 +2,7 @@ package redis import ( "context" + "errors" "fmt" "strconv" "time" @@ -14,7 +15,7 @@ func scheduleFutureEvents(ctx context.Context, rb *redisBackend) error { nowStr := strconv.FormatInt(now, 10) if _, err := futureEventsCmd.Run(ctx, rb.rdb, []string{ rb.keys.futureEventsKey(), - }, nowStr, rb.keys.prefix).Result(); err != nil && err != redis.Nil { + }, nowStr, rb.keys.prefix).Result(); err != nil && !errors.Is(err, redis.Nil) { return fmt.Errorf("checking future events: %w", err) } diff --git a/backend/redis/expire_test.go b/backend/redis/expire_test.go index 2a4f5a6a..f6577f15 100644 --- a/backend/redis/expire_test.go +++ b/backend/redis/expire_test.go @@ -5,13 +5,14 @@ import ( "testing" "time" + "github.com/google/uuid" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/worker" "github.com/cschleiden/go-workflows/workflow" - "github.com/google/uuid" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) func Test_AutoExpiration(t *testing.T) { @@ -54,7 +55,7 @@ func Test_AutoExpiration(t *testing.T) { // Check that the instance is gone from the list of instances insts, err := b.(*redisBackend).GetWorkflowInstances(ctx, "", "", 1) require.NoError(t, err) - assert.Len(t, insts, 0) + assert.Empty(t, insts) cancel() require.NoError(t, w.WaitForCompletion()) diff --git a/backend/redis/instance.go b/backend/redis/instance.go index dd64ed30..f801bfcd 100644 --- a/backend/redis/instance.go +++ b/backend/redis/instance.go @@ -3,15 +3,17 @@ package redis import ( "context" "encoding/json" + "errors" "fmt" "time" + "github.com/redis/go-redis/v9" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/backend/metadata" "github.com/cschleiden/go-workflows/core" "github.com/cschleiden/go-workflows/workflow" - "github.com/redis/go-redis/v9" ) func (rb *redisBackend) CreateWorkflowInstance(ctx context.Context, instance *workflow.Instance, event *history.Event) error { @@ -63,9 +65,9 @@ func (rb *redisBackend) CreateWorkflowInstance(ctx context.Context, instance *wo payloadData, time.Now().UTC().UnixNano(), ).Result() - if err != nil { - if _, ok := err.(redis.Error); ok { + var error redis.Error + if errors.As(err, &error) { if err.Error() == "ERR InstanceAlreadyExists" { return backend.ErrInstanceAlreadyExists } @@ -194,7 +196,7 @@ func readInstanceP(ctx context.Context, p redis.Pipeliner, instanceKey string) * func readInstancePipelineCmd(cmd *redis.StringCmd) (*instanceState, error) { val, err := cmd.Result() if err != nil { - if err == redis.Nil { + if errors.Is(err, redis.Nil) { return nil, backend.ErrInstanceNotFound } @@ -212,7 +214,7 @@ func readInstancePipelineCmd(cmd *redis.StringCmd) (*instanceState, error) { func (rb *redisBackend) readActiveInstanceExecution(ctx context.Context, instanceID string) (*core.WorkflowInstance, error) { val, err := rb.rdb.Get(ctx, rb.keys.activeInstanceExecutionKey(instanceID)).Result() if err != nil { - if err == redis.Nil { + if errors.Is(err, redis.Nil) { return nil, nil } diff --git a/backend/redis/keys_test.go b/backend/redis/keys_test.go index 53ea7714..0b925669 100644 --- a/backend/redis/keys_test.go +++ b/backend/redis/keys_test.go @@ -9,7 +9,7 @@ import ( func Test_newKeys(t *testing.T) { t.Run("WithEmptyPrefix", func(t *testing.T) { k := newKeys("") - require.Equal(t, "", k.prefix) + require.Empty(t, k.prefix) }) t.Run("WithNonEmptyPrefixWithoutColon", func(t *testing.T) { diff --git a/backend/redis/queue.go b/backend/redis/queue.go index ffe6adb2..9900871b 100644 --- a/backend/redis/queue.go +++ b/backend/redis/queue.go @@ -3,13 +3,15 @@ package redis import ( "context" "encoding/json" + "errors" "fmt" "strings" "time" - "github.com/cschleiden/go-workflows/workflow" "github.com/google/uuid" "github.com/redis/go-redis/v9" + + "github.com/cschleiden/go-workflows/workflow" ) type taskQueue[T any] struct { @@ -86,7 +88,7 @@ func (q *taskQueue[T]) Prepare(ctx context.Context, rdb redis.UniversalClient, q } _, err := prepareCmd.Run(ctx, rdb, keys, q.groupName).Result() - if err != nil && err != redis.Nil { + if err != nil && !errors.Is(err, redis.Nil) { return fmt.Errorf("preparing queues: %w", err) } @@ -164,11 +166,11 @@ func (q *taskQueue[T]) Dequeue(ctx context.Context, rdb redis.UniversalClient, q Count: 1, Block: timeout, }).Result() - if err != nil && err != redis.Nil { + if err != nil && !errors.Is(err, redis.Nil) { return nil, fmt.Errorf("dequeueing task: %w", err) } - if len(ids) == 0 || len(ids[0].Messages) == 0 || err == redis.Nil { + if len(ids) == 0 || len(ids[0].Messages) == 0 || errors.Is(err, redis.Nil) { return nil, nil } @@ -186,7 +188,7 @@ func (q *taskQueue[T]) Extend(ctx context.Context, p redis.Pipeliner, queue work Messages: []string{taskID}, MinIdle: 0, // Always claim this message }).Result() - if err != nil && err != redis.Nil { + if err != nil && !errors.Is(err, redis.Nil) { return fmt.Errorf("extending lease: %w", err) } @@ -198,7 +200,7 @@ func (q *taskQueue[T]) Complete(ctx context.Context, p redis.Pipeliner, queue wo q.Keys(queue).SetKey, q.Keys(queue).StreamKey, }, taskID, q.groupName) - if err := cmd.Err(); err != nil && err != redis.Nil { + if err := cmd.Err(); err != nil && !errors.Is(err, redis.Nil) { return nil, fmt.Errorf("completing task: %w", err) } @@ -207,7 +209,7 @@ func (q *taskQueue[T]) Complete(ctx context.Context, p redis.Pipeliner, queue wo func (q *taskQueue[T]) Data(ctx context.Context, p redis.Pipeliner, queue workflow.Queue, taskID string) (*TaskItem[T], error) { msg, err := p.XRange(ctx, q.Keys(queue).StreamKey, taskID, taskID).Result() - if err != nil && err != redis.Nil { + if err != nil && !errors.Is(err, redis.Nil) { return nil, fmt.Errorf("finding task: %w", err) } @@ -230,7 +232,7 @@ func (q *taskQueue[T]) recover(ctx context.Context, rdb redis.UniversalClient, q "0", ).Slice() if err != nil { - if err == redis.Nil { + if errors.Is(err, redis.Nil) { return nil, nil } diff --git a/backend/redis/queue_test.go b/backend/redis/queue_test.go index 65b1a3db..ce561cbd 100644 --- a/backend/redis/queue_test.go +++ b/backend/redis/queue_test.go @@ -6,10 +6,11 @@ import ( "testing" "time" - "github.com/cschleiden/go-workflows/core" - "github.com/cschleiden/go-workflows/workflow" "github.com/redis/go-redis/v9" "github.com/stretchr/testify/require" + + "github.com/cschleiden/go-workflows/core" + "github.com/cschleiden/go-workflows/workflow" ) func Test_TaskQueue(t *testing.T) { diff --git a/backend/redis/redis.go b/backend/redis/redis.go index be0005e4..d02ccb4b 100644 --- a/backend/redis/redis.go +++ b/backend/redis/redis.go @@ -7,14 +7,15 @@ import ( "io/fs" "time" + "github.com/redis/go-redis/v9" + "go.opentelemetry.io/otel/trace" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/backend/metrics" "github.com/cschleiden/go-workflows/core" "github.com/cschleiden/go-workflows/internal/metrickeys" "github.com/cschleiden/go-workflows/workflow" - "github.com/redis/go-redis/v9" - "go.opentelemetry.io/otel/trace" ) var _ backend.Backend = (*redisBackend)(nil) diff --git a/backend/redis/redis_test.go b/backend/redis/redis_test.go index 6cf079c6..8263faeb 100644 --- a/backend/redis/redis_test.go +++ b/backend/redis/redis_test.go @@ -8,10 +8,11 @@ import ( "testing" "time" + "github.com/redis/go-redis/v9" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/backend/test" - "github.com/redis/go-redis/v9" ) const ( @@ -93,7 +94,6 @@ func (rb *redisBackend) GetFutureEvents(ctx context.Context) ([]*history.Event, Min: "-inf", Max: "+inf", }).Result() - if err != nil { return nil, fmt.Errorf("getting future events: %w", err) } diff --git a/backend/redis/signal.go b/backend/redis/signal.go index b21723cd..fcd65142 100644 --- a/backend/redis/signal.go +++ b/backend/redis/signal.go @@ -4,10 +4,11 @@ import ( "context" "fmt" + "github.com/redis/go-redis/v9" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/workflow" - "github.com/redis/go-redis/v9" ) func (rb *redisBackend) SignalWorkflow(ctx context.Context, instanceID string, event *history.Event) error { diff --git a/backend/redis/workflow.go b/backend/redis/workflow.go index d14ef2d5..ca599e16 100644 --- a/backend/redis/workflow.go +++ b/backend/redis/workflow.go @@ -7,6 +7,8 @@ import ( "strconv" "time" + "github.com/redis/go-redis/v9" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/core" @@ -14,7 +16,6 @@ import ( "github.com/cschleiden/go-workflows/internal/propagators" "github.com/cschleiden/go-workflows/internal/workflowerrors" "github.com/cschleiden/go-workflows/workflow" - "github.com/redis/go-redis/v9" ) func (rb *redisBackend) PrepareWorkflowQueues(ctx context.Context, queues []workflow.Queue) error { diff --git a/backend/sqlite/diagnostics.go b/backend/sqlite/diagnostics.go index 6601b6ba..fe03421e 100644 --- a/backend/sqlite/diagnostics.go +++ b/backend/sqlite/diagnostics.go @@ -3,6 +3,7 @@ package sqlite import ( "context" "database/sql" + "errors" "time" "github.com/cschleiden/go-workflows/core" @@ -114,7 +115,7 @@ func (sb *sqliteBackend) GetWorkflowInstance(ctx context.Context, instance *core err = res.Scan(&id, &executionID, &parentID, &parentExecutionID, &parentScheduleEventID, &createdAt, &completedAt, &queue) if err != nil { - if err == sql.ErrNoRows { + if errors.Is(err, sql.ErrNoRows) { return nil, nil } diff --git a/backend/sqlite/events.go b/backend/sqlite/events.go index 730cffc5..26183f76 100644 --- a/backend/sqlite/events.go +++ b/backend/sqlite/events.go @@ -78,7 +78,6 @@ func getPendingEvents(ctx context.Context, tx *sql.Tx, instance *core.WorkflowIn instance.ExecutionID, now, ) - if err != nil { return nil, fmt.Errorf("getting new events: %w", err) } diff --git a/backend/sqlite/sqlite.go b/backend/sqlite/sqlite.go index f86f64b6..11e811dc 100644 --- a/backend/sqlite/sqlite.go +++ b/backend/sqlite/sqlite.go @@ -11,6 +11,13 @@ import ( "strings" "time" + "github.com/golang-migrate/migrate/v4" + "github.com/golang-migrate/migrate/v4/database/sqlite" + "github.com/golang-migrate/migrate/v4/source/iofs" + "github.com/google/uuid" + "go.opentelemetry.io/otel/trace" + _ "modernc.org/sqlite" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/backend/metadata" @@ -19,14 +26,6 @@ import ( "github.com/cschleiden/go-workflows/internal/metrickeys" "github.com/cschleiden/go-workflows/internal/workflowerrors" "github.com/cschleiden/go-workflows/workflow" - "github.com/google/uuid" - "go.opentelemetry.io/otel/trace" - - _ "modernc.org/sqlite" - - "github.com/golang-migrate/migrate/v4" - "github.com/golang-migrate/migrate/v4/database/sqlite" - "github.com/golang-migrate/migrate/v4/source/iofs" ) //go:embed db/migrations/*.sql @@ -662,7 +661,7 @@ func (sb *sqliteBackend) CompleteWorkflowTask( // Create new instance if err := createInstance(ctx, tx, queue, m.WorkflowInstance, a.Metadata); err != nil { - if err == backend.ErrInstanceAlreadyExists { + if errors.Is(err, backend.ErrInstanceAlreadyExists) { if err := insertPendingEvents(ctx, tx, instance, []*history.Event{ history.NewPendingEvent(time.Now(), history.EventType_SubWorkflowFailed, &history.SubWorkflowFailedAttributes{ Error: workflowerrors.FromError(backend.ErrInstanceAlreadyExists), @@ -876,8 +875,8 @@ func (sb *sqliteBackend) ExtendActivityTask(ctx context.Context, task *backend.A // getWorkerName returns the worker name from options, or generates a UUID-based name if not set. func getWorkerName(options *options) string { - if options.Options.WorkerName != "" { - return options.Options.WorkerName + if options.WorkerName != "" { + return options.WorkerName } return fmt.Sprintf("worker-%v", uuid.NewString()) } diff --git a/backend/sqlite/sqlite_test.go b/backend/sqlite/sqlite_test.go index 83b3a1c2..2ea93145 100644 --- a/backend/sqlite/sqlite_test.go +++ b/backend/sqlite/sqlite_test.go @@ -3,9 +3,10 @@ package sqlite import ( "testing" + "github.com/stretchr/testify/require" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/backend/test" - "github.com/stretchr/testify/require" ) func Test_SqliteBackend(t *testing.T) { diff --git a/backend/test/backendtest.go b/backend/test/backendtest.go index e882038e..a42fa057 100644 --- a/backend/test/backendtest.go +++ b/backend/test/backendtest.go @@ -6,6 +6,9 @@ import ( "testing" "time" + "github.com/google/uuid" + "github.com/stretchr/testify/require" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/backend/metadata" @@ -14,8 +17,6 @@ import ( "github.com/cschleiden/go-workflows/core" "github.com/cschleiden/go-workflows/diag" "github.com/cschleiden/go-workflows/workflow" - "github.com/google/uuid" - "github.com/stretchr/testify/require" ) func BackendTest(t *testing.T, setup func(options ...backend.BackendOption) TestBackend, teardown func(b TestBackend)) { @@ -195,7 +196,7 @@ func BackendTest(t *testing.T, setup func(options ...backend.BackendOption) Test Queue: workflow.QueueDefault, }), ) - require.Nil(t, err) + require.NoError(t, err) queues := []workflow.Queue{workflow.QueueDefault, core.QueueSystem} require.NoError(t, b.PrepareWorkflowQueues(ctx, queues)) @@ -283,7 +284,7 @@ func BackendTest(t *testing.T, setup func(options ...backend.BackendOption) Test h, err := b.GetWorkflowInstanceHistory(ctx, wfi, nil) require.NoError(t, err) - require.Equal(t, len(events), len(h)) + require.Len(t, h, len(events)) for i, event := range events { require.Equal(t, event.ID, h[i].ID) require.Equal(t, event.Type, h[i].Type) diff --git a/backend/test/e2e.go b/backend/test/e2e.go index 2d8339dc..9f265059 100644 --- a/backend/test/e2e.go +++ b/backend/test/e2e.go @@ -2,12 +2,16 @@ package test import ( "context" + "errors" "fmt" "log" "sync/atomic" "testing" "time" + "github.com/google/uuid" + "github.com/stretchr/testify/require" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/client" @@ -16,8 +20,6 @@ import ( "github.com/cschleiden/go-workflows/worker" "github.com/cschleiden/go-workflows/workflow" "github.com/cschleiden/go-workflows/workflow/executor" - "github.com/google/uuid" - "github.com/stretchr/testify/require" ) type backendTest struct { @@ -118,7 +120,7 @@ func EndToEndBackendTest(t *testing.T, setup func(options ...backend.BackendOpti output, err := runWorkflowWithResult[string](t, ctx, c, wf, "hello") - require.Zero(t, output) + require.Empty(t, output) require.ErrorContains(t, err, "workflow 1 not found") }, }, @@ -325,12 +327,12 @@ func EndToEndBackendTest(t *testing.T, setup func(options ...backend.BackendOpti swf := func(ctx workflow.Context, i int) (int, error) { // Sleep in this sub workflow, we expect the subworkflow to be canceled, so this timer will not complete. - if err := workflow.Sleep(ctx, time.Second*10); err != nil && err != workflow.Canceled { + if err := workflow.Sleep(ctx, time.Second*10); err != nil && !errors.Is(err, workflow.Canceled) { // This should not happen return 0, err } - if ctx.Err() != nil && ctx.Err() == workflow.Canceled { + if ctx.Err() != nil && errors.Is(ctx.Err(), workflow.Canceled) { atomic.AddInt32(&canceled, 1) } @@ -354,14 +356,14 @@ func EndToEndBackendTest(t *testing.T, setup func(options ...backend.BackendOpti for _, f := range swfs { sr, err := f.Get(ctx) - if err != nil && err != workflow.Canceled { + if err != nil && !errors.Is(err, workflow.Canceled) { return 0, err } r = r + sr } - if ctx.Err() != nil && ctx.Err() == workflow.Canceled { + if ctx.Err() != nil && errors.Is(ctx.Err(), workflow.Canceled) { atomic.AddInt32(&canceled, 1) } @@ -406,7 +408,7 @@ func EndToEndBackendTest(t *testing.T, setup func(options ...backend.BackendOpti workflow.Sleep(ctx, time.Millisecond*2) r, err := f.Get(ctx) - if err != nil && err != workflow.Canceled { + if err != nil && !errors.Is(err, workflow.Canceled) { return 0, err } @@ -701,8 +703,7 @@ func EndToEndBackendTest(t *testing.T, setup func(options ...backend.BackendOpti run("_without_cache", options) } -type noopWorkflowExecutorCache struct { -} +type noopWorkflowExecutorCache struct{} var _ executor.Cache = (*noopWorkflowExecutorCache)(nil) diff --git a/backend/test/e2e_activity.go b/backend/test/e2e_activity.go index 2d6695a9..92253f53 100644 --- a/backend/test/e2e_activity.go +++ b/backend/test/e2e_activity.go @@ -6,11 +6,12 @@ import ( "testing" "time" + "github.com/stretchr/testify/require" + "github.com/cschleiden/go-workflows/activity" "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/worker" "github.com/cschleiden/go-workflows/workflow" - "github.com/stretchr/testify/require" ) type CustomError struct { diff --git a/backend/test/e2e_continueasnew.go b/backend/test/e2e_continueasnew.go index acbc7597..5208184a 100644 --- a/backend/test/e2e_continueasnew.go +++ b/backend/test/e2e_continueasnew.go @@ -5,13 +5,14 @@ import ( "testing" "time" + "github.com/google/uuid" + "github.com/stretchr/testify/require" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/core" "github.com/cschleiden/go-workflows/worker" "github.com/cschleiden/go-workflows/workflow" - "github.com/google/uuid" - "github.com/stretchr/testify/require" ) var e2eContinueAsNewTests = []backendTest{ diff --git a/backend/test/e2e_diag.go b/backend/test/e2e_diag.go index 3cccd61c..a10b5c3d 100644 --- a/backend/test/e2e_diag.go +++ b/backend/test/e2e_diag.go @@ -4,12 +4,13 @@ import ( "context" "testing" + "github.com/google/uuid" + "github.com/stretchr/testify/require" + "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/diag" "github.com/cschleiden/go-workflows/worker" "github.com/cschleiden/go-workflows/workflow" - "github.com/google/uuid" - "github.com/stretchr/testify/require" ) var e2eDiagTests = []backendTest{ @@ -48,7 +49,7 @@ var e2eDiagTests = []backendTest{ refs, err := diagBackend.GetWorkflowInstances(ctx, afterInstanceID, afterExecutionID, 10) require.NoError(t, err) - require.Len(t, refs, 0) + require.Empty(t, refs) }, }, { diff --git a/backend/test/e2e_queues.go b/backend/test/e2e_queues.go index b00e5bdb..c5790bb5 100644 --- a/backend/test/e2e_queues.go +++ b/backend/test/e2e_queues.go @@ -5,12 +5,13 @@ import ( "testing" "time" + "github.com/google/uuid" + "github.com/stretchr/testify/require" + "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/core" "github.com/cschleiden/go-workflows/worker" "github.com/cschleiden/go-workflows/workflow" - "github.com/google/uuid" - "github.com/stretchr/testify/require" ) var e2eQueueTests = []backendTest{ diff --git a/backend/test/e2e_removal.go b/backend/test/e2e_removal.go index 30442df3..7ecddd90 100644 --- a/backend/test/e2e_removal.go +++ b/backend/test/e2e_removal.go @@ -6,11 +6,12 @@ import ( "testing" "time" + "github.com/stretchr/testify/require" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/worker" "github.com/cschleiden/go-workflows/workflow" - "github.com/stretchr/testify/require" ) var e2eRemovalTests = []backendTest{ @@ -71,7 +72,7 @@ var e2eRemovalTests = []backendTest{ for i := 0; i < 10; i++ { time.Sleep(100 * time.Millisecond) _, err = c.GetWorkflowInstanceState(ctx, workflowA) - if err != backend.ErrInstanceNotFound { + if !errors.Is(err, backend.ErrInstanceNotFound) { continue } else { break @@ -113,7 +114,7 @@ var e2eRemovalTests = []backendTest{ for i := 0; i < 10; i++ { time.Sleep(100 * time.Millisecond) _, err = c.GetWorkflowInstanceState(ctx, workflowA) - if err != backend.ErrInstanceNotFound { + if !errors.Is(err, backend.ErrInstanceNotFound) { continue } else { break diff --git a/backend/test/e2e_stats.go b/backend/test/e2e_stats.go index cede318c..73338edb 100644 --- a/backend/test/e2e_stats.go +++ b/backend/test/e2e_stats.go @@ -5,11 +5,12 @@ import ( "testing" "time" + "github.com/stretchr/testify/require" + "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/core" "github.com/cschleiden/go-workflows/worker" "github.com/cschleiden/go-workflows/workflow" - "github.com/stretchr/testify/require" ) var e2eStatsTests = []backendTest{ diff --git a/backend/test/e2e_timer.go b/backend/test/e2e_timer.go index 162e2701..a6660c24 100644 --- a/backend/test/e2e_timer.go +++ b/backend/test/e2e_timer.go @@ -2,14 +2,16 @@ package test import ( "context" + "errors" "testing" "time" + "github.com/stretchr/testify/require" + "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/worker" "github.com/cschleiden/go-workflows/workflow" - "github.com/stretchr/testify/require" ) var e2eTimerTests = []backendTest{ @@ -21,7 +23,7 @@ var e2eTimerTests = []backendTest{ } wf := func(ctx workflow.Context) error { _, err := workflow.ScheduleTimer(ctx, time.Second*10).Get(ctx) - if err != nil && err != workflow.Canceled { + if err != nil && !errors.Is(err, workflow.Canceled) { return err } @@ -58,7 +60,7 @@ var e2eTimerTests = []backendTest{ workflow.ExecuteActivity[any](ctx, workflow.DefaultActivityOptions, a).Get(ctx) _, err := f.Get(ctx) - if err != nil && err != workflow.Canceled { + if err != nil && !errors.Is(err, workflow.Canceled) { return err } @@ -80,7 +82,7 @@ var e2eTimerTests = []backendTest{ futureEvents, err := b.GetFutureEvents(ctx) require.NoError(t, err) - require.Len(t, futureEvents, 0, "no future events should be scheduled") + require.Empty(t, futureEvents, "no future events should be scheduled") }, }, { @@ -107,7 +109,7 @@ var e2eTimerTests = []backendTest{ // Force another checkpoint workflow.ExecuteActivity[any](ctx, workflow.DefaultActivityOptions, a).Get(ctx) - if _, err := f.Get(ctx); err != nil && err != workflow.Canceled { + if _, err := f.Get(ctx); err != nil && !errors.Is(err, workflow.Canceled) { return err } @@ -123,7 +125,7 @@ var e2eTimerTests = []backendTest{ futureEvents, err := b.GetFutureEvents(ctx) require.NoError(t, err) - require.Len(t, futureEvents, 0, "no future events should be scheduled") + require.Empty(t, futureEvents, "no future events should be scheduled") }, }, { @@ -145,7 +147,7 @@ var e2eTimerTests = []backendTest{ // Force another checkpoint workflow.ExecuteActivity[any](ctx, workflow.DefaultActivityOptions, a).Get(ctx) - if _, err := f.Get(ctx); err != nil && err != workflow.Canceled { + if _, err := f.Get(ctx); err != nil && !errors.Is(err, workflow.Canceled) { return err } @@ -161,7 +163,7 @@ var e2eTimerTests = []backendTest{ futureEvents, err := b.GetFutureEvents(ctx) require.NoError(t, err) - require.Len(t, futureEvents, 0, "no future events should be scheduled") + require.Empty(t, futureEvents, "no future events should be scheduled") }, }, { diff --git a/backend/test/e2e_tracing.go b/backend/test/e2e_tracing.go index a57f8387..44da897a 100644 --- a/backend/test/e2e_tracing.go +++ b/backend/test/e2e_tracing.go @@ -6,13 +6,14 @@ import ( "testing" "time" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/otel/sdk/trace" + "go.opentelemetry.io/otel/sdk/trace/tracetest" + "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/registry" "github.com/cschleiden/go-workflows/worker" "github.com/cschleiden/go-workflows/workflow" - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/sdk/trace" - "go.opentelemetry.io/otel/sdk/trace/tracetest" ) func setupTracing(b TestBackend) *tracetest.InMemoryExporter { @@ -31,7 +32,6 @@ var e2eTracingTests = []backendTest{ exporter := setupTracing(b) wf := func(ctx workflow.Context) error { - return nil } register(t, ctx, w, []interface{}{wf}, nil) diff --git a/backend/test/testcontextpropagator.go b/backend/test/testcontextpropagator.go index 47fba2ab..95a609e0 100644 --- a/backend/test/testcontextpropagator.go +++ b/backend/test/testcontextpropagator.go @@ -32,8 +32,7 @@ func myValuesWf(ctx workflow.Context) *myData { return ctx.Value(k).(*myData) } -type testContextPropagator struct { -} +type testContextPropagator struct{} var _ workflow.ContextPropagator = &testContextPropagator{} diff --git a/bench/main.go b/bench/main.go index 0adcb989..ff7bacf7 100644 --- a/bench/main.go +++ b/bench/main.go @@ -11,6 +11,8 @@ import ( "sync" "time" + redisv8 "github.com/redis/go-redis/v9" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/backend/monoprocess" "github.com/cschleiden/go-workflows/backend/mysql" @@ -18,20 +20,21 @@ import ( "github.com/cschleiden/go-workflows/backend/sqlite" "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/worker" - redisv8 "github.com/redis/go-redis/v9" ) -var b = flag.String("backend", "redis", "Backend to use. Supported backends are:\n- redis\n- mysql\n- sqlite\n") -var timeout = flag.Duration("timeout", time.Second*30, "Timeout for the benchmark run") -var scenario = flag.String("scenario", "basic", "Scenario to run. Support scenarios are:\n- basic\n") -var runs = flag.Int("runs", 1, "Number of root workflows to start") -var depth = flag.Int("depth", 2, "Depth of mid workflows") -var fanOut = flag.Int("fanout", 2, "Number of child workflows to execute per root/mid workflow") -var leafFanOut = flag.Int("leaffanout", 2, "Number of leaf workflows to execute per mid workflow") -var activities = flag.Int("activities", 2, "Number of activities to execute per leaf workflow") -var resultSize = flag.Int("resultsize", 100, "Size of activity result payload in bytes") -var format = flag.String("format", "text", "Output format. Supported formats are:\n- text\n- csv\n") -var cacheSize = flag.Int("cachesize", 128, "Size of the workflow executor cache") +var ( + b = flag.String("backend", "redis", "Backend to use. Supported backends are:\n- redis\n- mysql\n- sqlite\n") + timeout = flag.Duration("timeout", time.Second*30, "Timeout for the benchmark run") + scenario = flag.String("scenario", "basic", "Scenario to run. Support scenarios are:\n- basic\n") + runs = flag.Int("runs", 1, "Number of root workflows to start") + depth = flag.Int("depth", 2, "Depth of mid workflows") + fanOut = flag.Int("fanout", 2, "Number of child workflows to execute per root/mid workflow") + leafFanOut = flag.Int("leaffanout", 2, "Number of leaf workflows to execute per mid workflow") + activities = flag.Int("activities", 2, "Number of activities to execute per leaf workflow") + resultSize = flag.Int("resultsize", 100, "Size of activity result payload in bytes") + format = flag.String("format", "text", "Output format. Supported formats are:\n- text\n- csv\n") + cacheSize = flag.Int("cachesize", 128, "Size of the workflow executor cache") +) func main() { flag.Parse() diff --git a/bench/nooplog.go b/bench/nooplog.go index 74081eb0..2e86f174 100644 --- a/bench/nooplog.go +++ b/bench/nooplog.go @@ -5,8 +5,7 @@ import ( "log/slog" ) -type nullHandler struct { -} +type nullHandler struct{} // Enabled implements slog.Handler. func (*nullHandler) Enabled(context.Context, slog.Level) bool { diff --git a/client/client.go b/client/client.go index d3c9ba75..4aa8b62d 100644 --- a/client/client.go +++ b/client/client.go @@ -8,6 +8,10 @@ import ( "github.com/benbjohnson/clock" "github.com/cenkalti/backoff/v4" + "github.com/google/uuid" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/backend/metrics" @@ -19,9 +23,6 @@ import ( "github.com/cschleiden/go-workflows/internal/tracing" "github.com/cschleiden/go-workflows/internal/workflowerrors" "github.com/cschleiden/go-workflows/workflow" - "github.com/google/uuid" - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/trace" ) // ErrWorkflowCanceled is returned when a workflow was already canceled. diff --git a/client/client_test.go b/client/client_test.go index 766bb48f..81a3f780 100644 --- a/client/client_test.go +++ b/client/client_test.go @@ -8,16 +8,17 @@ import ( "time" "github.com/benbjohnson/clock" + "github.com/google/uuid" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/otel/trace/noop" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/backend/converter" "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/core" "github.com/cschleiden/go-workflows/internal/metrics" "github.com/cschleiden/go-workflows/workflow" - "github.com/google/uuid" - "github.com/stretchr/testify/mock" - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/trace/noop" ) func Test_Client_CreateWorkflowInstance_ParamMismatch(t *testing.T) { @@ -147,7 +148,7 @@ func Test_Client_SignalWorkflow(t *testing.T) { err := c.SignalWorkflow(ctx, instanceID, "test", "signal") - require.Nil(t, err) + require.NoError(t, err) b.AssertExpectations(t) } @@ -176,6 +177,6 @@ func Test_Client_SignalWorkflow_WithArgs(t *testing.T) { err := c.SignalWorkflow(ctx, instanceID, "test", arg) - require.Nil(t, err) + require.NoError(t, err) b.AssertExpectations(t) } diff --git a/go.mod b/go.mod index 26b68353..556693ab 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,6 @@ require ( go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 go.opentelemetry.io/otel/trace v1.31.0 go.uber.org/goleak v1.3.0 - golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d modernc.org/sqlite v1.27.0 ) @@ -63,6 +62,7 @@ require ( go.uber.org/zap v1.24.0 // indirect golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea // indirect golang.org/x/exp/typeparams v0.0.0-20230307190834-24139beb5833 // indirect + golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 // indirect google.golang.org/grpc v1.67.1 // indirect lukechampine.com/uint128 v1.2.0 // indirect diff --git a/internal/activity/activitystate.go b/internal/activity/activitystate.go index 019040ed..8828e84f 100644 --- a/internal/activity/activitystate.go +++ b/internal/activity/activitystate.go @@ -25,7 +25,8 @@ func NewActivityState(activityID string, attempt int, instance *workflow.Instanc log.InstanceIDKey, instance.InstanceID, log.ExecutionIDKey, instance.ExecutionID, log.AttemptKey, attempt, - )} + ), + } } type key int diff --git a/internal/activity/executor.go b/internal/activity/executor.go index e4330921..d67d6c43 100644 --- a/internal/activity/executor.go +++ b/internal/activity/executor.go @@ -7,6 +7,9 @@ import ( "log/slog" "reflect" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/backend/converter" "github.com/cschleiden/go-workflows/backend/history" @@ -17,8 +20,6 @@ import ( "github.com/cschleiden/go-workflows/internal/workflowerrors" "github.com/cschleiden/go-workflows/registry" wf "github.com/cschleiden/go-workflows/workflow" - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/trace" ) type Executor struct { diff --git a/internal/activity/executor_test.go b/internal/activity/executor_test.go index 4d0a2ff3..a5f066c1 100644 --- a/internal/activity/executor_test.go +++ b/internal/activity/executor_test.go @@ -7,6 +7,10 @@ import ( "testing" "time" + "github.com/google/uuid" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/otel/trace/noop" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/backend/converter" "github.com/cschleiden/go-workflows/backend/history" @@ -16,9 +20,6 @@ import ( "github.com/cschleiden/go-workflows/internal/fn" "github.com/cschleiden/go-workflows/internal/workflowerrors" "github.com/cschleiden/go-workflows/registry" - "github.com/google/uuid" - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/trace/noop" ) func TestExecutor_ExecuteActivity(t *testing.T) { @@ -100,8 +101,12 @@ func TestExecutor_ExecuteActivity(t *testing.T) { var expectedErr *workflowerrors.Error require.ErrorAs(t, err, &expectedErr) - e := err.(*workflowerrors.Error) - require.Equal(t, e.Type, "PanicError") + e := func() *workflowerrors.Error { + target := &workflowerrors.Error{} + _ = errors.As(err, &target) + return target + }() + require.Equal(t, "PanicError", e.Type) }, }, } diff --git a/internal/args/args_test.go b/internal/args/args_test.go index 9119db8d..8c91825e 100644 --- a/internal/args/args_test.go +++ b/internal/args/args_test.go @@ -5,9 +5,10 @@ import ( "reflect" "testing" + "github.com/stretchr/testify/require" + "github.com/cschleiden/go-workflows/backend/converter" "github.com/cschleiden/go-workflows/backend/payload" - "github.com/stretchr/testify/require" ) func TestInputsToArgs(t *testing.T) { diff --git a/internal/command/command.go b/internal/command/command.go index dd886f45..aa57ebec 100644 --- a/internal/command/command.go +++ b/internal/command/command.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/benbjohnson/clock" + "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/core" ) diff --git a/internal/command/command_test.go b/internal/command/command_test.go index 3b773c8a..957c4048 100644 --- a/internal/command/command_test.go +++ b/internal/command/command_test.go @@ -4,8 +4,9 @@ import ( "testing" "github.com/benbjohnson/clock" - "github.com/cschleiden/go-workflows/backend/history" "github.com/stretchr/testify/require" + + "github.com/cschleiden/go-workflows/backend/history" ) func assertExecuteNoEvent(t *testing.T, c Command, expectedState CommandState) { diff --git a/internal/command/complete_workflow.go b/internal/command/complete_workflow.go index bd875963..887354a3 100644 --- a/internal/command/complete_workflow.go +++ b/internal/command/complete_workflow.go @@ -2,6 +2,7 @@ package command import ( "github.com/benbjohnson/clock" + "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/backend/payload" "github.com/cschleiden/go-workflows/core" diff --git a/internal/command/complete_workflow_test.go b/internal/command/complete_workflow_test.go index bd01d82b..cf6ceaf7 100644 --- a/internal/command/complete_workflow_test.go +++ b/internal/command/complete_workflow_test.go @@ -4,11 +4,12 @@ import ( "testing" "github.com/benbjohnson/clock" + "github.com/google/uuid" + "github.com/stretchr/testify/require" + "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/backend/payload" "github.com/cschleiden/go-workflows/core" - "github.com/google/uuid" - "github.com/stretchr/testify/require" ) func TestCompleteWorkflowCommand_StateTransitions(t *testing.T) { diff --git a/internal/command/continueasnew.go b/internal/command/continueasnew.go index 71f310e9..177ff7cb 100644 --- a/internal/command/continueasnew.go +++ b/internal/command/continueasnew.go @@ -2,11 +2,12 @@ package command import ( "github.com/benbjohnson/clock" + "github.com/google/uuid" + "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/backend/metadata" "github.com/cschleiden/go-workflows/backend/payload" "github.com/cschleiden/go-workflows/core" - "github.com/google/uuid" ) type ContinueAsNewCommand struct { diff --git a/internal/command/schedule_activity.go b/internal/command/schedule_activity.go index 34069810..ecd38d68 100644 --- a/internal/command/schedule_activity.go +++ b/internal/command/schedule_activity.go @@ -2,6 +2,7 @@ package command import ( "github.com/benbjohnson/clock" + "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/backend/metadata" "github.com/cschleiden/go-workflows/backend/payload" diff --git a/internal/command/schedule_activity_test.go b/internal/command/schedule_activity_test.go index a2d1c6ea..fca3af49 100644 --- a/internal/command/schedule_activity_test.go +++ b/internal/command/schedule_activity_test.go @@ -4,11 +4,12 @@ import ( "testing" "github.com/benbjohnson/clock" + "github.com/stretchr/testify/require" + "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/backend/metadata" "github.com/cschleiden/go-workflows/backend/payload" "github.com/cschleiden/go-workflows/core" - "github.com/stretchr/testify/require" ) func TestScheduleActivityCommand_StateTransitions(t *testing.T) { diff --git a/internal/command/schedule_subworkflow.go b/internal/command/schedule_subworkflow.go index d0386df0..7e144f3d 100644 --- a/internal/command/schedule_subworkflow.go +++ b/internal/command/schedule_subworkflow.go @@ -2,11 +2,12 @@ package command import ( "github.com/benbjohnson/clock" + "github.com/google/uuid" + "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/backend/metadata" "github.com/cschleiden/go-workflows/backend/payload" "github.com/cschleiden/go-workflows/core" - "github.com/google/uuid" ) type ScheduleSubWorkflowCommand struct { diff --git a/internal/command/schedule_subworkflow_test.go b/internal/command/schedule_subworkflow_test.go index 097f41d5..c16f618c 100644 --- a/internal/command/schedule_subworkflow_test.go +++ b/internal/command/schedule_subworkflow_test.go @@ -4,12 +4,13 @@ import ( "testing" "github.com/benbjohnson/clock" + "github.com/google/uuid" + "github.com/stretchr/testify/require" + "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/backend/metadata" "github.com/cschleiden/go-workflows/backend/payload" "github.com/cschleiden/go-workflows/core" - "github.com/google/uuid" - "github.com/stretchr/testify/require" ) func TestScheduleSubWorkflowCommand_StateTransitions(t *testing.T) { @@ -19,7 +20,7 @@ func TestScheduleSubWorkflowCommand_StateTransitions(t *testing.T) { }{ {"Execute schedules subworkflow", func(t *testing.T, c *ScheduleSubWorkflowCommand, clock clock.Clock) { r := assertExecuteWithEvent(t, c, CommandState_Committed, history.EventType_SubWorkflowScheduled) - require.Equal(t, r.WorkflowEvents[0].HistoryEvent.Type, history.EventType_WorkflowExecutionStarted) + require.Equal(t, history.EventType_WorkflowExecutionStarted, r.WorkflowEvents[0].HistoryEvent.Type) }}, {"Cancel after schedule yields cancel event", func(t *testing.T, c *ScheduleSubWorkflowCommand, clock clock.Clock) { assertExecuteWithEvent(t, c, CommandState_Committed, history.EventType_SubWorkflowScheduled) @@ -28,7 +29,7 @@ func TestScheduleSubWorkflowCommand_StateTransitions(t *testing.T) { require.Equal(t, CommandState_CancelPending, c.State()) r := assertExecuteWithEvent(t, c, CommandState_Canceled, history.EventType_SubWorkflowCancellationRequested) - require.Equal(t, r.WorkflowEvents[0].HistoryEvent.Type, history.EventType_WorkflowExecutionCanceled) + require.Equal(t, history.EventType_WorkflowExecutionCanceled, r.WorkflowEvents[0].HistoryEvent.Type) }}, {"Cancel after commit yields cancel event", func(t *testing.T, c *ScheduleSubWorkflowCommand, clock clock.Clock) { c.Commit() diff --git a/internal/command/schedule_timer.go b/internal/command/schedule_timer.go index f516f3f3..3b11fa83 100644 --- a/internal/command/schedule_timer.go +++ b/internal/command/schedule_timer.go @@ -4,6 +4,7 @@ import ( "time" "github.com/benbjohnson/clock" + "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/internal/tracing" ) diff --git a/internal/command/schedule_timer_test.go b/internal/command/schedule_timer_test.go index d90b0c22..b8aaf73c 100644 --- a/internal/command/schedule_timer_test.go +++ b/internal/command/schedule_timer_test.go @@ -5,8 +5,9 @@ import ( "time" "github.com/benbjohnson/clock" - "github.com/cschleiden/go-workflows/backend/history" "github.com/stretchr/testify/require" + + "github.com/cschleiden/go-workflows/backend/history" ) func TestScheduleTimerCommand_StateTransitions(t *testing.T) { diff --git a/internal/command/sideeffect.go b/internal/command/sideeffect.go index 006dea32..d326e89c 100644 --- a/internal/command/sideeffect.go +++ b/internal/command/sideeffect.go @@ -2,6 +2,7 @@ package command import ( "github.com/benbjohnson/clock" + "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/backend/payload" ) diff --git a/internal/command/sideeffect_test.go b/internal/command/sideeffect_test.go index f86f7585..865175a5 100644 --- a/internal/command/sideeffect_test.go +++ b/internal/command/sideeffect_test.go @@ -4,8 +4,9 @@ import ( "testing" "github.com/benbjohnson/clock" - "github.com/cschleiden/go-workflows/backend/history" "github.com/stretchr/testify/require" + + "github.com/cschleiden/go-workflows/backend/history" ) func TestSideEffectCommand_StateTransitions(t *testing.T) { diff --git a/internal/command/start_trace.go b/internal/command/start_trace.go index 599d5509..1f6923d5 100644 --- a/internal/command/start_trace.go +++ b/internal/command/start_trace.go @@ -2,6 +2,7 @@ package command import ( "github.com/benbjohnson/clock" + "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/backend/payload" ) diff --git a/internal/metrics/noop.go b/internal/metrics/noop.go index c51e0c60..55c2a078 100644 --- a/internal/metrics/noop.go +++ b/internal/metrics/noop.go @@ -6,8 +6,7 @@ import ( "github.com/cschleiden/go-workflows/backend/metrics" ) -type noopMetricsClient struct { -} +type noopMetricsClient struct{} func NewNoopMetricsClient() *noopMetricsClient { return &noopMetricsClient{} @@ -22,7 +21,6 @@ func (*noopMetricsClient) Distribution(name string, tags metrics.Tags, value flo } func (*noopMetricsClient) Gauge(name string, tags metrics.Tags, value int64) { - } func (*noopMetricsClient) Timing(name string, tags metrics.Tags, duration time.Duration) { diff --git a/internal/propagators/tracing.go b/internal/propagators/tracing.go index 7dba148c..a7132600 100644 --- a/internal/propagators/tracing.go +++ b/internal/propagators/tracing.go @@ -3,10 +3,11 @@ package propagators import ( "context" - "github.com/cschleiden/go-workflows/internal/tracing" - "github.com/cschleiden/go-workflows/workflow" "go.opentelemetry.io/otel/propagation" "go.opentelemetry.io/otel/trace" + + "github.com/cschleiden/go-workflows/internal/tracing" + "github.com/cschleiden/go-workflows/workflow" ) var propagator propagation.TextMapPropagator = propagation.NewCompositeTextMapPropagator( @@ -22,8 +23,7 @@ func extractSpan(ctx context.Context, metadata *workflow.Metadata) context.Conte return propagator.Extract(ctx, metadata) } -type TracingContextPropagator struct { -} +type TracingContextPropagator struct{} var _ workflow.ContextPropagator = &TracingContextPropagator{} diff --git a/internal/sync/channel_test.go b/internal/sync/channel_test.go index e55fe1d6..68ba6675 100644 --- a/internal/sync/channel_test.go +++ b/internal/sync/channel_test.go @@ -210,7 +210,6 @@ func Test_Channel_Unbuffered(t *testing.T) { { name: "MultipleReceivesSends", fn: func(t *testing.T, c *channel[int]) { - ctx := Background() s := NewScheduler() diff --git a/internal/sync/coroutine_test.go b/internal/sync/coroutine_test.go index 2e2260eb..4516778b 100644 --- a/internal/sync/coroutine_test.go +++ b/internal/sync/coroutine_test.go @@ -210,7 +210,7 @@ func Test_Coroutine_Error(t *testing.T) { require.True(t, c.Finished()) require.Error(t, c.Error()) - require.Equal(t, c.Error().Error(), "custom error") + require.Equal(t, "custom error", c.Error().Error()) } func Test_Coroutine_Panic(t *testing.T) { @@ -222,5 +222,5 @@ func Test_Coroutine_Panic(t *testing.T) { require.True(t, c.Finished()) require.Error(t, c.Error()) - require.Equal(t, c.Error().Error(), "panic: test panic") + require.Equal(t, "panic: test panic", c.Error().Error()) } diff --git a/internal/sync/future_test.go b/internal/sync/future_test.go index 420c7fd6..2aa53737 100644 --- a/internal/sync/future_test.go +++ b/internal/sync/future_test.go @@ -67,7 +67,7 @@ func Test_FutureGetNil(t *testing.T) { f.Set(0, nil) c.Execute() - require.Nil(t, c.Error()) + require.NoError(t, c.Error()) require.True(t, c.Finished()) } @@ -85,7 +85,7 @@ func Test_FutureSetNil(t *testing.T) { f.Set(0, nil) c.Execute() - require.Nil(t, c.Error()) + require.NoError(t, c.Error()) require.True(t, c.Finished()) } @@ -105,7 +105,7 @@ func Test_FutureGetError(t *testing.T) { f.Set(0, errors.New("test")) c.Execute() - require.Nil(t, c.Error()) + require.NoError(t, c.Error()) require.True(t, c.Finished()) require.Equal(t, errors.New("test"), err) diff --git a/internal/sync/scheduler_test.go b/internal/sync/scheduler_test.go index dccf27ae..cbff2b66 100644 --- a/internal/sync/scheduler_test.go +++ b/internal/sync/scheduler_test.go @@ -167,7 +167,7 @@ func Test_Scheduler_Panic(t *testing.T) { err := s.Execute() - require.NotNil(t, err) + require.Error(t, err) require.Equal(t, "panic: something went wrong", err.Error()) require.Equal(t, 0, s.RunningCoroutines()) } diff --git a/internal/sync/selector_test.go b/internal/sync/selector_test.go index 8941288d..a1503cf4 100644 --- a/internal/sync/selector_test.go +++ b/internal/sync/selector_test.go @@ -16,7 +16,7 @@ func Test_FutureSelector_SelectWaits(t *testing.T) { ctx, Await(f.(Future[int]), func(ctx Context, f Future[int]) { r, err := f.Get(ctx) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, 42, r) }), ) @@ -50,13 +50,13 @@ func Test_FutureSelector_SelectWaitsWithSameOrder(t *testing.T) { ctx, Await(f.(Future[int]), func(ctx Context, f Future[int]) { r, err := f.Get(ctx) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, 42, r) order = append(order, 42) }), Await(f2.(Future[int]), func(ctx Context, f Future[int]) { r, err := f.Get(ctx) - require.Nil(t, err) + require.NoError(t, err) require.Equal(t, 23, r) order = append(order, 23) }), diff --git a/internal/tracing/context.go b/internal/tracing/context.go index 23862149..1cb99199 100644 --- a/internal/tracing/context.go +++ b/internal/tracing/context.go @@ -1,8 +1,9 @@ package tracing import ( - "github.com/cschleiden/go-workflows/internal/sync" "go.opentelemetry.io/otel/trace" + + "github.com/cschleiden/go-workflows/internal/sync" ) type spanContextKeyType int diff --git a/internal/tracing/tracecontext.go b/internal/tracing/tracecontext.go index daf8809b..9bdd80e8 100644 --- a/internal/tracing/tracecontext.go +++ b/internal/tracing/tracecontext.go @@ -3,9 +3,10 @@ package tracing import ( "context" - "github.com/cschleiden/go-workflows/internal/sync" "go.opentelemetry.io/otel/propagation" "go.opentelemetry.io/otel/trace" + + "github.com/cschleiden/go-workflows/internal/sync" ) type Context map[string]string diff --git a/internal/tracing/tracing.go b/internal/tracing/tracing.go index cb21992b..ff9456aa 100644 --- a/internal/tracing/tracing.go +++ b/internal/tracing/tracing.go @@ -10,8 +10,8 @@ import ( ) func SpanWithStartTime( - ctx context.Context, tracer trace.Tracer, name string, spanID trace.SpanID, startTime time.Time, opts ...trace.SpanStartOption) trace.Span { - + ctx context.Context, tracer trace.Tracer, name string, spanID trace.SpanID, startTime time.Time, opts ...trace.SpanStartOption, +) trace.Span { opts = append(opts, trace.WithTimestamp(startTime), trace.WithSpanKind(trace.SpanKindConsumer)) _, span := tracer.Start(ctx, name, diff --git a/internal/worker/activity.go b/internal/worker/activity.go index 4c5c88e9..25f0e3cf 100644 --- a/internal/worker/activity.go +++ b/internal/worker/activity.go @@ -7,6 +7,7 @@ import ( "time" "github.com/benbjohnson/clock" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/backend/metrics" diff --git a/internal/worker/workflow.go b/internal/worker/workflow.go index cfcfd197..30d1b269 100644 --- a/internal/worker/workflow.go +++ b/internal/worker/workflow.go @@ -8,6 +8,7 @@ import ( "time" "github.com/benbjohnson/clock" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/backend/history" "github.com/cschleiden/go-workflows/backend/metrics" diff --git a/internal/workflowerrors/error.go b/internal/workflowerrors/error.go index 33118268..838ff7c8 100644 --- a/internal/workflowerrors/error.go +++ b/internal/workflowerrors/error.go @@ -36,7 +36,7 @@ func (we *Error) Error() string { } func (we *Error) Unwrap() error { - if we == nil || we.Cause == (*Error)(nil) { + if we == nil || errors.Is(we.Cause, (*Error)(nil)) { return nil } @@ -56,11 +56,12 @@ func FromError(err error) *Error { } // If this is already a workflow error, just return it, do not wrap again - if e, ok := err.(*Error); ok { + e := &Error{} + if errors.As(err, &e) { return e } - e := &Error{ + e = &Error{ Type: getErrorType(err), Message: err.Error(), } @@ -103,7 +104,8 @@ func NewPermanentError(err error) *Error { // CanRetry returns true if the given error is retryable func CanRetry(err error) bool { - if e, ok := err.(*Error); ok { + e := &Error{} + if errors.As(err, &e) { return !e.Permanent } diff --git a/internal/workflowerrors/error_test.go b/internal/workflowerrors/error_test.go index 4f0b7012..8b2b43e1 100644 --- a/internal/workflowerrors/error_test.go +++ b/internal/workflowerrors/error_test.go @@ -16,7 +16,7 @@ func Test_NewError_DoesNotWrapAgain(t *testing.T) { err := FromError(errors.New("foo")) err2 := FromError(err) - require.Nil(t, errors.Unwrap(err2)) + require.NoError(t, errors.Unwrap(err2)) } func Test_NewError_DoesWrap(t *testing.T) { @@ -28,7 +28,7 @@ func Test_NewError_DoesWrap(t *testing.T) { require.Error(t, e, input.Error()) require.False(t, e.Permanent) - require.Nil(t, e.Cause) + require.NoError(t, e.Cause) } func Test_NewPermanentError(t *testing.T) { @@ -40,7 +40,7 @@ func Test_NewPermanentError(t *testing.T) { require.Error(t, e, input.Error()) require.True(t, e.Permanent) - require.Nil(t, e.Cause) + require.NoError(t, e.Cause) } func Test_RoundTrip(t *testing.T) { diff --git a/internal/workflowerrors/type_test.go b/internal/workflowerrors/type_test.go index 6a565152..5ff16e01 100644 --- a/internal/workflowerrors/type_test.go +++ b/internal/workflowerrors/type_test.go @@ -8,7 +8,7 @@ import ( ) func Test_getErrorType_stringError(t *testing.T) { - require.Equal(t, "", getErrorType(errors.New("test"))) + require.Empty(t, getErrorType(errors.New("test"))) } func Test_getErrorType_error(t *testing.T) { diff --git a/internal/workflowstate/replaylogger_test.go b/internal/workflowstate/replaylogger_test.go index fc36bbe1..c5c5b082 100644 --- a/internal/workflowstate/replaylogger_test.go +++ b/internal/workflowstate/replaylogger_test.go @@ -5,10 +5,11 @@ import ( "testing" "github.com/benbjohnson/clock" - "github.com/cschleiden/go-workflows/core" "github.com/google/uuid" "github.com/stretchr/testify/require" "go.opentelemetry.io/otel/trace/noop" + + "github.com/cschleiden/go-workflows/core" ) func Test_ReplayLogger_With(t *testing.T) { diff --git a/internal/workflowstate/workflowstate.go b/internal/workflowstate/workflowstate.go index 6311e5db..001d7489 100644 --- a/internal/workflowstate/workflowstate.go +++ b/internal/workflowstate/workflowstate.go @@ -6,12 +6,13 @@ import ( "time" "github.com/benbjohnson/clock" + "go.opentelemetry.io/otel/trace" + "github.com/cschleiden/go-workflows/backend/converter" "github.com/cschleiden/go-workflows/backend/payload" "github.com/cschleiden/go-workflows/core" "github.com/cschleiden/go-workflows/internal/command" "github.com/cschleiden/go-workflows/internal/sync" - "go.opentelemetry.io/otel/trace" ) type key int @@ -36,7 +37,7 @@ func AsDecodingSettable[T any](cv converter.Converter, name string, f sync.Setta var t T if v != nil { if err := cv.From(v, &t); err != nil { - return fmt.Errorf("failed to decode future: %v", err) + return fmt.Errorf("failed to decode future: %w", err) } } diff --git a/internal/workflowstate/workflowstate_test.go b/internal/workflowstate/workflowstate_test.go index 1c1b1c0a..03a294d8 100644 --- a/internal/workflowstate/workflowstate_test.go +++ b/internal/workflowstate/workflowstate_test.go @@ -5,12 +5,13 @@ import ( "testing" "github.com/benbjohnson/clock" - "github.com/cschleiden/go-workflows/backend/converter" - "github.com/cschleiden/go-workflows/core" - "github.com/cschleiden/go-workflows/internal/sync" "github.com/google/uuid" "github.com/stretchr/testify/require" "go.opentelemetry.io/otel/trace/noop" + + "github.com/cschleiden/go-workflows/backend/converter" + "github.com/cschleiden/go-workflows/core" + "github.com/cschleiden/go-workflows/internal/sync" ) func Test_PendingFutures(t *testing.T) { diff --git a/registry/registry_test.go b/registry/registry_test.go index aa52d590..f06eaa54 100644 --- a/registry/registry_test.go +++ b/registry/registry_test.go @@ -4,9 +4,10 @@ import ( "context" "testing" + "github.com/stretchr/testify/require" + "github.com/cschleiden/go-workflows/internal/fn" "github.com/cschleiden/go-workflows/internal/sync" - "github.com/stretchr/testify/require" ) func reg_workflow1(ctx sync.Context) error { diff --git a/samples/activity-registration/activity-registration.go b/samples/activity-registration/activity-registration.go index e0e2e2a7..e4bcc174 100644 --- a/samples/activity-registration/activity-registration.go +++ b/samples/activity-registration/activity-registration.go @@ -4,17 +4,17 @@ import ( "context" "errors" "log" - "os" "os/signal" "time" + "github.com/google/uuid" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/samples" "github.com/cschleiden/go-workflows/worker" "github.com/cschleiden/go-workflows/workflow" - "github.com/google/uuid" ) func main() { diff --git a/samples/cancellation/cancellation.go b/samples/cancellation/cancellation.go index e70372fb..79442446 100644 --- a/samples/cancellation/cancellation.go +++ b/samples/cancellation/cancellation.go @@ -8,12 +8,13 @@ import ( "os/signal" "time" + "github.com/google/uuid" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/samples" "github.com/cschleiden/go-workflows/worker" "github.com/cschleiden/go-workflows/workflow" - "github.com/google/uuid" ) func main() { diff --git a/samples/complex-parameters/complex-parameters.go b/samples/complex-parameters/complex-parameters.go index d223ee3c..190da411 100644 --- a/samples/complex-parameters/complex-parameters.go +++ b/samples/complex-parameters/complex-parameters.go @@ -6,12 +6,13 @@ import ( "os" "os/signal" + "github.com/google/uuid" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/samples" "github.com/cschleiden/go-workflows/worker" "github.com/cschleiden/go-workflows/workflow" - "github.com/google/uuid" ) func main() { diff --git a/samples/concurrent/concurrent.go b/samples/concurrent/concurrent.go index 4770d0d6..3295f1d0 100644 --- a/samples/concurrent/concurrent.go +++ b/samples/concurrent/concurrent.go @@ -7,12 +7,13 @@ import ( "os/signal" "time" + "github.com/google/uuid" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/samples" "github.com/cschleiden/go-workflows/worker" "github.com/cschleiden/go-workflows/workflow" - "github.com/google/uuid" ) func main() { diff --git a/samples/context-propagation/context_propagation.go b/samples/context-propagation/context_propagation.go index 21dedd40..c7b344f8 100644 --- a/samples/context-propagation/context_propagation.go +++ b/samples/context-propagation/context_propagation.go @@ -5,12 +5,12 @@ import ( "log" "time" + "github.com/google/uuid" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/samples" "github.com/cschleiden/go-workflows/worker" - - "github.com/google/uuid" ) func main() { diff --git a/samples/context-propagation/my_context.go b/samples/context-propagation/my_context.go index 5a1d89fd..6a77414f 100644 --- a/samples/context-propagation/my_context.go +++ b/samples/context-propagation/my_context.go @@ -32,8 +32,7 @@ func myValuesWf(ctx workflow.Context) *myData { return ctx.Value(k).(*myData) } -type myPropagator struct { -} +type myPropagator struct{} var _ workflow.ContextPropagator = &myPropagator{} diff --git a/samples/continue-as-new/continue-as-new.go b/samples/continue-as-new/continue-as-new.go index 3a82335b..3f5339f1 100644 --- a/samples/continue-as-new/continue-as-new.go +++ b/samples/continue-as-new/continue-as-new.go @@ -8,13 +8,13 @@ import ( "os/signal" "time" + "github.com/google/uuid" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/diag" "github.com/cschleiden/go-workflows/samples" "github.com/cschleiden/go-workflows/worker" - - "github.com/google/uuid" ) func main() { diff --git a/samples/converter/converter.go b/samples/converter/converter.go index 7cf8185c..37baeb9c 100644 --- a/samples/converter/converter.go +++ b/samples/converter/converter.go @@ -9,18 +9,17 @@ import ( "os/signal" "time" + "github.com/google/uuid" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/backend/converter" "github.com/cschleiden/go-workflows/backend/payload" "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/samples" "github.com/cschleiden/go-workflows/worker" - - "github.com/google/uuid" ) -type CustomConverter struct { -} +type CustomConverter struct{} var _ converter.Converter = (*CustomConverter)(nil) diff --git a/samples/converter/converter_test.go b/samples/converter/converter_test.go index 9eb0ec70..fd2d7e6c 100644 --- a/samples/converter/converter_test.go +++ b/samples/converter/converter_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" - "github.com/cschleiden/go-workflows/tester" "github.com/google/uuid" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + + "github.com/cschleiden/go-workflows/tester" ) func Test_Workflow(t *testing.T) { @@ -25,6 +26,6 @@ func Test_Workflow(t *testing.T) { wr, werr := tester.WorkflowResult() require.Equal(t, 59, wr) - require.Empty(t, werr) + require.NoError(t, werr) tester.AssertExpectations(t) } diff --git a/samples/errors/errors.go b/samples/errors/errors.go index 8005e4a4..7c5e6ac2 100644 --- a/samples/errors/errors.go +++ b/samples/errors/errors.go @@ -9,13 +9,14 @@ import ( "os" "os/signal" + "github.com/google/uuid" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/diag" "github.com/cschleiden/go-workflows/samples" "github.com/cschleiden/go-workflows/worker" "github.com/cschleiden/go-workflows/workflow" - "github.com/google/uuid" ) func main() { diff --git a/samples/orchestrator/main.go b/samples/orchestrator/main.go index 3a2b9dc2..f6153839 100644 --- a/samples/orchestrator/main.go +++ b/samples/orchestrator/main.go @@ -5,13 +5,13 @@ import ( "log" "time" + "github.com/google/uuid" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/samples" "github.com/cschleiden/go-workflows/worker" "github.com/cschleiden/go-workflows/workflow" - - "github.com/google/uuid" ) func main() { diff --git a/samples/queues/queues.go b/samples/queues/queues.go index 4a040f57..ee805e73 100644 --- a/samples/queues/queues.go +++ b/samples/queues/queues.go @@ -9,14 +9,14 @@ import ( "os/signal" "time" + "github.com/google/uuid" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/diag" "github.com/cschleiden/go-workflows/samples" "github.com/cschleiden/go-workflows/worker" "github.com/cschleiden/go-workflows/workflow" - - "github.com/google/uuid" ) var ( diff --git a/samples/retries/retries.go b/samples/retries/retries.go index 8a97eff8..2f4871a6 100644 --- a/samples/retries/retries.go +++ b/samples/retries/retries.go @@ -8,12 +8,13 @@ import ( "os/signal" "time" + "github.com/google/uuid" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/samples" "github.com/cschleiden/go-workflows/worker" "github.com/cschleiden/go-workflows/workflow" - "github.com/google/uuid" ) func main() { diff --git a/samples/retries/retries_test.go b/samples/retries/retries_test.go index 797c2c63..e57f6f18 100644 --- a/samples/retries/retries_test.go +++ b/samples/retries/retries_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" - "github.com/cschleiden/go-workflows/tester" "github.com/google/uuid" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + + "github.com/cschleiden/go-workflows/tester" ) func Test_Workflow(t *testing.T) { @@ -23,6 +24,6 @@ func Test_Workflow(t *testing.T) { wr, werr := tester.WorkflowResult() require.Empty(t, wr) - require.Empty(t, werr) + require.NoError(t, werr) tester.AssertExpectations(t) } diff --git a/samples/runner.go b/samples/runner.go index 615a99f0..3deacf6e 100644 --- a/samples/runner.go +++ b/samples/runner.go @@ -8,12 +8,13 @@ import ( "net/http" "time" + redisv9 "github.com/redis/go-redis/v9" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/backend/mysql" "github.com/cschleiden/go-workflows/backend/redis" "github.com/cschleiden/go-workflows/backend/sqlite" "github.com/cschleiden/go-workflows/diag" - redisv9 "github.com/redis/go-redis/v9" ) func GetBackend(name string, opt ...backend.BackendOption) backend.Backend { diff --git a/samples/scale/starter/main.go b/samples/scale/starter/main.go index 41595a2c..e4928ec6 100644 --- a/samples/scale/starter/main.go +++ b/samples/scale/starter/main.go @@ -8,14 +8,17 @@ import ( "sync/atomic" "time" + "github.com/google/uuid" + "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/samples" scale "github.com/cschleiden/go-workflows/samples/scale" - "github.com/google/uuid" ) -var tostart = flag.Int("count", 100, "Number of workflow instances to start") -var count int32 +var ( + tostart = flag.Int("count", 100, "Number of workflow instances to start") + count int32 +) func main() { ctx := context.Background() diff --git a/samples/signal-subworkflow/subworkflow-signal.go b/samples/signal-subworkflow/subworkflow-signal.go index 5cbd1055..dc020cf6 100644 --- a/samples/signal-subworkflow/subworkflow-signal.go +++ b/samples/signal-subworkflow/subworkflow-signal.go @@ -7,12 +7,13 @@ import ( "os" "os/signal" + "github.com/google/uuid" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/samples" "github.com/cschleiden/go-workflows/worker" "github.com/cschleiden/go-workflows/workflow" - "github.com/google/uuid" ) func main() { diff --git a/samples/signal/signal.go b/samples/signal/signal.go index f703c51c..3cc936bc 100644 --- a/samples/signal/signal.go +++ b/samples/signal/signal.go @@ -7,12 +7,13 @@ import ( "os/signal" "time" + "github.com/google/uuid" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/samples" "github.com/cschleiden/go-workflows/worker" "github.com/cschleiden/go-workflows/workflow" - "github.com/google/uuid" ) func main() { diff --git a/samples/simple-split-worker/starter/main.go b/samples/simple-split-worker/starter/main.go index 6cba8426..247f9ff1 100644 --- a/samples/simple-split-worker/starter/main.go +++ b/samples/simple-split-worker/starter/main.go @@ -4,10 +4,11 @@ import ( "context" "log" + "github.com/google/uuid" + "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/samples" simple_split_worker "github.com/cschleiden/go-workflows/samples/simple-split-worker" - "github.com/google/uuid" ) func main() { diff --git a/samples/simple/simple.go b/samples/simple/simple.go index 48a3d10a..0d641bbc 100644 --- a/samples/simple/simple.go +++ b/samples/simple/simple.go @@ -5,12 +5,12 @@ import ( "log" "time" + "github.com/google/uuid" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/samples" "github.com/cschleiden/go-workflows/worker" - - "github.com/google/uuid" ) func main() { diff --git a/samples/simple/simple_test.go b/samples/simple/simple_test.go index 9eb0ec70..fd2d7e6c 100644 --- a/samples/simple/simple_test.go +++ b/samples/simple/simple_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" - "github.com/cschleiden/go-workflows/tester" "github.com/google/uuid" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + + "github.com/cschleiden/go-workflows/tester" ) func Test_Workflow(t *testing.T) { @@ -25,6 +26,6 @@ func Test_Workflow(t *testing.T) { wr, werr := tester.WorkflowResult() require.Equal(t, 59, wr) - require.Empty(t, werr) + require.NoError(t, werr) tester.AssertExpectations(t) } diff --git a/samples/subworkflow/subworkflow.go b/samples/subworkflow/subworkflow.go index bb30d8c6..b9ec25a6 100644 --- a/samples/subworkflow/subworkflow.go +++ b/samples/subworkflow/subworkflow.go @@ -7,12 +7,13 @@ import ( "log" "time" + "github.com/google/uuid" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/samples" "github.com/cschleiden/go-workflows/worker" "github.com/cschleiden/go-workflows/workflow" - "github.com/google/uuid" ) func main() { diff --git a/samples/subworkflow/subworkflow_test.go b/samples/subworkflow/subworkflow_test.go index 15b988b3..000a0a40 100644 --- a/samples/subworkflow/subworkflow_test.go +++ b/samples/subworkflow/subworkflow_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" - "github.com/cschleiden/go-workflows/tester" "github.com/google/uuid" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + + "github.com/cschleiden/go-workflows/tester" ) func Test_Workflow(t *testing.T) { @@ -24,6 +25,6 @@ func Test_Workflow(t *testing.T) { wr, werr := tester.WorkflowResult() require.Empty(t, wr) - require.Empty(t, werr) + require.NoError(t, werr) tester.AssertExpectations(t) } diff --git a/samples/timer/timer.go b/samples/timer/timer.go index 4964155d..8c14233c 100644 --- a/samples/timer/timer.go +++ b/samples/timer/timer.go @@ -5,13 +5,14 @@ import ( "log" "time" + "github.com/google/uuid" + "github.com/cschleiden/go-workflows/activity" "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/samples" "github.com/cschleiden/go-workflows/worker" "github.com/cschleiden/go-workflows/workflow" - "github.com/google/uuid" ) func main() { diff --git a/samples/timer/timer_test.go b/samples/timer/timer_test.go index eeca7d9a..79683842 100644 --- a/samples/timer/timer_test.go +++ b/samples/timer/timer_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" - "github.com/cschleiden/go-workflows/tester" "github.com/google/uuid" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + + "github.com/cschleiden/go-workflows/tester" ) func Test_Workflow(t *testing.T) { @@ -21,6 +22,6 @@ func Test_Workflow(t *testing.T) { wr, werr := tester.WorkflowResult() require.Equal(t, "result", wr) - require.Empty(t, werr) + require.NoError(t, werr) tester.AssertExpectations(t) } diff --git a/samples/tracing/tracing.go b/samples/tracing/tracing.go index c2d94b76..185d0145 100644 --- a/samples/tracing/tracing.go +++ b/samples/tracing/tracing.go @@ -5,25 +5,23 @@ import ( "log" "time" - "github.com/cschleiden/go-workflows/backend" - "github.com/cschleiden/go-workflows/client" - "github.com/cschleiden/go-workflows/core" - "github.com/cschleiden/go-workflows/samples" - "github.com/cschleiden/go-workflows/workflow" - "github.com/cschleiden/go-workflows/workflow/executor" + "github.com/google/uuid" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/sdk/resource" - "go.opentelemetry.io/otel/sdk/trace" - semconv "go.opentelemetry.io/otel/semconv/v1.4.0" - "go.opentelemetry.io/otel/exporters/otlp/otlptrace" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp" "go.opentelemetry.io/otel/exporters/stdout/stdouttrace" + "go.opentelemetry.io/otel/sdk/resource" + "go.opentelemetry.io/otel/sdk/trace" + semconv "go.opentelemetry.io/otel/semconv/v1.4.0" + "github.com/cschleiden/go-workflows/backend" + "github.com/cschleiden/go-workflows/client" + "github.com/cschleiden/go-workflows/core" + "github.com/cschleiden/go-workflows/samples" "github.com/cschleiden/go-workflows/worker" - - "github.com/google/uuid" + "github.com/cschleiden/go-workflows/workflow" + "github.com/cschleiden/go-workflows/workflow/executor" ) func main() { @@ -106,8 +104,7 @@ func runWorkflow(ctx context.Context, c *client.Client) { } // Ensure we aren't caching for this sample -type noopWorkflowExecutorCache struct { -} +type noopWorkflowExecutorCache struct{} var _ executor.Cache = (*noopWorkflowExecutorCache)(nil) diff --git a/samples/tracing/workflow.go b/samples/tracing/workflow.go index 3544649d..24feca0f 100644 --- a/samples/tracing/workflow.go +++ b/samples/tracing/workflow.go @@ -5,11 +5,12 @@ import ( "errors" "time" - "github.com/cschleiden/go-workflows/activity" - "github.com/cschleiden/go-workflows/workflow" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" + + "github.com/cschleiden/go-workflows/activity" + "github.com/cschleiden/go-workflows/workflow" ) type Inputs struct { diff --git a/samples/web/web.go b/samples/web/web.go index f4b5c9f8..a9011188 100644 --- a/samples/web/web.go +++ b/samples/web/web.go @@ -8,14 +8,13 @@ import ( "os/signal" "time" + "github.com/google/uuid" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/diag" "github.com/cschleiden/go-workflows/samples" - "github.com/cschleiden/go-workflows/worker" - - "github.com/google/uuid" ) func main() { diff --git a/samples/workflow-registration/workflow_registration.go b/samples/workflow-registration/workflow_registration.go index 9067891b..03a7fe77 100644 --- a/samples/workflow-registration/workflow_registration.go +++ b/samples/workflow-registration/workflow_registration.go @@ -5,13 +5,13 @@ import ( "log" "time" + "github.com/google/uuid" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/registry" "github.com/cschleiden/go-workflows/samples" "github.com/cschleiden/go-workflows/worker" - - "github.com/google/uuid" ) func main() { diff --git a/samples/workflow-registration/workflow_registration_test.go b/samples/workflow-registration/workflow_registration_test.go index 6f1bf893..9c3bd776 100644 --- a/samples/workflow-registration/workflow_registration_test.go +++ b/samples/workflow-registration/workflow_registration_test.go @@ -4,9 +4,10 @@ import ( "context" "testing" - "github.com/cschleiden/go-workflows/tester" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + + "github.com/cschleiden/go-workflows/tester" ) func Test_Workflow(t *testing.T) { @@ -22,6 +23,6 @@ func Test_Workflow(t *testing.T) { wr, werr := tester.WorkflowResult() require.Equal(t, 47, wr) - require.Empty(t, werr) + require.NoError(t, werr) tester.AssertExpectations(t) } diff --git a/tester/tester.go b/tester/tester.go index 4ab3df32..11c8b173 100644 --- a/tester/tester.go +++ b/tester/tester.go @@ -12,6 +12,11 @@ import ( "time" "github.com/benbjohnson/clock" + "github.com/google/uuid" + "github.com/stretchr/testify/mock" + "go.opentelemetry.io/otel/trace" + "go.opentelemetry.io/otel/trace/noop" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/backend/converter" "github.com/cschleiden/go-workflows/backend/history" @@ -28,10 +33,6 @@ import ( "github.com/cschleiden/go-workflows/registry" "github.com/cschleiden/go-workflows/workflow" "github.com/cschleiden/go-workflows/workflow/executor" - "github.com/google/uuid" - "github.com/stretchr/testify/mock" - "go.opentelemetry.io/otel/trace" - "go.opentelemetry.io/otel/trace/noop" ) type testHistoryProvider struct { @@ -371,7 +372,7 @@ func (wt *workflowTester[TResult]) Execute(ctx context.Context, args ...any) { wt.options.MaxHistorySize, ) if err != nil { - panic(fmt.Errorf("could not create workflow executor: %v", err)) + panic(fmt.Errorf("could not create workflow executor: %w", err)) } result, err := e.ExecuteTask(ctx, t) @@ -714,7 +715,6 @@ func (wt *workflowTester[TResult]) scheduleActivity(wfi *core.WorkflowInstance, ), ) } - } else { executor := activity.NewExecutor(wt.logger, wt.tracer, wt.converter, wt.propagators, wt.registry) activityResult, activityErr = executor.ExecuteActivity(context.Background(), &backend.ActivityTask{ diff --git a/tester/tester_activity_test.go b/tester/tester_activity_test.go index f329b8d0..d47bbc8b 100644 --- a/tester/tester_activity_test.go +++ b/tester/tester_activity_test.go @@ -5,10 +5,11 @@ import ( "testing" "time" - "github.com/cschleiden/go-workflows/activity" - "github.com/cschleiden/go-workflows/workflow" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + + "github.com/cschleiden/go-workflows/activity" + "github.com/cschleiden/go-workflows/workflow" ) func Test_Activity_Long(t *testing.T) { diff --git a/tester/tester_context_propagation_test.go b/tester/tester_context_propagation_test.go index b9292d86..67c5106f 100644 --- a/tester/tester_context_propagation_test.go +++ b/tester/tester_context_propagation_test.go @@ -7,10 +7,11 @@ import ( "testing" "time" + "github.com/stretchr/testify/require" + "github.com/cschleiden/go-workflows/backend/metadata" "github.com/cschleiden/go-workflows/internal/sync" "github.com/cschleiden/go-workflows/workflow" - "github.com/stretchr/testify/require" ) type myKey int @@ -38,8 +39,7 @@ func myValuesWf(ctx workflow.Context) *myData { return ctx.Value(k).(*myData) } -type myPropagator struct { -} +type myPropagator struct{} var _ workflow.ContextPropagator = &myPropagator{} diff --git a/tester/tester_continue_as_new_test.go b/tester/tester_continue_as_new_test.go index 914afcd2..3181c808 100644 --- a/tester/tester_continue_as_new_test.go +++ b/tester/tester_continue_as_new_test.go @@ -4,8 +4,9 @@ import ( "context" "testing" - "github.com/cschleiden/go-workflows/workflow" "github.com/stretchr/testify/require" + + "github.com/cschleiden/go-workflows/workflow" ) func Test_ContinueAsNew(t *testing.T) { diff --git a/tester/tester_retries_test.go b/tester/tester_retries_test.go index 37a2c28f..07f7e16d 100644 --- a/tester/tester_retries_test.go +++ b/tester/tester_retries_test.go @@ -5,10 +5,11 @@ import ( "errors" "testing" + "github.com/stretchr/testify/require" + "github.com/cschleiden/go-workflows/internal/sync" "github.com/cschleiden/go-workflows/internal/workflowerrors" "github.com/cschleiden/go-workflows/workflow" - "github.com/stretchr/testify/require" ) func Test_withRetries_permanent(t *testing.T) { diff --git a/tester/tester_subworkflow_test.go b/tester/tester_subworkflow_test.go index 72168c03..b3f507c2 100644 --- a/tester/tester_subworkflow_test.go +++ b/tester/tester_subworkflow_test.go @@ -7,10 +7,11 @@ import ( "testing" "time" - "github.com/cschleiden/go-workflows/core" - "github.com/cschleiden/go-workflows/workflow" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + + "github.com/cschleiden/go-workflows/core" + "github.com/cschleiden/go-workflows/workflow" ) func Test_SubWorkflow(t *testing.T) { @@ -104,7 +105,7 @@ func Test_SubWorkflow_Mocked_Failure(t *testing.T) { require.True(t, tester.WorkflowFinished()) wfR, wfE := tester.WorkflowResult() - require.Equal(t, "", wfR) + require.Empty(t, wfR) require.EqualError(t, wfE, "swf error") tester.AssertExpectations(t) @@ -183,7 +184,7 @@ func Test_SubWorkflow_Signals(t *testing.T) { }) tester.ScheduleCallback(time.Millisecond, func() { - require.Nil(t, tester.SignalWorkflowInstance(subWorkflowInstance, "subworkflow-signal", "42")) + require.NoError(t, tester.SignalWorkflowInstance(subWorkflowInstance, "subworkflow-signal", "42")) }) tester.Execute(context.Background(), "hello") diff --git a/tester/tester_test.go b/tester/tester_test.go index 4af87ac3..c9c9b1f8 100644 --- a/tester/tester_test.go +++ b/tester/tester_test.go @@ -6,11 +6,12 @@ import ( "testing" "time" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/internal/sync" "github.com/cschleiden/go-workflows/workflow" - "github.com/stretchr/testify/mock" - "github.com/stretchr/testify/require" ) func Test_Workflow(t *testing.T) { @@ -118,7 +119,7 @@ func Test_Activity_WithoutMock(t *testing.T) { require.True(t, tester.WorkflowFinished()) r, errStr := tester.WorkflowResult() - require.Zero(t, errStr) + require.NoError(t, errStr) require.Equal(t, 23, r) tester.AssertExpectations(t) } @@ -188,7 +189,7 @@ func Test_Signals(t *testing.T) { require.True(t, tester.WorkflowFinished()) wfR, _ := tester.WorkflowResult() - require.Equal(t, wfR, "s42") + require.Equal(t, "s42", wfR) tester.AssertExpectations(t) } @@ -222,7 +223,7 @@ func Test_SignalSubWorkflowBeforeScheduling(t *testing.T) { func workflowSubWorkFlowsAndSignals(ctx workflow.Context) (string, error) { _, err := workflow.SignalWorkflow(ctx, "subworkflow", "test", "").Get(ctx) - if err != backend.ErrInstanceNotFound { + if !errors.Is(err, backend.ErrInstanceNotFound) { return "", err } @@ -241,7 +242,7 @@ func Test_SignalSubWorkflow(t *testing.T) { require.True(t, tester.WorkflowFinished()) wfR, wfErr := tester.WorkflowResult() - require.Empty(t, wfErr) + require.NoError(t, wfErr) require.Equal(t, 42, wfR) } diff --git a/tester/tester_timers_test.go b/tester/tester_timers_test.go index 7092da74..53c3df05 100644 --- a/tester/tester_timers_test.go +++ b/tester/tester_timers_test.go @@ -5,8 +5,9 @@ import ( "testing" "time" - "github.com/cschleiden/go-workflows/workflow" "github.com/stretchr/testify/require" + + "github.com/cschleiden/go-workflows/workflow" ) func Test_Timer(t *testing.T) { @@ -89,7 +90,7 @@ func Test_TimerSubworkflowCancellation(t *testing.T) { require.True(t, tester.WorkflowFinished()) _, wfErr := tester.WorkflowResult() - require.Empty(t, wfErr) + require.NoError(t, wfErr) } func workflowSubWorkflowTimerCancellation(ctx workflow.Context) error { @@ -134,7 +135,7 @@ func Test_TimerRespondingWithoutNewEvents(t *testing.T) { require.True(t, tester.WorkflowFinished()) _, err := tester.WorkflowResult() - require.Empty(t, err) + require.NoError(t, err) } func workflowTimerRespondingWithoutNewEvents(ctx workflow.Context) error { @@ -205,7 +206,7 @@ func Test_Timers_SetsTimeModeCorrectly(t *testing.T) { require.True(t, tester.WorkflowFinished()) _, werr := tester.WorkflowResult() - require.Empty(t, werr) + require.NoError(t, werr) tester.AssertExpectations(t) require.True(t, dl.hasLine("workflows.timer.mode.from=WallClock workflows.timer.mode.to=TimeTravel")) @@ -219,7 +220,6 @@ func Test_Timers_MultipleTimers(t *testing.T) { wf := func(ctx workflow.Context) error { for i := 0; i < 10; i++ { - tctx, cancel := workflow.WithCancel(ctx) workflow.ScheduleTimer(tctx, time.Millisecond*10) workflow.ExecuteActivity[string](ctx, workflow.DefaultActivityOptions, activity1).Get(ctx) @@ -240,6 +240,6 @@ func Test_Timers_MultipleTimers(t *testing.T) { require.True(t, tester.WorkflowFinished()) _, werr := tester.WorkflowResult() - require.Empty(t, werr) + require.NoError(t, werr) tester.AssertExpectations(t) } diff --git a/worker/worker.go b/worker/worker.go index d0433f8d..e1518f17 100644 --- a/worker/worker.go +++ b/worker/worker.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/benbjohnson/clock" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/client" "github.com/cschleiden/go-workflows/internal/signals" diff --git a/workflow/activity_test.go b/workflow/activity_test.go index 9bdff55a..218087a5 100644 --- a/workflow/activity_test.go +++ b/workflow/activity_test.go @@ -5,13 +5,14 @@ import ( "testing" "github.com/benbjohnson/clock" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/otel/trace/noop" + "github.com/cschleiden/go-workflows/backend/converter" "github.com/cschleiden/go-workflows/core" "github.com/cschleiden/go-workflows/internal/contextvalue" "github.com/cschleiden/go-workflows/internal/sync" "github.com/cschleiden/go-workflows/internal/workflowstate" - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/trace/noop" ) func Test_executeActivity_ResultMismatch(t *testing.T) { @@ -38,6 +39,7 @@ func Test_executeActivity_ResultMismatch(t *testing.T) { c.Execute() require.True(t, c.Finished()) } + func Test_executeActivity_ParamMismatch(t *testing.T) { a := func(ctx Context, s string, n int) (int, error) { return 42, nil diff --git a/workflow/executor/cache/cache.go b/workflow/executor/cache/cache.go index 036931f0..71865480 100644 --- a/workflow/executor/cache/cache.go +++ b/workflow/executor/cache/cache.go @@ -4,11 +4,12 @@ import ( "context" "time" + "github.com/jellydator/ttlcache/v3" + "github.com/cschleiden/go-workflows/backend/metrics" "github.com/cschleiden/go-workflows/core" "github.com/cschleiden/go-workflows/internal/metrickeys" "github.com/cschleiden/go-workflows/workflow/executor" - "github.com/jellydator/ttlcache/v3" ) type lruCache struct { diff --git a/workflow/executor/cache/cache_test.go b/workflow/executor/cache/cache_test.go index fc171638..29216b9f 100644 --- a/workflow/executor/cache/cache_test.go +++ b/workflow/executor/cache/cache_test.go @@ -8,6 +8,9 @@ import ( "time" "github.com/benbjohnson/clock" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/otel/trace/noop" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/backend/converter" "github.com/cschleiden/go-workflows/backend/history" @@ -17,8 +20,6 @@ import ( "github.com/cschleiden/go-workflows/registry" "github.com/cschleiden/go-workflows/workflow" "github.com/cschleiden/go-workflows/workflow/executor" - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/trace/noop" ) func Test_Cache_StoreAndGet(t *testing.T) { diff --git a/workflow/executor/executor.go b/workflow/executor/executor.go index 93ee05e5..77ae64e3 100644 --- a/workflow/executor/executor.go +++ b/workflow/executor/executor.go @@ -11,6 +11,9 @@ import ( "time" "github.com/benbjohnson/clock" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/backend/converter" "github.com/cschleiden/go-workflows/backend/history" @@ -27,8 +30,6 @@ import ( "github.com/cschleiden/go-workflows/internal/workflowstate" "github.com/cschleiden/go-workflows/registry" wf "github.com/cschleiden/go-workflows/workflow" - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/trace" ) type ExecutionResult struct { @@ -309,7 +310,8 @@ func (e *executor) executeNewEvents(newEvents []*history.Event) ([]*history.Even e.workflowSpan, fmt.Errorf("workflow completed, but there are still pending futures: %s", pending)) } - if canErr, ok := e.workflow.Error().(*continueasnew.Error); ok { + canErr := &continueasnew.Error{} + if errors.As(e.workflow.Error(), &canErr) { e.workflowRestarted(e.workflow.Result(), canErr) } else { e.workflowCompleted(e.workflow.Result(), e.workflow.Error()) diff --git a/workflow/executor/executor_test.go b/workflow/executor/executor_test.go index 9e012c25..3174d83d 100644 --- a/workflow/executor/executor_test.go +++ b/workflow/executor/executor_test.go @@ -9,6 +9,11 @@ import ( "time" "github.com/benbjohnson/clock" + "github.com/google/uuid" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/otel/trace/noop" + "go.uber.org/goleak" + "github.com/cschleiden/go-workflows/backend" "github.com/cschleiden/go-workflows/backend/converter" "github.com/cschleiden/go-workflows/backend/history" @@ -21,10 +26,6 @@ import ( "github.com/cschleiden/go-workflows/internal/sync" "github.com/cschleiden/go-workflows/registry" wf "github.com/cschleiden/go-workflows/workflow" - "github.com/google/uuid" - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/trace/noop" - "go.uber.org/goleak" ) type testHistoryProvider struct { @@ -111,7 +112,7 @@ func Test_Executor(t *testing.T) { _, err := e.ExecuteTask(context.Background(), task) require.NoError(t, err) - require.Nil(t, e.workflow.err) + require.NoError(t, e.workflow.err) require.Equal(t, 1, workflowActivityHit) require.Len(t, e.workflowState.Commands(), 1) @@ -181,7 +182,7 @@ func Test_Executor(t *testing.T) { _, err := e.ExecuteTask(context.Background(), task) require.NoError(t, err) - require.Nil(t, e.workflow.err) + require.NoError(t, e.workflow.err) require.Equal(t, 2, workflowActivityHit) require.True(t, e.workflow.Completed()) require.Len(t, e.workflowState.Commands(), 2) @@ -233,7 +234,7 @@ func Test_Executor(t *testing.T) { taskResult, err := e.ExecuteTask(context.Background(), oldTask) require.NoError(t, err) - require.Nil(t, e.workflow.err) + require.NoError(t, e.workflow.err) require.Equal(t, 1, workflowActivityHit) require.False(t, e.workflow.Completed()) require.Len(t, e.workflowState.Commands(), 1) @@ -259,7 +260,7 @@ func Test_Executor(t *testing.T) { // Execute the workflow again with the activity completed event _, err = e.ExecuteTask(context.Background(), newTask) require.NoError(t, err) - require.Nil(t, e.workflow.err) + require.NoError(t, e.workflow.err) require.Equal(t, 2, workflowActivityHit) require.True(t, e.workflow.Completed()) require.Len(t, e.workflowState.Commands(), 2) @@ -313,7 +314,7 @@ func Test_Executor(t *testing.T) { _, err := e.ExecuteTask(context.Background(), task) require.NoError(t, err) - require.Nil(t, e.workflow.err) + require.NoError(t, e.workflow.err) require.Equal(t, 1, workflowWithSelectorHits) require.Len(t, e.workflowState.Commands(), 2) @@ -359,7 +360,7 @@ func Test_Executor(t *testing.T) { _, err := e.ExecuteTask(context.Background(), task) require.NoError(t, err) - require.Nil(t, e.workflow.err) + require.NoError(t, e.workflow.err) require.Equal(t, 1, workflowTimerHits) require.Len(t, e.workflowState.Commands(), 1) @@ -391,7 +392,7 @@ func Test_Executor(t *testing.T) { result, err := e.ExecuteTask(context.Background(), task) require.NoError(t, err) - require.Nil(t, e.workflow.err) + require.NoError(t, e.workflow.err) require.Len(t, e.workflowState.Commands(), 2) task2 := continueTask(i.InstanceID, []*history.Event{ @@ -400,7 +401,7 @@ func Test_Executor(t *testing.T) { _, err = e.ExecuteTask(context.Background(), task2) require.NoError(t, err) - require.Nil(t, e.workflow.err) + require.NoError(t, e.workflow.err) }, }, { @@ -448,7 +449,7 @@ func Test_Executor(t *testing.T) { _, err = e.ExecuteTask(context.Background(), task) require.NoError(t, err) - require.Nil(t, e.workflow.err) + require.NoError(t, e.workflow.err) require.Equal(t, 1, workflowSignalHits) require.True(t, e.workflow.Completed()) require.Len(t, e.workflowState.Commands(), 1) @@ -484,7 +485,7 @@ func Test_Executor(t *testing.T) { require.Error(t, e.workflow.err) require.True(t, e.workflow.Completed()) require.Len(t, e.workflowState.Commands(), 1) - require.Len(t, pendingCommands(e.workflowState.Commands()), 0) + require.Empty(t, pendingCommands(e.workflowState.Commands())) require.Equal(t, core.WorkflowInstanceStateFinished, r1.State) }, }, @@ -510,7 +511,7 @@ func Test_Executor(t *testing.T) { result, err := e.ExecuteTask(context.Background(), task) require.NoError(t, err) - require.Nil(t, e.workflow.err) + require.NoError(t, e.workflow.err) require.Len(t, result.Executed, 3) require.Len(t, result.WorkflowEvents, 1) require.Equal(t, history.EventType_WorkflowExecutionStarted, result.WorkflowEvents[0].HistoryEvent.Type) @@ -545,7 +546,7 @@ func Test_Executor(t *testing.T) { task := startWorkflowTask("instanceID", workflow) result, err := e.ExecuteTask(context.Background(), task) require.NoError(t, err) - require.Nil(t, e.workflow.err) + require.NoError(t, e.workflow.err) require.Len(t, result.Executed, 4) require.Len(t, result.TimerEvents, 1) require.Len(t, result.WorkflowEvents, 1) @@ -748,7 +749,7 @@ func Test_Executor(t *testing.T) { // Execute the task - should not return an error _, err := e.ExecuteTask(context.Background(), task) require.NoError(t, err) - require.Nil(t, e.workflow.err) + require.NoError(t, e.workflow.err) }, }, } diff --git a/workflow/executor/workflow_test.go b/workflow/executor/workflow_test.go index ffbb0c94..fc4f80be 100644 --- a/workflow/executor/workflow_test.go +++ b/workflow/executor/workflow_test.go @@ -4,11 +4,12 @@ import ( "reflect" "testing" + "github.com/stretchr/testify/require" + "github.com/cschleiden/go-workflows/backend/converter" "github.com/cschleiden/go-workflows/internal/contextvalue" "github.com/cschleiden/go-workflows/internal/sync" "github.com/cschleiden/go-workflows/internal/workflowerrors" - "github.com/stretchr/testify/require" ) func Test_Workflow_WrapsPanic(t *testing.T) { diff --git a/workflow/retries.go b/workflow/retries.go index fc028c7b..04ab0760 100644 --- a/workflow/retries.go +++ b/workflow/retries.go @@ -1,6 +1,7 @@ package workflow import ( + "errors" "math" "time" @@ -68,7 +69,7 @@ func WithRetries[T any](ctx Context, retryOptions RetryOptions, fn func(ctx Cont break } - if err == Canceled { + if errors.Is(err, Canceled) { break } diff --git a/workflow/signal.go b/workflow/signal.go index fe06dcd5..c29f3837 100644 --- a/workflow/signal.go +++ b/workflow/signal.go @@ -1,12 +1,13 @@ package workflow import ( + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" + "github.com/cschleiden/go-workflows/core" "github.com/cschleiden/go-workflows/internal/log" "github.com/cschleiden/go-workflows/internal/signals" "github.com/cschleiden/go-workflows/internal/workflowstate" - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/trace" ) // NewSignalChannel returns a new signal channel. diff --git a/workflow/sleep_test.go b/workflow/sleep_test.go index 07957a74..70b34ec6 100644 --- a/workflow/sleep_test.go +++ b/workflow/sleep_test.go @@ -4,8 +4,9 @@ import ( "testing" "time" - "github.com/cschleiden/go-workflows/internal/sync" "github.com/stretchr/testify/require" + + "github.com/cschleiden/go-workflows/internal/sync" ) func Test_Sleep_Yields(t *testing.T) { diff --git a/workflow/subworkflow.go b/workflow/subworkflow.go index 8a5454a8..a627669e 100644 --- a/workflow/subworkflow.go +++ b/workflow/subworkflow.go @@ -10,7 +10,6 @@ import ( "github.com/cschleiden/go-workflows/internal/fn" "github.com/cschleiden/go-workflows/internal/sync" "github.com/cschleiden/go-workflows/internal/tracing" - // "github.com/cschleiden/go-workflows/internal/tracing" "github.com/cschleiden/go-workflows/internal/workflowstate" ) diff --git a/workflow/subworkflow_test.go b/workflow/subworkflow_test.go index fc73b2a0..5fb79446 100644 --- a/workflow/subworkflow_test.go +++ b/workflow/subworkflow_test.go @@ -5,13 +5,14 @@ import ( "testing" "github.com/benbjohnson/clock" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/otel/trace/noop" + "github.com/cschleiden/go-workflows/backend/converter" "github.com/cschleiden/go-workflows/core" "github.com/cschleiden/go-workflows/internal/contextvalue" "github.com/cschleiden/go-workflows/internal/sync" "github.com/cschleiden/go-workflows/internal/workflowstate" - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/trace/noop" ) func Test_createSubWorkflowInstance_NameAsString(t *testing.T) { diff --git a/workflow/timer_test.go b/workflow/timer_test.go index a02df149..54dacec3 100644 --- a/workflow/timer_test.go +++ b/workflow/timer_test.go @@ -6,13 +6,14 @@ import ( "time" "github.com/benbjohnson/clock" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/otel/trace/noop" + "github.com/cschleiden/go-workflows/backend/converter" "github.com/cschleiden/go-workflows/core" "github.com/cschleiden/go-workflows/internal/contextvalue" "github.com/cschleiden/go-workflows/internal/sync" "github.com/cschleiden/go-workflows/internal/workflowstate" - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/trace/noop" ) func Test_Timer_Cancellation(t *testing.T) { diff --git a/workflow/tracer.go b/workflow/tracer.go index 00042bec..6400baea 100644 --- a/workflow/tracer.go +++ b/workflow/tracer.go @@ -3,12 +3,13 @@ package workflow import ( "context" + "go.opentelemetry.io/otel/trace" + "github.com/cschleiden/go-workflows/internal/command" "github.com/cschleiden/go-workflows/internal/contextvalue" "github.com/cschleiden/go-workflows/internal/sync" "github.com/cschleiden/go-workflows/internal/tracing" "github.com/cschleiden/go-workflows/internal/workflowstate" - "go.opentelemetry.io/otel/trace" ) type wfSpan struct { @@ -33,8 +34,7 @@ func Tracer(ctx Context) *WorkflowTracer { return &WorkflowTracer{} } -type WorkflowTracer struct { -} +type WorkflowTracer struct{} // Start starts a new span. func (wt *WorkflowTracer) Start(ctx Context, name string, opts ...trace.SpanStartOption) (Context, Span) {