2015-01-15 18:51:22 +03:00
|
|
|
package redis_test
|
|
|
|
|
|
|
|
import (
|
2020-08-21 12:19:31 +03:00
|
|
|
"context"
|
2016-03-01 13:31:06 +03:00
|
|
|
"io"
|
2015-01-15 18:51:22 +03:00
|
|
|
"net"
|
2015-11-22 15:44:38 +03:00
|
|
|
"sync"
|
2015-01-15 18:51:22 +03:00
|
|
|
"time"
|
|
|
|
|
|
|
|
. "github.com/onsi/ginkgo"
|
|
|
|
. "github.com/onsi/gomega"
|
2021-09-08 16:00:52 +03:00
|
|
|
|
2022-12-12 15:55:49 +03:00
|
|
|
"git.internal/re/redis/v8"
|
2015-01-15 18:51:22 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
var _ = Describe("PubSub", func() {
|
|
|
|
var client *redis.Client
|
2020-08-21 12:19:31 +03:00
|
|
|
var clientID int64
|
2015-01-15 18:51:22 +03:00
|
|
|
|
|
|
|
BeforeEach(func() {
|
2018-08-12 10:08:21 +03:00
|
|
|
opt := redisOptions()
|
|
|
|
opt.MinIdleConns = 0
|
|
|
|
opt.MaxConnAge = 0
|
2020-08-21 12:19:31 +03:00
|
|
|
opt.OnConnect = func(ctx context.Context, cn *redis.Conn) (err error) {
|
|
|
|
clientID, err = cn.ClientID(ctx).Result()
|
|
|
|
return err
|
|
|
|
}
|
2018-08-12 10:08:21 +03:00
|
|
|
client = redis.NewClient(opt)
|
2020-03-11 17:26:42 +03:00
|
|
|
Expect(client.FlushDB(ctx).Err()).NotTo(HaveOccurred())
|
2015-01-15 18:51:22 +03:00
|
|
|
})
|
|
|
|
|
|
|
|
AfterEach(func() {
|
|
|
|
Expect(client.Close()).NotTo(HaveOccurred())
|
|
|
|
})
|
|
|
|
|
2019-03-12 13:40:08 +03:00
|
|
|
It("implements Stringer", func() {
|
2020-03-11 17:26:42 +03:00
|
|
|
pubsub := client.PSubscribe(ctx, "mychannel*")
|
2019-03-12 13:40:08 +03:00
|
|
|
defer pubsub.Close()
|
|
|
|
|
|
|
|
Expect(pubsub.String()).To(Equal("PubSub(mychannel*)"))
|
|
|
|
})
|
|
|
|
|
2015-01-15 18:51:22 +03:00
|
|
|
It("should support pattern matching", func() {
|
2020-03-11 17:26:42 +03:00
|
|
|
pubsub := client.PSubscribe(ctx, "mychannel*")
|
2015-07-11 13:42:44 +03:00
|
|
|
defer pubsub.Close()
|
2015-01-15 18:51:22 +03:00
|
|
|
|
|
|
|
{
|
2020-03-11 17:26:42 +03:00
|
|
|
msgi, err := pubsub.ReceiveTimeout(ctx, time.Second)
|
2015-01-15 18:51:22 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
subscr := msgi.(*redis.Subscription)
|
|
|
|
Expect(subscr.Kind).To(Equal("psubscribe"))
|
|
|
|
Expect(subscr.Channel).To(Equal("mychannel*"))
|
|
|
|
Expect(subscr.Count).To(Equal(1))
|
|
|
|
}
|
|
|
|
|
2016-03-09 14:38:33 +03:00
|
|
|
{
|
2020-03-11 17:26:42 +03:00
|
|
|
msgi, err := pubsub.ReceiveTimeout(ctx, time.Second)
|
2016-03-09 14:38:33 +03:00
|
|
|
Expect(err.(net.Error).Timeout()).To(Equal(true))
|
|
|
|
Expect(msgi).To(BeNil())
|
|
|
|
}
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
n, err := client.Publish(ctx, "mychannel1", "hello").Result()
|
2016-03-09 14:38:33 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
Expect(n).To(Equal(int64(1)))
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
Expect(pubsub.PUnsubscribe(ctx, "mychannel*")).NotTo(HaveOccurred())
|
2016-03-09 14:38:33 +03:00
|
|
|
|
2015-01-15 18:51:22 +03:00
|
|
|
{
|
2020-03-11 17:26:42 +03:00
|
|
|
msgi, err := pubsub.ReceiveTimeout(ctx, time.Second)
|
2015-01-15 18:51:22 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
2016-04-09 11:45:56 +03:00
|
|
|
subscr := msgi.(*redis.Message)
|
2015-01-15 18:51:22 +03:00
|
|
|
Expect(subscr.Channel).To(Equal("mychannel1"))
|
|
|
|
Expect(subscr.Pattern).To(Equal("mychannel*"))
|
|
|
|
Expect(subscr.Payload).To(Equal("hello"))
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
2020-03-11 17:26:42 +03:00
|
|
|
msgi, err := pubsub.ReceiveTimeout(ctx, time.Second)
|
2015-01-15 18:51:22 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
subscr := msgi.(*redis.Subscription)
|
|
|
|
Expect(subscr.Kind).To(Equal("punsubscribe"))
|
|
|
|
Expect(subscr.Channel).To(Equal("mychannel*"))
|
|
|
|
Expect(subscr.Count).To(Equal(0))
|
|
|
|
}
|
|
|
|
|
2016-03-17 19:00:47 +03:00
|
|
|
stats := client.PoolStats()
|
2019-05-31 17:54:30 +03:00
|
|
|
Expect(stats.Misses).To(Equal(uint32(1)))
|
2015-01-15 18:51:22 +03:00
|
|
|
})
|
|
|
|
|
|
|
|
It("should pub/sub channels", func() {
|
2020-03-11 17:26:42 +03:00
|
|
|
channels, err := client.PubSubChannels(ctx, "mychannel*").Result()
|
2015-01-15 18:51:22 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
Expect(channels).To(BeEmpty())
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
pubsub := client.Subscribe(ctx, "mychannel", "mychannel2")
|
2015-07-11 13:42:44 +03:00
|
|
|
defer pubsub.Close()
|
2015-01-15 18:51:22 +03:00
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
channels, err = client.PubSubChannels(ctx, "mychannel*").Result()
|
2015-01-15 18:51:22 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
Expect(channels).To(ConsistOf([]string{"mychannel", "mychannel2"}))
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
channels, err = client.PubSubChannels(ctx, "").Result()
|
2015-01-15 18:51:22 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
Expect(channels).To(BeEmpty())
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
channels, err = client.PubSubChannels(ctx, "*").Result()
|
2015-01-15 18:51:22 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
Expect(len(channels)).To(BeNumerically(">=", 2))
|
|
|
|
})
|
|
|
|
|
|
|
|
It("should return the numbers of subscribers", func() {
|
2020-03-11 17:26:42 +03:00
|
|
|
pubsub := client.Subscribe(ctx, "mychannel", "mychannel2")
|
2015-07-11 13:42:44 +03:00
|
|
|
defer pubsub.Close()
|
2015-01-15 18:51:22 +03:00
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
channels, err := client.PubSubNumSub(ctx, "mychannel", "mychannel2", "mychannel3").Result()
|
2015-01-15 18:51:22 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
2015-01-25 15:05:19 +03:00
|
|
|
Expect(channels).To(Equal(map[string]int64{
|
|
|
|
"mychannel": 1,
|
|
|
|
"mychannel2": 1,
|
|
|
|
"mychannel3": 0,
|
2015-01-15 18:51:22 +03:00
|
|
|
}))
|
|
|
|
})
|
|
|
|
|
|
|
|
It("should return the numbers of subscribers by pattern", func() {
|
2020-03-11 17:26:42 +03:00
|
|
|
num, err := client.PubSubNumPat(ctx).Result()
|
2015-01-15 18:51:22 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
Expect(num).To(Equal(int64(0)))
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
pubsub := client.PSubscribe(ctx, "*")
|
2015-07-11 13:42:44 +03:00
|
|
|
defer pubsub.Close()
|
2015-01-15 18:51:22 +03:00
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
num, err = client.PubSubNumPat(ctx).Result()
|
2015-01-15 18:51:22 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
Expect(num).To(Equal(int64(1)))
|
|
|
|
})
|
|
|
|
|
|
|
|
It("should pub/sub", func() {
|
2020-03-11 17:26:42 +03:00
|
|
|
pubsub := client.Subscribe(ctx, "mychannel", "mychannel2")
|
2015-07-11 13:42:44 +03:00
|
|
|
defer pubsub.Close()
|
2015-01-15 18:51:22 +03:00
|
|
|
|
|
|
|
{
|
2020-03-11 17:26:42 +03:00
|
|
|
msgi, err := pubsub.ReceiveTimeout(ctx, time.Second)
|
2015-01-15 18:51:22 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
subscr := msgi.(*redis.Subscription)
|
|
|
|
Expect(subscr.Kind).To(Equal("subscribe"))
|
|
|
|
Expect(subscr.Channel).To(Equal("mychannel"))
|
|
|
|
Expect(subscr.Count).To(Equal(1))
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
2020-03-11 17:26:42 +03:00
|
|
|
msgi, err := pubsub.ReceiveTimeout(ctx, time.Second)
|
2015-01-15 18:51:22 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
subscr := msgi.(*redis.Subscription)
|
|
|
|
Expect(subscr.Kind).To(Equal("subscribe"))
|
|
|
|
Expect(subscr.Channel).To(Equal("mychannel2"))
|
|
|
|
Expect(subscr.Count).To(Equal(2))
|
|
|
|
}
|
|
|
|
|
2016-03-09 14:38:33 +03:00
|
|
|
{
|
2020-03-11 17:26:42 +03:00
|
|
|
msgi, err := pubsub.ReceiveTimeout(ctx, time.Second)
|
2016-03-09 14:38:33 +03:00
|
|
|
Expect(err.(net.Error).Timeout()).To(Equal(true))
|
|
|
|
Expect(msgi).NotTo(HaveOccurred())
|
|
|
|
}
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
n, err := client.Publish(ctx, "mychannel", "hello").Result()
|
2016-03-09 14:38:33 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
Expect(n).To(Equal(int64(1)))
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
n, err = client.Publish(ctx, "mychannel2", "hello2").Result()
|
2016-03-09 14:38:33 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
Expect(n).To(Equal(int64(1)))
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
Expect(pubsub.Unsubscribe(ctx, "mychannel", "mychannel2")).NotTo(HaveOccurred())
|
2016-03-09 14:38:33 +03:00
|
|
|
|
2015-01-15 18:51:22 +03:00
|
|
|
{
|
2020-03-11 17:26:42 +03:00
|
|
|
msgi, err := pubsub.ReceiveTimeout(ctx, time.Second)
|
2015-01-15 18:51:22 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
2017-07-09 10:07:20 +03:00
|
|
|
msg := msgi.(*redis.Message)
|
|
|
|
Expect(msg.Channel).To(Equal("mychannel"))
|
|
|
|
Expect(msg.Payload).To(Equal("hello"))
|
2015-01-15 18:51:22 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
{
|
2020-03-11 17:26:42 +03:00
|
|
|
msgi, err := pubsub.ReceiveTimeout(ctx, time.Second)
|
2015-01-15 18:51:22 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
msg := msgi.(*redis.Message)
|
|
|
|
Expect(msg.Channel).To(Equal("mychannel2"))
|
|
|
|
Expect(msg.Payload).To(Equal("hello2"))
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
2020-03-11 17:26:42 +03:00
|
|
|
msgi, err := pubsub.ReceiveTimeout(ctx, time.Second)
|
2015-01-15 18:51:22 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
subscr := msgi.(*redis.Subscription)
|
|
|
|
Expect(subscr.Kind).To(Equal("unsubscribe"))
|
|
|
|
Expect(subscr.Channel).To(Equal("mychannel"))
|
|
|
|
Expect(subscr.Count).To(Equal(1))
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
2020-03-11 17:26:42 +03:00
|
|
|
msgi, err := pubsub.ReceiveTimeout(ctx, time.Second)
|
2015-01-15 18:51:22 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
subscr := msgi.(*redis.Subscription)
|
|
|
|
Expect(subscr.Kind).To(Equal("unsubscribe"))
|
|
|
|
Expect(subscr.Channel).To(Equal("mychannel2"))
|
|
|
|
Expect(subscr.Count).To(Equal(0))
|
|
|
|
}
|
|
|
|
|
2016-03-17 19:00:47 +03:00
|
|
|
stats := client.PoolStats()
|
2019-05-31 17:54:30 +03:00
|
|
|
Expect(stats.Misses).To(Equal(uint32(1)))
|
2015-01-15 18:51:22 +03:00
|
|
|
})
|
|
|
|
|
2015-07-11 13:12:47 +03:00
|
|
|
It("should ping/pong", func() {
|
2020-03-11 17:26:42 +03:00
|
|
|
pubsub := client.Subscribe(ctx, "mychannel")
|
2015-07-11 13:42:44 +03:00
|
|
|
defer pubsub.Close()
|
2015-07-11 13:12:47 +03:00
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
_, err := pubsub.ReceiveTimeout(ctx, time.Second)
|
2015-07-11 13:12:47 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
err = pubsub.Ping(ctx, "")
|
2015-07-11 13:12:47 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
msgi, err := pubsub.ReceiveTimeout(ctx, time.Second)
|
2015-07-11 13:12:47 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
pong := msgi.(*redis.Pong)
|
|
|
|
Expect(pong.Payload).To(Equal(""))
|
|
|
|
})
|
|
|
|
|
|
|
|
It("should ping/pong with payload", func() {
|
2020-03-11 17:26:42 +03:00
|
|
|
pubsub := client.Subscribe(ctx, "mychannel")
|
2015-07-11 13:42:44 +03:00
|
|
|
defer pubsub.Close()
|
2015-07-11 13:12:47 +03:00
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
_, err := pubsub.ReceiveTimeout(ctx, time.Second)
|
2015-07-11 13:12:47 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
err = pubsub.Ping(ctx, "hello")
|
2015-07-11 13:12:47 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
msgi, err := pubsub.ReceiveTimeout(ctx, time.Second)
|
2015-07-11 13:12:47 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
pong := msgi.(*redis.Pong)
|
|
|
|
Expect(pong.Payload).To(Equal("hello"))
|
|
|
|
})
|
|
|
|
|
2016-03-01 13:31:06 +03:00
|
|
|
It("should multi-ReceiveMessage", func() {
|
2020-03-11 17:26:42 +03:00
|
|
|
pubsub := client.Subscribe(ctx, "mychannel")
|
2015-09-06 13:50:16 +03:00
|
|
|
defer pubsub.Close()
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
subscr, err := pubsub.ReceiveTimeout(ctx, time.Second)
|
2017-07-01 13:22:39 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
Expect(subscr).To(Equal(&redis.Subscription{
|
|
|
|
Kind: "subscribe",
|
|
|
|
Channel: "mychannel",
|
|
|
|
Count: 1,
|
|
|
|
}))
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
err = client.Publish(ctx, "mychannel", "hello").Err()
|
2016-03-01 13:31:06 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
err = client.Publish(ctx, "mychannel", "world").Err()
|
2016-03-01 13:31:06 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
msg, err := pubsub.ReceiveMessage(ctx)
|
2016-03-01 13:31:06 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
Expect(msg.Channel).To(Equal("mychannel"))
|
|
|
|
Expect(msg.Payload).To(Equal("hello"))
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
msg, err = pubsub.ReceiveMessage(ctx)
|
2016-03-01 13:31:06 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
Expect(msg.Channel).To(Equal("mychannel"))
|
|
|
|
Expect(msg.Payload).To(Equal("world"))
|
|
|
|
})
|
|
|
|
|
2017-08-01 14:21:26 +03:00
|
|
|
It("returns an error when subscribe fails", func() {
|
2020-03-11 17:26:42 +03:00
|
|
|
pubsub := client.Subscribe(ctx)
|
2017-08-01 14:21:26 +03:00
|
|
|
defer pubsub.Close()
|
|
|
|
|
|
|
|
pubsub.SetNetConn(&badConn{
|
|
|
|
readErr: io.EOF,
|
|
|
|
writeErr: io.EOF,
|
|
|
|
})
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
err := pubsub.Subscribe(ctx, "mychannel")
|
2017-08-01 14:21:26 +03:00
|
|
|
Expect(err).To(MatchError("EOF"))
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
err = pubsub.Subscribe(ctx, "mychannel")
|
2017-08-01 14:21:26 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
})
|
|
|
|
|
2016-03-01 13:31:06 +03:00
|
|
|
expectReceiveMessageOnError := func(pubsub *redis.PubSub) {
|
2017-04-17 15:43:58 +03:00
|
|
|
pubsub.SetNetConn(&badConn{
|
2016-03-01 13:31:06 +03:00
|
|
|
readErr: io.EOF,
|
|
|
|
writeErr: io.EOF,
|
2017-02-08 12:24:09 +03:00
|
|
|
})
|
2015-09-06 13:50:16 +03:00
|
|
|
|
2018-07-23 15:55:13 +03:00
|
|
|
step := make(chan struct{}, 3)
|
|
|
|
|
2015-09-06 13:50:16 +03:00
|
|
|
go func() {
|
|
|
|
defer GinkgoRecover()
|
|
|
|
|
2018-07-23 15:55:13 +03:00
|
|
|
Eventually(step).Should(Receive())
|
2020-03-11 17:26:42 +03:00
|
|
|
err := client.Publish(ctx, "mychannel", "hello").Err()
|
2015-09-06 13:50:16 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
2018-07-23 15:55:13 +03:00
|
|
|
step <- struct{}{}
|
2015-09-06 13:50:16 +03:00
|
|
|
}()
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
_, err := pubsub.ReceiveMessage(ctx)
|
2018-07-23 15:55:13 +03:00
|
|
|
Expect(err).To(Equal(io.EOF))
|
|
|
|
step <- struct{}{}
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
msg, err := pubsub.ReceiveMessage(ctx)
|
2015-09-06 13:50:16 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
Expect(msg.Channel).To(Equal("mychannel"))
|
|
|
|
Expect(msg.Payload).To(Equal("hello"))
|
2015-11-22 15:44:38 +03:00
|
|
|
|
2018-07-23 15:55:13 +03:00
|
|
|
Eventually(step).Should(Receive())
|
2015-12-31 12:27:28 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
It("Subscribe should reconnect on ReceiveMessage error", func() {
|
2020-03-11 17:26:42 +03:00
|
|
|
pubsub := client.Subscribe(ctx, "mychannel")
|
2015-12-31 12:27:28 +03:00
|
|
|
defer pubsub.Close()
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
subscr, err := pubsub.ReceiveTimeout(ctx, time.Second)
|
2017-07-01 13:22:39 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
Expect(subscr).To(Equal(&redis.Subscription{
|
|
|
|
Kind: "subscribe",
|
|
|
|
Channel: "mychannel",
|
|
|
|
Count: 1,
|
|
|
|
}))
|
|
|
|
|
2016-03-01 13:31:06 +03:00
|
|
|
expectReceiveMessageOnError(pubsub)
|
2015-12-31 12:27:28 +03:00
|
|
|
})
|
|
|
|
|
|
|
|
It("PSubscribe should reconnect on ReceiveMessage error", func() {
|
2020-03-11 17:26:42 +03:00
|
|
|
pubsub := client.PSubscribe(ctx, "mychannel")
|
2015-12-31 12:27:28 +03:00
|
|
|
defer pubsub.Close()
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
subscr, err := pubsub.ReceiveTimeout(ctx, time.Second)
|
2017-07-01 13:22:39 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
Expect(subscr).To(Equal(&redis.Subscription{
|
|
|
|
Kind: "psubscribe",
|
|
|
|
Channel: "mychannel",
|
|
|
|
Count: 1,
|
|
|
|
}))
|
|
|
|
|
2016-03-01 13:31:06 +03:00
|
|
|
expectReceiveMessageOnError(pubsub)
|
2015-09-06 13:50:16 +03:00
|
|
|
})
|
|
|
|
|
2015-12-02 16:40:44 +03:00
|
|
|
It("should return on Close", func() {
|
2020-03-11 17:26:42 +03:00
|
|
|
pubsub := client.Subscribe(ctx, "mychannel")
|
2015-11-26 18:04:26 +03:00
|
|
|
defer pubsub.Close()
|
|
|
|
|
|
|
|
var wg sync.WaitGroup
|
|
|
|
wg.Add(1)
|
|
|
|
go func() {
|
|
|
|
defer GinkgoRecover()
|
|
|
|
|
|
|
|
wg.Done()
|
2017-02-15 18:15:24 +03:00
|
|
|
defer wg.Done()
|
2015-12-02 16:40:44 +03:00
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
_, err := pubsub.ReceiveMessage(ctx)
|
2017-02-18 13:28:01 +03:00
|
|
|
Expect(err).To(HaveOccurred())
|
2018-07-23 15:55:13 +03:00
|
|
|
Expect(err.Error()).To(SatisfyAny(
|
|
|
|
Equal("redis: client is closed"),
|
|
|
|
ContainSubstring("use of closed network connection"),
|
2017-02-18 13:28:01 +03:00
|
|
|
))
|
2015-11-26 18:04:26 +03:00
|
|
|
}()
|
2015-12-02 16:40:44 +03:00
|
|
|
|
2015-11-26 18:04:26 +03:00
|
|
|
wg.Wait()
|
2015-12-02 16:40:44 +03:00
|
|
|
wg.Add(1)
|
2015-11-26 18:04:26 +03:00
|
|
|
|
2017-04-11 16:53:55 +03:00
|
|
|
Expect(pubsub.Close()).NotTo(HaveOccurred())
|
2015-12-02 16:40:44 +03:00
|
|
|
|
|
|
|
wg.Wait()
|
2015-11-26 18:04:26 +03:00
|
|
|
})
|
|
|
|
|
2017-02-08 12:24:09 +03:00
|
|
|
It("should ReceiveMessage without a subscription", func() {
|
|
|
|
timeout := 100 * time.Millisecond
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
pubsub := client.Subscribe(ctx)
|
2017-02-08 12:24:09 +03:00
|
|
|
defer pubsub.Close()
|
|
|
|
|
2017-08-15 10:34:05 +03:00
|
|
|
var wg sync.WaitGroup
|
|
|
|
wg.Add(1)
|
2017-02-08 12:24:09 +03:00
|
|
|
go func() {
|
|
|
|
defer GinkgoRecover()
|
2017-08-15 10:34:05 +03:00
|
|
|
defer wg.Done()
|
2017-02-08 12:24:09 +03:00
|
|
|
|
2018-07-23 15:55:13 +03:00
|
|
|
time.Sleep(timeout)
|
2017-07-01 13:22:39 +03:00
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
err := pubsub.Subscribe(ctx, "mychannel")
|
2017-02-08 12:24:09 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
2017-07-01 13:22:39 +03:00
|
|
|
time.Sleep(timeout)
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
err = client.Publish(ctx, "mychannel", "hello").Err()
|
2017-02-08 12:24:09 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
}()
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
msg, err := pubsub.ReceiveMessage(ctx)
|
2017-02-08 12:24:09 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
Expect(msg.Channel).To(Equal("mychannel"))
|
|
|
|
Expect(msg.Payload).To(Equal("hello"))
|
2017-08-15 10:34:05 +03:00
|
|
|
|
|
|
|
wg.Wait()
|
2017-02-08 12:24:09 +03:00
|
|
|
})
|
2017-09-30 09:21:59 +03:00
|
|
|
|
|
|
|
It("handles big message payload", func() {
|
2020-03-11 17:26:42 +03:00
|
|
|
pubsub := client.Subscribe(ctx, "mychannel")
|
2017-09-30 09:21:59 +03:00
|
|
|
defer pubsub.Close()
|
|
|
|
|
|
|
|
ch := pubsub.Channel()
|
|
|
|
|
|
|
|
bigVal := bigVal()
|
2020-03-11 17:26:42 +03:00
|
|
|
err := client.Publish(ctx, "mychannel", bigVal).Err()
|
2017-09-30 09:21:59 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
|
|
|
var msg *redis.Message
|
|
|
|
Eventually(ch).Should(Receive(&msg))
|
|
|
|
Expect(msg.Channel).To(Equal("mychannel"))
|
|
|
|
Expect(msg.Payload).To(Equal(string(bigVal)))
|
|
|
|
})
|
2018-08-04 12:19:19 +03:00
|
|
|
|
2020-08-21 12:19:31 +03:00
|
|
|
It("handles message payload slice with server-assisted client-size caching", func() {
|
|
|
|
pubsub := client.Subscribe(ctx, "__redis__:invalidate")
|
|
|
|
defer pubsub.Close()
|
|
|
|
|
|
|
|
client2 := redis.NewClient(redisOptions())
|
|
|
|
defer client2.Close()
|
|
|
|
|
|
|
|
err := client2.Do(ctx, "CLIENT", "TRACKING", "on", "REDIRECT", clientID).Err()
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
|
|
|
err = client2.Do(ctx, "GET", "mykey").Err()
|
|
|
|
Expect(err).To(Equal(redis.Nil))
|
|
|
|
|
|
|
|
err = client2.Do(ctx, "SET", "mykey", "myvalue").Err()
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
|
|
|
ch := pubsub.Channel()
|
|
|
|
|
|
|
|
var msg *redis.Message
|
|
|
|
Eventually(ch).Should(Receive(&msg))
|
|
|
|
Expect(msg.Channel).To(Equal("__redis__:invalidate"))
|
|
|
|
Expect(msg.PayloadSlice).To(Equal([]string{"mykey"}))
|
|
|
|
})
|
|
|
|
|
2018-08-04 12:19:19 +03:00
|
|
|
It("supports concurrent Ping and Receive", func() {
|
|
|
|
const N = 100
|
|
|
|
|
2020-03-11 17:26:42 +03:00
|
|
|
pubsub := client.Subscribe(ctx, "mychannel")
|
2018-08-04 12:19:19 +03:00
|
|
|
defer pubsub.Close()
|
|
|
|
|
|
|
|
done := make(chan struct{})
|
|
|
|
go func() {
|
|
|
|
defer GinkgoRecover()
|
|
|
|
|
|
|
|
for i := 0; i < N; i++ {
|
2020-03-11 17:26:42 +03:00
|
|
|
_, err := pubsub.ReceiveTimeout(ctx, 5*time.Second)
|
2018-08-04 12:19:19 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
}
|
|
|
|
close(done)
|
|
|
|
}()
|
|
|
|
|
|
|
|
for i := 0; i < N; i++ {
|
2020-03-11 17:26:42 +03:00
|
|
|
err := pubsub.Ping(ctx)
|
2018-08-04 12:19:19 +03:00
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
}
|
|
|
|
|
|
|
|
select {
|
|
|
|
case <-done:
|
|
|
|
case <-time.After(30 * time.Second):
|
|
|
|
Fail("timeout")
|
|
|
|
}
|
|
|
|
})
|
2021-05-26 06:25:18 +03:00
|
|
|
|
|
|
|
It("should ChannelMessage", func() {
|
|
|
|
pubsub := client.Subscribe(ctx, "mychannel")
|
|
|
|
defer pubsub.Close()
|
|
|
|
|
|
|
|
ch := pubsub.Channel(
|
|
|
|
redis.WithChannelSize(10),
|
|
|
|
redis.WithChannelHealthCheckInterval(time.Second),
|
|
|
|
)
|
|
|
|
|
|
|
|
text := "test channel message"
|
|
|
|
err := client.Publish(ctx, "mychannel", text).Err()
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
|
|
|
|
|
|
|
var msg *redis.Message
|
|
|
|
Eventually(ch).Should(Receive(&msg))
|
|
|
|
Expect(msg.Channel).To(Equal("mychannel"))
|
|
|
|
Expect(msg.Payload).To(Equal(text))
|
|
|
|
})
|
2015-01-15 18:51:22 +03:00
|
|
|
})
|