Unverified Commit 78d3ccf2 authored by randy's avatar randy Committed by GitHub

Merge pull request #2 from ztelur/refactor

1 solve test may fail problem
parents 9031b2c6 2f58aadc
......@@ -15,7 +15,7 @@
* limitations under the License.
*/
package etcdv3
package gxetcd
import (
"context"
......@@ -31,17 +31,6 @@ import (
"google.golang.org/grpc"
)
const (
// ConnDelay connection delay
ConnDelay = 3
// MaxFailTimes max failure times
MaxFailTimes = 15
// RegistryETCDV3Client client name
RegistryETCDV3Client = "etcd registry"
// MetadataETCDV3Client client name
MetadataETCDV3Client = "etcd metadata"
)
var (
// ErrNilETCDV3Client raw client nil
ErrNilETCDV3Client = perrors.New("etcd raw client is nil") // full describe the ERR
......@@ -49,46 +38,6 @@ var (
ErrKVPairNotFound = perrors.New("k/v pair not found")
)
// Options client configuration
type Options struct {
name string
endpoints []string
client *Client
timeout time.Duration
heartbeat int // heartbeat second
}
// Option will define a function of handling Options
type Option func(*Options)
// WithEndpoints sets etcd client endpoints
func WithEndpoints(endpoints ...string) Option {
return func(opt *Options) {
opt.endpoints = endpoints
}
}
// WithName sets etcd client name
func WithName(name string) Option {
return func(opt *Options) {
opt.name = name
}
}
// WithTimeout sets etcd client timeout
func WithTimeout(timeout time.Duration) Option {
return func(opt *Options) {
opt.timeout = timeout
}
}
// WithHeartbeat sets etcd client heartbeat
func WithHeartbeat(heartbeat int) Option {
return func(opt *Options) {
opt.heartbeat = heartbeat
}
}
// NewConfigClient create new Client
func NewConfigClient(opts ...Option) *Client {
options := &Options{
......@@ -134,6 +83,7 @@ func NewClient(name string, endpoints []string, timeout time.Duration, heartbeat
DialTimeout: timeout,
DialOptions: []grpc.DialOption{grpc.WithBlock()},
})
if err != nil {
cancel()
return nil, perrors.WithMessage(err, "new raw client block connect to server")
......
......@@ -15,7 +15,7 @@
* limitations under the License.
*/
package etcdv3
package gxetcd
import (
"net/url"
......@@ -23,7 +23,6 @@ import (
"path"
"reflect"
"strings"
"sync"
"testing"
"time"
)
......@@ -289,57 +288,50 @@ func (suite *ClientTestSuite) TestClientWatch() {
c := suite.client
t := suite.T()
wg := sync.WaitGroup{}
wg.Add(1)
go func() {
time.Sleep(time.Second)
for _, tc := range tests {
defer wg.Done()
wc, err := c.watch(prefix)
if err != nil {
assert.Error(t, err)
}
events := make([]mvccpb.Event, 0)
var eCreate, eDelete mvccpb.Event
k := tc.input.k
v := tc.input.v
for e := range wc {
if err := c.Create(k, v); err != nil {
t.Fatal(err)
}
for _, event := range e.Events {
events = append(events, (mvccpb.Event)(*event))
if event.Type == mvccpb.PUT {
eCreate = (mvccpb.Event)(*event)
}
if event.Type == mvccpb.DELETE {
eDelete = (mvccpb.Event)(*event)
}
t.Logf("type IsCreate %v k %s v %s", event.IsCreate(), event.Kv.Key, event.Kv.Value)
if err := c.delete(k); err != nil {
t.Fatal(err)
}
}
assert.Equal(t, 2, len(events))
assert.Contains(t, events, eCreate)
assert.Contains(t, events, eDelete)
c.Close()
}()
for _, tc := range tests {
wc, err := c.watch(prefix)
if err != nil {
assert.Error(t, err)
}
k := tc.input.k
v := tc.input.v
events := make([]mvccpb.Event, 0)
var eCreate, eDelete mvccpb.Event
if err := c.Create(k, v); err != nil {
t.Fatal(err)
}
for e := range wc {
if err := c.delete(k); err != nil {
t.Fatal(err)
for _, event := range e.Events {
events = append(events, (mvccpb.Event)(*event))
if event.Type == mvccpb.PUT {
eCreate = (mvccpb.Event)(*event)
}
if event.Type == mvccpb.DELETE {
eDelete = (mvccpb.Event)(*event)
}
t.Logf("type IsCreate %v k %s v %s", event.IsCreate(), event.Kv.Key, event.Kv.Value)
}
}
c.Close()
wg.Wait()
assert.Equal(t, 2, len(events))
assert.Contains(t, events, eCreate)
assert.Contains(t, events, eDelete)
}
......@@ -349,50 +341,42 @@ func (suite *ClientTestSuite) TestClientRegisterTemp() {
observeC := suite.setUpClient()
t := suite.T()
wg := sync.WaitGroup{}
wg.Add(1)
go func() {
defer wg.Done()
completePath := path.Join("scott", "wang")
wc, err := observeC.watch(completePath)
time.Sleep(2 * time.Second)
err := c.RegisterTemp("scott/wang", "test")
if err != nil {
assert.Error(t, err)
t.Fatal(err)
}
c.Close()
}()
events := make([]mvccpb.Event, 0)
var eCreate, eDelete mvccpb.Event
completePath := path.Join("scott", "wang")
wc, err := observeC.watch(completePath)
if err != nil {
assert.Error(t, err)
}
for e := range wc {
events := make([]mvccpb.Event, 0)
var eCreate, eDelete mvccpb.Event
for _, event := range e.Events {
events = append(events, (mvccpb.Event)(*event))
if event.Type == mvccpb.DELETE {
eDelete = (mvccpb.Event)(*event)
t.Logf("complete key (%s) is delete", completePath)
observeC.Close()
break
}
eCreate = (mvccpb.Event)(*event)
t.Logf("type IsCreate %v k %s v %s", event.IsCreate(), event.Kv.Key, event.Kv.Value)
for e := range wc {
for _, event := range e.Events {
events = append(events, (mvccpb.Event)(*event))
if event.Type == mvccpb.DELETE {
eDelete = (mvccpb.Event)(*event)
t.Logf("complete key (%s) is delete", completePath)
observeC.Close()
break
}
eCreate = (mvccpb.Event)(*event)
t.Logf("type IsCreate %v k %s v %s", event.IsCreate(), event.Kv.Key, event.Kv.Value)
}
assert.Equal(t, 2, len(events))
assert.Contains(t, events, eCreate)
assert.Contains(t, events, eDelete)
}()
err := c.RegisterTemp("scott/wang", "test")
if err != nil {
t.Fatal(err)
}
time.Sleep(2 * time.Second)
c.Close()
wg.Wait()
assert.Equal(t, 2, len(events))
assert.Contains(t, events, eCreate)
assert.Contains(t, events, eDelete)
}
func TestClientSuite(t *testing.T) {
......
package gxetcd
import (
"time"
)
const (
// ConnDelay connection delay
ConnDelay = 3
// MaxFailTimes max failure times
MaxFailTimes = 15
// RegistryETCDV3Client client name
RegistryETCDV3Client = "etcd registry"
// MetadataETCDV3Client client name
MetadataETCDV3Client = "etcd metadata"
)
// Options client configuration
type Options struct {
name string
endpoints []string
client *Client
timeout time.Duration
heartbeat int // heartbeat second
}
// Option will define a function of handling Options
type Option func(*Options)
// WithEndpoints sets etcd client endpoints
func WithEndpoints(endpoints ...string) Option {
return func(opt *Options) {
opt.endpoints = endpoints
}
}
// WithName sets etcd client name
func WithName(name string) Option {
return func(opt *Options) {
opt.name = name
}
}
// WithTimeout sets etcd client timeout
func WithTimeout(timeout time.Duration) Option {
return func(opt *Options) {
opt.timeout = timeout
}
}
// WithHeartbeat sets etcd client heartbeat
func WithHeartbeat(heartbeat int) Option {
return func(opt *Options) {
opt.heartbeat = heartbeat
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment