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 }