mirror of
https://github.com/Buriburizaem0n/nezha_domains.git
synced 2026-09-19 17:50:12 +00:00
58 lines
1.3 KiB
Go
58 lines
1.3 KiB
Go
//go:build linux && agentcompat
|
|
|
|
package agent
|
|
|
|
import (
|
|
"fmt"
|
|
"sync"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestPreparedBinary_ConcurrentConsumersSharePathAndBlockClose(t *testing.T) {
|
|
prepared, err := PrepareBinary(t.Context(), testAgentSourceDir(t))
|
|
require.NoError(t, err)
|
|
t.Cleanup(func() { _ = prepared.Close() })
|
|
|
|
releases := make(chan func(), 8)
|
|
errorsChannel := make(chan error, 8)
|
|
var acquireGroup sync.WaitGroup
|
|
for range 8 {
|
|
acquireGroup.Add(1)
|
|
go func() {
|
|
defer acquireGroup.Done()
|
|
path, release, acquireErr := prepared.acquire()
|
|
if acquireErr == nil && path != prepared.BinaryPath() {
|
|
acquireErr = fmt.Errorf("acquired path %q differs from prepared path", path)
|
|
}
|
|
errorsChannel <- acquireErr
|
|
if acquireErr == nil {
|
|
releases <- release
|
|
}
|
|
}()
|
|
}
|
|
acquireGroup.Wait()
|
|
close(errorsChannel)
|
|
close(releases)
|
|
for acquireErr := range errorsChannel {
|
|
require.NoError(t, acquireErr)
|
|
}
|
|
|
|
closeErr := prepared.Close()
|
|
var usageErr *PreparedBinaryUsageError
|
|
require.ErrorAs(t, closeErr, &usageErr)
|
|
require.Equal(t, "has active consumers", usageErr.Reason)
|
|
|
|
var releaseGroup sync.WaitGroup
|
|
for release := range releases {
|
|
releaseGroup.Add(1)
|
|
go func() {
|
|
defer releaseGroup.Done()
|
|
release()
|
|
}()
|
|
}
|
|
releaseGroup.Wait()
|
|
require.NoError(t, prepared.Close())
|
|
}
|