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

     1  package server
     2  
     3  import (
     4  	"bytes"
     5  	"crypto/sha512"
     6  	"encoding/hex"
     7  	"fmt"
     8  	"io/ioutil"
     9  	"net/http/httptest"
    10  	"time"
    11  
    12  	. "gopkg.in/check.v1"
    13  
    14  	"github.com/hoffie/larasync/helpers/crypto"
    15  	"github.com/hoffie/larasync/repository"
    16  	"github.com/hoffie/larasync/repository/nib"
    17  )
    18  
    19  type NIBTest struct {
    20  	BaseTests
    21  	nibID string
    22  }
    23  
    24  func generateTestRevision() *nib.Revision {
    25  	return &nib.Revision{
    26  		MetadataID:   "metadataId",
    27  		ContentIDs:   []string{"1", "2", "3"},
    28  		UTCTimestamp: time.Now().UTC().Unix(),
    29  		DeviceID:     "ASDF",
    30  	}
    31  }
    32  
    33  func getNIBTest() NIBTest {
    34  	return NIBTest{
    35  		BaseTests: newBaseTest(),
    36  	}
    37  }
    38  
    39  func (t *NIBTest) SetUpTest(c *C) {
    40  	t.BaseTests.SetUpTest(c)
    41  	origGetURL := t.getURL
    42  	t.getURL = func() string {
    43  		return fmt.Sprintf(
    44  			"%s/nibs",
    45  			origGetURL(),
    46  		)
    47  	}
    48  	t.setNIBId("")
    49  	t.req = t.requestEmptyBody(c)
    50  }
    51  
    52  func (t *NIBTest) setNIBId(seed string) string {
    53  	signature := sha512.New()
    54  	signature.Write([]byte(seed))
    55  	t.nibID = hex.EncodeToString(
    56  		signature.Sum(nil),
    57  	)
    58  	return t.nibID
    59  }
    60  
    61  func (t *NIBTest) getTestNIB() *nib.NIB {
    62  	n := nib.NIB{}
    63  	n.ID = t.nibID
    64  	n.AppendRevision(generateTestRevision())
    65  	return &n
    66  }
    67  
    68  func (t *NIBTest) nibToBytes(n *nib.NIB) []byte {
    69  	buf := bytes.NewBufferString("")
    70  	n.WriteTo(buf)
    71  	return buf.Bytes()
    72  }
    73  
    74  func (t *NIBTest) getTestNIBBytes() []byte {
    75  	n := t.getTestNIB()
    76  	return t.nibToBytes(n)
    77  }
    78  
    79  func (t *NIBTest) getTestNIBSignedBytes(c *C) []byte {
    80  	return t.signNIBBytes(c, t.getTestNIBBytes())
    81  }
    82  
    83  func (t *NIBTest) addTestNIB(c *C) *nib.NIB {
    84  	return t.addNIB(c, t.getTestNIB())
    85  }
    86  
    87  func (t *NIBTest) signNIBBytes(c *C, nibBytes []byte) []byte {
    88  	wr := &bytes.Buffer{}
    89  	signingWriter := crypto.NewSigningWriter(t.privateKey, wr)
    90  	_, err := signingWriter.Write(nibBytes)
    91  	c.Assert(err, IsNil)
    92  	err = signingWriter.Finalize()
    93  	c.Assert(err, IsNil)
    94  	return wr.Bytes()
    95  }
    96  
    97  func (t *NIBTest) fillNIBContentObjects(c *C, repo *repository.Repository, n *nib.NIB) {
    98  	for _, objectID := range n.AllObjectIDs() {
    99  		if !repo.HasObject(objectID) {
   100  			err := repo.AddObject(objectID, bytes.NewBuffer([]byte("ASDF")))
   101  			c.Assert(err, IsNil)
   102  		}
   103  	}
   104  }
   105  
   106  func (t *NIBTest) fillContentOfDefaultNIB(c *C) {
   107  	repo := t.getRepository(c)
   108  	testNib := t.getTestNIB()
   109  	t.fillNIBContentObjects(c, repo, testNib)
   110  }
   111  
   112  func (t *NIBTest) addNIB(c *C, n *nib.NIB) *nib.NIB {
   113  	repo := t.createRepository(c)
   114  	t.fillNIBContentObjects(c, repo, n)
   115  
   116  	err := repo.AddNIBContent(bytes.NewBuffer(
   117  		t.signNIBBytes(c, t.nibToBytes(n))),
   118  	)
   119  	c.Assert(err, IsNil)
   120  	return n
   121  }
   122  
   123  func (t *NIBTest) extractNIB(c *C, resp *httptest.ResponseRecorder) *nib.NIB {
   124  	body, err := ioutil.ReadAll(resp.Body)
   125  	c.Assert(err, IsNil)
   126  	reader, err := crypto.NewVerifyingReader(
   127  		t.pubKey,
   128  		bytes.NewReader(body),
   129  	)
   130  	c.Assert(err, IsNil)
   131  
   132  	n := nib.NIB{}
   133  	n.ReadFrom(reader)
   134  	return &n
   135  }
   136  
   137  func (t *NIBTest) verifyNIBSignature(c *C, resp *httptest.ResponseRecorder) bool {
   138  	body, err := ioutil.ReadAll(resp.Body)
   139  	c.Assert(err, IsNil)
   140  	reader, err := crypto.NewVerifyingReader(
   141  		t.pubKey,
   142  		bytes.NewReader(body),
   143  	)
   144  	c.Assert(err, IsNil)
   145  	_, err = ioutil.ReadAll(reader)
   146  	c.Assert(err, IsNil)
   147  	return reader.VerifyAfterRead()
   148  }