test_collection.py 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. import pytest
  2. import os
  3. import duplitab
  4. import datetime
  5. project_root_path = os.path.realpath(os.path.join(__file__, '..', '..'))
  6. test_data_dir_path = os.path.join(project_root_path, 'tests', 'data')
  7. test_collections_dir_path = os.path.join(test_data_dir_path, 'collections')
  8. @pytest.mark.parametrize(('init_kwargs', 'expected_attr'), [
  9. [
  10. {
  11. 'url': 'file://media/backup/a',
  12. },
  13. {
  14. 'url': 'file://media/backup/a',
  15. },
  16. ],
  17. [
  18. {
  19. 'url': 'sftp://user@server//media/backup/阿',
  20. },
  21. {
  22. 'url': 'sftp://user@server//media/backup/阿',
  23. },
  24. ],
  25. ])
  26. def test_collection_init(init_kwargs, expected_attr):
  27. c = duplitab.Collection(**init_kwargs)
  28. for name, value in expected_attr.items():
  29. assert getattr(c, name) == value
  30. @pytest.mark.parametrize(('init_kwargs', 'ex_class'), [
  31. [
  32. {
  33. },
  34. TypeError,
  35. ],
  36. ])
  37. def test_collection_init_fail(init_kwargs, ex_class):
  38. with pytest.raises(ex_class):
  39. duplitab.Collection(**init_kwargs)
  40. @pytest.mark.parametrize(('url', 'expected_status_attr'), [
  41. [
  42. 'file://{}'.format(os.path.join(test_collections_dir_path,
  43. 'empty', 'only-full')),
  44. {
  45. 'primary_chain': duplitab._ChainStatus(
  46. sets=[
  47. duplitab._SetStatus(
  48. backup_time=datetime.datetime(2016, 10, 27, 19, 57, 33),
  49. ),
  50. ]),
  51. },
  52. ],
  53. [
  54. 'file://{}'.format(os.path.join(test_collections_dir_path,
  55. 'empty', 'single-full')),
  56. {
  57. 'primary_chain': duplitab._ChainStatus(
  58. sets=[
  59. duplitab._SetStatus(
  60. backup_time=datetime.datetime(2016, 10, 27, 19, 57, 33),
  61. ),
  62. duplitab._SetStatus(
  63. backup_time=datetime.datetime(2016, 10, 27, 19, 57, 35),
  64. ),
  65. duplitab._SetStatus(
  66. backup_time=datetime.datetime(2016, 10, 27, 19, 57, 39),
  67. ),
  68. ]),
  69. },
  70. ],
  71. [
  72. 'file://{}'.format(os.path.join(test_collections_dir_path,
  73. 'empty', 'multiple-full')),
  74. {
  75. 'primary_chain': duplitab._ChainStatus(
  76. sets=[
  77. duplitab._SetStatus(
  78. backup_time=datetime.datetime(2016, 10, 27, 19, 57, 47),
  79. ),
  80. duplitab._SetStatus(
  81. backup_time=datetime.datetime(2016, 10, 27, 19, 57, 54),
  82. ),
  83. ]),
  84. },
  85. ],
  86. [
  87. 'file://{}'.format(os.path.join(test_collections_dir_path, 'none')),
  88. {
  89. 'primary_chain': None,
  90. },
  91. ],
  92. ])
  93. def test_collection_request_status(url, expected_status_attr):
  94. c = duplitab.Collection(url=url)
  95. s = c.request_status()
  96. assert not s.archive_dir_path is None
  97. for name, value in expected_status_attr.items():
  98. assert value == getattr(s, name)
  99. @pytest.mark.parametrize(('url'), [
  100. 'file://{}'.format(os.path.join(test_collections_dir_path, 'broken-symlink')),
  101. 'file://{}'.format(os.path.join(test_collections_dir_path, 'broken-symlink', 'backup')),
  102. ])
  103. def test_collection_request_status_fail(url):
  104. c = duplitab.Collection(url=url)
  105. with pytest.raises(duplitab.DuplicityCommandFailedError):
  106. c.request_status()
  107. @pytest.mark.parametrize(('chain_status', 'expected_time'), [
  108. [
  109. duplitab._ChainStatus(
  110. sets=[
  111. duplitab._SetStatus(
  112. backup_time=datetime.datetime(2016, 10, 27, 19, 57, 33),
  113. ),
  114. ]),
  115. datetime.datetime(2016, 10, 27, 19, 57, 33),
  116. ],
  117. [
  118. duplitab._ChainStatus(
  119. sets=[
  120. duplitab._SetStatus(
  121. backup_time=datetime.datetime(2016, 10, 27, 19, 57, 33),
  122. ),
  123. duplitab._SetStatus(
  124. backup_time=datetime.datetime(2016, 10, 27, 19, 57, 35),
  125. ),
  126. duplitab._SetStatus(
  127. backup_time=datetime.datetime(2016, 10, 27, 19, 57, 39),
  128. ),
  129. ]),
  130. datetime.datetime(2016, 10, 27, 19, 57, 39),
  131. ],
  132. ])
  133. def test_chain_status_get_last_backup_time(chain_status, expected_time):
  134. assert expected_time == chain_status.last_backup_time
  135. @pytest.mark.parametrize(('chain_status', 'expected_time'), [
  136. [
  137. duplitab._ChainStatus(
  138. sets=[
  139. duplitab._SetStatus(
  140. backup_time=datetime.datetime(2016, 10, 27, 19, 57, 33),
  141. ),
  142. ]),
  143. None,
  144. ],
  145. [
  146. duplitab._ChainStatus(
  147. sets=[
  148. duplitab._SetStatus(
  149. backup_time=datetime.datetime(2016, 10, 27, 19, 57, 33),
  150. ),
  151. duplitab._SetStatus(
  152. backup_time=datetime.datetime(2016, 10, 27, 19, 57, 35),
  153. ),
  154. duplitab._SetStatus(
  155. backup_time=datetime.datetime(2016, 10, 27, 19, 57, 39),
  156. ),
  157. ]),
  158. datetime.datetime(2016, 10, 27, 19, 57, 39),
  159. ],
  160. ])
  161. def test_chain_status_get_last_incremental_backup_time(
  162. chain_status, expected_time):
  163. assert expected_time == chain_status.last_incremental_backup_time
  164. @pytest.mark.parametrize(('chain_status', 'expected_time'), [
  165. [
  166. duplitab._ChainStatus(
  167. sets=[
  168. duplitab._SetStatus(
  169. backup_time=datetime.datetime(2016, 10, 27, 19, 57, 33),
  170. ),
  171. ]),
  172. datetime.datetime(2016, 10, 27, 19, 57, 33),
  173. ],
  174. [
  175. duplitab._ChainStatus(
  176. sets=[
  177. duplitab._SetStatus(
  178. backup_time=datetime.datetime(2016, 10, 27, 19, 57, 33),
  179. ),
  180. duplitab._SetStatus(
  181. backup_time=datetime.datetime(2016, 10, 27, 19, 57, 35),
  182. ),
  183. duplitab._SetStatus(
  184. backup_time=datetime.datetime(2016, 10, 27, 19, 57, 39),
  185. ),
  186. ]),
  187. datetime.datetime(2016, 10, 27, 19, 57, 33),
  188. ],
  189. ])
  190. def test_chain_status_get_first_backup_time(chain_status, expected_time):
  191. assert expected_time == chain_status.first_backup_time
  192. @pytest.mark.parametrize(('collection_status', 'expected_time'), [
  193. [
  194. duplitab._CollectionStatus(
  195. archive_dir_path='/tmp/none',
  196. primary_chain=duplitab._ChainStatus(
  197. sets=[
  198. duplitab._SetStatus(
  199. backup_time=datetime.datetime(2016, 10, 27, 19, 57, 33),
  200. ),
  201. ]),
  202. ),
  203. None,
  204. ],
  205. [
  206. duplitab._CollectionStatus(
  207. archive_dir_path='/tmp/none',
  208. primary_chain=duplitab._ChainStatus(
  209. sets=[
  210. duplitab._SetStatus(
  211. backup_time=datetime.datetime(2016, 10, 27, 19, 57, 33),
  212. ),
  213. duplitab._SetStatus(
  214. backup_time=datetime.datetime(2016, 10, 27, 19, 57, 35),
  215. ),
  216. duplitab._SetStatus(
  217. backup_time=datetime.datetime(2016, 10, 27, 19, 57, 39),
  218. ),
  219. ]),
  220. ),
  221. datetime.datetime(2016, 10, 27, 19, 57, 39),
  222. ],
  223. [
  224. duplitab._CollectionStatus(
  225. archive_dir_path='/tmp/none',
  226. primary_chain=None,
  227. ),
  228. None,
  229. ],
  230. ])
  231. def test_collection_status_get_last_incremental_backup_time(
  232. collection_status, expected_time):
  233. assert expected_time == collection_status.last_incremental_backup_time
  234. @pytest.mark.parametrize(('collection_status', 'expected_time'), [
  235. [
  236. duplitab._CollectionStatus(
  237. archive_dir_path='/tmp/none',
  238. primary_chain=duplitab._ChainStatus(
  239. sets=[
  240. duplitab._SetStatus(
  241. backup_time=datetime.datetime(2016, 10, 27, 19, 57, 33),
  242. ),
  243. ]),
  244. ),
  245. datetime.datetime(2016, 10, 27, 19, 57, 33),
  246. ],
  247. [
  248. duplitab._CollectionStatus(
  249. archive_dir_path='/tmp/none',
  250. primary_chain=duplitab._ChainStatus(
  251. sets=[
  252. duplitab._SetStatus(
  253. backup_time=datetime.datetime(2016, 10, 27, 19, 57, 33),
  254. ),
  255. duplitab._SetStatus(
  256. backup_time=datetime.datetime(2016, 10, 27, 19, 57, 35),
  257. ),
  258. duplitab._SetStatus(
  259. backup_time=datetime.datetime(2016, 10, 27, 19, 57, 39),
  260. ),
  261. ]),
  262. ),
  263. datetime.datetime(2016, 10, 27, 19, 57, 33),
  264. ],
  265. [
  266. duplitab._CollectionStatus(
  267. archive_dir_path='/tmp/none',
  268. primary_chain=None,
  269. ),
  270. None,
  271. ],
  272. ])
  273. def test_collection_status_get_incremental_backup_time(
  274. collection_status, expected_time):
  275. assert expected_time == collection_status.last_full_backup_time