github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/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  func (s *TempDirectorySpecSuite) TestNewTempDirectorySpec(c *gc.C) {
   161  	s.stub.ReturnNewTempDir = "/tmp/juju-resource-xyz"
   162  	deps := s.stub
   163  
   164  	spec, err := internal.NewTempDirectorySpec("eggs", deps)
   165  	c.Assert(err, jc.ErrorIsNil)
   166  
   167  	s.stub.CheckCallNames(c, "NewTempDir", "Join")
   168  	c.Check(spec.CleanUp, gc.NotNil) // We can't compare functions.
   169  	spec.CleanUp = nil
   170  	c.Check(spec, jc.DeepEquals, &internal.TempDirectorySpec{
   171  		DirectorySpec: &internal.DirectorySpec{
   172  			Name:    "eggs",
   173  			Dirname: "/tmp/juju-resource-xyz/eggs",
   174  			Deps:    deps,
   175  		},
   176  	})
   177  }
   178  
   179  func (s *TempDirectorySpecSuite) TestClose(c *gc.C) {
   180  	s.stub.ReturnNewTempDir = "/tmp/juju-resource-xyz"
   181  	deps := s.stub
   182  	spec, err := internal.NewTempDirectorySpec("eggs", deps)
   183  	c.Assert(err, jc.ErrorIsNil)
   184  	s.stub.ResetCalls()
   185  
   186  	err = spec.Close()
   187  	c.Assert(err, jc.ErrorIsNil)
   188  
   189  	s.stub.CheckCallNames(c, "RemoveDir")
   190  }
   191  
   192  var _ = gc.Suite(&DirectorySuite{})
   193  
   194  type DirectorySuite struct {
   195  	testing.IsolationSuite
   196  
   197  	stub *internalStub
   198  }
   199  
   200  func (s *DirectorySuite) SetUpTest(c *gc.C) {
   201  	s.IsolationSuite.SetUpTest(c)
   202  
   203  	s.stub = newInternalStub()
   204  }
   205  
   206  func (s *DirectorySuite) TestNewDirectory(c *gc.C) {
   207  	dataDir := "/var/lib/juju/agents/unit-spam-1/resources"
   208  	deps := s.stub
   209  	spec := internal.NewDirectorySpec(dataDir, "eggs", deps)
   210  	s.stub.ResetCalls()
   211  
   212  	dir := internal.NewDirectory(spec, deps)
   213  
   214  	s.stub.CheckNoCalls(c)
   215  	c.Check(dir, jc.DeepEquals, &internal.Directory{
   216  		DirectorySpec: spec,
   217  		Deps:          deps,
   218  	})
   219  }
   220  
   221  func (s *DirectorySuite) TestWrite(c *gc.C) {
   222  	res := resourcetesting.NewResource(c, s.stub.Stub, "spam", "a-application", "some data")
   223  	stub := &stubDirectory{
   224  		internalStub: s.stub,
   225  	}
   226  	stub.ReturnInfo = res.Resource
   227  	opened := stub
   228  	dataDir := "/var/lib/juju/agents/unit-spam-1/resources"
   229  	deps := s.stub
   230  	spec := internal.NewDirectorySpec(dataDir, "eggs", deps)
   231  	s.stub.ResetCalls()
   232  	dir := internal.NewDirectory(spec, deps)
   233  
   234  	err := dir.Write(opened)
   235  	c.Assert(err, jc.ErrorIsNil)
   236  
   237  	stub.CheckCallNames(c,
   238  		"Info",
   239  		"Content",
   240  		"Join",
   241  		"CreateWriter",
   242  		"WriteContent",
   243  		"CloseAndLog",
   244  	)
   245  }
   246  
   247  func (s *DirectorySuite) TestWriteContent(c *gc.C) {
   248  	info, reader := newResource(c, s.stub.Stub, "spam", "some data")
   249  	content := internal.Content{
   250  		Data:        reader,
   251  		Size:        info.Size,
   252  		Fingerprint: info.Fingerprint,
   253  	}
   254  	relPath := info.Path
   255  	stub := &stubDirectory{
   256  		internalStub: s.stub,
   257  	}
   258  	dataDir := "/var/lib/juju/agents/unit-spam-1/resources"
   259  	deps := s.stub
   260  	spec := internal.NewDirectorySpec(dataDir, "eggs", deps)
   261  	dir := internal.NewDirectory(spec, deps)
   262  	s.stub.ResetCalls()
   263  
   264  	err := dir.WriteContent(relPath, content)
   265  	c.Assert(err, jc.ErrorIsNil)
   266  
   267  	stub.CheckCallNames(c,
   268  		"Join",
   269  		"CreateWriter",
   270  		"WriteContent",
   271  		"CloseAndLog",
   272  	)
   273  }
   274  
   275  type stubDirectory struct {
   276  	*internalStub
   277  
   278  	ReturnInfo    resource.Resource
   279  	ReturnContent internal.Content
   280  }
   281  
   282  func (s *stubDirectory) Info() resource.Resource {
   283  	s.AddCall("Info")
   284  	s.NextErr() // Pop one off.
   285  
   286  	return s.ReturnInfo
   287  }
   288  
   289  func (s *stubDirectory) Content() internal.Content {
   290  	s.AddCall("Content")
   291  	s.NextErr() // Pop one off.
   292  
   293  	return s.ReturnContent
   294  }