github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/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  	"launchpad.net/juju-core/agent/tools"
    15  	"launchpad.net/juju-core/version"
    16  	"launchpad.net/juju-core/worker/uniter"
    17  	"launchpad.net/juju-core/worker/uniter/jujuc"
    18      "launchpad.net/juju-core/utils"
    19  )
    20  
    21  type ToolsSuite struct {
    22  	dataDir, toolsDir string
    23  }
    24  
    25  var _ = gc.Suite(&ToolsSuite{})
    26  
    27  func (s *ToolsSuite) SetUpTest(c *gc.C) {
    28  	s.dataDir = c.MkDir()
    29  	s.toolsDir = tools.SharedToolsDir(s.dataDir, version.Current)
    30  	err := os.MkdirAll(s.toolsDir, 0755)
    31  	c.Assert(err, gc.IsNil)
    32  	err = utils.Symlink(s.toolsDir, tools.ToolsDir(s.dataDir, "unit-u-123"))
    33  	c.Assert(err, gc.IsNil)
    34  }
    35  
    36  func (s *ToolsSuite) TestEnsureJujucSymlinks(c *gc.C) {
    37  	jujudPath := filepath.Join(s.toolsDir, "jujud")
    38  	err := ioutil.WriteFile(jujudPath, []byte("assume sane"), 0755)
    39  	c.Assert(err, gc.IsNil)
    40  
    41  	assertLink := func(path string) time.Time {
    42  		target, err := os.Readlink(path)
    43  		c.Assert(err, gc.IsNil)
    44  		c.Assert(target, gc.Equals, "./jujud")
    45  		fi, err := os.Lstat(path)
    46  		c.Assert(err, gc.IsNil)
    47  		return fi.ModTime()
    48  	}
    49  
    50  	// Check that EnsureJujucSymlinks writes appropriate symlinks.
    51  	err = uniter.EnsureJujucSymlinks(s.toolsDir)
    52  	c.Assert(err, gc.IsNil)
    53  	mtimes := map[string]time.Time{}
    54  	for _, name := range jujuc.CommandNames() {
    55  		tool := filepath.Join(s.toolsDir, name)
    56  		mtimes[tool] = assertLink(tool)
    57  	}
    58  
    59  	// Check that EnsureJujucSymlinks doesn't overwrite things that don't need to be.
    60  	err = uniter.EnsureJujucSymlinks(s.toolsDir)
    61  	c.Assert(err, gc.IsNil)
    62  	for tool, mtime := range mtimes {
    63  		c.Assert(assertLink(tool), gc.Equals, mtime)
    64  	}
    65  }
    66  
    67  func (s *ToolsSuite) TestEnsureJujucSymlinksBadDir(c *gc.C) {
    68  	err := uniter.EnsureJujucSymlinks(filepath.Join(c.MkDir(), "noexist"))
    69  	c.Assert(err, gc.ErrorMatches, "cannot initialize hook commands in .*: no such file or directory")
    70  }