eventfd_test.go 913 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package virtqueue
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/stretchr/testify/assert"
  6. "github.com/stretchr/testify/require"
  7. "gvisor.dev/gvisor/pkg/eventfd"
  8. )
  9. // Tests how an eventfd and a waiting goroutine can be gracefully closed.
  10. // Extends the eventfd test suite:
  11. // https://github.com/google/gvisor/blob/0799336d64be65eb97d330606c30162dc3440cab/pkg/eventfd/eventfd_test.go
  12. func TestEventFD_CancelWait(t *testing.T) {
  13. efd, err := eventfd.Create()
  14. require.NoError(t, err)
  15. t.Cleanup(func() {
  16. assert.NoError(t, efd.Close())
  17. })
  18. var stop bool
  19. done := make(chan struct{})
  20. go func() {
  21. for !stop {
  22. _ = efd.Wait()
  23. }
  24. close(done)
  25. }()
  26. select {
  27. case <-done:
  28. t.Fatalf("goroutine ended early")
  29. case <-time.After(500 * time.Millisecond):
  30. }
  31. stop = true
  32. assert.NoError(t, efd.Notify())
  33. select {
  34. case <-done:
  35. break
  36. case <-time.After(5 * time.Second):
  37. t.Error("goroutine did not end")
  38. }
  39. }