yay/pkg/settings/config_test.go
jguer c8fcdeae5b feat(su): use alternative privilege elevators when sudo is not available
When sudobin/custom wrapper is not available try the following in order:

- sudo
- doas
- pkexec
- su
2021-08-31 02:17:27 +02:00

153 lines
3.7 KiB
Go

package settings
import (
"os"
"path/filepath"
"testing"
"github.com/stretchr/testify/assert"
)
// GIVEN default config
// WHEN setPrivilegeElevator gets called
// THEN sudobin should stay as "sudo" (given sudo exists)
func TestConfiguration_setPrivilegeElevator(t *testing.T) {
oldPath := os.Getenv("PATH")
path, err := os.MkdirTemp("", "yay-test")
assert.NoError(t, err)
doas := filepath.Join(path, "sudo")
_, err = os.Create(doas)
os.Chmod(doas, 0o755)
assert.NoError(t, err)
defer os.RemoveAll(path)
config := DefaultConfig()
config.SudoLoop = true
config.SudoFlags = "-v"
os.Setenv("PATH", path)
err = config.setPrivilegeElevator()
os.Setenv("PATH", oldPath)
assert.NoError(t, err)
assert.Equal(t, "sudo", config.SudoBin)
assert.Equal(t, "-v", config.SudoFlags)
assert.True(t, config.SudoLoop)
}
// GIVEN default config and sudo loop enabled
// GIVEN only su in path
// WHEN setPrivilegeElevator gets called
// THEN sudobin should be changed to "su"
func TestConfiguration_setPrivilegeElevator_su(t *testing.T) {
oldPath := os.Getenv("PATH")
path, err := os.MkdirTemp("", "yay-test")
assert.NoError(t, err)
doas := filepath.Join(path, "su")
_, err = os.Create(doas)
os.Chmod(doas, 0o755)
assert.NoError(t, err)
defer os.RemoveAll(path)
config := DefaultConfig()
config.SudoLoop = true
config.SudoFlags = "-v"
os.Setenv("PATH", path)
err = config.setPrivilegeElevator()
os.Setenv("PATH", oldPath)
assert.NoError(t, err)
assert.Equal(t, "su", config.SudoBin)
assert.Equal(t, "", config.SudoFlags)
assert.False(t, config.SudoLoop)
}
// GIVEN default config and sudo loop enabled
// GIVEN no sudo in path
// WHEN setPrivilegeElevator gets called
// THEN sudobin should be changed to "su"
func TestConfiguration_setPrivilegeElevator_no_path(t *testing.T) {
oldPath := os.Getenv("PATH")
os.Setenv("PATH", "")
config := DefaultConfig()
config.SudoLoop = true
config.SudoFlags = "-v"
err := config.setPrivilegeElevator()
os.Setenv("PATH", oldPath)
assert.Error(t, err)
assert.Equal(t, "sudo", config.SudoBin)
assert.Equal(t, "", config.SudoFlags)
assert.False(t, config.SudoLoop)
}
// GIVEN default config and sudo loop enabled
// GIVEN doas in path
// WHEN setPrivilegeElevator gets called
// THEN sudobin should be changed to "doas"
func TestConfiguration_setPrivilegeElevator_doas(t *testing.T) {
oldPath := os.Getenv("PATH")
path, err := os.MkdirTemp("", "yay-test")
assert.NoError(t, err)
doas := filepath.Join(path, "doas")
_, err = os.Create(doas)
os.Chmod(doas, 0o755)
assert.NoError(t, err)
defer os.RemoveAll(path)
config := DefaultConfig()
config.SudoLoop = true
config.SudoFlags = "-v"
os.Setenv("PATH", path)
err = config.setPrivilegeElevator()
os.Setenv("PATH", oldPath)
assert.NoError(t, err)
assert.Equal(t, "doas", config.SudoBin)
assert.Equal(t, "", config.SudoFlags)
assert.False(t, config.SudoLoop)
}
// GIVEN config with wrapper and sudo loop enabled
// GIVEN wrapper is in path
// WHEN setPrivilegeElevator gets called
// THEN sudobin should be kept as the wrapper
func TestConfiguration_setPrivilegeElevator_custom_script(t *testing.T) {
oldPath := os.Getenv("PATH")
path, err := os.MkdirTemp("", "yay-test")
assert.NoError(t, err)
wrapper := filepath.Join(path, "custom-wrapper")
_, err = os.Create(wrapper)
os.Chmod(wrapper, 0o755)
assert.NoError(t, err)
defer os.RemoveAll(path)
config := DefaultConfig()
config.SudoLoop = true
config.SudoBin = wrapper
config.SudoFlags = "-v"
os.Setenv("PATH", path)
err = config.setPrivilegeElevator()
os.Setenv("PATH", oldPath)
assert.NoError(t, err)
assert.Equal(t, wrapper, config.SudoBin)
assert.Equal(t, "-v", config.SudoFlags)
assert.True(t, config.SudoLoop)
}