@cloudant/couchbackup 2.9.14-SNAPSHOT.157 → 2.9.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (392) hide show
  1. package/.scannerwork/report-task.txt +3 -3
  2. package/.scannerwork/scanner-report/analysis-warnings.pb +2 -2
  3. package/.scannerwork/scanner-report/analysis.log +1 -1
  4. package/.scannerwork/scanner-report/changesets-10.pb +2 -0
  5. package/.scannerwork/scanner-report/changesets-11.pb +1 -0
  6. package/.scannerwork/scanner-report/changesets-37.pb +1 -0
  7. package/.scannerwork/scanner-report/changesets-38.pb +1 -0
  8. package/.scannerwork/scanner-report/changesets-39.pb +1 -0
  9. package/.scannerwork/scanner-report/changesets-40.pb +1 -0
  10. package/.scannerwork/scanner-report/changesets-41.pb +1 -0
  11. package/.scannerwork/scanner-report/changesets-42.pb +1 -0
  12. package/.scannerwork/scanner-report/changesets-43.pb +1 -0
  13. package/.scannerwork/scanner-report/changesets-44.pb +1 -0
  14. package/.scannerwork/scanner-report/changesets-49.pb +1 -0
  15. package/.scannerwork/scanner-report/changesets-5.pb +1 -0
  16. package/.scannerwork/scanner-report/changesets-6.pb +1 -0
  17. package/.scannerwork/scanner-report/changesets-8.pb +1 -0
  18. package/.scannerwork/scanner-report/changesets-9.pb +1 -0
  19. package/.scannerwork/scanner-report/component-1.pb +3 -1
  20. package/.scannerwork/scanner-report/component-10.pb +2 -0
  21. package/.scannerwork/scanner-report/component-11.pb +1 -0
  22. package/.scannerwork/scanner-report/component-12.pb +1 -1
  23. package/.scannerwork/scanner-report/component-13.pb +1 -1
  24. package/.scannerwork/scanner-report/component-14.pb +1 -1
  25. package/.scannerwork/scanner-report/component-15.pb +1 -1
  26. package/.scannerwork/scanner-report/component-16.pb +1 -1
  27. package/.scannerwork/scanner-report/component-17.pb +1 -1
  28. package/.scannerwork/scanner-report/component-18.pb +1 -1
  29. package/.scannerwork/scanner-report/component-19.pb +1 -1
  30. package/.scannerwork/scanner-report/component-2.pb +1 -1
  31. package/.scannerwork/scanner-report/component-20.pb +1 -1
  32. package/.scannerwork/scanner-report/component-21.pb +1 -1
  33. package/.scannerwork/scanner-report/component-22.pb +1 -1
  34. package/.scannerwork/scanner-report/component-23.pb +1 -1
  35. package/.scannerwork/scanner-report/component-24.pb +1 -1
  36. package/.scannerwork/scanner-report/component-25.pb +1 -1
  37. package/.scannerwork/scanner-report/component-37.pb +1 -0
  38. package/.scannerwork/scanner-report/component-38.pb +1 -0
  39. package/.scannerwork/scanner-report/component-39.pb +1 -0
  40. package/.scannerwork/scanner-report/component-40.pb +1 -0
  41. package/.scannerwork/scanner-report/component-41.pb +1 -0
  42. package/.scannerwork/scanner-report/component-42.pb +1 -0
  43. package/.scannerwork/scanner-report/component-43.pb +1 -0
  44. package/.scannerwork/scanner-report/component-44.pb +1 -0
  45. package/.scannerwork/scanner-report/component-49.pb +1 -0
  46. package/.scannerwork/scanner-report/component-5.pb +1 -0
  47. package/.scannerwork/scanner-report/component-50.pb +1 -1
  48. package/.scannerwork/scanner-report/component-51.pb +1 -1
  49. package/.scannerwork/scanner-report/component-52.pb +1 -1
  50. package/.scannerwork/scanner-report/component-53.pb +1 -1
  51. package/.scannerwork/scanner-report/component-54.pb +1 -1
  52. package/.scannerwork/scanner-report/component-55.pb +1 -1
  53. package/.scannerwork/scanner-report/component-56.pb +1 -1
  54. package/.scannerwork/scanner-report/component-57.pb +1 -1
  55. package/.scannerwork/scanner-report/component-58.pb +1 -1
  56. package/.scannerwork/scanner-report/component-59.pb +1 -1
  57. package/.scannerwork/scanner-report/component-6.pb +1 -0
  58. package/.scannerwork/scanner-report/component-60.pb +1 -1
  59. package/.scannerwork/scanner-report/component-61.pb +1 -1
  60. package/.scannerwork/scanner-report/component-62.pb +1 -1
  61. package/.scannerwork/scanner-report/component-67.pb +1 -0
  62. package/.scannerwork/scanner-report/component-7.pb +1 -1
  63. package/.scannerwork/scanner-report/component-8.pb +1 -0
  64. package/.scannerwork/scanner-report/component-9.pb +1 -1
  65. package/.scannerwork/scanner-report/coverages-12.pb +0 -0
  66. package/.scannerwork/scanner-report/coverages-13.pb +0 -0
  67. package/.scannerwork/scanner-report/coverages-14.pb +0 -0
  68. package/.scannerwork/scanner-report/coverages-15.pb +0 -0
  69. package/.scannerwork/scanner-report/coverages-16.pb +0 -0
  70. package/.scannerwork/scanner-report/coverages-17.pb +0 -0
  71. package/.scannerwork/scanner-report/coverages-18.pb +0 -0
  72. package/.scannerwork/scanner-report/coverages-19.pb +0 -0
  73. package/.scannerwork/scanner-report/coverages-20.pb +0 -0
  74. package/.scannerwork/scanner-report/coverages-21.pb +0 -0
  75. package/.scannerwork/scanner-report/coverages-22.pb +0 -0
  76. package/.scannerwork/scanner-report/coverages-23.pb +0 -0
  77. package/.scannerwork/scanner-report/coverages-24.pb +0 -0
  78. package/.scannerwork/scanner-report/coverages-25.pb +0 -0
  79. package/.scannerwork/scanner-report/coverages-37.pb +0 -0
  80. package/.scannerwork/scanner-report/coverages-41.pb +0 -0
  81. package/.scannerwork/scanner-report/coverages-42.pb +0 -0
  82. package/.scannerwork/scanner-report/coverages-44.pb +0 -0
  83. package/.scannerwork/scanner-report/coverages-49.pb +0 -0
  84. package/.scannerwork/scanner-report/coverages-5.pb +0 -0
  85. package/.scannerwork/scanner-report/coverages-50.pb +0 -0
  86. package/.scannerwork/scanner-report/coverages-51.pb +0 -0
  87. package/.scannerwork/scanner-report/coverages-52.pb +0 -0
  88. package/.scannerwork/scanner-report/coverages-53.pb +0 -0
  89. package/.scannerwork/scanner-report/coverages-54.pb +0 -0
  90. package/.scannerwork/scanner-report/coverages-55.pb +0 -0
  91. package/.scannerwork/scanner-report/coverages-56.pb +0 -0
  92. package/.scannerwork/scanner-report/coverages-57.pb +0 -0
  93. package/.scannerwork/scanner-report/coverages-58.pb +0 -0
  94. package/.scannerwork/scanner-report/coverages-59.pb +0 -0
  95. package/.scannerwork/scanner-report/coverages-60.pb +0 -0
  96. package/.scannerwork/scanner-report/coverages-61.pb +0 -0
  97. package/.scannerwork/scanner-report/coverages-62.pb +0 -0
  98. package/.scannerwork/scanner-report/coverages-7.pb +0 -0
  99. package/.scannerwork/scanner-report/coverages-8.pb +0 -0
  100. package/.scannerwork/scanner-report/coverages-9.pb +0 -0
  101. package/.scannerwork/scanner-report/duplications-20.pb +0 -2
  102. package/.scannerwork/scanner-report/duplications-22.pb +0 -3
  103. package/.scannerwork/scanner-report/duplications-23.pb +3 -2
  104. package/.scannerwork/scanner-report/duplications-42.pb +2 -0
  105. package/.scannerwork/scanner-report/duplications-43.pb +2 -0
  106. package/.scannerwork/scanner-report/duplications-44.pb +2 -0
  107. package/.scannerwork/scanner-report/duplications-51.pb +2 -0
  108. package/.scannerwork/scanner-report/duplications-53.pb +2 -0
  109. package/.scannerwork/scanner-report/duplications-55.pb +0 -2
  110. package/.scannerwork/scanner-report/duplications-60.pb +0 -2
  111. package/.scannerwork/scanner-report/duplications-7.pb +0 -2
  112. package/.scannerwork/scanner-report/duplications-9.pb +2 -0
  113. package/.scannerwork/scanner-report/issues-25.pb +2 -2
  114. package/.scannerwork/scanner-report/issues-41.pb +3 -0
  115. package/.scannerwork/scanner-report/measures-12.pb +0 -0
  116. package/.scannerwork/scanner-report/measures-13.pb +0 -0
  117. package/.scannerwork/scanner-report/measures-14.pb +0 -0
  118. package/.scannerwork/scanner-report/measures-15.pb +0 -0
  119. package/.scannerwork/scanner-report/measures-16.pb +0 -0
  120. package/.scannerwork/scanner-report/measures-17.pb +0 -0
  121. package/.scannerwork/scanner-report/measures-18.pb +0 -0
  122. package/.scannerwork/scanner-report/measures-19.pb +0 -0
  123. package/.scannerwork/scanner-report/measures-2.pb +0 -0
  124. package/.scannerwork/scanner-report/measures-20.pb +0 -0
  125. package/.scannerwork/scanner-report/measures-21.pb +0 -0
  126. package/.scannerwork/scanner-report/measures-22.pb +0 -0
  127. package/.scannerwork/scanner-report/measures-23.pb +0 -0
  128. package/.scannerwork/scanner-report/measures-24.pb +0 -0
  129. package/.scannerwork/scanner-report/measures-25.pb +0 -0
  130. package/.scannerwork/scanner-report/measures-37.pb +0 -0
  131. package/.scannerwork/scanner-report/measures-41.pb +0 -0
  132. package/.scannerwork/scanner-report/measures-42.pb +0 -0
  133. package/.scannerwork/scanner-report/measures-44.pb +0 -0
  134. package/.scannerwork/scanner-report/measures-49.pb +0 -0
  135. package/.scannerwork/scanner-report/measures-5.pb +0 -0
  136. package/.scannerwork/scanner-report/measures-50.pb +0 -0
  137. package/.scannerwork/scanner-report/measures-51.pb +0 -0
  138. package/.scannerwork/scanner-report/measures-52.pb +0 -0
  139. package/.scannerwork/scanner-report/measures-53.pb +0 -0
  140. package/.scannerwork/scanner-report/measures-54.pb +12 -11
  141. package/.scannerwork/scanner-report/measures-55.pb +0 -0
  142. package/.scannerwork/scanner-report/measures-56.pb +0 -0
  143. package/.scannerwork/scanner-report/measures-57.pb +0 -0
  144. package/.scannerwork/scanner-report/measures-58.pb +0 -0
  145. package/.scannerwork/scanner-report/measures-59.pb +0 -0
  146. package/.scannerwork/scanner-report/measures-60.pb +0 -0
  147. package/.scannerwork/scanner-report/measures-61.pb +0 -0
  148. package/.scannerwork/scanner-report/measures-62.pb +0 -0
  149. package/.scannerwork/scanner-report/measures-67.pb +0 -0
  150. package/.scannerwork/scanner-report/measures-7.pb +0 -0
  151. package/.scannerwork/scanner-report/measures-8.pb +0 -0
  152. package/.scannerwork/scanner-report/measures-9.pb +0 -0
  153. package/.scannerwork/scanner-report/metadata.pb +0 -0
  154. package/.scannerwork/scanner-report/source-12.txt +19 -396
  155. package/.scannerwork/scanner-report/source-13.txt +428 -16
  156. package/.scannerwork/scanner-report/source-14.txt +84 -15
  157. package/.scannerwork/scanner-report/source-15.txt +78 -9
  158. package/.scannerwork/scanner-report/source-16.txt +20 -85
  159. package/.scannerwork/scanner-report/source-17.txt +106 -421
  160. package/.scannerwork/scanner-report/source-18.txt +16 -19
  161. package/.scannerwork/scanner-report/source-19.txt +7 -20
  162. package/.scannerwork/scanner-report/source-2.txt +102 -81
  163. package/.scannerwork/scanner-report/source-20.txt +13 -168
  164. package/.scannerwork/scanner-report/source-21.txt +20 -55
  165. package/.scannerwork/scanner-report/source-22.txt +37 -188
  166. package/.scannerwork/scanner-report/source-23.txt +182 -152
  167. package/.scannerwork/scanner-report/source-24.txt +302 -107
  168. package/.scannerwork/scanner-report/source-25.txt +23 -111
  169. package/.scannerwork/scanner-report/source-37.txt +75 -0
  170. package/.scannerwork/scanner-report/source-41.txt +130 -0
  171. package/.scannerwork/scanner-report/source-42.txt +183 -0
  172. package/.scannerwork/scanner-report/source-44.txt +190 -0
  173. package/.scannerwork/scanner-report/source-49.txt +59 -0
  174. package/.scannerwork/scanner-report/source-5.txt +414 -0
  175. package/.scannerwork/scanner-report/source-50.txt +90 -91
  176. package/.scannerwork/scanner-report/source-51.txt +59 -43
  177. package/.scannerwork/scanner-report/source-52.txt +149 -16
  178. package/.scannerwork/scanner-report/source-53.txt +65 -254
  179. package/.scannerwork/scanner-report/source-54.txt +148 -83
  180. package/.scannerwork/scanner-report/source-55.txt +113 -76
  181. package/.scannerwork/scanner-report/source-56.txt +22 -154
  182. package/.scannerwork/scanner-report/source-57.txt +256 -55
  183. package/.scannerwork/scanner-report/source-58.txt +88 -141
  184. package/.scannerwork/scanner-report/source-59.txt +21 -98
  185. package/.scannerwork/scanner-report/source-60.txt +99 -56
  186. package/.scannerwork/scanner-report/source-61.txt +14 -24
  187. package/.scannerwork/scanner-report/source-62.txt +59 -25
  188. package/.scannerwork/scanner-report/source-67.txt +424 -0
  189. package/.scannerwork/scanner-report/source-7.txt +57 -166
  190. package/.scannerwork/scanner-report/source-8.txt +114 -0
  191. package/.scannerwork/scanner-report/source-9.txt +187 -424
  192. package/.scannerwork/scanner-report/symbols-12.pb +13 -604
  193. package/.scannerwork/scanner-report/symbols-13.pb +790 -9
  194. package/.scannerwork/scanner-report/symbols-14.pb +59 -13
  195. package/.scannerwork/scanner-report/symbols-15.pb +58 -9
  196. package/.scannerwork/scanner-report/symbols-16.pb +31 -59
  197. package/.scannerwork/scanner-report/symbols-17.pb +70 -789
  198. package/.scannerwork/scanner-report/symbols-18.pb +9 -23
  199. package/.scannerwork/scanner-report/symbols-19.pb +7 -18
  200. package/.scannerwork/scanner-report/symbols-20.pb +9 -227
  201. package/.scannerwork/scanner-report/symbols-21.pb +23 -39
  202. package/.scannerwork/scanner-report/symbols-22.pb +24 -264
  203. package/.scannerwork/scanner-report/symbols-23.pb +262 -201
  204. package/.scannerwork/scanner-report/symbols-24.pb +353 -71
  205. package/.scannerwork/scanner-report/symbols-25.pb +19 -86
  206. package/.scannerwork/scanner-report/symbols-37.pb +39 -0
  207. package/.scannerwork/scanner-report/symbols-41.pb +86 -0
  208. package/.scannerwork/scanner-report/symbols-42.pb +203 -0
  209. package/.scannerwork/scanner-report/symbols-44.pb +180 -0
  210. package/.scannerwork/scanner-report/symbols-49.pb +19 -0
  211. package/.scannerwork/scanner-report/symbols-5.pb +604 -0
  212. package/.scannerwork/scanner-report/symbols-50.pb +46 -28
  213. package/.scannerwork/scanner-report/symbols-51.pb +40 -17
  214. package/.scannerwork/scanner-report/symbols-52.pb +126 -14
  215. package/.scannerwork/scanner-report/symbols-53.pb +44 -354
  216. package/.scannerwork/scanner-report/symbols-54.pb +143 -45
  217. package/.scannerwork/scanner-report/symbols-55.pb +33 -44
  218. package/.scannerwork/scanner-report/symbols-56.pb +19 -143
  219. package/.scannerwork/scanner-report/symbols-57.pb +354 -46
  220. package/.scannerwork/scanner-report/symbols-58.pb +56 -123
  221. package/.scannerwork/scanner-report/symbols-59.pb +18 -30
  222. package/.scannerwork/scanner-report/symbols-60.pb +30 -42
  223. package/.scannerwork/scanner-report/symbols-61.pb +13 -17
  224. package/.scannerwork/scanner-report/symbols-62.pb +45 -19
  225. package/.scannerwork/scanner-report/symbols-7.pb +32 -180
  226. package/.scannerwork/scanner-report/symbols-8.pb +28 -0
  227. package/.scannerwork/scanner-report/symbols-9.pb +227 -0
  228. package/.scannerwork/scanner-report/syntax-highlightings-12.pb +32 -611
  229. package/.scannerwork/scanner-report/syntax-highlightings-13.pb +590 -26
  230. package/.scannerwork/scanner-report/syntax-highlightings-14.pb +143 -27
  231. package/.scannerwork/scanner-report/syntax-highlightings-15.pb +118 -18
  232. package/.scannerwork/scanner-report/syntax-highlightings-16.pb +32 -141
  233. package/.scannerwork/scanner-report/syntax-highlightings-17.pb +123 -567
  234. package/.scannerwork/scanner-report/syntax-highlightings-18.pb +25 -20
  235. package/.scannerwork/scanner-report/syntax-highlightings-19.pb +14 -31
  236. package/.scannerwork/scanner-report/syntax-highlightings-2.pb +690 -96
  237. package/.scannerwork/scanner-report/syntax-highlightings-20.pb +19 -333
  238. package/.scannerwork/scanner-report/syntax-highlightings-21.pb +18 -63
  239. package/.scannerwork/scanner-report/syntax-highlightings-22.pb +59 -258
  240. package/.scannerwork/scanner-report/syntax-highlightings-23.pb +203 -187
  241. package/.scannerwork/scanner-report/syntax-highlightings-24.pb +580 -141
  242. package/.scannerwork/scanner-report/syntax-highlightings-25.pb +29 -88
  243. package/.scannerwork/scanner-report/syntax-highlightings-37.pb +101 -0
  244. package/.scannerwork/scanner-report/syntax-highlightings-41.pb +125 -0
  245. package/.scannerwork/scanner-report/syntax-highlightings-42.pb +280 -0
  246. package/.scannerwork/scanner-report/syntax-highlightings-44.pb +225 -0
  247. package/.scannerwork/scanner-report/syntax-highlightings-49.pb +59 -0
  248. package/.scannerwork/scanner-report/syntax-highlightings-5.pb +641 -0
  249. package/.scannerwork/scanner-report/syntax-highlightings-50.pb +96 -108
  250. package/.scannerwork/scanner-report/syntax-highlightings-51.pb +47 -28
  251. package/.scannerwork/scanner-report/syntax-highlightings-52.pb +183 -15
  252. package/.scannerwork/scanner-report/syntax-highlightings-53.pb +48 -243
  253. package/.scannerwork/scanner-report/syntax-highlightings-54.pb +204 -87
  254. package/.scannerwork/scanner-report/syntax-highlightings-55.pb +88 -49
  255. package/.scannerwork/scanner-report/syntax-highlightings-56.pb +29 -208
  256. package/.scannerwork/scanner-report/syntax-highlightings-57.pb +245 -55
  257. package/.scannerwork/scanner-report/syntax-highlightings-58.pb +91 -171
  258. package/.scannerwork/scanner-report/syntax-highlightings-59.pb +17 -80
  259. package/.scannerwork/scanner-report/syntax-highlightings-60.pb +79 -44
  260. package/.scannerwork/scanner-report/syntax-highlightings-61.pb +16 -21
  261. package/.scannerwork/scanner-report/syntax-highlightings-62.pb +61 -30
  262. package/.scannerwork/scanner-report/syntax-highlightings-67.pb +3342 -0
  263. package/.scannerwork/scanner-report/syntax-highlightings-7.pb +73 -200
  264. package/.scannerwork/scanner-report/syntax-highlightings-8.pb +138 -0
  265. package/.scannerwork/scanner-report/syntax-highlightings-9.pb +289 -3262
  266. package/CHANGES.md +4 -1
  267. package/package.json +5 -5
  268. package/test-18-results.xml +159 -159
  269. package/test-iam-18-results.xml +50 -50
  270. package/.scannerwork/scanner-report/changesets-2.pb +0 -1
  271. package/.scannerwork/scanner-report/changesets-26.pb +0 -1
  272. package/.scannerwork/scanner-report/changesets-27.pb +0 -1
  273. package/.scannerwork/scanner-report/changesets-28.pb +0 -1
  274. package/.scannerwork/scanner-report/changesets-29.pb +0 -0
  275. package/.scannerwork/scanner-report/changesets-3.pb +0 -1
  276. package/.scannerwork/scanner-report/changesets-30.pb +0 -1
  277. package/.scannerwork/scanner-report/changesets-31.pb +0 -1
  278. package/.scannerwork/scanner-report/changesets-32.pb +0 -1
  279. package/.scannerwork/scanner-report/changesets-33.pb +0 -1
  280. package/.scannerwork/scanner-report/changesets-4.pb +0 -1
  281. package/.scannerwork/scanner-report/changesets-45.pb +0 -1
  282. package/.scannerwork/scanner-report/changesets-46.pb +0 -1
  283. package/.scannerwork/scanner-report/changesets-63.pb +0 -1
  284. package/.scannerwork/scanner-report/changesets-64.pb +0 -1
  285. package/.scannerwork/scanner-report/component-26.pb +0 -1
  286. package/.scannerwork/scanner-report/component-27.pb +0 -1
  287. package/.scannerwork/scanner-report/component-28.pb +0 -1
  288. package/.scannerwork/scanner-report/component-29.pb +0 -1
  289. package/.scannerwork/scanner-report/component-3.pb +0 -1
  290. package/.scannerwork/scanner-report/component-30.pb +0 -1
  291. package/.scannerwork/scanner-report/component-31.pb +0 -1
  292. package/.scannerwork/scanner-report/component-32.pb +0 -1
  293. package/.scannerwork/scanner-report/component-33.pb +0 -1
  294. package/.scannerwork/scanner-report/component-4.pb +0 -1
  295. package/.scannerwork/scanner-report/component-45.pb +0 -1
  296. package/.scannerwork/scanner-report/component-46.pb +0 -1
  297. package/.scannerwork/scanner-report/component-63.pb +0 -1
  298. package/.scannerwork/scanner-report/component-64.pb +0 -1
  299. package/.scannerwork/scanner-report/component-65.pb +0 -1
  300. package/.scannerwork/scanner-report/coverages-2.pb +0 -0
  301. package/.scannerwork/scanner-report/coverages-26.pb +0 -0
  302. package/.scannerwork/scanner-report/coverages-27.pb +0 -0
  303. package/.scannerwork/scanner-report/coverages-28.pb +0 -0
  304. package/.scannerwork/scanner-report/coverages-45.pb +0 -0
  305. package/.scannerwork/scanner-report/coverages-46.pb +0 -0
  306. package/.scannerwork/scanner-report/coverages-63.pb +0 -0
  307. package/.scannerwork/scanner-report/coverages-64.pb +0 -0
  308. package/.scannerwork/scanner-report/duplications-4.pb +0 -2
  309. package/.scannerwork/scanner-report/duplications-46.pb +0 -0
  310. package/.scannerwork/scanner-report/duplications-63.pb +0 -0
  311. package/.scannerwork/scanner-report/duplications-64.pb +0 -0
  312. package/.scannerwork/scanner-report/issues-19.pb +0 -3
  313. package/.scannerwork/scanner-report/measures-26.pb +0 -0
  314. package/.scannerwork/scanner-report/measures-27.pb +0 -0
  315. package/.scannerwork/scanner-report/measures-28.pb +0 -0
  316. package/.scannerwork/scanner-report/measures-45.pb +0 -0
  317. package/.scannerwork/scanner-report/measures-46.pb +0 -0
  318. package/.scannerwork/scanner-report/measures-63.pb +0 -0
  319. package/.scannerwork/scanner-report/measures-64.pb +0 -0
  320. package/.scannerwork/scanner-report/measures-65.pb +0 -0
  321. package/.scannerwork/scanner-report/source-26.txt +0 -62
  322. package/.scannerwork/scanner-report/source-27.txt +0 -41
  323. package/.scannerwork/scanner-report/source-28.txt +0 -101
  324. package/.scannerwork/scanner-report/source-45.txt +0 -29
  325. package/.scannerwork/scanner-report/source-46.txt +0 -329
  326. package/.scannerwork/scanner-report/source-63.txt +0 -111
  327. package/.scannerwork/scanner-report/source-64.txt +0 -129
  328. package/.scannerwork/scanner-report/source-65.txt +0 -102
  329. package/.scannerwork/scanner-report/symbols-2.pb +0 -32
  330. package/.scannerwork/scanner-report/symbols-26.pb +0 -24
  331. package/.scannerwork/scanner-report/symbols-27.pb +0 -31
  332. package/.scannerwork/scanner-report/symbols-28.pb +0 -58
  333. package/.scannerwork/scanner-report/symbols-45.pb +0 -8
  334. package/.scannerwork/scanner-report/symbols-46.pb +0 -353
  335. package/.scannerwork/scanner-report/symbols-63.pb +0 -59
  336. package/.scannerwork/scanner-report/symbols-64.pb +0 -33
  337. package/.scannerwork/scanner-report/syntax-highlightings-26.pb +0 -97
  338. package/.scannerwork/scanner-report/syntax-highlightings-27.pb +0 -69
  339. package/.scannerwork/scanner-report/syntax-highlightings-28.pb +0 -154
  340. package/.scannerwork/scanner-report/syntax-highlightings-45.pb +0 -49
  341. package/.scannerwork/scanner-report/syntax-highlightings-46.pb +0 -620
  342. package/.scannerwork/scanner-report/syntax-highlightings-63.pb +0 -133
  343. package/.scannerwork/scanner-report/syntax-highlightings-64.pb +0 -129
  344. package/.scannerwork/scanner-report/syntax-highlightings-65.pb +0 -692
  345. /package/.scannerwork/scanner-report/{coverages-33.pb → coverages-10.pb} +0 -0
  346. /package/.scannerwork/scanner-report/{coverages-32.pb → coverages-11.pb} +0 -0
  347. /package/.scannerwork/scanner-report/{coverages-30.pb → coverages-38.pb} +0 -0
  348. /package/.scannerwork/scanner-report/{coverages-29.pb → coverages-39.pb} +0 -0
  349. /package/.scannerwork/scanner-report/{coverages-31.pb → coverages-40.pb} +0 -0
  350. /package/.scannerwork/scanner-report/{coverages-4.pb → coverages-43.pb} +0 -0
  351. /package/.scannerwork/scanner-report/{coverages-3.pb → coverages-6.pb} +0 -0
  352. /package/.scannerwork/scanner-report/{duplications-19.pb → duplications-10.pb} +0 -0
  353. /package/.scannerwork/scanner-report/{duplications-2.pb → duplications-11.pb} +0 -0
  354. /package/.scannerwork/scanner-report/{duplications-26.pb → duplications-37.pb} +0 -0
  355. /package/.scannerwork/scanner-report/{duplications-27.pb → duplications-38.pb} +0 -0
  356. /package/.scannerwork/scanner-report/{duplications-28.pb → duplications-39.pb} +0 -0
  357. /package/.scannerwork/scanner-report/{duplications-29.pb → duplications-40.pb} +0 -0
  358. /package/.scannerwork/scanner-report/{duplications-3.pb → duplications-41.pb} +0 -0
  359. /package/.scannerwork/scanner-report/{duplications-30.pb → duplications-49.pb} +0 -0
  360. /package/.scannerwork/scanner-report/{duplications-31.pb → duplications-5.pb} +0 -0
  361. /package/.scannerwork/scanner-report/{duplications-32.pb → duplications-6.pb} +0 -0
  362. /package/.scannerwork/scanner-report/{duplications-33.pb → duplications-8.pb} +0 -0
  363. /package/.scannerwork/scanner-report/{issues-22.pb → issues-23.pb} +0 -0
  364. /package/.scannerwork/scanner-report/{issues-46.pb → issues-24.pb} +0 -0
  365. /package/.scannerwork/scanner-report/{measures-33.pb → measures-10.pb} +0 -0
  366. /package/.scannerwork/scanner-report/{measures-32.pb → measures-11.pb} +0 -0
  367. /package/.scannerwork/scanner-report/{measures-30.pb → measures-38.pb} +0 -0
  368. /package/.scannerwork/scanner-report/{measures-29.pb → measures-39.pb} +0 -0
  369. /package/.scannerwork/scanner-report/{measures-31.pb → measures-40.pb} +0 -0
  370. /package/.scannerwork/scanner-report/{measures-4.pb → measures-43.pb} +0 -0
  371. /package/.scannerwork/scanner-report/{measures-3.pb → measures-6.pb} +0 -0
  372. /package/.scannerwork/scanner-report/{source-33.txt → source-10.txt} +0 -0
  373. /package/.scannerwork/scanner-report/{source-32.txt → source-11.txt} +0 -0
  374. /package/.scannerwork/scanner-report/{source-30.txt → source-38.txt} +0 -0
  375. /package/.scannerwork/scanner-report/{source-29.txt → source-39.txt} +0 -0
  376. /package/.scannerwork/scanner-report/{source-31.txt → source-40.txt} +0 -0
  377. /package/.scannerwork/scanner-report/{source-4.txt → source-43.txt} +0 -0
  378. /package/.scannerwork/scanner-report/{source-3.txt → source-6.txt} +0 -0
  379. /package/.scannerwork/scanner-report/{symbols-33.pb → symbols-10.pb} +0 -0
  380. /package/.scannerwork/scanner-report/{symbols-32.pb → symbols-11.pb} +0 -0
  381. /package/.scannerwork/scanner-report/{symbols-30.pb → symbols-38.pb} +0 -0
  382. /package/.scannerwork/scanner-report/{symbols-29.pb → symbols-39.pb} +0 -0
  383. /package/.scannerwork/scanner-report/{symbols-31.pb → symbols-40.pb} +0 -0
  384. /package/.scannerwork/scanner-report/{symbols-4.pb → symbols-43.pb} +0 -0
  385. /package/.scannerwork/scanner-report/{symbols-3.pb → symbols-6.pb} +0 -0
  386. /package/.scannerwork/scanner-report/{syntax-highlightings-33.pb → syntax-highlightings-10.pb} +0 -0
  387. /package/.scannerwork/scanner-report/{syntax-highlightings-32.pb → syntax-highlightings-11.pb} +0 -0
  388. /package/.scannerwork/scanner-report/{syntax-highlightings-30.pb → syntax-highlightings-38.pb} +0 -0
  389. /package/.scannerwork/scanner-report/{syntax-highlightings-29.pb → syntax-highlightings-39.pb} +0 -0
  390. /package/.scannerwork/scanner-report/{syntax-highlightings-31.pb → syntax-highlightings-40.pb} +0 -0
  391. /package/.scannerwork/scanner-report/{syntax-highlightings-4.pb → syntax-highlightings-43.pb} +0 -0
  392. /package/.scannerwork/scanner-report/{syntax-highlightings-3.pb → syntax-highlightings-6.pb} +0 -0
