Skip to content

Commit

Permalink
Add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
saromanov committed Jan 11, 2019
1 parent 937e1dc commit 1737721
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 5 deletions.
32 changes: 31 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
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()
}
```
12 changes: 8 additions & 4 deletions redisdl.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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()
Expand Down
61 changes: 61 additions & 0 deletions redisdl_test.go
Original file line number Diff line number Diff line change
@@ -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")
}
}

0 comments on commit 1737721

Please sign in to comment.