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 }