@@ -12,26 +12,438 @@
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
14
 
15
- /* global describe it */
15
+ /* global */
16
16
  'use strict';
17
17
 
18
- delete require.cache[require.resolve('./citestutils.js')];
19
- const u = require('./citestutils.js');
18
+ const assert = require('node:assert');
19
+ const { once } = require('node:events');
20
+ const fs = require('node:fs');
21
+ const { PassThrough } = require('node:stream');
22
+ const { pipeline } = require('node:stream/promises');
23
+ const { createGzip, createGunzip } = require('node:zlib');
24
+ const debug = require('debug');
25
+ const { Tail } = require('tail');
26
+ const app = require('../app.js');
27
+ const dbUrl = require('../includes/cliutils.js').databaseUrl;
28
+ const compare = require('./compare.js');
29
+ const request = require('../includes/request.js');
30
+ const { cliBackup, cliDecrypt, cliEncrypt, cliGzip, cliGunzip, cliRestore } = require('./test_process.js');
31
+ const testLogger = debug('couchbackup:test:utils');
20
32
 
21
- [{ useApi: true }, { useApi: false }].forEach(function(params) {
22
- describe(u.scenario('End to end backup and restore', params), function() {
23
- it('should backup and restore animaldb', async function() {
24
- // Allow up to 60 s for backup and restore of animaldb
25
- u.setTimeout(this, 60);
26
- return u.testDirectBackupAndRestore(params, 'animaldb', this.dbName);
33
+ function scenario(test, params) {
34
+ return `${test} ${(params.useApi) ? 'using API' : 'using CLI'}`;
35
+ }
36
+
37
+ function params() {
38
+ const p = {};
39
+ for (let i = 0; i < arguments.length; i++) {
40
+ Object.assign(p, arguments[i]);
41
+ }
42
+ return p;
43
+ }
44
+
45
+ // Returns the event emitter for API calls, or the child process for CLI calls
46
+ async function testBackup(params, databaseName, outputStream) {
47
+ const pipelineStreams = [];
48
+ const promises = [];
49
+
50
+ // Configure API key if needed
51
+ augmentParamsWithApiKey(params);
52
+
53
+ let backup;
54
+ let backupStream;
55
+ let backupPromise;
56
+ let tail;
57
+ if (params.useApi) {
58
+ if (params.useStdOut) {
59
+ backupStream = outputStream;
60
+ } else {
61
+ backupStream = new PassThrough();
62
+ }
63
+ const backupCallbackPromise = new Promise((resolve, reject) => {
64
+ backup = app.backup(
65
+ dbUrl(process.env.COUCH_URL, databaseName),
66
+ backupStream,
67
+ params.opts,
68
+ (err, data) => {
69
+ if (err) {
70
+ testLogger(`API backup callback with ${JSON.stringify(err)}, will reject.`);
71
+ reject(err);
72
+ } else {
73
+ testLogger(`API backup callback with ${JSON.stringify(data)}, will resolve.`);
74
+ resolve(data);
75
+ }
76
+ });
77
+ });
78
+ const backupFinshedPromise = once(backup, 'finished')
79
+ .then((summary) => {
80
+ testLogger(`Resolving API backup event promise with ${JSON.stringify(summary)}`);
81
+ if (params.resume) {
82
+ assertWrittenFewerThan(summary.total, params.exclusiveMaxExpected);
83
+ }
84
+ })
85
+ .catch((err) => {
86
+ testLogger(`Rejecting API backup event promise with error ${JSON.stringify(err)}`);
87
+ throw err;
88
+ });
89
+ backupPromise = Promise.all([backupCallbackPromise, backupFinshedPromise])
90
+ .then(() => {
91
+ testLogger('Both API backup promises resolved.');
92
+ });
93
+ } else {
94
+ backup = cliBackup(databaseName, params);
95
+ backupStream = backup.stream;
96
+ backupPromise = backup.childProcessPromise;
97
+ if (params.abort) {
98
+ // Create the log file for abort tests so we can tail it, other tests assert
99
+ // the log file is usually created normally by the backup process.
100
+ const f = fs.openSync(params.opts.log, 'w');
101
+ fs.closeSync(f);
102
+
103
+ // Use tail to watch the log file for a batch to be completed then abort
104
+ tail = new Tail(params.opts.log, { useWatchFile: true, fsWatchOptions: { interval: 500 }, follow: false });
105
+ tail.on('line', function(data) {
106
+ const matches = data.match(/:d batch\d+/);
107
+ if (matches !== null) {
108
+ // Turn off the tail.
109
+ tail.unwatch();
110
+ // Abort the backup
111
+ backup.childProcess.kill();
112
+ }
113
+ });
114
+ }
115
+ if (params.resume) {
116
+ const listenerPromise = new Promise((resolve, reject) => {
117
+ const listener = function(data) {
118
+ const matches = data.toString().match(/.*Finished - Total document revisions written: (\d+).*/);
119
+ if (matches !== null) {
120
+ try {
121
+ assertWrittenFewerThan(matches[1], params.exclusiveMaxExpected);
122
+ resolve();
123
+ } catch (err) {
124
+ reject(err);
125
+ }
126
+ process.stderr.removeListener('data', listener);
127
+ }
128
+ };
129
+ backup.childProcess.stderr.on('data', listener);
130
+ });
131
+ promises.push(listenerPromise);
132
+ }
133
+ }
134
+
135
+ promises.push(backupPromise);
136
+ if (!params.useStdOut) {
137
+ pipelineStreams.push(backupStream);
138
+ }
139
+
140
+ if (params.compression) {
141
+ if (params.useApi) {
142
+ pipelineStreams.push(createGzip());
143
+ } else {
144
+ const gzipProcess = cliGzip();
145
+ pipelineStreams.push(gzipProcess.stream);
146
+ promises.push(gzipProcess.childProcessPromise);
147
+ }
148
+ }
149
+
150
+ // Pipe via encryption if requested
151
+ if (params.encryption) {
152
+ if (params.useApi) {
153
+ // Currently only CLI support for testing encryption
154
+ return Promise.reject(new Error('Not implemented: cannot test encrypted API backups at this time.'));
155
+ } else {
156
+ const encryptProcess = cliEncrypt();
157
+ pipelineStreams.push(encryptProcess.stream);
158
+ promises.push(encryptProcess.childProcessPromise);
159
+ }
160
+ }
161
+
162
+ if (!params.useStdOut) {
163
+ // Finally add the outputStream to the list we want to pipeline
164
+ pipelineStreams.push(outputStream);
165
+
166
+ // Create the promisified pipeline and add it to the array of promises we'll wait for
167
+ promises.unshift(pipeline(pipelineStreams));
168
+ }
169
+
170
+ // Wait for the promises and then assert
171
+ return Promise.all(promises)
172
+ .then(() => testLogger('All backup promises resolved.'))
173
+ .then(() => {
174
+ if (params.expectedBackupError) {
175
+ return Promise.reject(new Error('Backup passed when it should have failed.'));
176
+ }
177
+ })
178
+ .catch((err) => {
179
+ if (params.expectedBackupError || params.abort) {
180
+ if (params.useApi) {
181
+ assert.strictEqual(err.name, params.expectedBackupError.name, 'The backup should receive the expected error.');
182
+ } else {
183
+ if (params.abort) {
184
+ // The tail should be stopped when we match a line and abort, but if
185
+ // something didn't work we need to make sure the tail is stopped
186
+ tail.unwatch();
187
+ // Assert that the process was aborted as expected
188
+ assert.strictEqual(err.signal, 'SIGTERM', `The backup should have terminated with SIGTERM, but was ${err.signal}.`);
189
+ } else if (params.expectedBackupError) {
190
+ assert.strictEqual(err.code, params.expectedBackupError.code, `The backup exited with unexpected code ${err.code} and signal ${err.signal}.`);
191
+ }
192
+ }
193
+ } else {
194
+ return Promise.reject(err);
195
+ }
196
+ });
197
+ }
198
+
199
+ async function testRestore(params, inputStream, databaseName) {
200
+ const pipelineStreams = [inputStream];
201
+ const promises = [];
202
+
203
+ // Configure API key if needed
204
+ augmentParamsWithApiKey(params);
205
+
206
+ let restore;
207
+ let restoreStream;
208
+ let restorePromise;
209
+
210
+ if (params.useApi) {
211
+ restoreStream = new PassThrough();
212
+ const restoreCallbackPromise = new Promise((resolve, reject) => {
213
+ restore = app.restore(
214
+ restoreStream,
215
+ dbUrl(process.env.COUCH_URL, databaseName),
216
+ params.opts,
217
+ (err, data) => {
218
+ if (err) {
219
+ testLogger(`API restore callback with ${err}, will reject.`);
220
+ reject(err);
221
+ } else {
222
+ resolve(data);
223
+ }
224
+ });
225
+ });
226
+ const restoreFinshedPromise = once(restore, 'finished')
227
+ .then((summary) => {
228
+ testLogger(`Resolving API restore promise with ${summary}`);
229
+ })
230
+ .catch((err) => {
231
+ testLogger(`Handling API restore error event ${JSON.stringify(err)}`);
232
+ if (params.expectedRestoreErrorRecoverable) {
233
+ testLogger(`Expecting restore error ${params.expectedRestoreErrorRecoverable.name}`);
234
+ assert.strictEqual(err.name, params.expectedRestoreErrorRecoverable.name, 'The restore should receive the expected recoverable error.');
235
+ } else {
236
+ testLogger(`API restore will reject by throwing error event ${JSON.stringify(err)}`);
237
+ return Promise.reject(err);
238
+ }
239
+ });
240
+ restorePromise = Promise.all([restoreCallbackPromise, restoreFinshedPromise]);
241
+ } else {
242
+ restore = cliRestore(databaseName, params);
243
+ restoreStream = restore.stream;
244
+ restorePromise = restore.childProcessPromise;
245
+ }
246
+ promises.push(restorePromise);
247
+
248
+ // Pipe via decompression if requested
249
+ if (params.compression) {
250
+ if (params.useApi) {
251
+ pipelineStreams.push(createGunzip());
252
+ } else {
253
+ const gunzipProcess = cliGunzip();
254
+ pipelineStreams.push(gunzipProcess.stream);
255
+ promises.push(gunzipProcess.childProcessPromise);
256
+ }
257
+ }
258
+
259
+ // Pipe via decryption if requested
260
+ if (params.encryption) {
261
+ if (params.useApi) {
262
+ // Currently only CLI support for testing encryption
263
+ return Promise.reject(new Error('Not implemented: cannot test encrypted API backups at this time.'));
264
+ } else {
265
+ const decryptProcess = cliDecrypt();
266
+ pipelineStreams.push(decryptProcess.stream);
267
+ promises.push(decryptProcess.childProcessPromise);
268
+ }
269
+ }
270
+
271
+ // pipeline everything into the restoreStream
272
+ pipelineStreams.push(restoreStream);
273
+
274
+ // Create the promisified pipeline and add it to the array of promises we'll wait for
275
+ promises.unshift(pipeline(pipelineStreams));
276
+
277
+ // Wait for the all the promises to settle and then assert based on the process promise
278
+ return Promise.allSettled(promises)
279
+ .then(() => { return restorePromise; })
280
+ .then((summary) => {
281
+ testLogger(`Restore promise resolved with ${summary}.`);
282
+ if (params.expectedRestoreError) {
283
+ return Promise.reject(new Error('Restore passed when it should have failed.'));
284
+ }
285
+ })
286
+ .catch((err) => {
287
+ testLogger(`Restore promise rejected with ${err}.`);
288
+ if (params.expectedRestoreError) {
289
+ if (params.useApi) {
290
+ assert.strictEqual(err.name, params.expectedRestoreError.name, 'The restore should receive the expected error.');
291
+ } else {
292
+ assert.strictEqual(err.code, params.expectedRestoreError.code, `The restore exited with unexpected code ${err.code} and signal ${err.signal}.`);
293
+ }
294
+ } else {
295
+ return Promise.reject(err);
296
+ }
297
+ });
298
+ }
299
+
300
+ // Serial backup and restore via a file on disk
301
+ async function testBackupAndRestoreViaFile(params, srcDb, backupFile, targetDb) {
302
+ return testBackupToFile(params, srcDb, backupFile).then(() => {
303
+ return testRestoreFromFile(params, backupFile, targetDb);
304
+ });
305
+ }
306
+
307
+ async function testBackupToFile(params, srcDb, backupFile) {
308
+ // Open the file for appending if this is a resume
309
+ const output = fs.createWriteStream(backupFile, { flags: (params.opts && params.opts.resume) ? 'a' : 'w' });
310
+ return once(output, 'open')
311
+ .then(() => {
312
+ return testBackup(params, srcDb, output);
27
313
  });
314
+ }
28
315
 
29
- it('should backup and restore largedb1g #slow', async function() {
30
- // Allow up to 30 m for backup and restore of largedb1g
31
- // This is a long time but when many builds run in parallel it can take a
32
- // while to get this done.
33
- u.setTimeout(this, 30 * 60);
34
- return u.testDirectBackupAndRestore(params, 'largedb1g', this.dbName);
316
+ async function testRestoreFromFile(params, backupFile, targetDb) {
317
+ const input = fs.createReadStream(backupFile);
318
+ return once(input, 'open')
319
+ .then(() => {
320
+ return testRestore(params, input, targetDb);
35
321
  });
322
+ }
323
+
324
+ async function testDirectBackupAndRestore(params, srcDb, targetDb) {
325
+ // Allow a 64 MB highWaterMark for the passthrough during testing
326
+ const passthrough = new PassThrough({ highWaterMark: 67108864 });
327
+ const backup = testBackup(params, srcDb, passthrough);
328
+ const restore = testRestore(params, passthrough, targetDb);
329
+ return Promise.all([backup, restore]).then(() => {
330
+ return dbCompare(srcDb, targetDb);
36
331
  });
37
- });
332
+ }
333
+
334
+ async function testBackupAbortResumeRestore(params, srcDb, backupFile, targetDb) {
335
+ return Promise.resolve()
336
+ .then(() => {
337
+ // First backup with an abort
338
+ if (params.opts && params.opts.output) {
339
+ return testBackup(params, srcDb, new PassThrough());
340
+ } else {
341
+ return testBackupToFile(params, srcDb, backupFile);
342
+ }
343
+ }).then(() => {
344
+ // Remove the abort parameter and add the resume parameter
345
+ delete params.abort;
346
+ params.opts.resume = true;
347
+ // Resume the backup
348
+ if (params.opts && params.opts.output) {
349
+ return testBackup(params, srcDb, new PassThrough());
350
+ } else {
351
+ return testBackupToFile(params, srcDb, backupFile);
352
+ }
353
+ }).then(() => {
354
+ // Restore the backup
355
+ return testRestoreFromFile(params, backupFile, targetDb);
356
+ }).then(() => {
357
+ // Now compare the restored to the original for validation
358
+ return dbCompare(srcDb, targetDb);
359
+ });
360
+ }
361
+
362
+ async function dbCompare(db1Name, db2Name) {
363
+ const client = request.client(process.env.COUCH_BACKEND_URL, {});
364
+ return compare.compare(db1Name, db2Name, client.service)
365
+ .then(result => {
366
+ return assert.strictEqual(result, true, 'The database comparison should succeed, but failed');
367
+ });
368
+ }
369
+
370
+ function sortByIdThenRev(o1, o2) {
371
+ if (o1._id < o2._id) return -1;
372
+ if (o1._id > o2._id) return 1;
373
+ if (o1._rev < o2._rev) return -1;
374
+ if (o1._rev > o2._rev) return 1;
375
+ return 0;
376
+ }
377
+
378
+ function readSortAndDeepEqual(actualContentPath, expectedContentPath) {
379
+ const backupContent = JSON.parse(fs.readFileSync(actualContentPath, 'utf8'));
380
+ const expectedContent = JSON.parse(fs.readFileSync(expectedContentPath, 'utf8'));
381
+ // Array order of the docs is important for equality, but not for backup
382
+ backupContent.sort(sortByIdThenRev);
383
+ expectedContent.sort(sortByIdThenRev);
384
+ // Assert that the backup matches the expected
385
+ assert.deepStrictEqual(backupContent, expectedContent);
386
+ }
387
+
388
+ function setTimeout(context, timeout) {
389
+ // Increase timeout using TEST_TIMEOUT_MULTIPLIER
390
+ const multiplier = (typeof process.env.TEST_TIMEOUT_MULTIPLIER !== 'undefined') ? parseInt(process.env.TEST_TIMEOUT_MULTIPLIER) : 1;
391
+ timeout *= multiplier;
392
+ // Set the mocha timeout
393
+ context.timeout(timeout * 1000);
394
+ }
395
+
396
+ function assertGzipFile(path) {
397
+ // 1f 8b is the gzip magic number
398
+ const expectedBytes = Buffer.from([0x1f, 0x8b]);
399
+ const buffer = Buffer.alloc(2);
400
+ const fd = fs.openSync(path, 'r');
401
+ // Read the first two bytes
402
+ fs.readSync(fd, buffer, 0, 2, 0);
403
+ fs.closeSync(fd);
404
+ // Assert the magic number corresponds to gz extension
405
+ assert.deepStrictEqual(buffer, expectedBytes, 'The backup file should be gz compressed.');
406
+ }
407
+
408
+ function assertEncryptedFile(path) {
409
+ // Openssl encrypted files start with Salted
410
+ const expectedBytes = Buffer.from('Salted');
411
+ const buffer = Buffer.alloc(6);
412
+ const fd = fs.openSync(path, 'r');
413
+ // Read the first six bytes
414
+ fs.readSync(fd, buffer, 0, 6, 0);
415
+ fs.closeSync(fd);
416
+ // Assert first 6 characters of the file are "Salted"
417
+ assert.deepStrictEqual(buffer, expectedBytes, 'The backup file should be encrypted.');
418
+ }
419
+
420
+ function assertWrittenFewerThan(total, number) {
421
+ assert(total < number && total > 0, `Saw ${total} but expected between 1 and ${number - 1} documents for the resumed backup.`);
422
+ }
423
+
424
+ function augmentParamsWithApiKey(params) {
425
+ if (process.env.COUCHBACKUP_TEST_IAM_API_KEY) {
426
+ if (!params.opts) {
427
+ params.opts = {};
428
+ }
429
+ params.opts.iamApiKey = process.env.COUCHBACKUP_TEST_IAM_API_KEY;
430
+ params.opts.iamTokenUrl = process.env.CLOUDANT_IAM_TOKEN_URL;
431
+ }
432
+ }
433
+
434
+ module.exports = {
435
+ scenario,
436
+ p: params,
437
+ setTimeout,
438
+ dbCompare,
439
+ readSortAndDeepEqual,
440
+ assertGzipFile,
441
+ assertEncryptedFile,
442
+ testBackup,
443
+ testRestore,
444
+ testDirectBackupAndRestore,
445
+ testBackupToFile,
446
+ testRestoreFromFile,
447
+ testBackupAndRestoreViaFile,
448
+ testBackupAbortResumeRestore
449
+ };
@@ -15,23 +15,92 @@
15
15
  /* global describe it */
16
16
  'use strict';
17
17
 
18
+ const fs = require('fs');
19
+ const { once } = require('node:events');
18
20
  const u = require('./citestutils.js');
19
21
 
20
- describe('Event tests', function() {
21
- it('should get a finished event when using stdout', async function() {
22
- u.setTimeout(this, 40);
23
- // Use the API so we can get events, pass eventEmitter so we get the emitter back
24
- const params = { useApi: true, useStdOut: true };
25
- // All API backups now set an event listener for finished and it is part of the backup
26
- // promise, so if the backup passes the finished event fired.
27
- return u.testBackup(params, 'animaldb', process.stdout);
28
- });
22
+ [{ useApi: true }, { useApi: false }].forEach(function(params) {
23
+ describe(u.scenario('Basic backup and restore', params), function() {
24
+ it('should backup animaldb to a file correctly', async function() {
25
+ // Allow up to 40 s to backup and compare (it should be much faster)!
26
+ u.setTimeout(this, 40);
27
+ const actualBackup = `./${this.fileName}`;
28
+ // Create a file and backup to it
29
+ const output = fs.createWriteStream(actualBackup);
30
+ return once(output, 'open')
31
+ .then(() => {
32
+ return u.testBackup(params, 'animaldb', output);
33
+ }).then(() => {
34
+ return u.readSortAndDeepEqual(actualBackup, './test/fixtures/animaldb_expected.json');
35
+ });
36
+ });
37
+
38
+ it('should restore animaldb to a database correctly', async function() {
39
+ // Allow up to 60 s to restore and compare (again it should be faster)!
40
+ u.setTimeout(this, 60);
41
+ const input = fs.createReadStream('./test/fixtures/animaldb_expected.json');
42
+ const dbName = this.dbName;
43
+ return once(input, 'open').then(() => {
44
+ return u.testRestore(params, input, dbName);
45
+ }).then(() => {
46
+ return u.dbCompare('animaldb', dbName);
47
+ });
48
+ });
49
+
50
+ it('should execute a shallow mode backup successfully', async function() {
51
+ // Allow 30 s
52
+ u.setTimeout(this, 30);
53
+ const actualBackup = `./${this.fileName}`;
54
+ const output = fs.createWriteStream(actualBackup);
55
+ // Add the shallow mode option
56
+ const p = u.p(params, { opts: { mode: 'shallow' } });
57
+ return once(output, 'open')
58
+ .then(() => {
59
+ return u.testBackup(p, 'animaldb', output);
60
+ }).then(() => {
61
+ return u.readSortAndDeepEqual(actualBackup, './test/fixtures/animaldb_expected_shallow.json');
62
+ });
63
+ });
64
+
65
+ describe(u.scenario('Buffer size tests', params), function() {
66
+ it('should backup/restore animaldb with the same buffer size', async function() {
67
+ // Allow up to 60 s for backup and restore of animaldb
68
+ u.setTimeout(this, 60);
69
+ const actualBackup = `./${this.fileName}`;
70
+ const logFile = `./${this.fileName}` + '.log';
71
+ const p = u.p(params, { opts: { log: logFile, bufferSize: 1 } });
72
+ return u.testBackupAndRestoreViaFile(p, 'animaldb', actualBackup, this.dbName);
73
+ });
74
+
75
+ it('should backup/restore animaldb with backup buffer > restore buffer', async function() {
76
+ // Allow up to 60 s for backup and restore of animaldb
77
+ u.setTimeout(this, 60);
78
+ const actualBackup = `./${this.fileName}`;
79
+ const logFile = `./${this.fileName}` + '.log';
80
+ const dbName = this.dbName;
81
+ const p = u.p(params, { opts: { log: logFile, bufferSize: 2 } }); // backup
82
+ const q = u.p(params, { opts: { bufferSize: 1 } }); // restore
83
+ return u.testBackupToFile(p, 'animaldb', actualBackup).then(() => {
84
+ return u.testRestoreFromFile(q, actualBackup, dbName);
85
+ }).then(() => {
86
+ return u.dbCompare('animaldb', dbName);
87
+ });
88
+ });
29
89
 
30
- it('should get a finished event when using file output', async function() {
31
- u.setTimeout(this, 40);
32
- // Use the API so we can get events, pass eventEmitter so we get the emitter back
33
- const params = { useApi: true };
34
- const actualBackup = `./${this.fileName}`;
35
- return u.testBackupToFile(params, 'animaldb', actualBackup);
90
+ it('should backup/restore animaldb with backup buffer < restore buffer', async function() {
91
+ // Allow up to 60 s for backup and restore of animaldb
92
+ u.setTimeout(this, 60);
93
+ const actualBackup = `./${this.fileName}`;
94
+ const logFile = `./${this.fileName}` + '.log';
95
+ const dbName = this.dbName;
96
+ const p = u.p(params, { opts: { log: logFile, bufferSize: 1 } }); // backup
97
+ const q = u.p(params, { opts: { bufferSize: 2 } }); // restore
98
+ return u.testBackupToFile(p, 'animaldb', actualBackup).then(() => {
99
+ return u.testRestoreFromFile(q, actualBackup, dbName);
100
+ }).then(() => {
101
+ return u.dbCompare('animaldb', dbName);
102
+ });
103
+ });
104
+ });
36
105
  });
37
106
  });
@@ -15,18 +15,87 @@
15
15
  /* global describe it */
16
16
  'use strict';
17
17
 
18
+ const assert = require('assert');
19
+ const fs = require('fs');
20
+ const { once } = require('node:events');
18
21
  const u = require('./citestutils.js');
19
22
 
20
- describe('Encryption tests', function() {
21
- // Note CLI only to use openssl command
22
- const p = { useApi: false, encryption: true };
23
+ [{ useApi: true }, { useApi: false }].forEach(function(params) {
24
+ describe(u.scenario('Resume tests', params), function() {
25
+ it('should create a log file', async function() {
26
+ // Allow up to 90 s for this test
27
+ u.setTimeout(this, 60);
23
28
 
24
- it('should backup and restore animaldb via an encrypted file', async function() {
25
- // Allow up to 60 s for backup and restore of animaldb
26
- u.setTimeout(this, 60);
27
- const encryptedBackup = `./${this.fileName}`;
28
- return u.testBackupAndRestoreViaFile(p, 'animaldb', encryptedBackup, this.dbName).then(() => {
29
- return u.assertEncryptedFile(encryptedBackup);
29
+ const actualBackup = `./${this.fileName}`;
30
+ const logFile = `./${this.fileName}` + '.log';
31
+ const p = u.p(params, { opts: { log: logFile } });
32
+ return u.testBackupToFile(p, 'animaldb', actualBackup).then(() => {
33
+ assert.ok(fs.existsSync(logFile), 'The log file should exist.');
34
+ });
30
35
  });
36
+
37
+ it('should restore corrupted animaldb to a database correctly', async function() {
38
+ // Allow up to 60 s to restore and compare (again it should be faster)!
39
+ u.setTimeout(this, 60);
40
+ const input = fs.createReadStream('./test/fixtures/animaldb_corrupted.json');
41
+ const dbName = this.dbName;
42
+ const p = u.p(params, { expectedRestoreErrorRecoverable: { name: 'BackupFileJsonError' } });
43
+ return once(input, 'open')
44
+ .then(() => {
45
+ return u.testRestore(p, input, dbName);
46
+ }).then(() => {
47
+ return u.dbCompare('animaldb', dbName);
48
+ });
49
+ });
50
+
51
+ it('should restore resumed animaldb with blank line to a database correctly', async function() {
52
+ // Allow up to 60 s to restore and compare (again it should be faster)!
53
+ u.setTimeout(this, 60);
54
+ const input = fs.createReadStream('./test/fixtures/animaldb_resumed_blank.json');
55
+ const dbName = this.dbName;
56
+ return once(input, 'open')
57
+ .then(() => {
58
+ return u.testRestore(params, input, dbName);
59
+ }).then(() => {
60
+ return u.dbCompare('animaldb', dbName);
61
+ });
62
+ });
63
+ });
64
+ });
65
+
66
+ describe('Resume tests', function() {
67
+ // Currently cannot abort API backups, when we do this test should be run for
68
+ // both API and CLI
69
+ it('should correctly backup and restore backup10m', async function() {
70
+ // Allow up to 90 s for this test
71
+ u.setTimeout(this, 90);
72
+
73
+ const actualBackup = `./${this.fileName}`;
74
+ const logFile = `./${this.fileName}` + '.log';
75
+ // Use abort parameter to terminate the backup
76
+ const p = u.p(params, { abort: true }, { opts: { log: logFile } });
77
+ const restoreDb = this.dbName;
78
+ // Set the database doc count as fewer than this should be written during
79
+ // resumed backup.
80
+ p.exclusiveMaxExpected = 5096;
81
+
82
+ return u.testBackupAbortResumeRestore(p, 'backup10m', actualBackup, restoreDb);
83
+ });
84
+ // Note --output is only valid for CLI usage, this test should only run for CLI
85
+ const params = { useApi: false };
86
+ it('should correctly backup and restore backup10m using --output', async function() {
87
+ // Allow up to 90 s for this test
88
+ u.setTimeout(this, 90);
89
+
90
+ const actualBackup = `./${this.fileName}`;
91
+ const logFile = `./${this.fileName}` + '.log';
92
+ // Use abort parameter to terminate the backup
93
+ const p = u.p(params, { abort: true }, { opts: { output: actualBackup, log: logFile } });
94
+ const restoreDb = this.dbName;
95
+ // Set the database doc count as fewer than this should be written during
96
+ // resumed backup.
97
+ p.exclusiveMaxExpected = 5096;
98
+
99
+ return await u.testBackupAbortResumeRestore(p, 'backup10m', actualBackup, restoreDb);
31
100
  });
32
101
  });