blob: 8ba7c4628a2f107df59e07d75025436ea0c52d47 [file] [log] [blame]
package goscaffold
import (
"errors"
"fmt"
"net/http"
"time"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var _ = Describe("Scaffold Tests", func() {
It("Validate framework", func() {
s := CreateHTTPScaffold()
stopChan := make(chan error)
err := s.Open()
Expect(err).Should(Succeed())
go func() {
fmt.Fprintf(GinkgoWriter, "Gonna listen on %s\n", s.InsecureAddress())
stopErr := s.Listen(&testHandler{})
fmt.Fprintf(GinkgoWriter, "Done listening\n")
stopChan <- stopErr
}()
Eventually(func() bool {
return testGet(s, "")
}, 5*time.Second).Should(BeTrue())
resp, err := http.Get(fmt.Sprintf("http://%s", s.InsecureAddress()))
Expect(err).Should(Succeed())
Expect(resp.StatusCode).Should(Equal(200))
shutdownErr := errors.New("Validate")
s.Shutdown(shutdownErr)
Eventually(stopChan).Should(Receive(Equal(shutdownErr)))
})
It("Shutdown", func() {
s := CreateHTTPScaffold()
stopChan := make(chan bool)
err := s.Open()
Expect(err).Should(Succeed())
go func() {
s.Listen(&testHandler{})
stopChan <- true
}()
go func() {
resp2, err2 := http.Get(fmt.Sprintf("http://%s?delay=1s", s.InsecureAddress()))
Expect(err2).Should(Succeed())
Expect(resp2.StatusCode).Should(Equal(200))
}()
// Just make sure server is listening
Eventually(func() bool {
return testGet(s, "")
}, 5*time.Second).Should(BeTrue())
// Previous call prevents server from exiting
Consistently(stopChan, 250*time.Millisecond).ShouldNot(Receive())
// Tell the server to try and exit
s.Shutdown(errors.New("Stop"))
// Should take one second -- in the meantime, calls should fail with 503
resp, err := http.Get(fmt.Sprintf("http://%s?", s.InsecureAddress()))
Expect(err).Should(Succeed())
Expect(resp.StatusCode).Should(Equal(503))
// But in less than two seconds, server should be down
Eventually(stopChan, 2*time.Second).Should(Receive(BeTrue()))
// Calls should now fail
Eventually(func() bool {
return testGet(s, "")
}, time.Second).Should(BeFalse())
})
})
func testGet(s *HTTPScaffold, path string) bool {
resp, err := http.Get(fmt.Sprintf("http://%s", s.InsecureAddress()))
if err != nil {
fmt.Fprintf(GinkgoWriter, "Get %s = %s\n", path, err)
return false
}
if resp.StatusCode != 200 {
fmt.Fprintf(GinkgoWriter, "Get %s = %d\n", path, resp.StatusCode)
return false
}
return true
}
type testHandler struct {
}
func (h *testHandler) ServeHTTP(resp http.ResponseWriter, req *http.Request) {
var err error
var delayTime time.Duration
delayStr := req.URL.Query().Get("delay")
if delayStr != "" {
delayTime, err = time.ParseDuration(delayStr)
if err != nil {
resp.WriteHeader(http.StatusBadRequest)
return
}
}
if delayTime > 0 {
time.Sleep(delayTime)
}
}