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  }