github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/resource/context/internal/content_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package internal_test 5 6 import ( 7 "io" 8 "io/ioutil" 9 "strings" 10 11 "github.com/juju/errors" 12 "github.com/juju/testing" 13 jc "github.com/juju/testing/checkers" 14 "github.com/juju/testing/filetesting" 15 gc "gopkg.in/check.v1" 16 charmresource "gopkg.in/juju/charm.v6-unstable/resource" 17 18 "github.com/juju/juju/resource/context/internal" 19 ) 20 21 var _ = gc.Suite(&ContentSuite{}) 22 23 type ContentSuite struct { 24 testing.IsolationSuite 25 26 stub *internalStub 27 } 28 29 func (s *ContentSuite) SetUpTest(c *gc.C) { 30 s.IsolationSuite.SetUpTest(c) 31 32 s.stub = newInternalStub() 33 } 34 35 func (s *ContentSuite) TestVerifyOkay(c *gc.C) { 36 info, reader := newResource(c, s.stub.Stub, "spam", "some data") 37 content := internal.Content{ 38 Data: reader, 39 Size: info.Size, 40 Fingerprint: info.Fingerprint, 41 } 42 43 err := content.Verify(info.Size, info.Fingerprint) 44 c.Assert(err, jc.ErrorIsNil) 45 46 s.stub.CheckNoCalls(c) 47 } 48 49 func (s *ContentSuite) TestVerifyBadSize(c *gc.C) { 50 info, reader := newResource(c, s.stub.Stub, "spam", "some data") 51 content := internal.Content{ 52 Data: reader, 53 Size: info.Size, 54 Fingerprint: info.Fingerprint, 55 } 56 57 err := content.Verify(info.Size+1, info.Fingerprint) 58 59 c.Check(err, gc.ErrorMatches, `resource size does not match expected \(10 != 9\)`) 60 s.stub.CheckNoCalls(c) 61 } 62 63 func (s *ContentSuite) TestVerifyBadFingerprint(c *gc.C) { 64 fp, err := charmresource.GenerateFingerprint(strings.NewReader("other data")) 65 c.Assert(err, jc.ErrorIsNil) 66 info, reader := newResource(c, s.stub.Stub, "spam", "some data") 67 content := internal.Content{ 68 Data: reader, 69 Size: info.Size, 70 Fingerprint: info.Fingerprint, 71 } 72 73 err = content.Verify(info.Size, fp) 74 75 c.Check(err, gc.ErrorMatches, `resource fingerprint does not match expected .*`) 76 s.stub.CheckNoCalls(c) 77 } 78 79 func (s *ContentSuite) TestWriteContent(c *gc.C) { 80 info, reader := newResource(c, s.stub.Stub, "spam", "some data") 81 content := internal.Content{ 82 Data: reader, 83 Size: info.Size, 84 Fingerprint: info.Fingerprint, 85 } 86 target, _ := filetesting.NewStubWriter(s.stub.Stub) 87 stub := &stubContent{ 88 internalStub: s.stub, 89 Reader: reader, 90 } 91 stub.ReturnNewChecker = stub 92 stub.ReturnWrapReader = stub 93 deps := stub 94 95 err := internal.WriteContent(target, content, deps) 96 c.Assert(err, jc.ErrorIsNil) 97 98 s.stub.CheckCallNames(c, 99 "NewChecker", 100 "WrapReader", 101 "Copy", 102 "Verify", 103 ) 104 } 105 106 var _ = gc.Suite(&CheckerSuite{}) 107 108 type CheckerSuite struct { 109 testing.IsolationSuite 110 111 stub *internalStub 112 } 113 114 func (s *CheckerSuite) SetUpTest(c *gc.C) { 115 s.IsolationSuite.SetUpTest(c) 116 117 s.stub = newInternalStub() 118 } 119 120 func (s *CheckerSuite) TestNewContentChecker(c *gc.C) { 121 info, reader := newResource(c, s.stub.Stub, "spam", "some data") 122 content := internal.Content{ 123 Data: reader, 124 Size: info.Size, 125 Fingerprint: info.Fingerprint, 126 } 127 sizeWriter, sizeBuf := filetesting.NewStubWriter(s.stub.Stub) 128 sizeTracker := &stubChecker{ 129 Writer: sizeWriter, 130 stub: s.stub.Stub, 131 } 132 sumWriter, sumBuf := filetesting.NewStubWriter(s.stub.Stub) 133 checksumWriter := &stubChecker{ 134 Writer: sumWriter, 135 stub: s.stub.Stub, 136 } 137 138 checker := internal.NewContentChecker(content, sizeTracker, checksumWriter) 139 140 s.stub.CheckNoCalls(c) 141 c.Check(checker, jc.DeepEquals, &internal.Checker{ 142 Content: content, 143 SizeTracker: sizeTracker, 144 ChecksumWriter: checksumWriter, 145 }) 146 c.Check(sizeBuf.String(), gc.Equals, "") 147 c.Check(sumBuf.String(), gc.Equals, "") 148 } 149 150 func (s *CheckerSuite) TestWrapReader(c *gc.C) { 151 info, reader := newResource(c, s.stub.Stub, "spam", "some data") 152 sizeWriter, sizeBuf := filetesting.NewStubWriter(s.stub.Stub) 153 sumWriter, sumBuf := filetesting.NewStubWriter(s.stub.Stub) 154 checker := internal.Checker{ 155 Content: internal.Content{ 156 Size: info.Size, 157 Fingerprint: info.Fingerprint, 158 }, 159 SizeTracker: &stubChecker{ 160 Writer: sizeWriter, 161 stub: s.stub.Stub, 162 }, 163 ChecksumWriter: &stubChecker{ 164 Writer: sumWriter, 165 stub: s.stub.Stub, 166 }, 167 } 168 169 wrapped := checker.WrapReader(reader) 170 171 s.stub.CheckNoCalls(c) 172 data, err := ioutil.ReadAll(wrapped) 173 c.Assert(err, jc.ErrorIsNil) 174 s.stub.CheckCallNames(c, 175 "Read", 176 "Write", 177 "Write", 178 "Read", 179 ) 180 c.Check(string(data), gc.Equals, "some data") 181 c.Check(sizeBuf.String(), gc.Equals, "some data") 182 c.Check(sumBuf.String(), gc.Equals, "some data") 183 } 184 185 func (s *CheckerSuite) TestVerifyOkay(c *gc.C) { 186 info, _ := newResource(c, s.stub.Stub, "spam", "some data") 187 stub := &stubChecker{ 188 stub: s.stub.Stub, 189 ReturnSize: info.Size, 190 ReturnFingerprint: info.Fingerprint, 191 } 192 checker := internal.Checker{ 193 Content: internal.Content{ 194 Size: info.Size, 195 Fingerprint: info.Fingerprint, 196 }, 197 SizeTracker: stub, 198 ChecksumWriter: stub, 199 } 200 201 err := checker.Verify() 202 c.Assert(err, jc.ErrorIsNil) 203 204 s.stub.CheckCallNames(c, "Size", "Fingerprint") 205 } 206 207 func (s *CheckerSuite) TestVerifyFailed(c *gc.C) { 208 info, _ := newResource(c, s.stub.Stub, "spam", "some data") 209 stub := &stubChecker{ 210 stub: s.stub.Stub, 211 ReturnSize: info.Size + 1, 212 ReturnFingerprint: info.Fingerprint, 213 } 214 checker := internal.Checker{ 215 Content: internal.Content{ 216 Size: info.Size, 217 Fingerprint: info.Fingerprint, 218 }, 219 SizeTracker: stub, 220 ChecksumWriter: stub, 221 } 222 223 err := checker.Verify() 224 225 s.stub.CheckCallNames(c, "Size", "Fingerprint") 226 c.Check(err, gc.ErrorMatches, `resource size does not match expected \(10 != 9\)`) 227 } 228 229 func (s *CheckerSuite) TestNopWrapReader(c *gc.C) { 230 _, reader := newResource(c, s.stub.Stub, "spam", "some data") 231 checker := internal.NopChecker{} 232 233 wrapped := checker.WrapReader(reader) 234 235 s.stub.CheckNoCalls(c) 236 c.Check(wrapped, gc.Equals, reader) 237 } 238 239 func (s *CheckerSuite) TestNopVerify(c *gc.C) { 240 checker := internal.NopChecker{} 241 242 err := checker.Verify() 243 244 c.Check(err, jc.ErrorIsNil) 245 } 246 247 type stubContent struct { 248 *internalStub 249 io.Reader 250 251 ReturnWrapReader io.Reader 252 ReturnCreateTarget io.WriteCloser 253 } 254 255 func (s *stubContent) WrapReader(reader io.Reader) io.Reader { 256 s.Stub.AddCall("WrapReader", reader) 257 s.Stub.NextErr() // Pop one off. 258 259 return s.ReturnWrapReader 260 } 261 262 func (s *stubContent) Verify() error { 263 s.Stub.AddCall("Verify") 264 if err := s.Stub.NextErr(); err != nil { 265 return errors.Trace(err) 266 } 267 268 return nil 269 } 270 271 type stubChecker struct { 272 io.Writer 273 stub *testing.Stub 274 275 ReturnSize int64 276 ReturnFingerprint charmresource.Fingerprint 277 } 278 279 func (s *stubChecker) Size() int64 { 280 s.stub.AddCall("Size") 281 s.stub.NextErr() // Pop one off. 282 283 return s.ReturnSize 284 } 285 286 func (s *stubChecker) Fingerprint() charmresource.Fingerprint { 287 s.stub.AddCall("Fingerprint") 288 s.stub.NextErr() // Pop one off. 289 290 return s.ReturnFingerprint 291 }