Skip to content

Commit eef44bb

Browse files
committed
test: add mocking for darwin service
1 parent a9c3581 commit eef44bb

File tree

2 files changed

+416
-64
lines changed

2 files changed

+416
-64
lines changed

internal/service/service_darwin.go

Lines changed: 44 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,14 @@ import (
1515
"github.com/RewstApp/agent-smith-go/internal/utils"
1616
)
1717

18-
func runLaunchCtl(args ...string) ([]byte, error) {
18+
type launchCtl interface {
19+
Run(args ...string) ([]byte, error)
20+
PlistFilePath(name string) string
21+
}
22+
23+
type defaultLaunchCtl struct{}
24+
25+
func (d *defaultLaunchCtl) Run(args ...string) ([]byte, error) {
1926
cmd := exec.Command("launchctl", args...)
2027
out, err := cmd.CombinedOutput()
2128
if err != nil {
@@ -25,39 +32,45 @@ func runLaunchCtl(args ...string) ([]byte, error) {
2532
return out, nil
2633
}
2734

35+
func (d *defaultLaunchCtl) PlistFilePath(name string) string {
36+
return filepath.Join("/Library/LaunchDaemons", fmt.Sprintf("%s.plist", name))
37+
}
38+
2839
type darwinService struct {
29-
name string
40+
name string
41+
system launchCtl
3042
}
3143

3244
func (svc *darwinService) serviceFilePath() string {
33-
return filepath.Join("/Library/LaunchDaemons", fmt.Sprintf("%s.plist", svc.name))
45+
return svc.system.PlistFilePath(svc.name)
3446
}
3547

3648
func (svc *darwinService) Close() error {
3749
return nil
3850
}
3951

4052
func (svc *darwinService) Start() error {
41-
_, err := runLaunchCtl("load", svc.serviceFilePath())
53+
_, err := svc.system.Run("load", svc.serviceFilePath())
4254
if err != nil {
4355
return err
4456
}
4557

46-
_, err = runLaunchCtl("start", svc.name)
58+
_, err = svc.system.Run("start", svc.name)
4759
return err
4860
}
4961

5062
func (svc *darwinService) Stop() error {
51-
_, err := runLaunchCtl("stop", svc.name)
63+
_, err := svc.system.Run("stop", svc.name)
5264
if err != nil {
5365
return err
5466
}
55-
_, err = runLaunchCtl("unload", svc.serviceFilePath())
67+
68+
_, err = svc.system.Run("unload", svc.serviceFilePath())
5669
return err
5770
}
5871

5972
func (svc *darwinService) Delete() error {
60-
_, err := runLaunchCtl("unload", svc.name)
73+
_, err := svc.system.Run("unload", svc.name)
6174
if err != nil {
6275
return err
6376
}
@@ -67,7 +80,7 @@ func (svc *darwinService) Delete() error {
6780
}
6881

6982
func (svc *darwinService) IsActive() bool {
70-
out, err := runLaunchCtl("print", fmt.Sprintf("system/%s", svc.name))
83+
out, err := svc.system.Run("print", fmt.Sprintf("system/%s", svc.name))
7184
if err != nil {
7285
return false
7386
}
@@ -95,61 +108,23 @@ func (svc *darwinService) IsActive() bool {
95108
}
96109

97110
func Create(params AgentParams) (Service, error) {
98-
serviceConfig := strings.Builder{}
111+
return createWithLaunchCtl(params, &defaultLaunchCtl{})
112+
}
99113

100-
serviceConfig.WriteString("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
101-
serviceConfig.WriteString("<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\"\n")
102-
serviceConfig.WriteString("\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n")
103-
104-
serviceConfig.WriteString("<plist version=\"1.0\">\n")
105-
serviceConfig.WriteString("<dict>\n")
106-
107-
serviceConfig.WriteString("<key>Label</key>\n")
108-
serviceConfig.WriteString("<string>")
109-
serviceConfig.WriteString(params.Name)
110-
serviceConfig.WriteString("</string>\n")
111-
112-
serviceConfig.WriteString("<key>ProgramArguments</key>\n")
113-
serviceConfig.WriteString("<array>\n")
114-
serviceConfig.WriteString("<string>")
115-
serviceConfig.WriteString(params.AgentExecutablePath)
116-
serviceConfig.WriteString("</string>\n")
117-
serviceConfig.WriteString("<string>--org-id</string>\n")
118-
serviceConfig.WriteString("<string>")
119-
serviceConfig.WriteString(params.OrgId)
120-
serviceConfig.WriteString("</string>\n")
121-
serviceConfig.WriteString("<string>--config-file</string>\n")
122-
serviceConfig.WriteString("<string>")
123-
serviceConfig.WriteString(params.ConfigFilePath)
124-
serviceConfig.WriteString("</string>\n")
125-
serviceConfig.WriteString("<string>--log-file</string>\n")
126-
serviceConfig.WriteString("<string>")
127-
serviceConfig.WriteString(params.LogFilePath)
128-
serviceConfig.WriteString("</string>\n")
129-
serviceConfig.WriteString("</array>\n")
130-
131-
serviceConfig.WriteString("<key>RunAtLoad</key>\n")
132-
serviceConfig.WriteString("<false/>\n")
133-
134-
serviceConfig.WriteString("<key>KeepAlive</key>\n")
135-
serviceConfig.WriteString("<dict>\n")
136-
serviceConfig.WriteString("<key>SuccessfulExit</key>\n")
137-
serviceConfig.WriteString("<false/>\n")
138-
serviceConfig.WriteString("</dict>\n")
139-
140-
serviceConfig.WriteString("<key>EnvironmentVariables</key>\n")
141-
serviceConfig.WriteString("<dict>\n")
142-
serviceConfig.WriteString("<key>PATH</key>\n")
143-
serviceConfig.WriteString("<string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>\n")
144-
serviceConfig.WriteString("</dict>\n")
145-
146-
serviceConfig.WriteString("</dict>\n")
147-
serviceConfig.WriteString("</plist>\n")
148-
149-
svc := &darwinService{
150-
name: params.Name,
151-
}
114+
func createWithLaunchCtl(params AgentParams, system launchCtl) (Service, error) {
115+
serviceConfig := strings.Builder{}
152116

117+
fmt.Fprintf(&serviceConfig, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\"\n\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n")
118+
fmt.Fprintf(&serviceConfig, "<plist version=\"1.0\">\n<dict>\n")
119+
fmt.Fprintf(&serviceConfig, "<key>Label</key>\n<string>%s</string>\n", params.Name)
120+
fmt.Fprintf(&serviceConfig, "<key>ProgramArguments</key>\n<array>\n<string>%s</string>\n<string>--org-id</string>\n<string>%s</string>\n<string>--config-file</string>\n<string>%s</string>\n<string>--log-file</string>\n<string>%s</string>\n</array>\n",
121+
params.AgentExecutablePath, params.OrgId, params.ConfigFilePath, params.LogFilePath)
122+
fmt.Fprintf(&serviceConfig, "<key>RunAtLoad</key>\n<false/>\n")
123+
fmt.Fprintf(&serviceConfig, "<key>KeepAlive</key>\n<dict>\n<key>SuccessfulExit</key>\n<false/>\n</dict>\n")
124+
fmt.Fprintf(&serviceConfig, "<key>EnvironmentVariables</key>\n<dict>\n<key>PATH</key>\n<string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>\n</dict>\n")
125+
fmt.Fprintf(&serviceConfig, "</dict>\n</plist>\n")
126+
127+
svc := &darwinService{name: params.Name, system: system}
153128
err := os.WriteFile(svc.serviceFilePath(), []byte(serviceConfig.String()), utils.DefaultFileMod)
154129
if err != nil {
155130
return nil, err
@@ -159,13 +134,18 @@ func Create(params AgentParams) (Service, error) {
159134
}
160135

161136
func Open(name string) (Service, error) {
162-
_, err := runLaunchCtl("print", fmt.Sprintf("system/%s", name))
137+
return openWithLaunchCtl(name, &defaultLaunchCtl{})
138+
}
139+
140+
func openWithLaunchCtl(name string, system launchCtl) (Service, error) {
141+
_, err := system.Run("print", fmt.Sprintf("system/%s", name))
163142
if err != nil {
164143
return nil, err
165144
}
166145

167146
return &darwinService{
168-
name: name,
147+
name: name,
148+
system: system,
169149
}, nil
170150
}
171151

0 commit comments

Comments
 (0)