github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/resource/context/internal/resourcedir_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/testing"
     8  	jc "github.com/juju/testing/checkers"
     9  	gc "gopkg.in/check.v1"
    10  
    11  	"github.com/juju/juju/resource"
    12  	"github.com/juju/juju/resource/context/internal"
    13  	"github.com/juju/juju/resource/resourcetesting"
    14  )
    15  
    16  var _ = gc.Suite(&DirectorySpecSuite{})
    17  
    18  type DirectorySpecSuite struct {
    19  	testing.IsolationSuite
    20  
    21  	stub *internalStub
    22  }
    23  
    24  func (s *DirectorySpecSuite) SetUpTest(c *gc.C) {
    25  	s.IsolationSuite.SetUpTest(c)
    26  
    27  	s.stub = newInternalStub()
    28  }
    29  
    30  func (s *DirectorySpecSuite) TestNewDirectorySpec(c *gc.C) {
    31  	dataDir := "/var/lib/juju/agents/unit-spam-1/resources"
    32  	deps := s.stub
    33  
    34  	spec := internal.NewDirectorySpec(dataDir, "eggs", deps)
    35  
    36  	s.stub.CheckCallNames(c, "Join")
    37  	c.Check(spec, jc.DeepEquals, &internal.DirectorySpec{
    38  		Name:    "eggs",
    39  		Dirname: dataDir + "/eggs",
    40  		Deps:    deps,
    41  	})
    42  }
    43  
    44  func (s *DirectorySpecSuite) TestResolveFile(c *gc.C) {
    45  	dataDir := "/var/lib/juju/agents/unit-spam-1/resources"
    46  	deps := s.stub
    47  	spec := internal.NewDirectorySpec(dataDir, "eggs", deps)
    48  	s.stub.ResetCalls()
    49  
    50  	resolved := spec.Resolve("ham/ham.tgz")
    51  
    52  	s.stub.CheckCallNames(c, "Join")
    53  	c.Check(resolved, gc.Equals, dataDir+"/eggs/ham/ham.tgz")
    54  }
    55  
    56  func (s *DirectorySpecSuite) TestResolveEmpty(c *gc.C) {
    57  	dataDir := "/var/lib/juju/agents/unit-spam-1/resources"
    58  	deps := s.stub
    59  	spec := internal.NewDirectorySpec(dataDir, "eggs", deps)
    60  	s.stub.ResetCalls()
    61  
    62  	resolved := spec.Resolve()
    63  
    64  	s.stub.CheckCallNames(c, "Join")
    65  	c.Check(resolved, gc.Equals, dataDir+"/eggs")
    66  }
    67  
    68  func (s *DirectorySpecSuite) TestIsUpToDateTrue(c *gc.C) {
    69  	info, reader := newResource(c, s.stub.Stub, "spam", "some data")
    70  	content := internal.Content{
    71  		Data:        reader,
    72  		Size:        info.Size,
    73  		Fingerprint: info.Fingerprint,
    74  	}
    75  	s.stub.ReturnFingerprintMatches = true
    76  	dataDir := "/var/lib/juju/agents/unit-spam-1/resources"
    77  	deps := s.stub
    78  	spec := internal.NewDirectorySpec(dataDir, "eggs", deps)
    79  	s.stub.ResetCalls()
    80  
    81  	isUpToDate, err := spec.IsUpToDate(content)
    82  	c.Assert(err, jc.ErrorIsNil)
    83  
    84  	s.stub.CheckCallNames(c, "Join", "FingerprintMatches")
    85  	c.Check(isUpToDate, jc.IsTrue)
    86  }
    87  
    88  func (s *DirectorySpecSuite) TestIsUpToDateFalse(c *gc.C) {
    89  	info, reader := newResource(c, s.stub.Stub, "spam", "some data")
    90  	content := internal.Content{
    91  		Data:        reader,
    92  		Size:        info.Size,
    93  		Fingerprint: info.Fingerprint,
    94  	}
    95  	s.stub.ReturnFingerprintMatches = false
    96  	dataDir := "/var/lib/juju/agents/unit-spam-1/resources"
    97  	deps := s.stub
    98  	spec := internal.NewDirectorySpec(dataDir, "eggs", deps)
    99  	s.stub.ResetCalls()
   100  
   101  	isUpToDate, err := spec.IsUpToDate(content)
   102  	c.Assert(err, jc.ErrorIsNil)
   103  
   104  	s.stub.CheckCallNames(c, "Join", "FingerprintMatches")
   105  	c.Check(isUpToDate, jc.IsFalse)
   106  }
   107  
   108  func (s *DirectorySpecSuite) TestIsUpToDateCalls(c *gc.C) {
   109  	info, reader := newResource(c, s.stub.Stub, "spam", "some data")
   110  	content := internal.Content{
   111  		Data:        reader,
   112  		Size:        info.Size,
   113  		Fingerprint: info.Fingerprint,
   114  	}
   115  	dataDir := "/var/lib/juju/agents/unit-spam-1/resources"
   116  	deps := s.stub
   117  	spec := internal.NewDirectorySpec(dataDir, "eggs", deps)
   118  	s.stub.ResetCalls()
   119  
   120  	_, err := spec.IsUpToDate(content)
   121  	c.Assert(err, jc.ErrorIsNil)
   122  
   123  	s.stub.CheckCallNames(c, "Join", "FingerprintMatches")
   124  	dirname := s.stub.Join(dataDir, "eggs")
   125  	s.stub.CheckCall(c, 0, "Join", []string{dirname, "eggs"})
   126  	s.stub.CheckCall(c, 1, "FingerprintMatches", s.stub.Join(dirname, "eggs"), info.Fingerprint)
   127  }
   128  
   129  func (s *DirectorySpecSuite) TestInitialize(c *gc.C) {
   130  	dataDir := "/var/lib/juju/agents/unit-spam-1/resources"
   131  	deps := s.stub
   132  	spec := internal.NewDirectorySpec(dataDir, "eggs", deps)
   133  	s.stub.ResetCalls()
   134  
   135  	dir, err := spec.Initialize()
   136  	c.Assert(err, jc.ErrorIsNil)
   137  
   138  	s.stub.CheckCallNames(c, "MkdirAll")
   139  	s.stub.CheckCall(c, 0, "MkdirAll", spec.Dirname)
   140  	c.Check(dir, jc.DeepEquals, &internal.Directory{
   141  		DirectorySpec: spec,
   142  		Deps:          deps,
   143  	})
   144  }
   145  
   146  var _ = gc.Suite(&TempDirectorySpecSuite{})
   147  
   148  type TempDirectorySpecSuite struct {
   149  	testing.IsolationSuite
   150  
   151  	stub *internalStub
   152  }
   153  
   154  func (s *TempDirectorySpecSuite) SetUpTest(c *gc.C) {
   155  	s.IsolationSuite.SetUpTest(c)
   156  
   157  	s.stub = newInternalStub()
   158  }
   159  
   160  var _ = gc.Suite(&DirectorySuite{})
   161  
   162  type DirectorySuite struct {
   163  	testing.IsolationSuite
   164  
   165  	stub *internalStub
   166  }
   167  
   168  func (s *DirectorySuite) SetUpTest(c *gc.C) {
   169  	s.IsolationSuite.SetUpTest(c)
   170  
   171  	s.stub = newInternalStub()
   172  }
   173  
   174  func (s *DirectorySuite) TestNewDirectory(c *gc.C) {
   175  	dataDir := "/var/lib/juju/agents/unit-spam-1/resources"
   176  	deps := s.stub
   177  	spec := internal.NewDirectorySpec(dataDir, "eggs", deps)
   178  	s.stub.ResetCalls()
   179  
   180  	dir := internal.NewDirectory(spec, deps)
   181  
   182  	s.stub.CheckNoCalls(c)
   183  	c.Check(dir, jc.DeepEquals, &internal.Directory{
   184  		DirectorySpec: spec,
   185  		Deps:          deps,
   186  	})
   187  }
   188  
   189  func (s *DirectorySuite) TestWrite(c *gc.C) {
   190  	res := resourcetesting.NewResource(c, s.stub.Stub, "spam", "a-application", "some data")
   191  	stub := &stubDirectory{
   192  		internalStub: s.stub,
   193  	}
   194  	stub.ReturnInfo = res.Resource
   195  	opened := stub
   196  	dataDir := "/var/lib/juju/agents/unit-spam-1/resources"
   197  	deps := s.stub
   198  	spec := internal.NewDirectorySpec(dataDir, "eggs", deps)
   199  	s.stub.ResetCalls()
   200  	dir := internal.NewDirectory(spec, deps)
   201  
   202  	err := dir.Write(opened)
   203  	c.Assert(err, jc.ErrorIsNil)
   204  
   205  	stub.CheckCallNames(c,
   206  		"Info",
   207  		"Content",
   208  		"Join",
   209  		"CreateWriter",
   210  		"WriteContent",
   211  		"CloseAndLog",
   212  	)
   213  }
   214  
   215  func (s *DirectorySuite) TestWriteContent(c *gc.C) {
   216  	info, reader := newResource(c, s.stub.Stub, "spam", "some data")
   217  	content := internal.Content{
   218  		Data:        reader,
   219  		Size:        info.Size,
   220  		Fingerprint: info.Fingerprint,
   221  	}
   222  	relPath := info.Path
   223  	stub := &stubDirectory{
   224  		internalStub: s.stub,
   225  	}
   226  	dataDir := "/var/lib/juju/agents/unit-spam-1/resources"
   227  	deps := s.stub
   228  	spec := internal.NewDirectorySpec(dataDir, "eggs", deps)
   229  	dir := internal.NewDirectory(spec, deps)
   230  	s.stub.ResetCalls()
   231  
   232  	err := dir.WriteContent(relPath, content)
   233  	c.Assert(err, jc.ErrorIsNil)
   234  
   235  	stub.CheckCallNames(c,
   236  		"Join",
   237  		"CreateWriter",
   238  		"WriteContent",
   239  		"CloseAndLog",
   240  	)
   241  }
   242  
   243  type stubDirectory struct {
   244  	*internalStub
   245  
   246  	ReturnInfo    resource.Resource
   247  	ReturnContent internal.Content
   248  }
   249  
   250  func (s *stubDirectory) Info() resource.Resource {
   251  	s.AddCall("Info")
   252  	s.NextErr() // Pop one off.
   253  
   254  	return s.ReturnInfo
   255  }
   256  
   257  func (s *stubDirectory) Content() internal.Content {
   258  	s.AddCall("Content")
   259  	s.NextErr() // Pop one off.
   260  
   261  	return s.ReturnContent
   262  }