config_test.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. //go:build !integration
  2. // +build !integration
  3. package settings
  4. import (
  5. "encoding/json"
  6. "os"
  7. "path/filepath"
  8. "testing"
  9. "github.com/stretchr/testify/assert"
  10. "github.com/stretchr/testify/require"
  11. )
  12. // GIVEN a non existing build dir in the config
  13. // WHEN the config is loaded
  14. // THEN the directory should be created
  15. func TestNewConfig(t *testing.T) {
  16. configDir := t.TempDir()
  17. err := os.MkdirAll(filepath.Join(configDir, "yay"), 0o755)
  18. assert.NoError(t, err)
  19. t.Setenv("XDG_CONFIG_HOME", configDir)
  20. cacheDir := t.TempDir()
  21. config := map[string]string{"BuildDir": filepath.Join(cacheDir, "test-build-dir")}
  22. f, err := os.Create(filepath.Join(configDir, "yay", "config.json"))
  23. assert.NoError(t, err)
  24. defer f.Close()
  25. configJSON, _ := json.Marshal(config)
  26. _, err = f.WriteString(string(configJSON))
  27. assert.NoError(t, err)
  28. newConfig, err := NewConfig(nil, GetConfigPath(), "v1.0.0")
  29. assert.NoError(t, err)
  30. assert.Equal(t, filepath.Join(cacheDir, "test-build-dir"), newConfig.BuildDir)
  31. _, err = os.Stat(filepath.Join(cacheDir, "test-build-dir"))
  32. assert.NoError(t, err)
  33. }
  34. // GIVEN a non existing build dir in the config and AURDEST set to a non-existing folder
  35. // WHEN the config is loaded
  36. // THEN the directory of AURDEST should be created and selected
  37. func TestNewConfigAURDEST(t *testing.T) {
  38. configDir := t.TempDir()
  39. err := os.MkdirAll(filepath.Join(configDir, "yay"), 0o755)
  40. assert.NoError(t, err)
  41. t.Setenv("XDG_CONFIG_HOME", configDir)
  42. cacheDir := t.TempDir()
  43. config := map[string]string{"BuildDir": filepath.Join(cacheDir, "test-other-dir")}
  44. t.Setenv("AURDEST", filepath.Join(cacheDir, "test-build-dir"))
  45. f, err := os.Create(filepath.Join(configDir, "yay", "config.json"))
  46. assert.NoError(t, err)
  47. defer f.Close()
  48. configJSON, _ := json.Marshal(config)
  49. _, err = f.WriteString(string(configJSON))
  50. assert.NoError(t, err)
  51. newConfig, err := NewConfig(nil, GetConfigPath(), "v1.0.0")
  52. assert.NoError(t, err)
  53. assert.Equal(t, filepath.Join(cacheDir, "test-build-dir"), newConfig.BuildDir)
  54. _, err = os.Stat(filepath.Join(cacheDir, "test-build-dir"))
  55. assert.NoError(t, err)
  56. }
  57. // Test tilde expansion in AURDEST
  58. func TestNewConfigAURDESTTildeExpansion(t *testing.T) {
  59. configDir := t.TempDir()
  60. err := os.MkdirAll(filepath.Join(configDir, "yay"), 0o755)
  61. assert.NoError(t, err)
  62. t.Setenv("XDG_CONFIG_HOME", configDir)
  63. homeDir := t.TempDir()
  64. cacheDir := t.TempDir()
  65. config := map[string]string{"BuildDir": filepath.Join(cacheDir, "test-other-dir")}
  66. t.Setenv("AURDEST", "~/test-build-dir")
  67. t.Setenv("HOME", homeDir)
  68. f, err := os.Create(filepath.Join(configDir, "yay", "config.json"))
  69. assert.NoError(t, err)
  70. defer f.Close()
  71. configJSON, _ := json.Marshal(config)
  72. _, err = f.WriteString(string(configJSON))
  73. assert.NoError(t, err)
  74. newConfig, err := NewConfig(nil, GetConfigPath(), "v1.0.0")
  75. assert.NoError(t, err)
  76. assert.Equal(t, filepath.Join(homeDir, "test-build-dir"), newConfig.BuildDir)
  77. _, err = os.Stat(filepath.Join(homeDir, "test-build-dir"))
  78. assert.NoError(t, err)
  79. }
  80. // GIVEN default config
  81. // WHEN setPrivilegeElevator gets called
  82. // THEN sudobin should stay as "sudo" (given sudo exists)
  83. func TestConfiguration_setPrivilegeElevator(t *testing.T) {
  84. path := t.TempDir()
  85. doas := filepath.Join(path, "sudo")
  86. _, err := os.Create(doas)
  87. os.Chmod(doas, 0o755)
  88. assert.NoError(t, err)
  89. config := DefaultConfig("test")
  90. config.SudoLoop = true
  91. config.SudoFlags = "-v"
  92. t.Setenv("PATH", path)
  93. err = config.setPrivilegeElevator()
  94. assert.NoError(t, err)
  95. assert.Equal(t, "sudo", config.SudoBin)
  96. assert.Equal(t, "-v", config.SudoFlags)
  97. assert.True(t, config.SudoLoop)
  98. }
  99. // GIVEN default config and sudo loop enabled
  100. // GIVEN only su in path
  101. // WHEN setPrivilegeElevator gets called
  102. // THEN sudobin should be changed to "su"
  103. func TestConfiguration_setPrivilegeElevator_su(t *testing.T) {
  104. path := t.TempDir()
  105. doas := filepath.Join(path, "su")
  106. _, err := os.Create(doas)
  107. os.Chmod(doas, 0o755)
  108. assert.NoError(t, err)
  109. config := DefaultConfig("test")
  110. config.SudoLoop = true
  111. config.SudoFlags = "-v"
  112. t.Setenv("PATH", path)
  113. err = config.setPrivilegeElevator()
  114. assert.NoError(t, err)
  115. assert.Equal(t, "su", config.SudoBin)
  116. assert.Equal(t, "", config.SudoFlags)
  117. assert.False(t, config.SudoLoop)
  118. }
  119. // GIVEN default config and sudo loop enabled
  120. // GIVEN no sudo in path
  121. // WHEN setPrivilegeElevator gets called
  122. // THEN sudobin should be changed to "su"
  123. func TestConfiguration_setPrivilegeElevator_no_path(t *testing.T) {
  124. t.Setenv("PATH", "")
  125. config := DefaultConfig("test")
  126. config.SudoLoop = true
  127. config.SudoFlags = "-v"
  128. err := config.setPrivilegeElevator()
  129. assert.Error(t, err)
  130. assert.Equal(t, "sudo", config.SudoBin)
  131. assert.Equal(t, "", config.SudoFlags)
  132. assert.False(t, config.SudoLoop)
  133. }
  134. // GIVEN default config and sudo loop enabled
  135. // GIVEN doas in path
  136. // WHEN setPrivilegeElevator gets called
  137. // THEN sudobin should be changed to "doas"
  138. func TestConfiguration_setPrivilegeElevator_doas(t *testing.T) {
  139. path := t.TempDir()
  140. doas := filepath.Join(path, "doas")
  141. _, err := os.Create(doas)
  142. os.Chmod(doas, 0o755)
  143. assert.NoError(t, err)
  144. config := DefaultConfig("test")
  145. config.SudoLoop = true
  146. config.SudoFlags = "-v"
  147. t.Setenv("PATH", path)
  148. err = config.setPrivilegeElevator()
  149. assert.NoError(t, err)
  150. assert.Equal(t, "doas", config.SudoBin)
  151. assert.Equal(t, "", config.SudoFlags)
  152. assert.False(t, config.SudoLoop)
  153. }
  154. // GIVEN config with wrapper and sudo loop enabled
  155. // GIVEN wrapper is in path
  156. // WHEN setPrivilegeElevator gets called
  157. // THEN sudobin should be kept as the wrapper
  158. func TestConfiguration_setPrivilegeElevator_custom_script(t *testing.T) {
  159. path := t.TempDir()
  160. wrapper := filepath.Join(path, "custom-wrapper")
  161. _, err := os.Create(wrapper)
  162. os.Chmod(wrapper, 0o755)
  163. assert.NoError(t, err)
  164. config := DefaultConfig("test")
  165. config.SudoLoop = true
  166. config.SudoBin = wrapper
  167. config.SudoFlags = "-v"
  168. t.Setenv("PATH", path)
  169. err = config.setPrivilegeElevator()
  170. assert.NoError(t, err)
  171. assert.Equal(t, wrapper, config.SudoBin)
  172. assert.Equal(t, "-v", config.SudoFlags)
  173. assert.True(t, config.SudoLoop)
  174. }
  175. // GIVEN default config and sudo loop enabled
  176. // GIVEN doas as PACMAN_AUTH env variable
  177. // WHEN setPrivilegeElevator gets called
  178. // THEN sudobin should be changed to "doas"
  179. func TestConfiguration_setPrivilegeElevator_pacman_auth_doas(t *testing.T) {
  180. path := t.TempDir()
  181. doas := filepath.Join(path, "doas")
  182. _, err := os.Create(doas)
  183. os.Chmod(doas, 0o755)
  184. require.NoError(t, err)
  185. sudo := filepath.Join(path, "sudo")
  186. _, err = os.Create(sudo)
  187. os.Chmod(sudo, 0o755)
  188. require.NoError(t, err)
  189. config := DefaultConfig("test")
  190. config.SudoBin = "sudo"
  191. config.SudoLoop = true
  192. config.SudoFlags = "-v"
  193. t.Setenv("PACMAN_AUTH", "doas")
  194. t.Setenv("PATH", path)
  195. err = config.setPrivilegeElevator()
  196. assert.NoError(t, err)
  197. assert.Equal(t, "doas", config.SudoBin)
  198. assert.Equal(t, "", config.SudoFlags)
  199. assert.False(t, config.SudoLoop)
  200. }
  201. // GIVEN config with doas configed and sudo loop enabled
  202. // GIVEN sudo as PACMAN_AUTH env variable
  203. // WHEN setPrivilegeElevator gets called
  204. // THEN sudobin should be changed to "sudo"
  205. func TestConfiguration_setPrivilegeElevator_pacman_auth_sudo(t *testing.T) {
  206. path := t.TempDir()
  207. doas := filepath.Join(path, "doas")
  208. _, err := os.Create(doas)
  209. os.Chmod(doas, 0o755)
  210. require.NoError(t, err)
  211. sudo := filepath.Join(path, "sudo")
  212. _, err = os.Create(sudo)
  213. os.Chmod(sudo, 0o755)
  214. require.NoError(t, err)
  215. config := DefaultConfig("test")
  216. config.SudoBin = "doas"
  217. config.SudoLoop = true
  218. config.SudoFlags = "-v"
  219. t.Setenv("PACMAN_AUTH", "sudo")
  220. t.Setenv("PATH", path)
  221. err = config.setPrivilegeElevator()
  222. assert.NoError(t, err)
  223. assert.Equal(t, "sudo", config.SudoBin)
  224. assert.Equal(t, "-v", config.SudoFlags)
  225. assert.True(t, config.SudoLoop)
  226. }