github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/worker/uniter/tools_test.go (about)

     1  // Copyright 2012, 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package uniter_test
     5  
     6  import (
     7  	"io/ioutil"
     8  	"os"
     9  	"path/filepath"
    10  	"time"
    11  
    12  	gc "launchpad.net/gocheck"
    13  
    14  	"github.com/juju/juju/agent/tools"
    15  	"github.com/juju/juju/version"
    16  	"github.com/juju/juju/worker/uniter"
    17  	"github.com/juju/juju/worker/uniter/jujuc"
    18  )
    19  
    20  type ToolsSuite struct {
    21  	dataDir, toolsDir string
    22  }
    23  
    24  var _ = gc.Suite(&ToolsSuite{})
    25  
    26  func (s *ToolsSuite) SetUpTest(c *gc.C) {
    27  	s.dataDir = c.MkDir()
    28  	s.toolsDir = tools.SharedToolsDir(s.dataDir, version.Current)
    29  	err := os.MkdirAll(s.toolsDir, 0755)
    30  	c.Assert(err, gc.IsNil)
    31  	err = os.Symlink(s.toolsDir, tools.ToolsDir(s.dataDir, "unit-u-123"))
    32  	c.Assert(err, gc.IsNil)
    33  }
    34  
    35  func (s *ToolsSuite) TestEnsureJujucSymlinks(c *gc.C) {
    36  	jujudPath := filepath.Join(s.toolsDir, "jujud")
    37  	err := ioutil.WriteFile(jujudPath, []byte("assume sane"), 0755)
    38  	c.Assert(err, gc.IsNil)
    39  
    40  	assertLink := func(path string) time.Time {
    41  		target, err := os.Readlink(path)
    42  		c.Assert(err, gc.IsNil)
    43  		c.Assert(target, gc.Equals, "./jujud")
    44  		fi, err := os.Lstat(path)
    45  		c.Assert(err, gc.IsNil)
    46  		return fi.ModTime()
    47  	}
    48  
    49  	// Check that EnsureJujucSymlinks writes appropriate symlinks.
    50  	err = uniter.EnsureJujucSymlinks(s.toolsDir)
    51  	c.Assert(err, gc.IsNil)
    52  	mtimes := map[string]time.Time{}
    53  	for _, name := range jujuc.CommandNames() {
    54  		tool := filepath.Join(s.toolsDir, name)
    55  		mtimes[tool] = assertLink(tool)
    56  	}
    57  
    58  	// Check that EnsureJujucSymlinks doesn't overwrite things that don't need to be.
    59  	err = uniter.EnsureJujucSymlinks(s.toolsDir)
    60  	c.Assert(err, gc.IsNil)
    61  	for tool, mtime := range mtimes {
    62  		c.Assert(assertLink(tool), gc.Equals, mtime)
    63  	}
    64  }
    65  
    66  func (s *ToolsSuite) TestEnsureJujucSymlinksBadDir(c *gc.C) {
    67  	err := uniter.EnsureJujucSymlinks(filepath.Join(c.MkDir(), "noexist"))
    68  	c.Assert(err, gc.ErrorMatches, "cannot initialize hook commands in .*: no such file or directory")
    69  }