github.com/hoffie/larasync@v0.0.0-20151025221940-0384d2bddcef/api/server/base_test.go (about)

     1  package server
     2  
     3  import (
     4  	"bytes"
     5  	"crypto/rand"
     6  	"fmt"
     7  	"io"
     8  	"net/http"
     9  	"net/http/httptest"
    10  	"net/url"
    11  	"os"
    12  	"path/filepath"
    13  	"time"
    14  
    15  	"github.com/hoffie/larasync/api/common"
    16  	edhelpers "github.com/hoffie/larasync/helpers/ed25519"
    17  	"github.com/hoffie/larasync/helpers/x509"
    18  	"github.com/hoffie/larasync/repository"
    19  
    20  	. "gopkg.in/check.v1"
    21  )
    22  
    23  func newBaseTest() BaseTests {
    24  	return BaseTests{}
    25  }
    26  
    27  type BaseTests struct {
    28  	rm             *repository.Manager
    29  	repositoryName string
    30  	repos          string
    31  	certFile       string
    32  	keyFile        string
    33  	pubKey         [PublicKeySize]byte
    34  	privateKey     [PrivateKeySize]byte
    35  	server         *Server
    36  	req            *http.Request
    37  	httpMethod     string
    38  	getURL         func() string
    39  	urlParams      url.Values
    40  }
    41  
    42  func (t *BaseTests) SetUpTest(c *C) {
    43  	t.createRepoManager(c)
    44  
    45  	t.repositoryName = "test"
    46  	c.Assert(t.rm.Exists(t.repositoryName), Equals, false)
    47  	t.createServer(c)
    48  	t.httpMethod = "GET"
    49  	t.getURL = func() string {
    50  		return fmt.Sprintf(
    51  			"http://example.org/repositories/%s",
    52  			t.repositoryName,
    53  		)
    54  	}
    55  	t.req = t.requestEmptyBody(c)
    56  	t.urlParams = url.Values{}
    57  }
    58  
    59  func (t *BaseTests) SetUpSuite(c *C) {
    60  	byteArray := make([]byte, PrivateKeySize)
    61  	_, err := rand.Read(byteArray)
    62  	c.Assert(err, IsNil)
    63  	t.privateKey, err = common.PassphraseToKey(byteArray)
    64  	c.Assert(err, IsNil)
    65  	t.pubKey = edhelpers.GetPublicKeyFromPrivate(t.privateKey)
    66  	t.createServerCert(c)
    67  }
    68  
    69  func (t *BaseTests) createServer(c *C) {
    70  	var err error
    71  	t.server, err = New(adminPubkey, time.Minute, t.rm, t.certFile, t.keyFile)
    72  	c.Assert(err, IsNil)
    73  }
    74  
    75  func (t *BaseTests) getResponse(req *http.Request) *httptest.ResponseRecorder {
    76  	rw := httptest.NewRecorder()
    77  	t.server.router.ServeHTTP(rw, req)
    78  	return rw
    79  }
    80  
    81  func (t *BaseTests) requestEmptyBody(c *C) *http.Request {
    82  	return t.requestWithBytes(c, nil)
    83  }
    84  
    85  func (t *BaseTests) requestWithBytes(c *C, body []byte) *http.Request {
    86  	var httpBody io.Reader
    87  	if body == nil {
    88  		httpBody = nil
    89  	} else {
    90  		httpBody = bytes.NewReader(body)
    91  	}
    92  	return t.requestWithReader(c, httpBody)
    93  }
    94  
    95  func (t *BaseTests) requestWithReader(c *C, httpBody io.Reader) *http.Request {
    96  	requestURL, err := url.Parse(t.getURL())
    97  	c.Assert(err, IsNil)
    98  	requestURL.RawQuery = t.urlParams.Encode()
    99  	req, err := http.NewRequest(
   100  		t.httpMethod,
   101  		requestURL.String(),
   102  		httpBody)
   103  	c.Assert(err, IsNil)
   104  	if httpBody != nil {
   105  		req.Header.Set("Content-Type", "application/octet-type")
   106  	}
   107  	return req
   108  }
   109  
   110  func (t *BaseTests) signRequest() {
   111  	common.SignWithKey(t.req, t.privateKey)
   112  }
   113  
   114  func (t *BaseTests) createRepoManager(c *C) {
   115  	t.repos = c.MkDir()
   116  	rm, err := repository.NewManager(t.repos)
   117  	c.Assert(err, IsNil)
   118  	t.rm = rm
   119  }
   120  
   121  func (t *BaseTests) createServerCert(c *C) {
   122  	dir := c.MkDir()
   123  	t.certFile = filepath.Join(dir, "server.crt")
   124  	t.keyFile = filepath.Join(dir, "server.key")
   125  	err := x509.GenerateServerCertFiles(t.certFile, t.keyFile)
   126  	c.Assert(err, IsNil)
   127  }
   128  
   129  func (t *BaseTests) TearDownTest(c *C) {
   130  	os.RemoveAll(t.repos)
   131  }
   132  
   133  func (t *BaseTests) createRepository(c *C) *repository.Repository {
   134  	err := t.rm.Create(t.repositoryName, t.pubKey[:])
   135  	if err != nil && !os.IsExist(err) {
   136  		c.Assert(err, IsNil)
   137  	}
   138  	return t.getRepository(c)
   139  }
   140  
   141  func (t *BaseTests) getRepository(c *C) *repository.Repository {
   142  	rep, err := t.rm.Open(t.repositoryName)
   143  	c.Assert(err, IsNil)
   144  	return rep
   145  }
   146  
   147  func (t *BaseTests) getClientRepository(c *C) *repository.ClientRepository {
   148  	return repository.NewClient(filepath.Join(t.repos, t.repositoryName))
   149  }