1
// Copyright 2012, 2013 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
12
jc "github.com/juju/testing/checkers"
13
"github.com/juju/utils"
14
"github.com/juju/utils/arch"
15
"github.com/juju/utils/series"
16
"github.com/juju/utils/symlink"
17
"github.com/juju/version"
18
gc "gopkg.in/check.v1"
20
"github.com/juju/juju/agent/tools"
21
"github.com/juju/juju/juju/names"
22
jujuversion "github.com/juju/juju/version"
23
"github.com/juju/juju/worker/uniter/runner/jujuc"
26
type ToolsSuite struct {
27
dataDir, toolsDir string
30
var _ = gc.Suite(&ToolsSuite{})
32
func (s *ToolsSuite) SetUpTest(c *gc.C) {
34
s.toolsDir = tools.SharedToolsDir(s.dataDir, version.Binary{
35
Number: jujuversion.Current,
36
Arch: arch.HostArch(),
37
Series: series.HostSeries(),
39
err := os.MkdirAll(s.toolsDir, 0755)
40
c.Assert(err, jc.ErrorIsNil)
41
err = symlink.New(s.toolsDir, tools.ToolsDir(s.dataDir, "unit-u-123"))
42
c.Assert(err, jc.ErrorIsNil)
45
func (s *ToolsSuite) TestEnsureSymlinks(c *gc.C) {
46
s.testEnsureSymlinks(c, s.toolsDir)
49
func (s *ToolsSuite) TestEnsureSymlinksSymlinkedDir(c *gc.C) {
50
toolsDirSymlink := filepath.Join(c.MkDir(), "unit-ubuntu-0")
51
err := symlink.New(s.toolsDir, toolsDirSymlink)
52
c.Assert(err, jc.ErrorIsNil)
53
s.testEnsureSymlinks(c, toolsDirSymlink)
56
func (s *ToolsSuite) testEnsureSymlinks(c *gc.C, dir string) {
57
jujudPath := filepath.Join(s.toolsDir, names.Jujud)
58
err := ioutil.WriteFile(jujudPath, []byte("assume sane"), 0755)
59
c.Assert(err, jc.ErrorIsNil)
61
assertLink := func(path string) time.Time {
62
target, err := symlink.Read(path)
63
c.Assert(err, jc.ErrorIsNil)
64
c.Assert(target, jc.SamePath, jujudPath)
65
fi, err := os.Lstat(path)
66
c.Assert(err, jc.ErrorIsNil)
70
// Check that EnsureSymlinks writes appropriate symlinks.
71
err = jujuc.EnsureSymlinks(dir)
72
c.Assert(err, jc.ErrorIsNil)
73
mtimes := map[string]time.Time{}
74
for _, name := range jujuc.CommandNames() {
75
tool := filepath.Join(s.toolsDir, name)
76
mtimes[tool] = assertLink(tool)
79
// Check that EnsureSymlinks doesn't overwrite things that don't need to be.
80
err = jujuc.EnsureSymlinks(s.toolsDir)
81
c.Assert(err, jc.ErrorIsNil)
82
for tool, mtime := range mtimes {
83
c.Assert(assertLink(tool), gc.Equals, mtime)
87
func (s *ToolsSuite) TestEnsureSymlinksBadDir(c *gc.C) {
88
err := jujuc.EnsureSymlinks(filepath.Join(c.MkDir(), "noexist"))
89
c.Assert(err, gc.ErrorMatches, "cannot initialize hook commands in .*: "+utils.NoSuchFileErrRegexp)