diff --git a/README.md b/README.md index 3530304..6bb380a 100644 --- a/README.md +++ b/README.md @@ -15,8 +15,8 @@ In fact, if `systemctl` isn't found in the `PATH`, this library will panic. ## Supported systemctl functions - [ ] `systemctl daemon-reload` -- [ ] `systemctl disable` -- [ ] `systemctl enable` +- [x] `systemctl disable` +- [x] `systemctl enable` - [ ] `systemctl is-active` - [ ] `systemctl is-enabled` - [ ] `systemctl is-failed` diff --git a/systemctl_test.go b/systemctl_test.go index 7c7f710..9e40314 100644 --- a/systemctl_test.go +++ b/systemctl_test.go @@ -78,6 +78,51 @@ func TestEnable(t *testing.T) { } +func TestDisable(t *testing.T) { + testCases := []struct { + unit string + err error + opts Options + runAsUser bool + }{ + // Run these tests only as a user + + //try nonexistant unit in user mode as user + {"nonexistant", ErrDoesNotExist, Options{usermode: true}, true}, + // try existing unit in user mode as user + {"syncthing", nil, Options{usermode: true}, true}, + // try nonexisting unit in system mode as user + {"nonexistant", ErrInsufficientPermissions, Options{usermode: false}, true}, + // try existing unit in system mode as user + {"nginx", ErrInsufficientPermissions, Options{usermode: false}, true}, + + // Run these tests only as a superuser + + // try nonexistant unit in system mode as system + {"nonexistant", ErrDoesNotExist, Options{usermode: false}, false}, + // try existing unit in system mode as system + {"nginx", ErrBusFailure, Options{usermode: true}, false}, + // try existing unit in system mode as system + {"nginx", nil, Options{usermode: false}, false}, + } + for _, tc := range testCases { + t.Run(fmt.Sprintf("%s as %s", tc.unit, userString), func(t *testing.T) { + if (userString == "root" || userString == "system") && tc.runAsUser { + t.Skip("skipping user test while running as superuser") + } else if (userString != "root" && userString != "system") && !tc.runAsUser { + t.Skip("skipping superuser test while running as user") + } + ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) + defer cancel() + err := Disable(ctx, tc.unit, tc.opts) + if err != tc.err { + t.Errorf("error is %v, but should have been %v", err, tc.err) + } + }) + } + +} + // Runs through all defined properties and checks for error cases func TestShow(t *testing.T) { if testing.Short() {