github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/resource/context/internal/context_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  	"github.com/juju/errors"
     8  	"github.com/juju/testing"
     9  	jc "github.com/juju/testing/checkers"
    10  	"github.com/juju/testing/filetesting"
    11  	gc "gopkg.in/check.v1"
    12  
    13  	"github.com/juju/juju/resource"
    14  	"github.com/juju/juju/resource/context/internal"
    15  )
    16  
    17  var _ = gc.Suite(&ContextSuite{})
    18  
    19  type ContextSuite struct {
    20  	testing.IsolationSuite
    21  
    22  	stub *internalStub
    23  }
    24  
    25  func (s *ContextSuite) SetUpTest(c *gc.C) {
    26  	s.IsolationSuite.SetUpTest(c)
    27  
    28  	s.stub = newInternalStub()
    29  }
    30  
    31  func (s *ContextSuite) TestContextDownloadOutOfDate(c *gc.C) {
    32  	info, reader := newResource(c, s.stub.Stub, "spam", "some data")
    33  	content := internal.Content{
    34  		Data:        reader,
    35  		Size:        info.Size,
    36  		Fingerprint: info.Fingerprint,
    37  	}
    38  	stub := &stubContext{
    39  		internalStub: s.stub,
    40  		StubCloser:   &filetesting.StubCloser{Stub: s.stub.Stub},
    41  	}
    42  	stub.ReturnNewContextDirectorySpec = stub
    43  	stub.ReturnOpenResource = stub
    44  	stub.ReturnResolve = "/var/lib/juju/agents/unit-spam-1/resources/spam/eggs.tgz"
    45  	stub.ReturnInfo = info
    46  	stub.ReturnContent = content
    47  	deps := stub
    48  
    49  	path, err := internal.ContextDownload(deps)
    50  	c.Assert(err, jc.ErrorIsNil)
    51  
    52  	s.stub.CheckCallNames(c,
    53  		"NewContextDirectorySpec",
    54  		"OpenResource",
    55  		"Info",
    56  		"Resolve",
    57  		"Content",
    58  		"IsUpToDate",
    59  		"Download",
    60  		"CloseAndLog",
    61  	)
    62  	c.Check(path, gc.Equals, "/var/lib/juju/agents/unit-spam-1/resources/spam/eggs.tgz")
    63  }
    64  
    65  func (s *ContextSuite) TestContextDownloadUpToDate(c *gc.C) {
    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  	stub := &stubContext{
    73  		internalStub: s.stub,
    74  		StubCloser:   &filetesting.StubCloser{Stub: s.stub.Stub},
    75  	}
    76  	stub.ReturnNewContextDirectorySpec = stub
    77  	stub.ReturnOpenResource = stub
    78  	stub.ReturnResolve = "/var/lib/juju/agents/unit-spam-1/resources/spam/eggs.tgz"
    79  	stub.ReturnInfo = info
    80  	stub.ReturnContent = content
    81  	stub.ReturnIsUpToDate = true
    82  	deps := stub
    83  
    84  	path, err := internal.ContextDownload(deps)
    85  	c.Assert(err, jc.ErrorIsNil)
    86  
    87  	s.stub.CheckCallNames(c,
    88  		"NewContextDirectorySpec",
    89  		"OpenResource",
    90  		"Info",
    91  		"Resolve",
    92  		"Content",
    93  		"IsUpToDate",
    94  		"CloseAndLog",
    95  	)
    96  	c.Check(path, gc.Equals, "/var/lib/juju/agents/unit-spam-1/resources/spam/eggs.tgz")
    97  }
    98  
    99  type stubContext struct {
   100  	*internalStub
   101  	*filetesting.StubCloser
   102  
   103  	ReturnResolve    string
   104  	ReturnInfo       resource.Resource
   105  	ReturnContent    internal.Content
   106  	ReturnInitialize internal.DownloadDirectory
   107  	ReturnIsUpToDate bool
   108  }
   109  
   110  func (s *stubContext) Resolve(path ...string) string {
   111  	s.AddCall("Resolve", path)
   112  	s.NextErr() // Pop one off.
   113  
   114  	return s.ReturnResolve
   115  }
   116  
   117  func (s *stubContext) Info() resource.Resource {
   118  	s.AddCall("Info")
   119  	s.NextErr() // Pop one off.
   120  
   121  	return s.ReturnInfo
   122  }
   123  
   124  func (s *stubContext) Content() internal.Content {
   125  	s.AddCall("Content")
   126  	s.NextErr() // Pop one off.
   127  
   128  	return s.ReturnContent
   129  }
   130  
   131  func (s *stubContext) Initialize() (internal.DownloadDirectory, error) {
   132  	s.AddCall("Initialize")
   133  	if err := s.NextErr(); err != nil {
   134  		return nil, errors.Trace(err)
   135  	}
   136  
   137  	return s.ReturnInitialize, nil
   138  }
   139  
   140  func (s *stubContext) IsUpToDate(content internal.Content) (bool, error) {
   141  	s.AddCall("IsUpToDate", content)
   142  	if err := s.NextErr(); err != nil {
   143  		return false, errors.Trace(err)
   144  	}
   145  
   146  	return s.ReturnIsUpToDate, nil
   147  }