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.
 
 
 

146 lines
2.8 KiB

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