github.com/hoffie/larasync@v0.0.0-20151025221940-0384d2bddcef/api/client/testserver_test.go (about) 1 package client 2 3 import ( 4 "net" 5 "time" 6 7 "github.com/hoffie/larasync/api/common" 8 "github.com/hoffie/larasync/api/server" 9 "github.com/hoffie/larasync/helpers/x509" 10 "github.com/hoffie/larasync/repository" 11 ) 12 13 // TestServer is used for creating and managing 14 // Server instances for testing. 15 type TestServer struct { 16 listener net.Listener 17 hostAndPort string 18 adminSecret []byte 19 rm *repository.Manager 20 api *server.Server 21 } 22 23 // NewTestServer creates a server instance for testing purposes. 24 // It uses a random port for that. 25 func NewTestServer(certFile, keyFile string, rm *repository.Manager) (*TestServer, error) { 26 ts := &TestServer{ 27 adminSecret: adminSecret, 28 } 29 30 pubKey, err := common.GetAdminSecretPubkey(ts.adminSecret) 31 if err != nil { 32 return nil, err 33 } 34 35 err = x509.GenerateServerCertFiles(certFile, keyFile) 36 if err != nil { 37 return nil, err 38 } 39 ts.api, err = server.New(pubKey, 5*time.Second, rm, certFile, keyFile) 40 if err != nil { 41 return nil, err 42 } 43 44 err = ts.makeListener() 45 if err != nil { 46 return nil, err 47 } 48 go ts.serve() 49 return ts, nil 50 } 51 52 // serve starts serving requests on the listener. 53 func (ts *TestServer) serve() error { 54 return ts.api.Serve(ts.listener) 55 } 56 57 // makeListener creates a new listener on a random port 58 // and saves the required address in the attribute hostAndPort 59 func (ts *TestServer) makeListener() error { 60 // passing port :0 to Listen lets it choose a random port 61 listener, err := net.Listen("tcp", "127.0.0.1:0") 62 if err != nil { 63 return err 64 } 65 ts.listener = listener 66 ts.hostAndPort = listener.Addr().String() 67 return nil 68 } 69 70 // Close cleans when done using this instance; 71 // it removes the temporary directory and stops listening 72 func (ts *TestServer) Close() { 73 ts.listener.Close() 74 }