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 }