github.com/billybanfield/evergreen@v0.0.0-20170525200750-eeee692790f7/service/api_test_utils.go (about) 1 package service 2 3 import ( 4 "crypto/tls" 5 "fmt" 6 "net" 7 "net/http/httptest" 8 "os" 9 "path/filepath" 10 11 "github.com/evergreen-ci/evergreen" 12 "github.com/evergreen-ci/evergreen/plugin" 13 "github.com/evergreen-ci/evergreen/service/testutil" 14 "github.com/mongodb/grip" 15 ) 16 17 type TestServer struct { 18 URL string 19 net.Listener 20 *APIServer 21 ts *httptest.Server 22 } 23 24 func (s *TestServer) Close() { 25 grip.Alertln("closing test server:", s.URL) 26 27 grip.CatchError(s.Listener.Close()) 28 s.ts.CloseClientConnections() 29 s.ts.Close() 30 } 31 32 func CreateTestServer(settings *evergreen.Settings, tlsConfig *tls.Config, plugins []plugin.APIPlugin) (*TestServer, error) { 33 port := testutil.NextPort() 34 if err := os.MkdirAll(filepath.Join(evergreen.FindEvergreenHome(), evergreen.ClientDirectory), 0644); err != nil { 35 return nil, err 36 } 37 38 apiServer, err := NewAPIServer(settings, plugins) 39 apiServer.UserManager = testutil.MockUserManager{} 40 if err != nil { 41 return nil, err 42 } 43 var l net.Listener 44 protocol := "http" 45 46 h, err := apiServer.Handler() 47 if err != nil { 48 return nil, err 49 } 50 server := httptest.NewUnstartedServer(h) 51 server.TLS = tlsConfig 52 53 // We're not running ssl tests with the agent in any cases, 54 // but currently its set up to clients of this test server 55 // should figure out the port from the TestServer instance's 56 // URL field. 57 // 58 // We try and make sure that the SSL servers on different 59 // ports than their non-ssl servers. 60 61 var addr string 62 if tlsConfig == nil { 63 addr = fmt.Sprintf(":%d", port) 64 l, err = GetListener(addr) 65 if err != nil { 66 return nil, err 67 } 68 server.Listener = l 69 go server.Start() 70 } else { 71 addr = fmt.Sprintf(":%d", port+1) 72 l, err = GetTLSListener(addr, tlsConfig) 73 if err != nil { 74 return nil, err 75 } 76 protocol = "https" 77 server.Listener = l 78 go server.StartTLS() 79 } 80 81 ts := &TestServer{ 82 URL: fmt.Sprintf("%s://localhost%v", protocol, addr), 83 Listener: l, 84 APIServer: apiServer, 85 ts: server, 86 } 87 88 grip.Infoln("started server:", ts.URL) 89 90 return ts, nil 91 }