config_test.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. package settings
  2. import (
  3. "encoding/json"
  4. "os"
  5. "path/filepath"
  6. "testing"
  7. "github.com/stretchr/testify/assert"
  8. )
  9. // GIVEN a non existing build dir in the config
  10. // WHEN the config is loaded
  11. // THEN the directory should be created
  12. func TestNewConfig(t *testing.T) {
  13. configDir, err := os.MkdirTemp(os.TempDir(), "yay-config-home")
  14. assert.NoError(t, err)
  15. err = os.MkdirAll(filepath.Join(configDir, "yay"), 0o755)
  16. assert.NoError(t, err)
  17. os.Setenv("XDG_CONFIG_HOME", configDir)
  18. cacheDir, err := os.MkdirTemp(os.TempDir(), "yay-cache-home")
  19. assert.NoError(t, err)
  20. config := map[string]string{"BuildDir": filepath.Join(cacheDir, "test-build-dir")}
  21. f, err := os.Create(filepath.Join(configDir, "yay", "config.json"))
  22. assert.NoError(t, err)
  23. defer f.Close()
  24. configJSON, _ := json.Marshal(config)
  25. _, err = f.WriteString(string(configJSON))
  26. assert.NoError(t, err)
  27. newConfig, err := NewConfig("v1.0.0")
  28. assert.NoError(t, err)
  29. assert.Equal(t, filepath.Join(cacheDir, "test-build-dir"), newConfig.BuildDir)
  30. _, err = os.Stat(filepath.Join(cacheDir, "test-build-dir"))
  31. assert.NoError(t, err)
  32. }
  33. // GIVEN a non existing build dir in the config and AURDEST set to a non-existing folder
  34. // WHEN the config is loaded
  35. // THEN the directory of AURDEST should be created and selected
  36. func TestNewConfigAURDEST(t *testing.T) {
  37. configDir, err := os.MkdirTemp(os.TempDir(), "yay-config-home")
  38. assert.NoError(t, err)
  39. err = os.MkdirAll(filepath.Join(configDir, "yay"), 0o755)
  40. assert.NoError(t, err)
  41. os.Setenv("XDG_CONFIG_HOME", configDir)
  42. cacheDir, err := os.MkdirTemp(os.TempDir(), "yay-cache-home")
  43. assert.NoError(t, err)
  44. config := map[string]string{"BuildDir": filepath.Join(cacheDir, "test-other-dir")}
  45. os.Setenv("AURDEST", filepath.Join(cacheDir, "test-build-dir"))
  46. f, err := os.Create(filepath.Join(configDir, "yay", "config.json"))
  47. assert.NoError(t, err)
  48. defer f.Close()
  49. configJSON, _ := json.Marshal(config)
  50. _, err = f.WriteString(string(configJSON))
  51. assert.NoError(t, err)
  52. newConfig, err := NewConfig("v1.0.0")
  53. assert.NoError(t, err)
  54. assert.Equal(t, filepath.Join(cacheDir, "test-build-dir"), newConfig.BuildDir)
  55. _, err = os.Stat(filepath.Join(cacheDir, "test-build-dir"))
  56. assert.NoError(t, err)
  57. }
  58. // GIVEN default config
  59. // WHEN setPrivilegeElevator gets called
  60. // THEN sudobin should stay as "sudo" (given sudo exists)
  61. func TestConfiguration_setPrivilegeElevator(t *testing.T) {
  62. oldPath := os.Getenv("PATH")
  63. path, err := os.MkdirTemp("", "yay-test")
  64. assert.NoError(t, err)
  65. doas := filepath.Join(path, "sudo")
  66. _, err = os.Create(doas)
  67. os.Chmod(doas, 0o755)
  68. assert.NoError(t, err)
  69. defer os.RemoveAll(path)
  70. config := DefaultConfig()
  71. config.SudoLoop = true
  72. config.SudoFlags = "-v"
  73. os.Setenv("PATH", path)
  74. err = config.setPrivilegeElevator()
  75. os.Setenv("PATH", oldPath)
  76. assert.NoError(t, err)
  77. assert.Equal(t, "sudo", config.SudoBin)
  78. assert.Equal(t, "-v", config.SudoFlags)
  79. assert.True(t, config.SudoLoop)
  80. }
  81. // GIVEN default config and sudo loop enabled
  82. // GIVEN only su in path
  83. // WHEN setPrivilegeElevator gets called
  84. // THEN sudobin should be changed to "su"
  85. func TestConfiguration_setPrivilegeElevator_su(t *testing.T) {
  86. oldPath := os.Getenv("PATH")
  87. path, err := os.MkdirTemp("", "yay-test")
  88. assert.NoError(t, err)
  89. doas := filepath.Join(path, "su")
  90. _, err = os.Create(doas)
  91. os.Chmod(doas, 0o755)
  92. assert.NoError(t, err)
  93. defer os.RemoveAll(path)
  94. config := DefaultConfig()
  95. config.SudoLoop = true
  96. config.SudoFlags = "-v"
  97. os.Setenv("PATH", path)
  98. err = config.setPrivilegeElevator()
  99. os.Setenv("PATH", oldPath)
  100. assert.NoError(t, err)
  101. assert.Equal(t, "su", config.SudoBin)
  102. assert.Equal(t, "", config.SudoFlags)
  103. assert.False(t, config.SudoLoop)
  104. }
  105. // GIVEN default config and sudo loop enabled
  106. // GIVEN no sudo in path
  107. // WHEN setPrivilegeElevator gets called
  108. // THEN sudobin should be changed to "su"
  109. func TestConfiguration_setPrivilegeElevator_no_path(t *testing.T) {
  110. oldPath := os.Getenv("PATH")
  111. os.Setenv("PATH", "")
  112. config := DefaultConfig()
  113. config.SudoLoop = true
  114. config.SudoFlags = "-v"
  115. err := config.setPrivilegeElevator()
  116. os.Setenv("PATH", oldPath)
  117. assert.Error(t, err)
  118. assert.Equal(t, "sudo", config.SudoBin)
  119. assert.Equal(t, "", config.SudoFlags)
  120. assert.False(t, config.SudoLoop)
  121. }
  122. // GIVEN default config and sudo loop enabled
  123. // GIVEN doas in path
  124. // WHEN setPrivilegeElevator gets called
  125. // THEN sudobin should be changed to "doas"
  126. func TestConfiguration_setPrivilegeElevator_doas(t *testing.T) {
  127. oldPath := os.Getenv("PATH")
  128. path, err := os.MkdirTemp("", "yay-test")
  129. assert.NoError(t, err)
  130. doas := filepath.Join(path, "doas")
  131. _, err = os.Create(doas)
  132. os.Chmod(doas, 0o755)
  133. assert.NoError(t, err)
  134. defer os.RemoveAll(path)
  135. config := DefaultConfig()
  136. config.SudoLoop = true
  137. config.SudoFlags = "-v"
  138. os.Setenv("PATH", path)
  139. err = config.setPrivilegeElevator()
  140. os.Setenv("PATH", oldPath)
  141. assert.NoError(t, err)
  142. assert.Equal(t, "doas", config.SudoBin)
  143. assert.Equal(t, "", config.SudoFlags)
  144. assert.False(t, config.SudoLoop)
  145. }
  146. // GIVEN config with wrapper and sudo loop enabled
  147. // GIVEN wrapper is in path
  148. // WHEN setPrivilegeElevator gets called
  149. // THEN sudobin should be kept as the wrapper
  150. func TestConfiguration_setPrivilegeElevator_custom_script(t *testing.T) {
  151. oldPath := os.Getenv("PATH")
  152. path, err := os.MkdirTemp("", "yay-test")
  153. assert.NoError(t, err)
  154. wrapper := filepath.Join(path, "custom-wrapper")
  155. _, err = os.Create(wrapper)
  156. os.Chmod(wrapper, 0o755)
  157. assert.NoError(t, err)
  158. defer os.RemoveAll(path)
  159. config := DefaultConfig()
  160. config.SudoLoop = true
  161. config.SudoBin = wrapper
  162. config.SudoFlags = "-v"
  163. os.Setenv("PATH", path)
  164. err = config.setPrivilegeElevator()
  165. os.Setenv("PATH", oldPath)
  166. assert.NoError(t, err)
  167. assert.Equal(t, wrapper, config.SudoBin)
  168. assert.Equal(t, "-v", config.SudoFlags)
  169. assert.True(t, config.SudoLoop)
  170. }