http_test.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package etcdhttp
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "net/http/httptest"
  6. "net/url"
  7. "reflect"
  8. "testing"
  9. "time"
  10. "code.google.com/p/go.net/context"
  11. etcdserver "github.com/coreos/etcd/etcdserver2"
  12. "github.com/coreos/etcd/etcdserver2/etcdserverpb"
  13. "github.com/coreos/etcd/raft"
  14. "github.com/coreos/etcd/raft/raftpb"
  15. "github.com/coreos/etcd/store"
  16. )
  17. func nopSave(st raftpb.State, ents []raftpb.Entry) {}
  18. func nopSend(m []raftpb.Message) {}
  19. func TestSet(t *testing.T) {
  20. ctx, cancel := context.WithCancel(context.Background())
  21. defer cancel()
  22. st := store.New()
  23. n := raft.Start(ctx, 1, []int64{1})
  24. n.Campaign(ctx)
  25. srv := &etcdserver.Server{
  26. Node: n,
  27. Store: st,
  28. Send: etcdserver.SendFunc(nopSend),
  29. Save: func(st raftpb.State, ents []raftpb.Entry) {
  30. for _, e := range ents {
  31. var r etcdserverpb.Request
  32. if err := r.Unmarshal(e.Data); err != nil {
  33. t.Fatal(err)
  34. }
  35. }
  36. },
  37. }
  38. etcdserver.Start(srv)
  39. defer srv.Stop()
  40. h := Handler{
  41. Timeout: time.Hour,
  42. Server: srv,
  43. }
  44. s := httptest.NewServer(h)
  45. defer s.Close()
  46. resp, err := http.PostForm(s.URL+"/keys/foo", url.Values{"value": {"bar"}})
  47. if err != nil {
  48. t.Fatal(err)
  49. }
  50. if resp.StatusCode != 201 {
  51. t.Errorf("StatusCode = %d, expected %d", 201, resp.StatusCode)
  52. }
  53. g := new(store.Event)
  54. if err := json.NewDecoder(resp.Body).Decode(&g); err != nil {
  55. t.Fatal(err)
  56. }
  57. w := &store.NodeExtern{
  58. Key: "/foo/1",
  59. Value: stringp("bar"),
  60. ModifiedIndex: 1,
  61. CreatedIndex: 1,
  62. }
  63. if !reflect.DeepEqual(g.Node, w) {
  64. t.Errorf("g = %+v, want %+v", g.Node, w)
  65. }
  66. }
  67. func stringp(s string) *string { return &s }