test_environment.py 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. from flexmock import flexmock
  2. from borgmatic.borg import environment as module
  3. def test_make_environment_with_passcommand_should_call_it_and_set_passphrase_file_descriptor_in_environment():
  4. flexmock(module.os).should_receive('environ').and_return(
  5. {'USER': 'root', 'BORG_PASSCOMMAND': 'nope'}
  6. )
  7. flexmock(module.borgmatic.hooks.credential.parse).should_receive(
  8. 'resolve_credential'
  9. ).and_return(None)
  10. flexmock(module.borgmatic.borg.passcommand).should_receive(
  11. 'get_passphrase_from_passcommand'
  12. ).and_return('passphrase')
  13. flexmock(module.os).should_receive('pipe').and_return((3, 4))
  14. flexmock(module.os).should_receive('write')
  15. flexmock(module.os).should_receive('close')
  16. flexmock(module.os).should_receive('set_inheritable')
  17. environment = module.make_environment({'encryption_passcommand': 'command'})
  18. assert environment.get('BORG_PASSPHRASE') is None
  19. assert environment.get('BORG_PASSCOMMAND') is None
  20. assert environment.get('BORG_PASSPHRASE_FD') == '3'
  21. def test_make_environment_with_passphrase_should_set_passphrase_file_descriptor_in_environment():
  22. flexmock(module.os).should_receive('environ').and_return(
  23. {'USER': 'root', 'BORG_PASSPHRASE': 'nope', 'BORG_PASSCOMMAND': 'nope'}
  24. )
  25. flexmock(module.borgmatic.hooks.credential.parse).should_receive(
  26. 'resolve_credential'
  27. ).replace_with(lambda value, config: value)
  28. flexmock(module.borgmatic.borg.passcommand).should_receive(
  29. 'get_passphrase_from_passcommand'
  30. ).and_return(None)
  31. flexmock(module.os).should_receive('pipe').and_return((3, 4))
  32. flexmock(module.os).should_receive('write')
  33. flexmock(module.os).should_receive('close')
  34. flexmock(module.os).should_receive('set_inheritable')
  35. environment = module.make_environment({'encryption_passphrase': 'pass'})
  36. assert environment.get('BORG_PASSPHRASE') is None
  37. assert environment.get('BORG_PASSCOMMAND') is None
  38. assert environment.get('BORG_PASSPHRASE_FD') == '3'
  39. def test_make_environment_with_credential_tag_passphrase_should_load_it_and_set_passphrase_file_descriptor_in_environment():
  40. flexmock(module.os).should_receive('environ').and_return({'USER': 'root'})
  41. config = {'encryption_passphrase': '{credential systemd pass}'}
  42. flexmock(module.borgmatic.hooks.credential.parse).should_receive(
  43. 'resolve_credential',
  44. ).with_args('{credential systemd pass}', config).and_return('pass')
  45. flexmock(module.borgmatic.borg.passcommand).should_receive(
  46. 'get_passphrase_from_passcommand'
  47. ).never()
  48. flexmock(module.os).should_receive('pipe').and_return((3, 4))
  49. flexmock(module.os).should_receive('write')
  50. flexmock(module.os).should_receive('close')
  51. flexmock(module.os).should_receive('set_inheritable')
  52. environment = module.make_environment(config)
  53. assert environment.get('BORG_PASSPHRASE') is None
  54. assert environment.get('BORG_PASSPHRASE_FD') == '3'
  55. def test_make_environment_with_ssh_command_should_set_environment():
  56. flexmock(module.os).should_receive('environ').and_return({'USER': 'root'})
  57. flexmock(module.borgmatic.hooks.credential.parse).should_receive(
  58. 'resolve_credential'
  59. ).and_return(None)
  60. flexmock(module.os).should_receive('pipe').never()
  61. environment = module.make_environment({'ssh_command': 'ssh -C'})
  62. assert environment.get('BORG_RSH') == 'ssh -C'
  63. def test_make_environment_without_configuration_sets_certain_environment_variables():
  64. flexmock(module.os).should_receive('environ').and_return({'USER': 'root'})
  65. flexmock(module.borgmatic.hooks.credential.parse).should_receive(
  66. 'resolve_credential'
  67. ).and_return(None)
  68. flexmock(module.os).should_receive('pipe').never()
  69. environment = module.make_environment({})
  70. # Default environment variables.
  71. assert environment == {
  72. 'USER': 'root',
  73. 'BORG_EXIT_CODES': 'modern',
  74. 'BORG_RELOCATED_REPO_ACCESS_IS_OK': 'NO',
  75. 'BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK': 'NO',
  76. 'BORG_USE_CHUNKS_ARCHIVE': 'NO',
  77. 'BORG_DEBUG_PASSPHRASE': 'NO',
  78. 'BORG_DISPLAY_PASSPHRASE': 'NO',
  79. }
  80. def test_make_environment_without_configuration_passes_through_default_environment_variables_untouched():
  81. flexmock(module.os).should_receive('environ').and_return(
  82. {
  83. 'USER': 'root',
  84. 'BORG_RELOCATED_REPO_ACCESS_IS_OK': 'yup',
  85. 'BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK': 'nah',
  86. 'BORG_USE_CHUNKS_ARCHIVE': 'yup',
  87. 'BORG_DEBUG_PASSPHRASE': 'nah',
  88. 'BORG_DISPLAY_PASSPHRASE': 'yup',
  89. }
  90. )
  91. flexmock(module.borgmatic.hooks.credential.parse).should_receive(
  92. 'resolve_credential'
  93. ).and_return(None)
  94. flexmock(module.os).should_receive('pipe').never()
  95. environment = module.make_environment({})
  96. assert environment == {
  97. 'USER': 'root',
  98. 'BORG_RELOCATED_REPO_ACCESS_IS_OK': 'yup',
  99. 'BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK': 'nah',
  100. 'BORG_USE_CHUNKS_ARCHIVE': 'yup',
  101. 'BORG_DEBUG_PASSPHRASE': 'nah',
  102. 'BORG_DISPLAY_PASSPHRASE': 'yup',
  103. 'BORG_EXIT_CODES': 'modern',
  104. }
  105. def test_make_environment_with_relocated_repo_access_true_should_set_environment_YES():
  106. flexmock(module.os).should_receive('environ').and_return({'USER': 'root'})
  107. flexmock(module.borgmatic.hooks.credential.parse).should_receive(
  108. 'resolve_credential'
  109. ).and_return(None)
  110. flexmock(module.os).should_receive('pipe').never()
  111. environment = module.make_environment({'relocated_repo_access_is_ok': True})
  112. assert environment.get('BORG_RELOCATED_REPO_ACCESS_IS_OK') == 'YES'
  113. def test_make_environment_with_relocated_repo_access_false_should_set_environment_NO():
  114. flexmock(module.os).should_receive('environ').and_return({'USER': 'root'})
  115. flexmock(module.borgmatic.hooks.credential.parse).should_receive(
  116. 'resolve_credential'
  117. ).and_return(None)
  118. flexmock(module.os).should_receive('pipe').never()
  119. environment = module.make_environment({'relocated_repo_access_is_ok': False})
  120. assert environment.get('BORG_RELOCATED_REPO_ACCESS_IS_OK') == 'NO'
  121. def test_make_environment_check_i_know_what_i_am_doing_true_should_set_environment_YES():
  122. flexmock(module.os).should_receive('environ').and_return({'USER': 'root'})
  123. flexmock(module.borgmatic.hooks.credential.parse).should_receive(
  124. 'resolve_credential'
  125. ).and_return(None)
  126. flexmock(module.os).should_receive('pipe').never()
  127. environment = module.make_environment({'check_i_know_what_i_am_doing': True})
  128. assert environment.get('BORG_CHECK_I_KNOW_WHAT_I_AM_DOING') == 'YES'
  129. def test_make_environment_check_i_know_what_i_am_doing_false_should_set_environment_NO():
  130. flexmock(module.os).should_receive('environ').and_return({'USER': 'root'})
  131. flexmock(module.borgmatic.hooks.credential.parse).should_receive(
  132. 'resolve_credential'
  133. ).and_return(None)
  134. flexmock(module.os).should_receive('pipe').never()
  135. environment = module.make_environment({'check_i_know_what_i_am_doing': False})
  136. assert environment.get('BORG_CHECK_I_KNOW_WHAT_I_AM_DOING') == 'NO'
  137. def test_make_environment_debug_passphrase_true_should_set_environment_YES():
  138. flexmock(module.os).should_receive('environ').and_return({'USER': 'root'})
  139. flexmock(module.borgmatic.hooks.credential.parse).should_receive(
  140. 'resolve_credential'
  141. ).and_return(None)
  142. flexmock(module.os).should_receive('pipe').never()
  143. environment = module.make_environment({'debug_passphrase': True})
  144. assert environment.get('BORG_DEBUG_PASSPHRASE') == 'YES'
  145. def test_make_environment_debug_passphrase_false_should_set_environment_NO():
  146. flexmock(module.os).should_receive('environ').and_return({'USER': 'root'})
  147. flexmock(module.borgmatic.hooks.credential.parse).should_receive(
  148. 'resolve_credential'
  149. ).and_return(None)
  150. flexmock(module.os).should_receive('pipe').never()
  151. environment = module.make_environment({'debug_passphrase': False})
  152. assert environment.get('BORG_DEBUG_PASSPHRASE') == 'NO'
  153. def test_make_environment_display_passphrase_true_should_set_environment_YES():
  154. flexmock(module.os).should_receive('environ').and_return({'USER': 'root'})
  155. flexmock(module.borgmatic.hooks.credential.parse).should_receive(
  156. 'resolve_credential'
  157. ).and_return(None)
  158. flexmock(module.os).should_receive('pipe').never()
  159. environment = module.make_environment({'display_passphrase': True})
  160. assert environment.get('BORG_DISPLAY_PASSPHRASE') == 'YES'
  161. def test_make_environment_display_passphrase_false_should_set_environment_NO():
  162. flexmock(module.os).should_receive('environ').and_return({'USER': 'root'})
  163. flexmock(module.borgmatic.hooks.credential.parse).should_receive(
  164. 'resolve_credential'
  165. ).and_return(None)
  166. flexmock(module.os).should_receive('pipe').never()
  167. environment = module.make_environment({'display_passphrase': False})
  168. assert environment.get('BORG_DISPLAY_PASSPHRASE') == 'NO'
  169. def test_make_environment_with_integer_variable_value():
  170. flexmock(module.os).should_receive('environ').and_return({'USER': 'root'})
  171. flexmock(module.borgmatic.hooks.credential.parse).should_receive(
  172. 'resolve_credential'
  173. ).and_return(None)
  174. flexmock(module.os).should_receive('pipe').never()
  175. environment = module.make_environment({'borg_files_cache_ttl': 40})
  176. assert environment.get('BORG_FILES_CACHE_TTL') == '40'
  177. def test_make_environment_with_use_chunks_archive_should_set_correct_environment_value():
  178. flexmock(module.os).should_receive('environ').and_return({'USER': 'root'})
  179. flexmock(module.borgmatic.hooks.credential.parse).should_receive(
  180. 'resolve_credential'
  181. ).and_return(None)
  182. flexmock(module.os).should_receive('pipe').never()
  183. environment = module.make_environment({'use_chunks_archive': True})
  184. assert environment.get('BORG_USE_CHUNKS_ARCHIVE') == 'YES'
  185. environment = module.make_environment({'use_chunks_archive': False})
  186. assert environment.get('BORG_USE_CHUNKS_ARCHIVE') == 'NO'