test_extract.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644
  1. import logging
  2. import pytest
  3. from flexmock import flexmock
  4. from borgmatic.borg import extract as module
  5. from ..test_verbosity import insert_logging_mock
  6. def insert_execute_command_mock(command, working_directory=None, borg_exit_codes=None):
  7. flexmock(module.environment).should_receive('make_environment')
  8. flexmock(module).should_receive('execute_command').with_args(
  9. command,
  10. working_directory=working_directory,
  11. extra_environment=None,
  12. borg_local_path=command[0],
  13. borg_exit_codes=borg_exit_codes,
  14. ).once()
  15. def test_extract_last_archive_dry_run_calls_borg_with_last_archive():
  16. flexmock(module.rlist).should_receive('resolve_archive_name').and_return('archive')
  17. insert_execute_command_mock(('borg', 'extract', '--dry-run', 'repo::archive'))
  18. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  19. ('repo::archive',)
  20. )
  21. module.extract_last_archive_dry_run(
  22. config={},
  23. local_borg_version='1.2.3',
  24. global_arguments=flexmock(log_json=False),
  25. repository_path='repo',
  26. lock_wait=None,
  27. )
  28. def test_extract_last_archive_dry_run_without_any_archives_should_not_raise():
  29. flexmock(module.rlist).should_receive('resolve_archive_name').and_raise(ValueError)
  30. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(('repo',))
  31. module.extract_last_archive_dry_run(
  32. config={},
  33. local_borg_version='1.2.3',
  34. global_arguments=flexmock(log_json=False),
  35. repository_path='repo',
  36. lock_wait=None,
  37. )
  38. def test_extract_last_archive_dry_run_with_log_info_calls_borg_with_info_parameter():
  39. flexmock(module.rlist).should_receive('resolve_archive_name').and_return('archive')
  40. insert_execute_command_mock(('borg', 'extract', '--dry-run', '--info', 'repo::archive'))
  41. insert_logging_mock(logging.INFO)
  42. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  43. ('repo::archive',)
  44. )
  45. module.extract_last_archive_dry_run(
  46. config={},
  47. local_borg_version='1.2.3',
  48. global_arguments=flexmock(log_json=False),
  49. repository_path='repo',
  50. lock_wait=None,
  51. )
  52. def test_extract_last_archive_dry_run_with_log_debug_calls_borg_with_debug_parameter():
  53. flexmock(module.rlist).should_receive('resolve_archive_name').and_return('archive')
  54. insert_execute_command_mock(
  55. ('borg', 'extract', '--dry-run', '--debug', '--show-rc', '--list', 'repo::archive')
  56. )
  57. insert_logging_mock(logging.DEBUG)
  58. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  59. ('repo::archive',)
  60. )
  61. module.extract_last_archive_dry_run(
  62. config={},
  63. local_borg_version='1.2.3',
  64. global_arguments=flexmock(log_json=False),
  65. repository_path='repo',
  66. lock_wait=None,
  67. )
  68. def test_extract_last_archive_dry_run_calls_borg_via_local_path():
  69. flexmock(module.rlist).should_receive('resolve_archive_name').and_return('archive')
  70. insert_execute_command_mock(('borg1', 'extract', '--dry-run', 'repo::archive'))
  71. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  72. ('repo::archive',)
  73. )
  74. module.extract_last_archive_dry_run(
  75. config={},
  76. local_borg_version='1.2.3',
  77. global_arguments=flexmock(log_json=False),
  78. repository_path='repo',
  79. lock_wait=None,
  80. local_path='borg1',
  81. )
  82. def test_extract_last_archive_dry_run_calls_borg_using_exit_codes():
  83. flexmock(module.rlist).should_receive('resolve_archive_name').and_return('archive')
  84. borg_exit_codes = flexmock()
  85. insert_execute_command_mock(
  86. ('borg', 'extract', '--dry-run', 'repo::archive'), borg_exit_codes=borg_exit_codes
  87. )
  88. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  89. ('repo::archive',)
  90. )
  91. module.extract_last_archive_dry_run(
  92. config={'borg_exit_codes': borg_exit_codes},
  93. local_borg_version='1.2.3',
  94. global_arguments=flexmock(log_json=False),
  95. repository_path='repo',
  96. lock_wait=None,
  97. )
  98. def test_extract_last_archive_dry_run_calls_borg_with_remote_path_flags():
  99. flexmock(module.rlist).should_receive('resolve_archive_name').and_return('archive')
  100. insert_execute_command_mock(
  101. ('borg', 'extract', '--dry-run', '--remote-path', 'borg1', 'repo::archive')
  102. )
  103. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  104. ('repo::archive',)
  105. )
  106. module.extract_last_archive_dry_run(
  107. config={},
  108. local_borg_version='1.2.3',
  109. global_arguments=flexmock(log_json=False),
  110. repository_path='repo',
  111. lock_wait=None,
  112. remote_path='borg1',
  113. )
  114. def test_extract_last_archive_dry_run_calls_borg_with_log_json_flag():
  115. flexmock(module.rlist).should_receive('resolve_archive_name').and_return('archive')
  116. insert_execute_command_mock(('borg', 'extract', '--dry-run', '--log-json', 'repo::archive'))
  117. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  118. ('repo::archive',)
  119. )
  120. module.extract_last_archive_dry_run(
  121. config={},
  122. local_borg_version='1.2.3',
  123. global_arguments=flexmock(log_json=True),
  124. repository_path='repo',
  125. lock_wait=None,
  126. )
  127. def test_extract_last_archive_dry_run_calls_borg_with_lock_wait_flags():
  128. flexmock(module.rlist).should_receive('resolve_archive_name').and_return('archive')
  129. insert_execute_command_mock(
  130. ('borg', 'extract', '--dry-run', '--lock-wait', '5', 'repo::archive')
  131. )
  132. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  133. ('repo::archive',)
  134. )
  135. module.extract_last_archive_dry_run(
  136. config={},
  137. local_borg_version='1.2.3',
  138. global_arguments=flexmock(log_json=False),
  139. repository_path='repo',
  140. lock_wait=5,
  141. )
  142. def test_extract_archive_calls_borg_with_path_flags():
  143. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  144. insert_execute_command_mock(('borg', 'extract', 'repo::archive', 'path1', 'path2'))
  145. flexmock(module.feature).should_receive('available').and_return(True)
  146. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  147. ('repo::archive',)
  148. )
  149. flexmock(module.borgmatic.config.validate).should_receive(
  150. 'normalize_repository_path'
  151. ).and_return('repo')
  152. module.extract_archive(
  153. dry_run=False,
  154. repository='repo',
  155. archive='archive',
  156. paths=['path1', 'path2'],
  157. config={},
  158. local_borg_version='1.2.3',
  159. global_arguments=flexmock(log_json=False),
  160. )
  161. def test_extract_archive_calls_borg_with_local_path():
  162. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  163. insert_execute_command_mock(('borg1', 'extract', 'repo::archive'))
  164. flexmock(module.feature).should_receive('available').and_return(True)
  165. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  166. ('repo::archive',)
  167. )
  168. flexmock(module.borgmatic.config.validate).should_receive(
  169. 'normalize_repository_path'
  170. ).and_return('repo')
  171. module.extract_archive(
  172. dry_run=False,
  173. repository='repo',
  174. archive='archive',
  175. paths=None,
  176. config={},
  177. local_borg_version='1.2.3',
  178. global_arguments=flexmock(log_json=False),
  179. local_path='borg1',
  180. )
  181. def test_extract_archive_calls_borg_with_exit_codes():
  182. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  183. borg_exit_codes = flexmock()
  184. insert_execute_command_mock(
  185. ('borg', 'extract', 'repo::archive'), borg_exit_codes=borg_exit_codes
  186. )
  187. flexmock(module.feature).should_receive('available').and_return(True)
  188. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  189. ('repo::archive',)
  190. )
  191. flexmock(module.borgmatic.config.validate).should_receive(
  192. 'normalize_repository_path'
  193. ).and_return('repo')
  194. module.extract_archive(
  195. dry_run=False,
  196. repository='repo',
  197. archive='archive',
  198. paths=None,
  199. config={'borg_exit_codes': borg_exit_codes},
  200. local_borg_version='1.2.3',
  201. global_arguments=flexmock(log_json=False),
  202. )
  203. def test_extract_archive_calls_borg_with_remote_path_flags():
  204. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  205. insert_execute_command_mock(('borg', 'extract', '--remote-path', 'borg1', 'repo::archive'))
  206. flexmock(module.feature).should_receive('available').and_return(True)
  207. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  208. ('repo::archive',)
  209. )
  210. flexmock(module.borgmatic.config.validate).should_receive(
  211. 'normalize_repository_path'
  212. ).and_return('repo')
  213. module.extract_archive(
  214. dry_run=False,
  215. repository='repo',
  216. archive='archive',
  217. paths=None,
  218. config={},
  219. local_borg_version='1.2.3',
  220. global_arguments=flexmock(log_json=False),
  221. remote_path='borg1',
  222. )
  223. @pytest.mark.parametrize(
  224. 'feature_available,option_flag',
  225. (
  226. (True, '--numeric-ids'),
  227. (False, '--numeric-owner'),
  228. ),
  229. )
  230. def test_extract_archive_calls_borg_with_numeric_ids_parameter(feature_available, option_flag):
  231. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  232. insert_execute_command_mock(('borg', 'extract', option_flag, 'repo::archive'))
  233. flexmock(module.feature).should_receive('available').and_return(feature_available)
  234. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  235. ('repo::archive',)
  236. )
  237. flexmock(module.borgmatic.config.validate).should_receive(
  238. 'normalize_repository_path'
  239. ).and_return('repo')
  240. module.extract_archive(
  241. dry_run=False,
  242. repository='repo',
  243. archive='archive',
  244. paths=None,
  245. config={'numeric_ids': True},
  246. local_borg_version='1.2.3',
  247. global_arguments=flexmock(log_json=False),
  248. )
  249. def test_extract_archive_calls_borg_with_umask_flags():
  250. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  251. insert_execute_command_mock(('borg', 'extract', '--umask', '0770', 'repo::archive'))
  252. flexmock(module.feature).should_receive('available').and_return(True)
  253. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  254. ('repo::archive',)
  255. )
  256. flexmock(module.borgmatic.config.validate).should_receive(
  257. 'normalize_repository_path'
  258. ).and_return('repo')
  259. module.extract_archive(
  260. dry_run=False,
  261. repository='repo',
  262. archive='archive',
  263. paths=None,
  264. config={'umask': '0770'},
  265. local_borg_version='1.2.3',
  266. global_arguments=flexmock(log_json=False),
  267. )
  268. def test_extract_archive_calls_borg_with_log_json_flags():
  269. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  270. insert_execute_command_mock(('borg', 'extract', '--log-json', 'repo::archive'))
  271. flexmock(module.feature).should_receive('available').and_return(True)
  272. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  273. ('repo::archive',)
  274. )
  275. module.extract_archive(
  276. dry_run=False,
  277. repository='repo',
  278. archive='archive',
  279. paths=None,
  280. config={},
  281. local_borg_version='1.2.3',
  282. global_arguments=flexmock(log_json=True),
  283. )
  284. def test_extract_archive_calls_borg_with_lock_wait_flags():
  285. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  286. insert_execute_command_mock(('borg', 'extract', '--lock-wait', '5', 'repo::archive'))
  287. flexmock(module.feature).should_receive('available').and_return(True)
  288. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  289. ('repo::archive',)
  290. )
  291. flexmock(module.borgmatic.config.validate).should_receive(
  292. 'normalize_repository_path'
  293. ).and_return('repo')
  294. module.extract_archive(
  295. dry_run=False,
  296. repository='repo',
  297. archive='archive',
  298. paths=None,
  299. config={'lock_wait': '5'},
  300. local_borg_version='1.2.3',
  301. global_arguments=flexmock(log_json=False),
  302. )
  303. def test_extract_archive_with_log_info_calls_borg_with_info_parameter():
  304. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  305. insert_execute_command_mock(('borg', 'extract', '--info', 'repo::archive'))
  306. insert_logging_mock(logging.INFO)
  307. flexmock(module.feature).should_receive('available').and_return(True)
  308. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  309. ('repo::archive',)
  310. )
  311. flexmock(module.borgmatic.config.validate).should_receive(
  312. 'normalize_repository_path'
  313. ).and_return('repo')
  314. module.extract_archive(
  315. dry_run=False,
  316. repository='repo',
  317. archive='archive',
  318. paths=None,
  319. config={},
  320. local_borg_version='1.2.3',
  321. global_arguments=flexmock(log_json=False),
  322. )
  323. def test_extract_archive_with_log_debug_calls_borg_with_debug_flags():
  324. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  325. insert_execute_command_mock(
  326. ('borg', 'extract', '--debug', '--list', '--show-rc', 'repo::archive')
  327. )
  328. insert_logging_mock(logging.DEBUG)
  329. flexmock(module.feature).should_receive('available').and_return(True)
  330. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  331. ('repo::archive',)
  332. )
  333. flexmock(module.borgmatic.config.validate).should_receive(
  334. 'normalize_repository_path'
  335. ).and_return('repo')
  336. module.extract_archive(
  337. dry_run=False,
  338. repository='repo',
  339. archive='archive',
  340. paths=None,
  341. config={},
  342. local_borg_version='1.2.3',
  343. global_arguments=flexmock(log_json=False),
  344. )
  345. def test_extract_archive_calls_borg_with_dry_run_parameter():
  346. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  347. insert_execute_command_mock(('borg', 'extract', '--dry-run', 'repo::archive'))
  348. flexmock(module.feature).should_receive('available').and_return(True)
  349. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  350. ('repo::archive',)
  351. )
  352. flexmock(module.borgmatic.config.validate).should_receive(
  353. 'normalize_repository_path'
  354. ).and_return('repo')
  355. module.extract_archive(
  356. dry_run=True,
  357. repository='repo',
  358. archive='archive',
  359. paths=None,
  360. config={},
  361. local_borg_version='1.2.3',
  362. global_arguments=flexmock(log_json=False),
  363. )
  364. def test_extract_archive_calls_borg_with_destination_path():
  365. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  366. insert_execute_command_mock(('borg', 'extract', 'repo::archive'), working_directory='/dest')
  367. flexmock(module.feature).should_receive('available').and_return(True)
  368. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  369. ('repo::archive',)
  370. )
  371. flexmock(module.borgmatic.config.validate).should_receive(
  372. 'normalize_repository_path'
  373. ).and_return('repo')
  374. module.extract_archive(
  375. dry_run=False,
  376. repository='repo',
  377. archive='archive',
  378. paths=None,
  379. config={},
  380. local_borg_version='1.2.3',
  381. global_arguments=flexmock(log_json=False),
  382. destination_path='/dest',
  383. )
  384. def test_extract_archive_calls_borg_with_strip_components():
  385. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  386. insert_execute_command_mock(('borg', 'extract', '--strip-components', '5', 'repo::archive'))
  387. flexmock(module.feature).should_receive('available').and_return(True)
  388. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  389. ('repo::archive',)
  390. )
  391. flexmock(module.borgmatic.config.validate).should_receive(
  392. 'normalize_repository_path'
  393. ).and_return('repo')
  394. module.extract_archive(
  395. dry_run=False,
  396. repository='repo',
  397. archive='archive',
  398. paths=None,
  399. config={},
  400. local_borg_version='1.2.3',
  401. global_arguments=flexmock(log_json=False),
  402. strip_components=5,
  403. )
  404. def test_extract_archive_calls_borg_with_strip_components_calculated_from_all():
  405. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  406. insert_execute_command_mock(
  407. (
  408. 'borg',
  409. 'extract',
  410. '--strip-components',
  411. '2',
  412. 'repo::archive',
  413. 'foo/bar/baz.txt',
  414. 'foo/bar.txt',
  415. )
  416. )
  417. flexmock(module.feature).should_receive('available').and_return(True)
  418. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  419. ('repo::archive',)
  420. )
  421. flexmock(module.borgmatic.config.validate).should_receive(
  422. 'normalize_repository_path'
  423. ).and_return('repo')
  424. module.extract_archive(
  425. dry_run=False,
  426. repository='repo',
  427. archive='archive',
  428. paths=['foo/bar/baz.txt', 'foo/bar.txt'],
  429. config={},
  430. local_borg_version='1.2.3',
  431. global_arguments=flexmock(log_json=False),
  432. strip_components='all',
  433. )
  434. def test_extract_archive_with_strip_components_all_and_no_paths_raises():
  435. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  436. flexmock(module.feature).should_receive('available').and_return(True)
  437. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  438. ('repo::archive',)
  439. )
  440. flexmock(module.borgmatic.config.validate).should_receive(
  441. 'normalize_repository_path'
  442. ).and_return('repo')
  443. flexmock(module).should_receive('execute_command').never()
  444. with pytest.raises(ValueError):
  445. module.extract_archive(
  446. dry_run=False,
  447. repository='repo',
  448. archive='archive',
  449. paths=None,
  450. config={},
  451. local_borg_version='1.2.3',
  452. global_arguments=flexmock(log_json=False),
  453. strip_components='all',
  454. )
  455. def test_extract_archive_calls_borg_with_progress_parameter():
  456. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  457. flexmock(module.environment).should_receive('make_environment')
  458. flexmock(module).should_receive('execute_command').with_args(
  459. ('borg', 'extract', '--progress', 'repo::archive'),
  460. output_file=module.DO_NOT_CAPTURE,
  461. working_directory=None,
  462. extra_environment=None,
  463. borg_local_path='borg',
  464. borg_exit_codes=None,
  465. ).once()
  466. flexmock(module.feature).should_receive('available').and_return(True)
  467. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  468. ('repo::archive',)
  469. )
  470. flexmock(module.borgmatic.config.validate).should_receive(
  471. 'normalize_repository_path'
  472. ).and_return('repo')
  473. module.extract_archive(
  474. dry_run=False,
  475. repository='repo',
  476. archive='archive',
  477. paths=None,
  478. config={},
  479. local_borg_version='1.2.3',
  480. global_arguments=flexmock(log_json=False),
  481. progress=True,
  482. )
  483. def test_extract_archive_with_progress_and_extract_to_stdout_raises():
  484. flexmock(module).should_receive('execute_command').never()
  485. with pytest.raises(ValueError):
  486. module.extract_archive(
  487. dry_run=False,
  488. repository='repo',
  489. archive='archive',
  490. paths=None,
  491. config={},
  492. local_borg_version='1.2.3',
  493. global_arguments=flexmock(log_json=False),
  494. progress=True,
  495. extract_to_stdout=True,
  496. )
  497. def test_extract_archive_calls_borg_with_stdout_parameter_and_returns_process():
  498. flexmock(module.os.path).should_receive('abspath').and_return('repo')
  499. process = flexmock()
  500. flexmock(module.environment).should_receive('make_environment')
  501. flexmock(module).should_receive('execute_command').with_args(
  502. ('borg', 'extract', '--stdout', 'repo::archive'),
  503. output_file=module.subprocess.PIPE,
  504. working_directory=None,
  505. run_to_completion=False,
  506. extra_environment=None,
  507. borg_local_path='borg',
  508. borg_exit_codes=None,
  509. ).and_return(process).once()
  510. flexmock(module.feature).should_receive('available').and_return(True)
  511. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  512. ('repo::archive',)
  513. )
  514. flexmock(module.borgmatic.config.validate).should_receive(
  515. 'normalize_repository_path'
  516. ).and_return('repo')
  517. assert (
  518. module.extract_archive(
  519. dry_run=False,
  520. repository='repo',
  521. archive='archive',
  522. paths=None,
  523. config={},
  524. local_borg_version='1.2.3',
  525. global_arguments=flexmock(log_json=False),
  526. extract_to_stdout=True,
  527. )
  528. == process
  529. )
  530. def test_extract_archive_skips_abspath_for_remote_repository():
  531. flexmock(module.os.path).should_receive('abspath').never()
  532. flexmock(module.environment).should_receive('make_environment')
  533. flexmock(module).should_receive('execute_command').with_args(
  534. ('borg', 'extract', 'server:repo::archive'),
  535. working_directory=None,
  536. extra_environment=None,
  537. borg_local_path='borg',
  538. borg_exit_codes=None,
  539. ).once()
  540. flexmock(module.feature).should_receive('available').and_return(True)
  541. flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
  542. ('server:repo::archive',)
  543. )
  544. flexmock(module.borgmatic.config.validate).should_receive(
  545. 'normalize_repository_path'
  546. ).and_return('repo')
  547. module.extract_archive(
  548. dry_run=False,
  549. repository='server:repo',
  550. archive='archive',
  551. paths=None,
  552. config={},
  553. local_borg_version='1.2.3',
  554. global_arguments=flexmock(log_json=False),
  555. )