diff --git a/.travis.yml b/.travis.yml index 6ec987342..384be7fdc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,6 +16,7 @@ script: - golangci-lint run - go build - go test + - go test -race notifications: webhooks: diff --git a/tests/locks.go b/tests/locks.go new file mode 100644 index 000000000..366dda8f2 --- /dev/null +++ b/tests/locks.go @@ -0,0 +1,97 @@ +package main + +import ( + "errors" + "fmt" + "time" + + "github.com/getsentry/sentry-go" +) + +func main() { + i := 0 + + if err := sentry.Init(sentry.ClientOptions{ + Dsn: "", + BeforeSend: func(event *sentry.Event, hint *sentry.EventHint) *sentry.Event { + i++ + if i%1000 == 0 { + fmt.Println(i) + } + return nil + }, + }); err != nil { + fmt.Println(err) + } + + for i := 0; i < 10000; i++ { + go func(x int) { + sentry.WithScope(func(scope *sentry.Scope) { + scope.SetTag("foo", "bar") + scope.SetContext("foo", "bar") + scope.SetExtra("foo", "bar") + scope.SetLevel(sentry.LevelDebug) + scope.SetTransaction("foo") + scope.SetFingerprint([]string{"foo"}) + scope.AddBreadcrumb(&sentry.Breadcrumb{Timestamp: 1337, Message: "foo"}, 100) + scope.SetUser(sentry.User{ID: "foo"}) + scope.SetRequest(sentry.Request{URL: "foo"}) + + sentry.CaptureException(errors.New(string(x))) + }) + }(i) + + go func(x int) { + sentry.ConfigureScope(func(scope *sentry.Scope) { + scope.SetTag("foo", "bar") + scope.SetContext("foo", "bar") + scope.SetExtra("foo", "bar") + scope.SetLevel(sentry.LevelDebug) + scope.SetTransaction("foo") + scope.SetFingerprint([]string{"foo"}) + scope.AddBreadcrumb(&sentry.Breadcrumb{Timestamp: 1337, Message: "foo"}, 100) + scope.SetUser(sentry.User{ID: "foo"}) + scope.SetRequest(sentry.Request{URL: "foo"}) + + sentry.CaptureException(errors.New(string(x))) + }) + }(i) + } + + for i := 0; i < 10000; i++ { + func(x int) { + sentry.WithScope(func(scope *sentry.Scope) { + scope.SetTag("foo", "bar") + scope.SetContext("foo", "bar") + scope.SetExtra("foo", "bar") + scope.SetLevel(sentry.LevelDebug) + scope.SetTransaction("foo") + scope.SetFingerprint([]string{"foo"}) + scope.AddBreadcrumb(&sentry.Breadcrumb{Timestamp: 1337, Message: "foo"}, 100) + scope.SetUser(sentry.User{ID: "foo"}) + scope.SetRequest(sentry.Request{URL: "foo"}) + + sentry.CaptureException(errors.New(string(x))) + }) + }(i) + + func(x int) { + sentry.ConfigureScope(func(scope *sentry.Scope) { + scope.SetTag("foo", "bar") + scope.SetContext("foo", "bar") + scope.SetExtra("foo", "bar") + scope.SetLevel(sentry.LevelDebug) + scope.SetTransaction("foo") + scope.SetFingerprint([]string{"foo"}) + scope.AddBreadcrumb(&sentry.Breadcrumb{Timestamp: 1337, Message: "foo"}, 100) + scope.SetUser(sentry.User{ID: "foo"}) + scope.SetRequest(sentry.Request{URL: "foo"}) + + sentry.CaptureException(errors.New(string(x))) + }) + }(i) + } + + // wait for goroutines to finish + time.Sleep(time.Second) +}