| 12345678910111213141516171819202122232425262728293031 |
- // Copyright (c) Tailscale Inc & AUTHORS
- // SPDX-License-Identifier: BSD-3-Clause
- package execqueue
- import (
- "context"
- "sync/atomic"
- "testing"
- )
- func TestExecQueue(t *testing.T) {
- ctx := context.Background()
- var n atomic.Int32
- q := &ExecQueue{}
- defer q.Shutdown()
- q.Add(func() { n.Add(1) })
- q.Wait(ctx)
- if got := n.Load(); got != 1 {
- t.Errorf("n=%d; want 1", got)
- }
- }
- // Test that RunSync doesn't hold q.mu and block Shutdown
- // as we saw in tailscale/tailscale#18502
- func TestExecQueueRunSyncLocking(t *testing.T) {
- q := &ExecQueue{}
- q.RunSync(t.Context(), func() {
- q.Shutdown()
- })
- }
|