github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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) TestIsUpToDate(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  	dataDir := "/var/lib/juju/agents/unit-spam-1/resources"
    76  	deps := s.stub
    77  	spec := internal.NewDirectorySpec(dataDir, "eggs", deps)
    78  	s.stub.ResetCalls()
    79  
    80  	isUpToDate, err := spec.IsUpToDate(content)
    81  	c.Assert(err, jc.ErrorIsNil)
    82  
    83  	s.stub.CheckNoCalls(c)
    84  	c.Check(isUpToDate, jc.IsFalse) // For now, always...
    85  }
    86  
    87  func (s *DirectorySpecSuite) TestInitialize(c *gc.C) {
    88  	dataDir := "/var/lib/juju/agents/unit-spam-1/resources"
    89  	deps := s.stub
    90  	spec := internal.NewDirectorySpec(dataDir, "eggs", deps)
    91  	s.stub.ResetCalls()
    92  
    93  	dir, err := spec.Initialize()
    94  	c.Assert(err, jc.ErrorIsNil)
    95  
    96  	s.stub.CheckCallNames(c, "MkdirAll")
    97  	s.stub.CheckCall(c, 0, "MkdirAll", spec.Dirname)
    98  	c.Check(dir, jc.DeepEquals, &internal.Directory{
    99  		DirectorySpec: spec,
   100  		Deps:          deps,
   101  	})
   102  }
   103  
   104  var _ = gc.Suite(&TempDirectorySpecSuite{})
   105  
   106  type TempDirectorySpecSuite struct {
   107  	testing.IsolationSuite
   108  
   109  	stub *internalStub
   110  }
   111  
   112  func (s *TempDirectorySpecSuite) SetUpTest(c *gc.C) {
   113  	s.IsolationSuite.SetUpTest(c)
   114  
   115  	s.stub = newInternalStub()
   116  }
   117  
   118  func (s *TempDirectorySpecSuite) TestNewTempDirectorySpec(c *gc.C) {
   119  	s.stub.ReturnNewTempDir = "/tmp/juju-resource-xyz"
   120  	deps := s.stub
   121  
   122  	spec, err := internal.NewTempDirectorySpec("eggs", deps)
   123  	c.Assert(err, jc.ErrorIsNil)
   124  
   125  	s.stub.CheckCallNames(c, "NewTempDir", "Join")
   126  	c.Check(spec.CleanUp, gc.NotNil) // We can't compare functions.
   127  	spec.CleanUp = nil
   128  	c.Check(spec, jc.DeepEquals, &internal.TempDirectorySpec{
   129  		DirectorySpec: &internal.DirectorySpec{
   130  			Name:    "eggs",
   131  			Dirname: "/tmp/juju-resource-xyz/eggs",
   132  			Deps:    deps,
   133  		},
   134  	})
   135  }
   136  
   137  func (s *TempDirectorySpecSuite) TestClose(c *gc.C) {
   138  	s.stub.ReturnNewTempDir = "/tmp/juju-resource-xyz"
   139  	deps := s.stub
   140  	spec, err := internal.NewTempDirectorySpec("eggs", deps)
   141  	c.Assert(err, jc.ErrorIsNil)
   142  	s.stub.ResetCalls()
   143  
   144  	err = spec.Close()
   145  	c.Assert(err, jc.ErrorIsNil)
   146  
   147  	s.stub.CheckCallNames(c, "RemoveDir")
   148  }
   149  
   150  var _ = gc.Suite(&DirectorySuite{})
   151  
   152  type DirectorySuite struct {
   153  	testing.IsolationSuite
   154  
   155  	stub *internalStub
   156  }
   157  
   158  func (s *DirectorySuite) SetUpTest(c *gc.C) {
   159  	s.IsolationSuite.SetUpTest(c)
   160  
   161  	s.stub = newInternalStub()
   162  }
   163  
   164  func (s *DirectorySuite) TestNewDirectory(c *gc.C) {
   165  	dataDir := "/var/lib/juju/agents/unit-spam-1/resources"
   166  	deps := s.stub
   167  	spec := internal.NewDirectorySpec(dataDir, "eggs", deps)
   168  	s.stub.ResetCalls()
   169  
   170  	dir := internal.NewDirectory(spec, deps)
   171  
   172  	s.stub.CheckNoCalls(c)
   173  	c.Check(dir, jc.DeepEquals, &internal.Directory{
   174  		DirectorySpec: spec,
   175  		Deps:          deps,
   176  	})
   177  }
   178  
   179  func (s *DirectorySuite) TestWrite(c *gc.C) {
   180  	res := resourcetesting.NewResource(c, s.stub.Stub, "spam", "a-service", "some data")
   181  	stub := &stubDirectory{
   182  		internalStub: s.stub,
   183  	}
   184  	stub.ReturnInfo = res.Resource
   185  	opened := stub
   186  	dataDir := "/var/lib/juju/agents/unit-spam-1/resources"
   187  	deps := s.stub
   188  	spec := internal.NewDirectorySpec(dataDir, "eggs", deps)
   189  	s.stub.ResetCalls()
   190  	dir := internal.NewDirectory(spec, deps)
   191  
   192  	err := dir.Write(opened)
   193  	c.Assert(err, jc.ErrorIsNil)
   194  
   195  	stub.CheckCallNames(c,
   196  		"Info",
   197  		"Content",
   198  		"Join",
   199  		"CreateWriter",
   200  		"WriteContent",
   201  		"CloseAndLog",
   202  	)
   203  }
   204  
   205  func (s *DirectorySuite) TestWriteContent(c *gc.C) {
   206  	info, reader := newResource(c, s.stub.Stub, "spam", "some data")
   207  	content := internal.Content{
   208  		Data:        reader,
   209  		Size:        info.Size,
   210  		Fingerprint: info.Fingerprint,
   211  	}
   212  	relPath := info.Path
   213  	stub := &stubDirectory{
   214  		internalStub: s.stub,
   215  	}
   216  	dataDir := "/var/lib/juju/agents/unit-spam-1/resources"
   217  	deps := s.stub
   218  	spec := internal.NewDirectorySpec(dataDir, "eggs", deps)
   219  	dir := internal.NewDirectory(spec, deps)
   220  	s.stub.ResetCalls()
   221  
   222  	err := dir.WriteContent(relPath, content)
   223  	c.Assert(err, jc.ErrorIsNil)
   224  
   225  	stub.CheckCallNames(c,
   226  		"Join",
   227  		"CreateWriter",
   228  		"WriteContent",
   229  		"CloseAndLog",
   230  	)
   231  }
   232  
   233  type stubDirectory struct {
   234  	*internalStub
   235  
   236  	ReturnInfo    resource.Resource
   237  	ReturnContent internal.Content
   238  }
   239  
   240  func (s *stubDirectory) Info() resource.Resource {
   241  	s.AddCall("Info")
   242  	s.NextErr() // Pop one off.
   243  
   244  	return s.ReturnInfo
   245  }
   246  
   247  func (s *stubDirectory) Content() internal.Content {
   248  	s.AddCall("Content")
   249  	s.NextErr() // Pop one off.
   250  
   251  	return s.ReturnContent
   252  }