2023-03-28 18:39:22 +00:00
|
|
|
// Copyright (c) HashiCorp, Inc.
|
2023-08-11 13:12:13 +00:00
|
|
|
// SPDX-License-Identifier: BUSL-1.1
|
2023-03-28 18:39:22 +00:00
|
|
|
|
2017-06-15 16:45:30 +00:00
|
|
|
package agent
|
2015-09-20 08:36:39 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
2018-08-02 13:54:48 +00:00
|
|
|
// Used to be defined in NotifyGroup.WaitCh but was only used in tests and prone
|
|
|
|
// to leaking memory if anything real did use it because there is no way to
|
|
|
|
// clear the chan later.
|
|
|
|
func testWaitCh(t *testing.T, grp *NotifyGroup) chan struct{} {
|
|
|
|
ch := make(chan struct{}, 1)
|
|
|
|
grp.Wait(ch)
|
|
|
|
return ch
|
|
|
|
}
|
|
|
|
|
2015-09-20 08:36:39 +00:00
|
|
|
func TestNotifyGroup(t *testing.T) {
|
|
|
|
grp := &NotifyGroup{}
|
|
|
|
|
2018-08-02 13:54:48 +00:00
|
|
|
ch1 := testWaitCh(t, grp)
|
|
|
|
ch2 := testWaitCh(t, grp)
|
2015-09-20 08:36:39 +00:00
|
|
|
|
|
|
|
select {
|
|
|
|
case <-ch1:
|
|
|
|
t.Fatalf("should block")
|
|
|
|
default:
|
|
|
|
}
|
|
|
|
select {
|
|
|
|
case <-ch2:
|
|
|
|
t.Fatalf("should block")
|
|
|
|
default:
|
|
|
|
}
|
|
|
|
|
|
|
|
grp.Notify()
|
|
|
|
|
|
|
|
select {
|
|
|
|
case <-ch1:
|
|
|
|
default:
|
|
|
|
t.Fatalf("should not block")
|
|
|
|
}
|
|
|
|
select {
|
|
|
|
case <-ch2:
|
|
|
|
default:
|
|
|
|
t.Fatalf("should not block")
|
|
|
|
}
|
|
|
|
|
|
|
|
// Should be unregistered
|
2018-08-02 13:54:48 +00:00
|
|
|
ch3 := testWaitCh(t, grp)
|
2015-09-20 08:36:39 +00:00
|
|
|
grp.Notify()
|
|
|
|
|
|
|
|
select {
|
|
|
|
case <-ch1:
|
|
|
|
t.Fatalf("should block")
|
|
|
|
default:
|
|
|
|
}
|
|
|
|
select {
|
|
|
|
case <-ch2:
|
|
|
|
t.Fatalf("should block")
|
|
|
|
default:
|
|
|
|
}
|
|
|
|
select {
|
|
|
|
case <-ch3:
|
|
|
|
default:
|
|
|
|
t.Fatalf("should not block")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestNotifyGroup_Clear(t *testing.T) {
|
|
|
|
grp := &NotifyGroup{}
|
|
|
|
|
2018-08-02 13:54:48 +00:00
|
|
|
ch1 := testWaitCh(t, grp)
|
2015-09-20 08:36:39 +00:00
|
|
|
grp.Clear(ch1)
|
|
|
|
|
|
|
|
grp.Notify()
|
|
|
|
|
|
|
|
// Should not get anything
|
|
|
|
select {
|
|
|
|
case <-ch1:
|
|
|
|
t.Fatalf("should not get message")
|
|
|
|
default:
|
|
|
|
}
|
|
|
|
}
|