config_test.go 6.6 KB

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