Skip to content

Commit 7afa65f

Browse files
committed
ossvc: add openbsd tests
1 parent cc04444 commit 7afa65f

2 files changed

Lines changed: 150 additions & 9 deletions

File tree

internal/ossvc/service_openbsd.go

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,18 +66,20 @@ func (sys *openbsdSystem) Interactive() (ok bool) {
6666
// New implements service.System interface for openbsdSystem.
6767
func (sys *openbsdSystem) New(i service.Interface, c *service.Config) (s service.Service, err error) {
6868
return &openbsdRunComService{
69-
cmdCons: sys.cmdCons,
70-
i: i,
71-
cfg: c,
69+
cmdCons: sys.cmdCons,
70+
i: i,
71+
cfg: c,
72+
scriptsPath: "/etc/rc.d",
7273
}, nil
7374
}
7475

7576
// openbsdRunComService is the RunCom-based service.Service to be used on the
7677
// OpenBSD.
7778
type openbsdRunComService struct {
78-
cmdCons executil.CommandConstructor
79-
i service.Interface
80-
cfg *service.Config
79+
cmdCons executil.CommandConstructor
80+
i service.Interface
81+
cfg *service.Config
82+
scriptsPath string
8183
}
8284

8385
// Platform implements service.Service interface for *openbsdRunComService.
@@ -145,9 +147,7 @@ func (s *openbsdRunComService) scriptPath() (cp string, err error) {
145147
return "", errNoUserServiceRunCom
146148
}
147149

148-
const scriptPathPref = "/etc/rc.d"
149-
150-
return filepath.Join(scriptPathPref, s.cfg.Name), nil
150+
return filepath.Join(s.scriptsPath, s.cfg.Name), nil
151151
}
152152

153153
const (
@@ -249,6 +249,7 @@ func (s *openbsdRunComService) writeScript() (err error) {
249249
}
250250

251251
t := s.template()
252+
// #nosec CWE-22 -- The path is constructed from constants.
252253
f, err := os.Create(scriptPath)
253254
if err != nil {
254255
return fmt.Errorf("creating rc.d script file: %w", err)
@@ -269,6 +270,7 @@ func (s *openbsdRunComService) writeScript() (err error) {
269270
}
270271

271272
return errors.Annotate(
273+
// #nosec CWE-276 -- The permissions are required.
272274
os.Chmod(scriptPath, 0o755),
273275
"changing rc.d script file permissions: %w",
274276
)
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
//go:build openbsd
2+
3+
package ossvc
4+
5+
import (
6+
"fmt"
7+
"os"
8+
"path/filepath"
9+
"testing"
10+
11+
"github.com/AdguardTeam/golibs/osutil/executil"
12+
"github.com/AdguardTeam/golibs/testutil"
13+
"github.com/kardianos/service"
14+
"github.com/stretchr/testify/assert"
15+
"github.com/stretchr/testify/require"
16+
)
17+
18+
func TestOpenbsdSystem(t *testing.T) {
19+
t.Parallel()
20+
21+
sys := &openbsdSystem{
22+
cmdCons: newTestCmdConstructor(t, "", nil),
23+
}
24+
25+
assert.Equal(t, sysVersion, sys.String())
26+
assert.True(t, sys.Detect())
27+
assert.Equal(t, os.Getppid() != 1, sys.Interactive())
28+
29+
svc, err := sys.New(emptyInterface{}, &service.Config{
30+
Name: testServiceName,
31+
})
32+
require.NoError(t, err)
33+
34+
assert.NotNil(t, svc)
35+
assert.Equal(t, "openbsd", svc.Platform())
36+
assert.Equal(t, testServiceName, svc.String())
37+
38+
l, err := svc.Logger(nil)
39+
require.NoError(t, err)
40+
41+
assert.NotNil(t, l)
42+
43+
l, err = svc.SystemLogger(nil)
44+
require.NoError(t, err)
45+
46+
assert.NotNil(t, l)
47+
}
48+
49+
func TestOpenbsdRunComService(t *testing.T) {
50+
t.Parallel()
51+
52+
scriptsDir := t.TempDir()
53+
54+
conf := &service.Config{
55+
Name: testServiceName,
56+
}
57+
svc := &openbsdRunComService{
58+
cmdCons: executil.EmptyCommandConstructor{},
59+
i: emptyInterface{},
60+
cfg: conf,
61+
scriptsPath: scriptsDir,
62+
}
63+
64+
err := svc.Install()
65+
assert.NoError(t, err)
66+
assert.FileExists(t, filepath.Join(scriptsDir, testServiceName))
67+
68+
err = svc.Start()
69+
assert.NoError(t, err)
70+
71+
err = svc.Stop()
72+
assert.NoError(t, err)
73+
74+
err = svc.Restart()
75+
assert.NoError(t, err)
76+
77+
err = svc.Uninstall()
78+
assert.NoError(t, err)
79+
assert.NoFileExists(t, filepath.Join(scriptsDir, testServiceName))
80+
}
81+
82+
func TestOpenbsdRunComService_Status(t *testing.T) {
83+
t.Parallel()
84+
85+
scriptsDir := t.TempDir()
86+
87+
conf := &service.Config{
88+
Name: testServiceName,
89+
}
90+
91+
testCases := []struct {
92+
cmdErr error
93+
name string
94+
body string
95+
wantErrMsg string
96+
wantStatus service.Status
97+
}{{
98+
name: "running",
99+
body: fmt.Sprintf("%s(ok)\n", testServiceName),
100+
cmdErr: nil,
101+
wantErrMsg: "",
102+
wantStatus: service.StatusRunning,
103+
}, {
104+
name: "stopped",
105+
body: fmt.Sprintf("%s(failed)\n", testServiceName),
106+
cmdErr: nil,
107+
wantErrMsg: "",
108+
wantStatus: service.StatusStopped,
109+
}, {
110+
name: "unknown_cmd_error",
111+
body: "",
112+
cmdErr: assert.AnError,
113+
wantErrMsg: "getting status of openbsd-runcom AdGuardHome service: starting: " +
114+
assert.AnError.Error(),
115+
wantStatus: service.StatusUnknown,
116+
}, {
117+
name: "unknown",
118+
body: "",
119+
cmdErr: nil,
120+
wantErrMsg: "getting status of openbsd-runcom AdGuardHome service: " +
121+
service.ErrNotInstalled.Error(),
122+
wantStatus: service.StatusUnknown,
123+
}}
124+
125+
for _, tc := range testCases {
126+
t.Run(tc.name, func(t *testing.T) {
127+
svc := &openbsdRunComService{
128+
cmdCons: newTestCmdConstructor(t, tc.body, tc.cmdErr),
129+
i: emptyInterface{},
130+
cfg: conf,
131+
scriptsPath: scriptsDir,
132+
}
133+
134+
status, err := svc.Status()
135+
assert.Equal(t, tc.wantStatus, status)
136+
testutil.AssertErrorMsg(t, tc.wantErrMsg, err)
137+
})
138+
}
139+
}

0 commit comments

Comments
 (0)