mirror of https://github.com/0xERR0R/blocky.git
126 lines
3.0 KiB
Go
126 lines
3.0 KiB
Go
package util
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
. "github.com/onsi/ginkgo/v2"
|
|
. "github.com/onsi/gomega"
|
|
)
|
|
|
|
const (
|
|
testMessage = 1
|
|
)
|
|
|
|
var _ = Describe("Context utils", func() {
|
|
Describe("CtxSend", func() {
|
|
var ch chan int
|
|
BeforeEach(func() {
|
|
ch = make(chan int, 1)
|
|
})
|
|
|
|
AfterEach(func() {
|
|
ch = nil
|
|
})
|
|
|
|
When("channel is not closed", func() {
|
|
It("should send value to channel", func(ctx context.Context) {
|
|
go startReader(ctx, ch)
|
|
Expect(CtxSend(ctx, ch, testMessage)).Should(BeTrue())
|
|
}, SpecTimeout(time.Second))
|
|
})
|
|
|
|
When("channel is closed", func() {
|
|
It("should return false", func(ctx context.Context) {
|
|
go startReader(ctx, ch)
|
|
close(ch)
|
|
Expect(CtxSend(ctx, ch, testMessage)).Should(BeFalse())
|
|
}, SpecTimeout(time.Second))
|
|
})
|
|
|
|
When("channel is nil", func() {
|
|
It("should return false", func(ctx context.Context) {
|
|
Expect(CtxSend(ctx, nil, testMessage)).Should(BeFalse())
|
|
}, SpecTimeout(time.Second))
|
|
})
|
|
|
|
When("channel is full", func() {
|
|
It("should wait", func(ctx context.Context) {
|
|
ch <- testMessage
|
|
go func(ctx context.Context, ch chan int) {
|
|
timer := time.NewTimer(time.Millisecond * 200)
|
|
select {
|
|
case <-timer.C:
|
|
startReader(ctx, ch)
|
|
case <-ctx.Done():
|
|
return
|
|
}
|
|
}(ctx, ch)
|
|
Expect(CtxSend(ctx, ch, testMessage)).Should(BeTrue())
|
|
}, SpecTimeout(time.Second))
|
|
})
|
|
|
|
When("context is done", func() {
|
|
It("should return false", func(ctx context.Context) {
|
|
go startReader(ctx, ch)
|
|
cCtx, cancel := context.WithCancel(ctx)
|
|
cancel()
|
|
<-cCtx.Done()
|
|
Expect(CtxSend(cCtx, ch, testMessage)).Should(BeFalse())
|
|
}, SpecTimeout(time.Second))
|
|
})
|
|
|
|
When("context is terminated", func() {
|
|
It("should return false", func(ctx context.Context) {
|
|
ch <- testMessage
|
|
cCtx, cancel := context.WithCancel(ctx)
|
|
go func(ctx context.Context, cancel context.CancelFunc) {
|
|
timer := time.NewTimer(time.Millisecond * 200)
|
|
select {
|
|
case <-timer.C:
|
|
cancel()
|
|
case <-ctx.Done():
|
|
return
|
|
}
|
|
}(ctx, cancel)
|
|
Expect(CtxSend(cCtx, ch, testMessage)).Should(BeFalse())
|
|
}, SpecTimeout(time.Second))
|
|
})
|
|
|
|
When("context is nil", func() {
|
|
It("should return false", func(ctx context.Context) {
|
|
Expect(CtxSend(nil, ch, testMessage)).Should(BeFalse())
|
|
}, SpecTimeout(time.Second))
|
|
})
|
|
|
|
When("context and channel are nil", func() {
|
|
It("should return false", func(ctx context.Context) {
|
|
Expect(CtxSend(nil, nil, testMessage)).Should(BeFalse())
|
|
}, SpecTimeout(time.Second))
|
|
})
|
|
|
|
When("context is done and channel is closed", func() {
|
|
It("should return false", func(ctx context.Context) {
|
|
go startReader(ctx, ch)
|
|
ctx, cancel := context.WithCancel(ctx)
|
|
cancel()
|
|
close(ch)
|
|
Expect(CtxSend(ctx, ch, testMessage)).Should(BeFalse())
|
|
}, SpecTimeout(time.Second))
|
|
})
|
|
})
|
|
})
|
|
|
|
func startReader(ctx context.Context, ch <-chan int) {
|
|
for {
|
|
select {
|
|
case <-ctx.Done():
|
|
return
|
|
case i, ok := <-ch:
|
|
if ok {
|
|
Expect(i).Should(Equal(testMessage))
|
|
}
|
|
}
|
|
}
|
|
}
|