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  }