diff --git a/conn.go b/conn.go index 40d612b..62a8bdf 100644 --- a/conn.go +++ b/conn.go @@ -8,9 +8,10 @@ import ( const defaultBufSize = 4096 -var ( - noTimeout = time.Time{} -) +var noTimeout = time.Time{} + +// Stubbed in tests. +var now = time.Now type conn struct { netcn net.Conn @@ -32,6 +33,8 @@ func newConnDialer(opt *Options) func() (*conn, error) { cn := &conn{ netcn: netcn, buf: make([]byte, defaultBufSize), + + UsedAt: now(), } cn.rd = bufio.NewReader(cn) return cn, cn.init(opt) @@ -76,7 +79,7 @@ func (cn *conn) writeCmds(cmds ...Cmder) error { } func (cn *conn) Read(b []byte) (int, error) { - cn.UsedAt = time.Now() + cn.UsedAt = now() if cn.ReadTimeout != 0 { cn.netcn.SetReadDeadline(cn.UsedAt.Add(cn.ReadTimeout)) } else { @@ -86,7 +89,7 @@ func (cn *conn) Read(b []byte) (int, error) { } func (cn *conn) Write(b []byte) (int, error) { - cn.UsedAt = time.Now() + cn.UsedAt = now() if cn.WriteTimeout != 0 { cn.netcn.SetWriteDeadline(cn.UsedAt.Add(cn.WriteTimeout)) } else { diff --git a/export_test.go b/export_test.go index 4a6de2c..95715b5 100644 --- a/export_test.go +++ b/export_test.go @@ -1,6 +1,9 @@ package redis -import "net" +import ( + "net" + "time" +) func (c *baseClient) Pool() pool { return c.connPool @@ -15,3 +18,13 @@ var NewConnDialer = newConnDialer func (cn *conn) SetNetConn(netcn net.Conn) { cn.netcn = netcn } + +func SetTime(tm time.Time) { + now = func() time.Time { + return tm + } +} + +func RestoreTime() { + now = time.Now +} diff --git a/redis_test.go b/redis_test.go index 724d241..8c846d0 100644 --- a/redis_test.go +++ b/redis_test.go @@ -173,18 +173,23 @@ var _ = Describe("Client", func() { It("should maintain conn.UsedAt", func() { cn, _, err := client.Pool().Get() Expect(err).NotTo(HaveOccurred()) - Expect(cn.UsedAt).To(BeZero()) + Expect(cn.UsedAt).NotTo(BeZero()) + createdAt := cn.UsedAt + + future := time.Now().Add(time.Hour) + redis.SetTime(future) + defer redis.RestoreTime() err = client.Pool().Put(cn) Expect(err).NotTo(HaveOccurred()) - Expect(cn.UsedAt).To(BeZero()) + Expect(cn.UsedAt.Equal(createdAt)).To(BeTrue()) err = client.Ping().Err() Expect(err).NotTo(HaveOccurred()) cn = client.Pool().First() Expect(cn).NotTo(BeNil()) - Expect(cn.UsedAt).To(BeTemporally("~", time.Now())) + Expect(cn.UsedAt.Equal(future)).To(BeTrue()) }) })