6
. "launchpad.net/gocheck"
7
"launchpad.net/juju/go/upstart"
13
func Test(t *testing.T) { TestingT(t) }
15
type UpstartSuite struct {
18
service *upstart.Service
21
var _ = Suite(&UpstartSuite{})
23
func (s *UpstartSuite) SetUpTest(c *C) {
24
s.origPath = os.Getenv("PATH")
25
s.testPath = c.MkDir()
26
os.Setenv("PATH", s.testPath+":"+s.origPath)
27
s.service = &upstart.Service{Name: "some-service", InitDir: c.MkDir()}
28
_, err := os.Create(filepath.Join(s.service.InitDir, "some-service.conf"))
32
func (s *UpstartSuite) TearDownTest(c *C) {
33
os.Setenv("PATH", s.origPath)
36
func (s *UpstartSuite) MakeTool(c *C, name, script string) {
37
path := filepath.Join(s.testPath, name)
38
err := ioutil.WriteFile(path, []byte("#!/bin/bash\n"+script), 0755)
42
func (s *UpstartSuite) StoppedStatus(c *C) {
43
s.MakeTool(c, "status", `echo "some-service stop/waiting"`)
46
func (s *UpstartSuite) RunningStatus(c *C) {
47
s.MakeTool(c, "status", `echo "some-service start/running, process 123"`)
50
func (s *UpstartSuite) TestInitDir(c *C) {
51
svc := upstart.NewService("blah")
52
c.Assert(svc.InitDir, Equals, "/etc/init")
55
func (s *UpstartSuite) TestInstalled(c *C) {
56
c.Assert(s.service.Installed(), Equals, true)
57
err := os.Remove(filepath.Join(s.service.InitDir, "some-service.conf"))
59
c.Assert(s.service.Installed(), Equals, false)
62
func (s *UpstartSuite) TestRunning(c *C) {
63
s.MakeTool(c, "status", "exit 1")
64
c.Assert(s.service.Running(), Equals, false)
65
s.MakeTool(c, "status", `echo "GIBBERISH NONSENSE"`)
66
c.Assert(s.service.Running(), Equals, false)
68
c.Assert(s.service.Running(), Equals, true)
71
func (s *UpstartSuite) TestStart(c *C) {
73
s.MakeTool(c, "start", "exit 99")
74
c.Assert(s.service.Start(), IsNil)
76
c.Assert(s.service.Start(), ErrorMatches, "exit status 99")
77
s.MakeTool(c, "start", "exit 0")
78
c.Assert(s.service.Start(), IsNil)
81
func (s *UpstartSuite) TestStop(c *C) {
83
s.MakeTool(c, "stop", "exit 99")
84
c.Assert(s.service.Stop(), IsNil)
86
c.Assert(s.service.Stop(), ErrorMatches, "exit status 99")
87
s.MakeTool(c, "stop", "exit 0")
88
c.Assert(s.service.Stop(), IsNil)
91
func (s *UpstartSuite) TestRemoveMissing(c *C) {
92
err := os.Remove(filepath.Join(s.service.InitDir, "some-service.conf"))
94
c.Assert(s.service.Remove(), IsNil)
97
func (s *UpstartSuite) TestRemoveStopped(c *C) {
99
c.Assert(s.service.Remove(), IsNil)
100
_, err := os.Stat(filepath.Join(s.service.InitDir, "some-service.conf"))
101
c.Assert(os.IsNotExist(err), Equals, true)
104
func (s *UpstartSuite) TestRemoveRunning(c *C) {
106
s.MakeTool(c, "stop", "exit 99")
107
c.Assert(s.service.Remove(), ErrorMatches, "exit status 99")
108
_, err := os.Stat(filepath.Join(s.service.InitDir, "some-service.conf"))
110
s.MakeTool(c, "stop", "exit 0")
111
c.Assert(s.service.Remove(), IsNil)
112
_, err = os.Stat(filepath.Join(s.service.InitDir, "some-service.conf"))
113
c.Assert(os.IsNotExist(err), Equals, true)
116
func (s *UpstartSuite) TestInstallErrors(c *C) {
117
conf := &upstart.Conf{}
118
check := func(msg string) {
119
c.Assert(conf.Install(), ErrorMatches, msg)
120
_, err := conf.InstallCommands()
121
c.Assert(err, ErrorMatches, msg)
123
check("missing Name")
124
conf.Name = "some-service"
125
check("missing InitDir")
126
conf.InitDir = c.MkDir()
127
check("missing Desc")
128
conf.Desc = "this is an upstart service"
132
const expectStart = `description "this is an upstart service"
133
author "Juju Team <juju@lists.ubuntu.com>"
134
start on runlevel [2345]
135
stop on runlevel [!2345]
139
func (s *UpstartSuite) dummyConf(c *C) *upstart.Conf {
140
return &upstart.Conf{
142
Desc: "this is an upstart service",
147
func (s *UpstartSuite) assertInstall(c *C, conf *upstart.Conf, expectEnd string) {
148
expectContent := expectStart + expectEnd
149
expectPath := filepath.Join(conf.InitDir, "some-service.conf")
151
cmds, err := conf.InstallCommands()
153
c.Assert(cmds, DeepEquals, []string{
154
"cat >> " + expectPath + " << 'EOF'\n" + expectContent + "EOF\n",
155
"start some-service",
158
s.MakeTool(c, "start", "exit 99")
160
c.Assert(err, ErrorMatches, "exit status 99")
161
s.MakeTool(c, "start", "exit 0")
164
content, err := ioutil.ReadFile(expectPath)
166
c.Assert(string(content), Equals, expectContent)
169
func (s *UpstartSuite) TestInstallSimple(c *C) {
170
conf := s.dummyConf(c)
171
s.assertInstall(c, conf, "\nexec do something\n")
174
func (s *UpstartSuite) TestInstallOutput(c *C) {
175
conf := s.dummyConf(c)
176
conf.Out = "/some/output/path"
177
s.assertInstall(c, conf, "\nexec do something >> /some/output/path 2>&1\n")
180
func (s *UpstartSuite) TestInstallEnv(c *C) {
181
conf := s.dummyConf(c)
182
conf.Env = map[string]string{"FOO": "bar baz", "QUX": "ping pong"}
183
s.assertInstall(c, conf, `env FOO="bar baz"
190
func (s *UpstartSuite) TestInstallAlreadyRunning(c *C) {
191
pathTo := func(name string) string {
192
return filepath.Join(s.testPath, name)
194
s.MakeTool(c, "status-stopped", `echo "some-service stop/waiting"`)
195
s.MakeTool(c, "status-started", `echo "some-service start/running, process 123"`)
196
s.MakeTool(c, "stop", fmt.Sprintf(
197
"rm %s; ln -s %s %s",
198
pathTo("status"), pathTo("status-stopped"), pathTo("status"),
200
s.MakeTool(c, "start", fmt.Sprintf(
201
"rm %s; ln -s %s %s",
202
pathTo("status"), pathTo("status-started"), pathTo("status"),
204
err := os.Symlink(pathTo("status-started"), pathTo("status"))
207
conf := s.dummyConf(c)
210
c.Assert(conf.Running(), Equals, true)