Files
coder/aibridge/utils/concurrent_group_test.go
Paweł Banaszewski e00e85765b chore: move aibridge library code into coder repo (#24190)
This PR merges code from `coder/aibridge` repository into `coder/coder`.
It was split into 4 PRs for easier review but stacked PRs will need to
be merged into this PR so all checks pass.

* https://github.com/coder/coder/pull/24190 -> raw code copy (this PR,
before merging PRs on top of it, it was just 1 commit:
https://github.com/coder/coder/commit/70d33f33200c7e77df910957595715f81f9bec24)
* https://github.com/coder/coder/pull/24570 -> update imports in
`coder/coder` to use copied code
* https://github.com/coder/coder/pull/24586 -> linter fixes and CI
integration (also added README.md)
* https://github.com/coder/coder/pull/24571 -> added exclude to
scripts/check_emdash.sh check

Original PR message (before PR squash):
Moves coder/aibridge code into coder/coder repository.

Omitted files:

- `go.mod`, `go.sum`, `.gitignore`, `.github/workflows/ci.yml,`
`Makefile`, `LICENSE`, `README.md` (modified README.md is added later)
- `.github`, `example`, `buildinfo,` `scripts` directories

Simple verification script (will list omitted files)

```
tmp=$(mktemp -d)
echo "$tmp"
git clone --depth=1 https://github.com/coder/aibridge "$tmp/aibridge"
git clone --depth=1 --branch pb/aibridge-code-move https://github.com/coder/coder "$tmp/coder"
diff -rq --exclude=.git "$tmp/aibridge" "$tmp/coder/aibridge"
# rm -rf "$tmp"
```
2026-04-22 17:01:01 +02:00

82 lines
1.4 KiB
Go

package utils_test
import (
"testing"
"github.com/stretchr/testify/require"
"go.uber.org/goleak"
"golang.org/x/xerrors"
"github.com/coder/coder/v2/aibridge/utils"
)
func TestMain(m *testing.M) {
goleak.VerifyTestMain(m)
}
func TestConcurrentGroup(t *testing.T) {
t.Parallel()
t.Run("no goroutines", func(t *testing.T) {
t.Parallel()
cg := utils.NewConcurrentGroup()
require.NoError(t, cg.Wait())
})
t.Run("multiple goroutines, all ok", func(t *testing.T) {
t.Parallel()
cg := utils.NewConcurrentGroup()
cg.Go(func() error {
return nil
})
cg.Go(func() error {
return nil
})
require.NoError(t, cg.Wait())
})
t.Run("multiple goroutines, one err", func(t *testing.T) {
t.Parallel()
cg := utils.NewConcurrentGroup()
oops := xerrors.New("oops")
cg.Go(func() error {
return oops
})
cg.Go(func() error {
return nil
})
require.ErrorIs(t, cg.Wait(), oops)
})
t.Run("multiple goroutines, multiple errs", func(t *testing.T) {
t.Parallel()
cg := utils.NewConcurrentGroup()
oops := xerrors.New("oops")
eek := xerrors.New("eek")
cg.Go(func() error {
return oops
})
cg.Go(func() error {
return eek
})
errs := cg.Wait()
require.ErrorIs(t, errs, oops)
require.ErrorIs(t, errs, eek)
})
}
func BenchmarkConcurrentGroup(b *testing.B) {
for i := 0; i < b.N; i++ {
cg := utils.NewConcurrentGroup()
for j := 0; j < 10; j++ {
cg.Go(func() error { return nil })
}
_ = cg.Wait()
}
}