From 3d16633a9436709a96d59ec50c7af71193376a22 Mon Sep 17 00:00:00 2001 From: rick Date: Sun, 1 Dec 2013 13:56:32 -0700 Subject: [PATCH] update the v2 server to support recursive on CompareAndDelete events --- server/v2/delete_handler.go | 5 +-- server/v2/tests/delete_handler_test.go | 59 +++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/server/v2/delete_handler.go b/server/v2/delete_handler.go index c98c2768e..c70fdb6ab 100644 --- a/server/v2/delete_handler.go +++ b/server/v2/delete_handler.go @@ -15,10 +15,9 @@ func DeleteHandler(w http.ResponseWriter, req *http.Request, s Server) error { req.ParseForm() _, valueOk := req.Form["prevValue"] _, indexOk := req.Form["prevIndex"] + recursive := (req.Form.Get("recursive") == "true") if !valueOk && !indexOk { - recursive := (req.Form.Get("recursive") == "true") - c := s.Store().CommandFactory().CreateDeleteCommand(key, recursive) return s.Dispatch(c, w, req) } @@ -43,6 +42,6 @@ func DeleteHandler(w http.ResponseWriter, req *http.Request, s Server) error { } } - c := s.Store().CommandFactory().CreateCompareAndDeleteCommand(key, prevValue, prevIndex) + c := s.Store().CommandFactory().CreateCompareAndDeleteCommand(key, recursive, prevValue, prevIndex) return s.Dispatch(c, w, req) } diff --git a/server/v2/tests/delete_handler_test.go b/server/v2/tests/delete_handler_test.go index b602e0764..7fcd4e1f4 100644 --- a/server/v2/tests/delete_handler_test.go +++ b/server/v2/tests/delete_handler_test.go @@ -28,6 +28,64 @@ func TestV2DeleteKey(t *testing.T) { }) } +// Ensures that a directory is deleted. +// +// $ curl -X PUT localhost:4001/v2/keys/foo/bar -d value=XXX +// $ curl -X DELETE localhost:4001/v2/keys/foo?recursive=true +// +func TestV2DeleteDirectory(t *testing.T) { + tests.RunServer(func(s *server.Server) { + v := url.Values{} + v.Set("value", "XXX") + resp, err := tests.PutForm(fmt.Sprintf("http://%s%s", s.URL(), "/v2/keys/foo/bar"), v) + tests.ReadBody(resp) + resp, err = tests.DeleteForm(fmt.Sprintf("http://%s%s", s.URL(), "/v2/keys/foo?recursive=true"), url.Values{}) + assert.Nil(t, err, "") + body := tests.ReadBodyJSON(resp) + assert.Equal(t, body["action"], "delete", "") + assert.Equal(t, body["dir"], true, "") + assert.Equal(t, body["modifiedIndex"], 2, "") + }) +} + +// Ensures that a directory is deleted if the previous index matches +// +// $ curl -X PUT localhost:4001/v2/keys/foo/bar -d value=XXX +// $ curl -X DELETE localhost:4001/v2/keys/foo?recursive=true&prevIndex=1 +// +func TestV2DeleteDirectoryCADOnIndexSuccess(t *testing.T) { + tests.RunServer(func(s *server.Server) { + v := url.Values{} + v.Set("value", "XXX") + resp, err := tests.PutForm(fmt.Sprintf("http://%s%s", s.URL(), "/v2/keys/foo/bar"), v) + tests.ReadBody(resp) + resp, err = tests.DeleteForm(fmt.Sprintf("http://%s%s", s.URL(), "/v2/keys/foo?recursive=true&prevIndex=1"), url.Values{}) + assert.Nil(t, err, "") + body := tests.ReadBodyJSON(resp) + assert.Equal(t, body["action"], "compareAndDelete", "") + assert.Equal(t, body["dir"], true, "") + assert.Equal(t, body["modifiedIndex"], 2, "") + }) +} + +// Ensures that a directory is not deleted if the previous index does not match +// +// $ curl -X PUT localhost:4001/v2/keys/foo/bar -d value=XXX +// $ curl -X DELETE localhost:4001/v2/keys/foo?recursive=true&prevIndex=100 +// +func TestV2DeleteDirectoryCADOnIndexFail(t *testing.T) { + tests.RunServer(func(s *server.Server) { + v := url.Values{} + v.Set("value", "XXX") + resp, err := tests.PutForm(fmt.Sprintf("http://%s%s", s.URL(), "/v2/keys/foo/bar"), v) + tests.ReadBody(resp) + resp, err = tests.DeleteForm(fmt.Sprintf("http://%s%s", s.URL(), "/v2/keys/foo?recursive=true&prevIndex=100"), url.Values{}) + assert.Nil(t, err, "") + body := tests.ReadBodyJSON(resp) + assert.Equal(t, body["errorCode"], 101) + }) +} + // Ensures that a key is deleted only if the previous index matches. // // $ curl -X PUT localhost:4001/v2/keys/foo/bar -d value=XXX @@ -60,7 +118,6 @@ func TestV2DeleteKeyCADOnIndexFail(t *testing.T) { tests.ReadBody(resp) resp, _ = tests.DeleteForm(fmt.Sprintf("http://%s%s", s.URL(), "/v2/keys/foo/bar?prevIndex=100"), v) body := tests.ReadBodyJSON(resp) - fmt.Println(body) assert.Equal(t, body["errorCode"], 101) }) }