}
}
+func TestChannelMovedOutOfBubble(t *testing.T) {
+ for _, test := range []struct {
+ desc string
+ f func(chan struct{})
+ wantPanic string
+ }{{
+ desc: "receive",
+ f: func(ch chan struct{}) {
+ <-ch
+ },
+ wantPanic: "receive on synctest channel from outside bubble",
+ }, {
+ desc: "send",
+ f: func(ch chan struct{}) {
+ ch <- struct{}{}
+ },
+ wantPanic: "send on synctest channel from outside bubble",
+ }, {
+ desc: "close",
+ f: func(ch chan struct{}) {
+ close(ch)
+ },
+ wantPanic: "close of synctest channel from outside bubble",
+ }} {
+ t.Run(test.desc, func(t *testing.T) {
+ donec := make(chan struct{})
+ ch := make(chan chan struct{})
+ go func() {
+ defer close(donec)
+ defer wantPanic(t, test.wantPanic)
+ test.f(<-ch)
+ }()
+ synctest.Run(func() {
+ ch <- make(chan struct{})
+ })
+ <-donec
+ })
+ }
+}
+
func TestTimerFromInsideBubble(t *testing.T) {
for _, test := range []struct {
desc string
if c == nil {
panic(plainError("close of nil channel"))
}
+ if c.synctest && getg().bubble == nil {
+ panic(plainError("close of synctest channel from outside bubble"))
+ }
lock(&c.lock)
if c.closed != 0 {