diff options
Diffstat (limited to 'vendor/github.com/goamz/goamz/elb/suite_test.go')
-rw-r--r-- | vendor/github.com/goamz/goamz/elb/suite_test.go | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/vendor/github.com/goamz/goamz/elb/suite_test.go b/vendor/github.com/goamz/goamz/elb/suite_test.go new file mode 100644 index 000000000..fe4c81d47 --- /dev/null +++ b/vendor/github.com/goamz/goamz/elb/suite_test.go @@ -0,0 +1,119 @@ +package elb_test + +import ( + "fmt" + "net/http" + "net/url" + "os" + "testing" + "time" + + . "gopkg.in/check.v1" +) + +func Test(t *testing.T) { + TestingT(t) +} + +type HTTPSuite struct{} + +var testServer = NewTestHTTPServer("http://localhost:4444", 5*time.Second) + +func (s *HTTPSuite) SetUpSuite(c *C) { + testServer.Start() +} + +func (s *HTTPSuite) TearDownTest(c *C) { + testServer.FlushRequests() +} + +type TestHTTPServer struct { + URL string + Timeout time.Duration + started bool + request chan *http.Request + response chan *testResponse + pending chan bool +} + +type testResponse struct { + Status int + Headers map[string]string + Body string +} + +func NewTestHTTPServer(url string, timeout time.Duration) *TestHTTPServer { + return &TestHTTPServer{URL: url, Timeout: timeout} +} + +func (s *TestHTTPServer) Start() { + if s.started { + return + } + s.started = true + + s.request = make(chan *http.Request, 64) + s.response = make(chan *testResponse, 64) + s.pending = make(chan bool, 64) + + url, _ := url.Parse(s.URL) + go http.ListenAndServe(url.Host, s) + + s.PrepareResponse(202, nil, "Nothing.") + for { + // Wait for it to be up. + resp, err := http.Get(s.URL) + if err == nil && resp.StatusCode == 202 { + break + } + time.Sleep(1e8) + } + s.WaitRequest() // Consume dummy request. +} + +// FlushRequests discards requests which were not yet consumed by WaitRequest. +func (s *TestHTTPServer) FlushRequests() { + for { + select { + case <-s.request: + default: + return + } + } +} + +func (s *TestHTTPServer) ServeHTTP(w http.ResponseWriter, req *http.Request) { + s.request <- req + var resp *testResponse + select { + case resp = <-s.response: + case <-time.After(s.Timeout): + fmt.Fprintf(os.Stderr, "ERROR: Timeout waiting for test to provide response\n") + resp = &testResponse{500, nil, ""} + } + if resp.Headers != nil { + h := w.Header() + for k, v := range resp.Headers { + h.Set(k, v) + } + } + if resp.Status != 0 { + w.WriteHeader(resp.Status) + } + w.Write([]byte(resp.Body)) +} + +func (s *TestHTTPServer) WaitRequest() *http.Request { + select { + case req := <-s.request: + req.ParseForm() + return req + case <-time.After(s.Timeout): + panic("Timeout waiting for goamz request") + } + panic("unreached") +} + +func (s *TestHTTPServer) PrepareResponse(status int, headers map[string]string, body string) { + s.response <- &testResponse{status, headers, body} +} |