mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
update test
This commit is contained in:
@@ -65,6 +65,52 @@ func (fs *FileSystem) Get(keyPath string, recusive bool, index uint64, term uint
|
||||
return e, nil
|
||||
}
|
||||
|
||||
func (fs *FileSystem) Create(keyPath string, value string, expireTime time.Time, index uint64, term uint64) (*Event, error) {
|
||||
keyPath = path.Clean("/" + keyPath)
|
||||
|
||||
// make sure we can create the node
|
||||
_, err := fs.InternalGet(keyPath, index, term)
|
||||
|
||||
if err == nil { // key already exists
|
||||
return nil, etcdErr.NewError(105, keyPath)
|
||||
}
|
||||
|
||||
etcdError, _ := err.(etcdErr.Error)
|
||||
|
||||
if etcdError.ErrorCode == 104 { // we cannot create the key due to meet a file while walking
|
||||
return nil, err
|
||||
}
|
||||
|
||||
dir, _ := path.Split(keyPath)
|
||||
|
||||
// walk through the keyPath, create dirs and get the last directory node
|
||||
d, err := fs.walk(dir, fs.checkDir)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
e := newEvent(Set, keyPath, fs.Index, fs.Term)
|
||||
e.Value = value
|
||||
|
||||
f := newFile(keyPath, value, fs.Index, fs.Term, d, "", expireTime)
|
||||
|
||||
err = d.Add(f)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Node with TTL
|
||||
if expireTime != Permanent {
|
||||
go f.Expire()
|
||||
e.Expiration = &f.ExpireTime
|
||||
e.TTL = int64(expireTime.Sub(time.Now()) / time.Second)
|
||||
}
|
||||
|
||||
return e, nil
|
||||
}
|
||||
|
||||
func (fs *FileSystem) Update(keyPath string, value string, expireTime time.Time, index uint64, term uint64) (*Event, error) {
|
||||
n, err := fs.InternalGet(keyPath, index, term)
|
||||
|
||||
@@ -109,52 +155,6 @@ func (fs *FileSystem) Update(keyPath string, value string, expireTime time.Time,
|
||||
return e, nil
|
||||
}
|
||||
|
||||
func (fs *FileSystem) Create(keyPath string, value string, expireTime time.Time, create bool, index uint64, term uint64) (*Event, error) {
|
||||
keyPath = path.Clean("/" + keyPath)
|
||||
|
||||
// make sure we can create the node
|
||||
_, err := fs.InternalGet(keyPath, index, term)
|
||||
|
||||
if err != nil { // key already exists
|
||||
return nil, etcdErr.NewError(105, keyPath)
|
||||
}
|
||||
|
||||
etcdError, _ := err.(etcdErr.Error)
|
||||
|
||||
if etcdError.ErrorCode == 104 { // we cannot create the key due to meet a file while walking
|
||||
return nil, err
|
||||
}
|
||||
|
||||
dir, _ := path.Split(keyPath)
|
||||
|
||||
// walk through the keyPath, create dirs and get the last directory node
|
||||
d, err := fs.walk(dir, fs.checkDir)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
e := newEvent(Set, keyPath, fs.Index, fs.Term)
|
||||
e.Value = value
|
||||
|
||||
f := newFile(keyPath, value, fs.Index, fs.Term, d, "", expireTime)
|
||||
|
||||
err = d.Add(f)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Node with TTL
|
||||
if expireTime != Permanent {
|
||||
go f.Expire()
|
||||
e.Expiration = &f.ExpireTime
|
||||
e.TTL = int64(expireTime.Sub(time.Now()) / time.Second)
|
||||
}
|
||||
|
||||
return e, nil
|
||||
}
|
||||
|
||||
func (fs *FileSystem) TestAndSet(keyPath string, prevValue string, prevIndex uint64, value string, expireTime time.Time, index uint64, term uint64) (*Event, error) {
|
||||
f, err := fs.InternalGet(keyPath, index, term)
|
||||
|
||||
|
||||
@@ -5,26 +5,43 @@ import (
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestSetAndGet(t *testing.T) {
|
||||
func TestCreateAndGet(t *testing.T) {
|
||||
fs := New()
|
||||
setAndGet(fs, "/foobar", t)
|
||||
setAndGet(fs, "/foo/bar", t)
|
||||
setAndGet(fs, "/foo/foo/bar", t)
|
||||
|
||||
// this should create successfully
|
||||
createAndGet(fs, "/foobar", t)
|
||||
createAndGet(fs, "/foo/bar", t)
|
||||
createAndGet(fs, "/foo/foo/bar", t)
|
||||
|
||||
// already exist, create should fail
|
||||
_, err := fs.Create("/foobar", "bar", Permanent, 1, 1)
|
||||
|
||||
if err == nil {
|
||||
t.Fatal("Create should fail")
|
||||
}
|
||||
|
||||
// meet file, create should fail
|
||||
_, err = fs.Create("/foo/bar/bar", "bar", Permanent, 1, 1)
|
||||
|
||||
if err == nil {
|
||||
t.Fatal("Create should fail")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func TestUpdateFile(t *testing.T) {
|
||||
fs := New()
|
||||
|
||||
_, err := fs.Set("/foo/bar", "bar", Permanent, 1, 1)
|
||||
_, err := fs.Create("/foo/bar", "bar", Permanent, 1, 1)
|
||||
|
||||
if err != nil {
|
||||
t.Fatalf("cannot set %s=bar [%s]", "/foo/bar", err.Error())
|
||||
t.Fatalf("cannot update %s=bar [%s]", "/foo/bar", err.Error())
|
||||
}
|
||||
|
||||
_, err = fs.Set("/foo/bar", "barbar", Permanent, 2, 1)
|
||||
_, err = fs.Update("/foo/bar", "barbar", Permanent, 2, 1)
|
||||
|
||||
if err != nil {
|
||||
t.Fatalf("cannot set %s=barbar [%s]", "/foo/bar", err.Error())
|
||||
t.Fatalf("cannot update %s=barbar [%s]", "/foo/bar", err.Error())
|
||||
}
|
||||
|
||||
e, err := fs.Get("/foo/bar", false, 2, 1)
|
||||
@@ -43,11 +60,11 @@ func TestListDirectory(t *testing.T) {
|
||||
|
||||
// create dir /foo
|
||||
// set key-value /foo/foo=bar
|
||||
fs.Set("/foo/foo", "bar", Permanent, 1, 1)
|
||||
fs.Create("/foo/foo", "bar", Permanent, 1, 1)
|
||||
|
||||
// create dir /foo/fooDir
|
||||
// set key-value /foo/fooDir/foo=bar
|
||||
fs.Set("/foo/fooDir/foo", "bar", Permanent, 2, 1)
|
||||
fs.Create("/foo/fooDir/foo", "bar", Permanent, 2, 1)
|
||||
|
||||
e, err := fs.Get("/foo", true, 2, 1)
|
||||
|
||||
@@ -74,7 +91,7 @@ func TestListDirectory(t *testing.T) {
|
||||
|
||||
// create dir /foo/_hidden
|
||||
// set key-value /foo/_hidden/foo -> bar
|
||||
fs.Set("/foo/_hidden/foo", "bar", Permanent, 3, 1)
|
||||
fs.Create("/foo/_hidden/foo", "bar", Permanent, 3, 1)
|
||||
|
||||
e, _ = fs.Get("/foo", false, 2, 1)
|
||||
|
||||
@@ -86,7 +103,7 @@ func TestListDirectory(t *testing.T) {
|
||||
func TestRemove(t *testing.T) {
|
||||
fs := New()
|
||||
|
||||
fs.Set("/foo", "bar", Permanent, 1, 1)
|
||||
fs.Create("/foo", "bar", Permanent, 1, 1)
|
||||
_, err := fs.Delete("/foo", false, 1, 1)
|
||||
|
||||
if err != nil {
|
||||
@@ -99,9 +116,9 @@ func TestRemove(t *testing.T) {
|
||||
t.Fatalf("can get the node after deletion")
|
||||
}
|
||||
|
||||
fs.Set("/foo/bar", "bar", Permanent, 1, 1)
|
||||
fs.Set("/foo/car", "car", Permanent, 1, 1)
|
||||
fs.Set("/foo/dar/dar", "dar", Permanent, 1, 1)
|
||||
fs.Create("/foo/bar", "bar", Permanent, 1, 1)
|
||||
fs.Create("/foo/car", "car", Permanent, 1, 1)
|
||||
fs.Create("/foo/dar/dar", "dar", Permanent, 1, 1)
|
||||
|
||||
_, err = fs.Delete("/foo", false, 1, 1)
|
||||
|
||||
@@ -128,7 +145,7 @@ func TestExpire(t *testing.T) {
|
||||
|
||||
expire := time.Now().Add(time.Second)
|
||||
|
||||
fs.Set("/foo", "bar", expire, 1, 1)
|
||||
fs.Create("/foo", "bar", expire, 1, 1)
|
||||
|
||||
_, err := fs.InternalGet("/foo", 1, 1)
|
||||
|
||||
@@ -144,7 +161,7 @@ func TestExpire(t *testing.T) {
|
||||
t.Fatalf("can get the node after expiration time")
|
||||
}
|
||||
|
||||
fs.Set("/foo", "bar", expire, 1, 1)
|
||||
fs.Create("/foo", "bar", expire, 1, 1)
|
||||
|
||||
time.Sleep(time.Millisecond * 50)
|
||||
_, err = fs.InternalGet("/foo", 1, 1)
|
||||
@@ -155,14 +172,14 @@ func TestExpire(t *testing.T) {
|
||||
|
||||
expire = time.Now().Add(time.Second)
|
||||
|
||||
fs.Set("/foo", "bar", expire, 1, 1)
|
||||
fs.Create("/foo", "bar", expire, 1, 1)
|
||||
fs.Delete("/foo", false, 1, 1)
|
||||
|
||||
}
|
||||
|
||||
func TestTestAndSet(t *testing.T) {
|
||||
fs := New()
|
||||
fs.Set("/foo", "bar", Permanent, 1, 1)
|
||||
fs.Create("/foo", "bar", Permanent, 1, 1)
|
||||
|
||||
// test on wrong previous value
|
||||
_, err := fs.TestAndSet("/foo", "barbar", 0, "car", Permanent, 2, 1)
|
||||
@@ -191,23 +208,13 @@ func TestTestAndSet(t *testing.T) {
|
||||
if e.PrevValue != "car" || e.Value != "bar" {
|
||||
t.Fatalf("[%v/%v] [%v/%v]", e.PrevValue, "car", e.Value, "bar")
|
||||
}
|
||||
|
||||
// test on empty previous value
|
||||
e, err = fs.TestAndSet("/fooDir/foo", "", 0, "bar", Permanent, 4, 1)
|
||||
if err != nil {
|
||||
t.Fatal("test on empty node should be succeeded")
|
||||
}
|
||||
|
||||
if e.Key != "/fooDir/foo" || e.PrevValue != "" || e.Value != "bar" {
|
||||
t.Fatalf("[%v/%v] [%v/%v] [%v/%v]", e.Key, "/fooDir/foo", e.PrevValue, "", e.Value, "bar")
|
||||
}
|
||||
}
|
||||
|
||||
func setAndGet(fs *FileSystem, path string, t *testing.T) {
|
||||
_, err := fs.Set(path, "bar", Permanent, 1, 1)
|
||||
func createAndGet(fs *FileSystem, path string, t *testing.T) {
|
||||
_, err := fs.Create(path, "bar", Permanent, 1, 1)
|
||||
|
||||
if err != nil {
|
||||
t.Fatalf("cannot set %s=bar [%s]", path, err.Error())
|
||||
t.Fatalf("cannot create %s=bar [%s]", path, err.Error())
|
||||
}
|
||||
|
||||
e, err := fs.Get(path, false, 1, 1)
|
||||
@@ -219,4 +226,5 @@ func setAndGet(fs *FileSystem, path string, t *testing.T) {
|
||||
if e.Value != "bar" {
|
||||
t.Fatalf("expect value of %s is bar [%s]", path, e.Value)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user