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