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 }