From 1737721d4d642698871e5d4e7d185596a4470530 Mon Sep 17 00:00:00 2001 From: Sergey Date: Fri, 11 Jan 2019 17:51:06 +0500 Subject: [PATCH] Add tests --- README.md | 32 +++++++++++++++++++++++++- redisdl.go | 12 ++++++---- redisdl_test.go | 61 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 3f62852..d824c2f 100644 --- a/README.md +++ b/README.md @@ -3,4 +3,34 @@ [![Go Report Card](https://goreportcard.com/badge/github.com/saromanov/redisdl)](https://goreportcard.com/report/github.com/saromanov/redisdl) [![Coverage Status](https://coveralls.io/repos/github/saromanov/redisdl/badge.svg?branch=master)](https://coveralls.io/github/saromanov/redisdl?branch=master) -Implementation of distributed locking over Redis \ No newline at end of file +Implementation of distributed locking over Redis + +## Example +```go +package main + +import ( + "context" + + "github.com/go-redis/redis" + "github.com/saromanov/redisdl" +) + +func main() { + client := redis.NewClient(&redis.Options{ + Network: "tcp", + Addr: "127.0.0.1:6379", + }) + defer client.Close() + dl, err := redisdl.New(&redisdl.Options{ + Client: client, + Key: "fun.lock", + RetryCount: 3, + }) + if err != nil { + panic(err) + } + dl.Lock(context.Background()) + defer dl.Unlock() +} +``` \ No newline at end of file diff --git a/redisdl.go b/redisdl.go index 3f2de6c..f137c24 100644 --- a/redisdl.go +++ b/redisdl.go @@ -76,6 +76,7 @@ func (r *RedisDL) resetToken() { r.currentToken = "" } +// lock provides trying to gen new token func (r *RedisDL) lock(ctx context.Context) error { r.m.Lock() defer r.m.Unlock() @@ -84,12 +85,15 @@ func (r *RedisDL) lock(ctx context.Context) error { return err } retry := time.NewTimer(r.opt.LockTimeout) + atts := r.opt.RetryCount + 1 for { - if err := r.storeToken(token); err != nil { - return err + if err := r.storeToken(token); err == nil { + r.currentToken = token + return nil + } + if atts--; atts <= 0 { + return fmt.Errorf("unable to generate token") } - r.currentToken = token - select { case <-ctx.Done(): return ctx.Err() diff --git a/redisdl_test.go b/redisdl_test.go index 85b71bb..4bac4e5 100644 --- a/redisdl_test.go +++ b/redisdl_test.go @@ -1 +1,62 @@ package redisdl + +import ( + "context" + "testing" + "time" + + "github.com/go-redis/redis" +) + +func TestNew(t *testing.T) { + client := redis.NewClient(&redis.Options{ + Network: "tcp", + Addr: "127.0.0.1:6379", + }) + defer client.Close() + _, err := New(&Options{ + Client: client, + }) + if err != nil { + t.Fatal(err) + } +} + +func TestInvalidNew(t *testing.T) { + client := redis.NewClient(&redis.Options{ + Network: "tcp", + Addr: "127.0.0.1:123", + }) + defer client.Close() + _, err := New(&Options{ + Client: client, + }) + if err == nil { + t.Fatal("should't start redis with invalid port") + } +} + +func TestLock(t *testing.T) { + client := redis.NewClient(&redis.Options{ + Network: "tcp", + Addr: "127.0.0.1:6379", + }) + defer client.Close() + d, err := New(&Options{ + Client: client, + Key: "mock2.key", + LockTimeout: 3 * time.Second, + }) + if err != nil { + t.Fatal(err) + } + err = d.Lock(context.Background()) + defer d.Unlock() + token := d.GetToken() + if err != nil { + t.Fatal(err) + } + if token == "" { + t.Fatal("unable to get token") + } +}