config_test.go 7.5 KB

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