summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/braintree/manners/server_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/braintree/manners/server_test.go')
-rw-r--r--vendor/github.com/braintree/manners/server_test.go242
1 files changed, 0 insertions, 242 deletions
diff --git a/vendor/github.com/braintree/manners/server_test.go b/vendor/github.com/braintree/manners/server_test.go
deleted file mode 100644
index 108863040..000000000
--- a/vendor/github.com/braintree/manners/server_test.go
+++ /dev/null
@@ -1,242 +0,0 @@
-package manners
-
-import (
- "net"
- "net/http"
- "testing"
- "time"
-)
-
-// Tests that the server allows in-flight requests to complete
-// before shutting down.
-func TestGracefulness(t *testing.T) {
- server := newServer()
- wg := newTestWg()
- server.wg = wg
- statechanged := make(chan http.ConnState)
- listener, exitchan := startServer(t, server, statechanged)
-
- client := newClient(listener.Addr(), false)
- client.Run()
-
- // wait for client to connect, but don't let it send the request yet
- if err := <-client.connected; err != nil {
- t.Fatal("Client failed to connect to server", err)
- }
- // avoid a race between the client connection and the server accept
- if state := <-statechanged; state != http.StateNew {
- t.Fatal("Unexpected state", state)
- }
-
- server.Close()
-
- waiting := <-wg.waitCalled
- if waiting < 1 {
- t.Errorf("Expected the waitgroup to equal 1 at shutdown; actually %d", waiting)
- }
-
- // allow the client to finish sending the request and make sure the server exits after
- // (client will be in connected but idle state at that point)
- client.sendrequest <- true
- close(client.sendrequest)
- if err := <-exitchan; err != nil {
- t.Error("Unexpected error during shutdown", err)
- }
-}
-
-// Tests that the server begins to shut down when told to and does not accept
-// new requests once shutdown has begun
-func TestShutdown(t *testing.T) {
- server := newServer()
- wg := newTestWg()
- server.wg = wg
- statechanged := make(chan http.ConnState)
- listener, exitchan := startServer(t, server, statechanged)
-
- client1 := newClient(listener.Addr(), false)
- client1.Run()
-
- // wait for client1 to connect
- if err := <-client1.connected; err != nil {
- t.Fatal("Client failed to connect to server", err)
- }
- // avoid a race between the client connection and the server accept
- if state := <-statechanged; state != http.StateNew {
- t.Fatal("Unexpected state", state)
- }
-
- // start the shutdown; once it hits waitgroup.Wait()
- // the listener should of been closed, though client1 is still connected
- if server.Close() != true {
- t.Fatal("first call to Close returned false")
- }
- if server.Close() != false {
- t.Fatal("second call to Close returned true")
- }
-
- waiting := <-wg.waitCalled
- if waiting != 1 {
- t.Errorf("Waitcount should be one, got %d", waiting)
- }
-
- // should get connection refused at this point
- client2 := newClient(listener.Addr(), false)
- client2.Run()
-
- if err := <-client2.connected; err == nil {
- t.Fatal("client2 connected when it should of received connection refused")
- }
-
- // let client1 finish so the server can exit
- close(client1.sendrequest) // don't bother sending an actual request
-
- <-exitchan
-}
-
-// Test that a connection is closed upon reaching an idle state if and only if the server
-// is shutting down.
-func TestCloseOnIdle(t *testing.T) {
- server := newServer()
- wg := newTestWg()
- server.wg = wg
- fl := newFakeListener()
- runner := func() error {
- return server.Serve(fl)
- }
-
- startGenericServer(t, server, nil, runner)
-
- // Change to idle state while server is not closing; Close should not be called
- conn := &fakeConn{}
- server.ConnState(conn, http.StateIdle)
- if conn.closeCalled {
- t.Error("Close was called unexpected")
- }
-
- server.Close()
-
- // wait until the server calls Close() on the listener
- // by that point the atomic closing variable will have been updated, avoiding a race.
- <-fl.closeCalled
-
- conn = &fakeConn{}
- server.ConnState(conn, http.StateIdle)
- if !conn.closeCalled {
- t.Error("Close was not called")
- }
-}
-
-func waitForState(t *testing.T, waiter chan http.ConnState, state http.ConnState, errmsg string) {
- for {
- select {
- case ns := <-waiter:
- if ns == state {
- return
- }
- case <-time.After(time.Second):
- t.Fatal(errmsg)
- }
- }
-}
-
-// Test that a request moving from active->idle->active using an actual
-// network connection still results in a corect shutdown
-func TestStateTransitionActiveIdleActive(t *testing.T) {
- server := newServer()
- wg := newTestWg()
- statechanged := make(chan http.ConnState)
- server.wg = wg
- listener, exitchan := startServer(t, server, statechanged)
-
- client := newClient(listener.Addr(), false)
- client.Run()
-
- // wait for client to connect, but don't let it send the request
- if err := <-client.connected; err != nil {
- t.Fatal("Client failed to connect to server", err)
- }
-
- for i := 0; i < 2; i++ {
- client.sendrequest <- true
- waitForState(t, statechanged, http.StateActive, "Client failed to reach active state")
- <-client.idle
- client.idlerelease <- true
- waitForState(t, statechanged, http.StateIdle, "Client failed to reach idle state")
- }
-
- // client is now in an idle state
-
- server.Close()
- waiting := <-wg.waitCalled
- if waiting != 0 {
- t.Errorf("Waitcount should be zero, got %d", waiting)
- }
-
- if err := <-exitchan; err != nil {
- t.Error("Unexpected error during shutdown", err)
- }
-}
-
-// Test state transitions from new->active->-idle->closed using an actual
-// network connection and make sure the waitgroup count is correct at the end.
-func TestStateTransitionActiveIdleClosed(t *testing.T) {
- var (
- listener net.Listener
- exitchan chan error
- )
-
- keyFile, err1 := newTempFile(localhostKey)
- certFile, err2 := newTempFile(localhostCert)
- defer keyFile.Unlink()
- defer certFile.Unlink()
-
- if err1 != nil || err2 != nil {
- t.Fatal("Failed to create temporary files", err1, err2)
- }
-
- for _, withTLS := range []bool{false, true} {
- server := newServer()
- wg := newTestWg()
- statechanged := make(chan http.ConnState)
- server.wg = wg
- if withTLS {
- listener, exitchan = startTLSServer(t, server, certFile.Name(), keyFile.Name(), statechanged)
- } else {
- listener, exitchan = startServer(t, server, statechanged)
- }
-
- client := newClient(listener.Addr(), withTLS)
- client.Run()
-
- // wait for client to connect, but don't let it send the request
- if err := <-client.connected; err != nil {
- t.Fatal("Client failed to connect to server", err)
- }
-
- client.sendrequest <- true
- waitForState(t, statechanged, http.StateActive, "Client failed to reach active state")
-
- err := <-client.idle
- if err != nil {
- t.Fatalf("tls=%t unexpected error from client %s", withTLS, err)
- }
-
- client.idlerelease <- true
- waitForState(t, statechanged, http.StateIdle, "Client failed to reach idle state")
-
- // client is now in an idle state
- close(client.sendrequest)
- <-client.closed
- waitForState(t, statechanged, http.StateClosed, "Client failed to reach closed state")
-
- server.Close()
- waiting := <-wg.waitCalled
- if waiting != 0 {
- t.Errorf("Waitcount should be zero, got %d", waiting)
- }
-
- if err := <-exitchan; err != nil {
- t.Error("Unexpected error during shutdown", err)
- }
- }
-}