1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
package systemd
import (
"context"
"os"
"sync"
"testing"
)
func TestParallelConnection(t *testing.T) {
if !IsRunningSystemd() {
t.Skip("Test requires systemd.")
}
var dms []*dbusConnManager
for range 600 {
dms = append(dms, newDbusConnManager(os.Geteuid() != 0))
}
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
var (
doneWg sync.WaitGroup
startCh = make(chan struct{})
errCh = make(chan error, 1)
)
for _, dm := range dms {
doneWg.Add(1)
go func(dm *dbusConnManager) {
defer doneWg.Done()
select {
case <-ctx.Done():
return
case <-startCh:
_, err := dm.newConnection()
if err != nil {
// Only bother trying to send the first error.
select {
case errCh <- err:
default:
}
cancel()
}
}
}(dm)
}
close(startCh) // trigger all connection attempts
doneWg.Wait()
select {
case err := <-errCh:
t.Fatal(err)
default:
}
}
|