github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/agent/tools/symlinks_test.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package tools_test 5 6 import ( 7 "io/ioutil" 8 "os" 9 "path/filepath" 10 "time" 11 12 "github.com/juju/os/series" 13 jc "github.com/juju/testing/checkers" 14 "github.com/juju/utils" 15 "github.com/juju/utils/arch" 16 "github.com/juju/utils/symlink" 17 "github.com/juju/version" 18 gc "gopkg.in/check.v1" 19 20 "github.com/juju/juju/agent/tools" 21 "github.com/juju/juju/juju/names" 22 jujuversion "github.com/juju/juju/version" 23 ) 24 25 type SymlinksSuite struct { 26 dataDir, toolsDir string 27 } 28 29 var _ = gc.Suite(&SymlinksSuite{}) 30 31 func (s *SymlinksSuite) SetUpTest(c *gc.C) { 32 s.dataDir = c.MkDir() 33 s.toolsDir = tools.SharedToolsDir(s.dataDir, version.Binary{ 34 Number: jujuversion.Current, 35 Arch: arch.HostArch(), 36 Series: series.MustHostSeries(), 37 }) 38 err := os.MkdirAll(s.toolsDir, 0755) 39 c.Assert(err, jc.ErrorIsNil) 40 c.Logf("created %s", s.toolsDir) 41 unitDir := tools.ToolsDir(s.dataDir, "unit-u-123") 42 err = symlink.New(s.toolsDir, unitDir) 43 c.Assert(err, jc.ErrorIsNil) 44 c.Logf("created %s => %s", unitDir, s.toolsDir) 45 } 46 47 func (s *SymlinksSuite) TestEnsureSymlinks(c *gc.C) { 48 s.testEnsureSymlinks(c, s.toolsDir) 49 } 50 51 func (s *SymlinksSuite) TestEnsureSymlinksSymlinkedDir(c *gc.C) { 52 dirSymlink := filepath.Join(c.MkDir(), "commands") 53 err := symlink.New(s.toolsDir, dirSymlink) 54 c.Assert(err, jc.ErrorIsNil) 55 c.Logf("created %s => %s", dirSymlink, s.toolsDir) 56 s.testEnsureSymlinks(c, dirSymlink) 57 } 58 59 func (s *SymlinksSuite) testEnsureSymlinks(c *gc.C, dir string) { 60 jujudPath := filepath.Join(s.toolsDir, names.Jujud) 61 err := ioutil.WriteFile(jujudPath, []byte("assume sane"), 0755) 62 c.Assert(err, jc.ErrorIsNil) 63 64 assertLink := func(path string) time.Time { 65 target, err := symlink.Read(path) 66 c.Assert(err, jc.ErrorIsNil) 67 c.Check(target, jc.SamePath, jujudPath) 68 c.Check(filepath.Dir(target), gc.Equals, filepath.Dir(jujudPath)) 69 fi, err := os.Lstat(path) 70 c.Assert(err, jc.ErrorIsNil) 71 return fi.ModTime() 72 } 73 74 commands := []string{"foo", "bar"} 75 76 // Check that EnsureSymlinks writes appropriate symlinks. 77 err = tools.EnsureSymlinks(dir, dir, commands) 78 c.Assert(err, jc.ErrorIsNil) 79 mtimes := map[string]time.Time{} 80 for _, name := range commands { 81 tool := filepath.Join(s.toolsDir, name) 82 mtimes[tool] = assertLink(tool) 83 } 84 85 // Check that EnsureSymlinks doesn't overwrite things that don't need to be. 86 err = tools.EnsureSymlinks(s.toolsDir, s.toolsDir, commands) 87 c.Assert(err, jc.ErrorIsNil) 88 for tool, mtime := range mtimes { 89 c.Assert(assertLink(tool), gc.Equals, mtime) 90 } 91 } 92 93 func (s *SymlinksSuite) TestEnsureSymlinksBadDir(c *gc.C) { 94 dir := filepath.Join(c.MkDir(), "noexist") 95 err := tools.EnsureSymlinks(dir, dir, []string{"foo"}) 96 c.Assert(err, gc.ErrorMatches, "cannot initialize commands in .*: "+utils.NoSuchFileErrRegexp) 97 }