You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

120 lines
2.3 KiB

  1. package elb_test
  2. import (
  3. "fmt"
  4. "net/http"
  5. "net/url"
  6. "os"
  7. "testing"
  8. "time"
  9. . "gopkg.in/check.v1"
  10. )
  11. func Test(t *testing.T) {
  12. TestingT(t)
  13. }
  14. type HTTPSuite struct{}
  15. var testServer = NewTestHTTPServer("http://localhost:4444", 5*time.Second)
  16. func (s *HTTPSuite) SetUpSuite(c *C) {
  17. testServer.Start()
  18. }
  19. func (s *HTTPSuite) TearDownTest(c *C) {
  20. testServer.FlushRequests()
  21. }
  22. type TestHTTPServer struct {
  23. URL string
  24. Timeout time.Duration
  25. started bool
  26. request chan *http.Request
  27. response chan *testResponse
  28. pending chan bool
  29. }
  30. type testResponse struct {
  31. Status int
  32. Headers map[string]string
  33. Body string
  34. }
  35. func NewTestHTTPServer(url string, timeout time.Duration) *TestHTTPServer {
  36. return &TestHTTPServer{URL: url, Timeout: timeout}
  37. }
  38. func (s *TestHTTPServer) Start() {
  39. if s.started {
  40. return
  41. }
  42. s.started = true
  43. s.request = make(chan *http.Request, 64)
  44. s.response = make(chan *testResponse, 64)
  45. s.pending = make(chan bool, 64)
  46. url, _ := url.Parse(s.URL)
  47. go http.ListenAndServe(url.Host, s)
  48. s.PrepareResponse(202, nil, "Nothing.")
  49. for {
  50. // Wait for it to be up.
  51. resp, err := http.Get(s.URL)
  52. if err == nil && resp.StatusCode == 202 {
  53. break
  54. }
  55. time.Sleep(1e8)
  56. }
  57. s.WaitRequest() // Consume dummy request.
  58. }
  59. // FlushRequests discards requests which were not yet consumed by WaitRequest.
  60. func (s *TestHTTPServer) FlushRequests() {
  61. for {
  62. select {
  63. case <-s.request:
  64. default:
  65. return
  66. }
  67. }
  68. }
  69. func (s *TestHTTPServer) ServeHTTP(w http.ResponseWriter, req *http.Request) {
  70. s.request <- req
  71. var resp *testResponse
  72. select {
  73. case resp = <-s.response:
  74. case <-time.After(s.Timeout):
  75. fmt.Fprintf(os.Stderr, "ERROR: Timeout waiting for test to provide response\n")
  76. resp = &testResponse{500, nil, ""}
  77. }
  78. if resp.Headers != nil {
  79. h := w.Header()
  80. for k, v := range resp.Headers {
  81. h.Set(k, v)
  82. }
  83. }
  84. if resp.Status != 0 {
  85. w.WriteHeader(resp.Status)
  86. }
  87. w.Write([]byte(resp.Body))
  88. }
  89. func (s *TestHTTPServer) WaitRequest() *http.Request {
  90. select {
  91. case req := <-s.request:
  92. req.ParseForm()
  93. return req
  94. case <-time.After(s.Timeout):
  95. panic("Timeout waiting for goamz request")
  96. }
  97. panic("unreached")
  98. }
  99. func (s *TestHTTPServer) PrepareResponse(status int, headers map[string]string, body string) {
  100. s.response <- &testResponse{status, headers, body}
  101. }