test_environment.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  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. }
  78. def test_make_environment_without_configuration_passes_through_default_environment_variables_untouched():
  79. flexmock(module.os).should_receive('environ').and_return(
  80. {
  81. 'USER': 'root',
  82. 'BORG_RELOCATED_REPO_ACCESS_IS_OK': 'yup',
  83. 'BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK': 'nah',
  84. 'BORG_USE_CHUNKS_ARCHIVE': 'yup',
  85. }
  86. )
  87. flexmock(module.borgmatic.hooks.credential.parse).should_receive(
  88. 'resolve_credential'
  89. ).and_return(None)
  90. flexmock(module.os).should_receive('pipe').never()
  91. environment = module.make_environment({})
  92. assert environment == {
  93. 'USER': 'root',
  94. 'BORG_RELOCATED_REPO_ACCESS_IS_OK': 'yup',
  95. 'BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK': 'nah',
  96. 'BORG_USE_CHUNKS_ARCHIVE': 'yup',
  97. 'BORG_EXIT_CODES': 'modern',
  98. }
  99. def test_make_environment_with_relocated_repo_access_true_should_set_environment_yes():
  100. flexmock(module.os).should_receive('environ').and_return({'USER': 'root'})
  101. flexmock(module.borgmatic.hooks.credential.parse).should_receive(
  102. 'resolve_credential'
  103. ).and_return(None)
  104. flexmock(module.os).should_receive('pipe').never()
  105. environment = module.make_environment({'relocated_repo_access_is_ok': True})
  106. assert environment.get('BORG_RELOCATED_REPO_ACCESS_IS_OK') == 'yes'
  107. def test_make_environment_with_relocated_repo_access_false_should_set_environment_no():
  108. flexmock(module.os).should_receive('environ').and_return({'USER': 'root'})
  109. flexmock(module.borgmatic.hooks.credential.parse).should_receive(
  110. 'resolve_credential'
  111. ).and_return(None)
  112. flexmock(module.os).should_receive('pipe').never()
  113. environment = module.make_environment({'relocated_repo_access_is_ok': False})
  114. assert environment.get('BORG_RELOCATED_REPO_ACCESS_IS_OK') == 'no'
  115. def test_make_environment_check_i_know_what_i_am_doing_true_should_set_environment_YES():
  116. flexmock(module.os).should_receive('environ').and_return({'USER': 'root'})
  117. flexmock(module.borgmatic.hooks.credential.parse).should_receive(
  118. 'resolve_credential'
  119. ).and_return(None)
  120. flexmock(module.os).should_receive('pipe').never()
  121. environment = module.make_environment({'check_i_know_what_i_am_doing': True})
  122. assert environment.get('BORG_CHECK_I_KNOW_WHAT_I_AM_DOING') == 'YES'
  123. def test_make_environment_check_i_know_what_i_am_doing_false_should_set_environment_NO():
  124. flexmock(module.os).should_receive('environ').and_return({'USER': 'root'})
  125. flexmock(module.borgmatic.hooks.credential.parse).should_receive(
  126. 'resolve_credential'
  127. ).and_return(None)
  128. flexmock(module.os).should_receive('pipe').never()
  129. environment = module.make_environment({'check_i_know_what_i_am_doing': False})
  130. assert environment.get('BORG_CHECK_I_KNOW_WHAT_I_AM_DOING') == 'NO'
  131. def test_make_environment_with_integer_variable_value():
  132. flexmock(module.os).should_receive('environ').and_return({'USER': 'root'})
  133. flexmock(module.borgmatic.hooks.credential.parse).should_receive(
  134. 'resolve_credential'
  135. ).and_return(None)
  136. flexmock(module.os).should_receive('pipe').never()
  137. environment = module.make_environment({'borg_files_cache_ttl': 40})
  138. assert environment.get('BORG_FILES_CACHE_TTL') == '40'
  139. def test_make_environment_with_use_chunks_archive_should_set_correct_environment_value():
  140. flexmock(module.os).should_receive('environ').and_return({'USER': 'root'})
  141. environment = module.make_environment({'use_chunks_archive': True})
  142. assert environment.get('BORG_USE_CHUNKS_ARCHIVE') == 'yes'
  143. environment = module.make_environment({'use_chunks_archive': False})
  144. assert environment.get('BORG_USE_CHUNKS_ARCHIVE') == 'no'