config_test.go 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  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. os.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. os.Setenv("XDG_CONFIG_HOME", configDir)
  40. cacheDir := t.TempDir()
  41. config := map[string]string{"BuildDir": filepath.Join(cacheDir, "test-other-dir")}
  42. os.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. // GIVEN default config
  56. // WHEN setPrivilegeElevator gets called
  57. // THEN sudobin should stay as "sudo" (given sudo exists)
  58. func TestConfiguration_setPrivilegeElevator(t *testing.T) {
  59. oldPath := os.Getenv("PATH")
  60. path := t.TempDir()
  61. doas := filepath.Join(path, "sudo")
  62. _, err := os.Create(doas)
  63. os.Chmod(doas, 0o755)
  64. assert.NoError(t, err)
  65. config := DefaultConfig("test")
  66. config.SudoLoop = true
  67. config.SudoFlags = "-v"
  68. os.Setenv("PATH", path)
  69. err = config.setPrivilegeElevator()
  70. os.Setenv("PATH", oldPath)
  71. assert.NoError(t, err)
  72. assert.Equal(t, "sudo", config.SudoBin)
  73. assert.Equal(t, "-v", config.SudoFlags)
  74. assert.True(t, config.SudoLoop)
  75. }
  76. // GIVEN default config and sudo loop enabled
  77. // GIVEN only su in path
  78. // WHEN setPrivilegeElevator gets called
  79. // THEN sudobin should be changed to "su"
  80. func TestConfiguration_setPrivilegeElevator_su(t *testing.T) {
  81. oldPath := os.Getenv("PATH")
  82. path := t.TempDir()
  83. doas := filepath.Join(path, "su")
  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. os.Setenv("PATH", path)
  91. err = config.setPrivilegeElevator()
  92. os.Setenv("PATH", oldPath)
  93. assert.NoError(t, err)
  94. assert.Equal(t, "su", config.SudoBin)
  95. assert.Equal(t, "", config.SudoFlags)
  96. assert.False(t, config.SudoLoop)
  97. }
  98. // GIVEN default config and sudo loop enabled
  99. // GIVEN no sudo in path
  100. // WHEN setPrivilegeElevator gets called
  101. // THEN sudobin should be changed to "su"
  102. func TestConfiguration_setPrivilegeElevator_no_path(t *testing.T) {
  103. oldPath := os.Getenv("PATH")
  104. os.Setenv("PATH", "")
  105. config := DefaultConfig("test")
  106. config.SudoLoop = true
  107. config.SudoFlags = "-v"
  108. err := config.setPrivilegeElevator()
  109. os.Setenv("PATH", oldPath)
  110. assert.Error(t, err)
  111. assert.Equal(t, "sudo", config.SudoBin)
  112. assert.Equal(t, "", config.SudoFlags)
  113. assert.False(t, config.SudoLoop)
  114. }
  115. // GIVEN default config and sudo loop enabled
  116. // GIVEN doas in path
  117. // WHEN setPrivilegeElevator gets called
  118. // THEN sudobin should be changed to "doas"
  119. func TestConfiguration_setPrivilegeElevator_doas(t *testing.T) {
  120. oldPath := os.Getenv("PATH")
  121. path := t.TempDir()
  122. doas := filepath.Join(path, "doas")
  123. _, err := os.Create(doas)
  124. os.Chmod(doas, 0o755)
  125. assert.NoError(t, err)
  126. config := DefaultConfig("test")
  127. config.SudoLoop = true
  128. config.SudoFlags = "-v"
  129. os.Setenv("PATH", path)
  130. err = config.setPrivilegeElevator()
  131. os.Setenv("PATH", oldPath)
  132. assert.NoError(t, err)
  133. assert.Equal(t, "doas", config.SudoBin)
  134. assert.Equal(t, "", config.SudoFlags)
  135. assert.False(t, config.SudoLoop)
  136. }
  137. // GIVEN config with wrapper and sudo loop enabled
  138. // GIVEN wrapper is in path
  139. // WHEN setPrivilegeElevator gets called
  140. // THEN sudobin should be kept as the wrapper
  141. func TestConfiguration_setPrivilegeElevator_custom_script(t *testing.T) {
  142. oldPath := os.Getenv("PATH")
  143. path := t.TempDir()
  144. wrapper := filepath.Join(path, "custom-wrapper")
  145. _, err := os.Create(wrapper)
  146. os.Chmod(wrapper, 0o755)
  147. assert.NoError(t, err)
  148. config := DefaultConfig("test")
  149. config.SudoLoop = true
  150. config.SudoBin = wrapper
  151. config.SudoFlags = "-v"
  152. os.Setenv("PATH", path)
  153. err = config.setPrivilegeElevator()
  154. os.Setenv("PATH", oldPath)
  155. assert.NoError(t, err)
  156. assert.Equal(t, wrapper, config.SudoBin)
  157. assert.Equal(t, "-v", config.SudoFlags)
  158. assert.True(t, config.SudoLoop)
  159. }
  160. // GIVEN default config and sudo loop enabled
  161. // GIVEN doas as PACMAN_AUTH env variable
  162. // WHEN setPrivilegeElevator gets called
  163. // THEN sudobin should be changed to "doas"
  164. func TestConfiguration_setPrivilegeElevator_pacman_auth_doas(t *testing.T) {
  165. oldPath := os.Getenv("PATH")
  166. path := t.TempDir()
  167. doas := filepath.Join(path, "doas")
  168. _, err := os.Create(doas)
  169. os.Chmod(doas, 0o755)
  170. require.NoError(t, err)
  171. sudo := filepath.Join(path, "sudo")
  172. _, err = os.Create(sudo)
  173. os.Chmod(sudo, 0o755)
  174. require.NoError(t, err)
  175. config := DefaultConfig("test")
  176. config.SudoBin = "sudo"
  177. config.SudoLoop = true
  178. config.SudoFlags = "-v"
  179. os.Setenv("PACMAN_AUTH", "doas")
  180. os.Setenv("PATH", path)
  181. err = config.setPrivilegeElevator()
  182. os.Setenv("PATH", oldPath)
  183. assert.NoError(t, err)
  184. assert.Equal(t, "doas", config.SudoBin)
  185. assert.Equal(t, "", config.SudoFlags)
  186. assert.False(t, config.SudoLoop)
  187. }
  188. // GIVEN config with doas configed and sudo loop enabled
  189. // GIVEN sudo as PACMAN_AUTH env variable
  190. // WHEN setPrivilegeElevator gets called
  191. // THEN sudobin should be changed to "sudo"
  192. func TestConfiguration_setPrivilegeElevator_pacman_auth_sudo(t *testing.T) {
  193. oldPath := os.Getenv("PATH")
  194. path := t.TempDir()
  195. doas := filepath.Join(path, "doas")
  196. _, err := os.Create(doas)
  197. os.Chmod(doas, 0o755)
  198. require.NoError(t, err)
  199. sudo := filepath.Join(path, "sudo")
  200. _, err = os.Create(sudo)
  201. os.Chmod(sudo, 0o755)
  202. require.NoError(t, err)
  203. config := DefaultConfig("test")
  204. config.SudoBin = "doas"
  205. config.SudoLoop = true
  206. config.SudoFlags = "-v"
  207. os.Setenv("PACMAN_AUTH", "sudo")
  208. os.Setenv("PATH", path)
  209. err = config.setPrivilegeElevator()
  210. os.Setenv("PATH", oldPath)
  211. assert.NoError(t, err)
  212. assert.Equal(t, "sudo", config.SudoBin)
  213. assert.Equal(t, "-v", config.SudoFlags)
  214. assert.True(t, config.SudoLoop)
  215. }