msgpack_entity_test.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. package restPack
  2. import (
  3. "bytes"
  4. "errors"
  5. "log"
  6. "net/http"
  7. "net/http/httptest"
  8. "reflect"
  9. "testing"
  10. "time"
  11. restful "github.com/emicklei/go-restful"
  12. "gopkg.in/vmihailenco/msgpack.v2"
  13. "io/ioutil"
  14. )
  15. func TestMsgPack(t *testing.T) {
  16. // register msg pack entity
  17. restful.RegisterEntityAccessor(MIME_MSGPACK, NewEntityAccessorMsgPack())
  18. type Tool struct {
  19. Name string
  20. Vendor string
  21. }
  22. // Write
  23. httpWriter := httptest.NewRecorder()
  24. mpack := &Tool{Name: "json", Vendor: "apple"}
  25. resp := restful.NewResponse(httpWriter)
  26. resp.SetRequestAccepts("application/x-msgpack,*/*;q=0.8")
  27. err := resp.WriteEntity(mpack)
  28. if err != nil {
  29. t.Errorf("err %v", err)
  30. }
  31. // Read
  32. bodyReader := bytes.NewReader(httpWriter.Body.Bytes())
  33. httpRequest, _ := http.NewRequest("GET", "/test", bodyReader)
  34. httpRequest.Header.Set("Content-Type", MIME_MSGPACK)
  35. request := restful.NewRequest(httpRequest)
  36. readMsgPack := new(Tool)
  37. err = request.ReadEntity(&readMsgPack)
  38. if err != nil {
  39. t.Errorf("err %v", err)
  40. }
  41. if equal := reflect.DeepEqual(mpack, readMsgPack); !equal {
  42. t.Fatalf("should not be error")
  43. }
  44. }
  45. func TestWithWebService(t *testing.T) {
  46. serverURL := "http://127.0.0.1:8090"
  47. go func() {
  48. runRestfulMsgPackRouterServer()
  49. }()
  50. if err := waitForServerUp(serverURL); err != nil {
  51. t.Errorf("%v", err)
  52. }
  53. // send a post request
  54. userData := user{Id: "0001", Name: "Tony"}
  55. msgPackData, err := msgpack.Marshal(userData)
  56. req, err := http.NewRequest("POST", serverURL+"/test/msgpack", bytes.NewBuffer(msgPackData))
  57. req.Header.Set("Content-Type", MIME_MSGPACK)
  58. client := &http.Client{}
  59. resp, err := client.Do(req)
  60. if err != nil {
  61. t.Errorf("unexpected error in sending req: %v", err)
  62. }
  63. if resp.StatusCode != http.StatusOK {
  64. t.Errorf("unexpected response: %v, expected: %v", resp.StatusCode, http.StatusOK)
  65. }
  66. ur := &userResponse{}
  67. expectMsgPackDocument(t, resp, ur)
  68. if ur.Status != statusActive {
  69. t.Fatalf("should not error")
  70. }
  71. log.Printf("user response:%v", ur)
  72. }
  73. func expectMsgPackDocument(t *testing.T, r *http.Response, doc interface{}) {
  74. data, err := ioutil.ReadAll(r.Body)
  75. defer r.Body.Close()
  76. if err != nil {
  77. t.Error("ExpectMsgPackDocument: unable to read response body :%v", err)
  78. return
  79. }
  80. // put the body back for re-reads
  81. r.Body = ioutil.NopCloser(bytes.NewReader(data))
  82. err = msgpack.Unmarshal(data, doc)
  83. if err != nil {
  84. t.Error("ExpectMsgPackDocument: unable to unmarshal MsgPack:%v", err)
  85. }
  86. }
  87. func runRestfulMsgPackRouterServer() {
  88. container := restful.NewContainer()
  89. register(container)
  90. log.Printf("start listening on localhost:8090")
  91. server := &http.Server{Addr: ":8090", Handler: container}
  92. log.Fatal(server.ListenAndServe())
  93. }
  94. func waitForServerUp(serverURL string) error {
  95. for start := time.Now(); time.Since(start) < time.Minute; time.Sleep(5 * time.Second) {
  96. _, err := http.Get(serverURL + "/")
  97. if err == nil {
  98. return nil
  99. }
  100. }
  101. return errors.New("waiting for server timed out")
  102. }
  103. var (
  104. statusActive = "active"
  105. )
  106. type user struct {
  107. Id, Name string
  108. }
  109. type userResponse struct {
  110. Status string
  111. }
  112. func register(container *restful.Container) {
  113. restful.RegisterEntityAccessor(MIME_MSGPACK, NewEntityAccessorMsgPack())
  114. ws := new(restful.WebService)
  115. ws.
  116. Path("/test").
  117. Consumes(restful.MIME_JSON, MIME_MSGPACK).
  118. Produces(restful.MIME_JSON, MIME_MSGPACK)
  119. // route user api
  120. ws.Route(ws.POST("/msgpack").
  121. To(do).
  122. Reads(user{}).
  123. Writes(userResponse{}))
  124. container.Add(ws)
  125. }
  126. func do(request *restful.Request, response *restful.Response) {
  127. u := &user{}
  128. err := request.ReadEntity(u)
  129. if err != nil {
  130. log.Printf("should be no error, got:%v", err)
  131. }
  132. log.Printf("got:%v", u)
  133. ur := &userResponse{Status: statusActive}
  134. response.SetRequestAccepts(MIME_MSGPACK)
  135. response.WriteEntity(ur)
  136. }