// Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: MPL-2.0 package agent import ( "testing" ) // 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 } func TestNotifyGroup(t *testing.T) { grp := &NotifyGroup{} ch1 := testWaitCh(t, grp) ch2 := testWaitCh(t, grp) 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 ch3 := testWaitCh(t, grp) 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{} ch1 := testWaitCh(t, grp) grp.Clear(ch1) grp.Notify() // Should not get anything select { case <-ch1: t.Fatalf("should not get message") default: } }