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 }