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  }