@cloudant/couchbackup 2.9.16-SNAPSHOT.183 → 2.9.16

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 +2 -2
  2. package/.scannerwork/scanner-report/analysis-cache2.pb +0 -0
  3. package/.scannerwork/scanner-report/analysis-warnings.pb +2 -2
  4. package/.scannerwork/scanner-report/analysis.log +1 -1
  5. package/.scannerwork/scanner-report/changesets-2.pb +1 -0
  6. package/.scannerwork/scanner-report/changesets-34.pb +1 -0
  7. package/.scannerwork/scanner-report/changesets-35.pb +1 -0
  8. package/.scannerwork/scanner-report/changesets-36.pb +1 -0
  9. package/.scannerwork/scanner-report/changesets-37.pb +1 -0
  10. package/.scannerwork/scanner-report/changesets-4.pb +1 -0
  11. package/.scannerwork/scanner-report/changesets-43.pb +1 -0
  12. package/.scannerwork/scanner-report/changesets-44.pb +1 -0
  13. package/.scannerwork/scanner-report/changesets-45.pb +1 -0
  14. package/.scannerwork/scanner-report/changesets-5.pb +1 -0
  15. package/.scannerwork/scanner-report/changesets-60.pb +1 -0
  16. package/.scannerwork/scanner-report/changesets-61.pb +1 -0
  17. package/.scannerwork/scanner-report/changesets-64.pb +1 -0
  18. package/.scannerwork/scanner-report/changesets-66.pb +1 -0
  19. package/.scannerwork/scanner-report/changesets-8.pb +1 -0
  20. package/.scannerwork/scanner-report/component-1.pb +2 -2
  21. package/.scannerwork/scanner-report/component-10.pb +1 -1
  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 -0
  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-3.pb +1 -0
  35. package/.scannerwork/scanner-report/component-34.pb +1 -0
  36. package/.scannerwork/scanner-report/component-35.pb +1 -0
  37. package/.scannerwork/scanner-report/component-36.pb +1 -0
  38. package/.scannerwork/scanner-report/component-37.pb +1 -0
  39. package/.scannerwork/scanner-report/component-38.pb +1 -1
  40. package/.scannerwork/scanner-report/component-39.pb +1 -1
  41. package/.scannerwork/scanner-report/component-4.pb +1 -1
  42. package/.scannerwork/scanner-report/component-40.pb +1 -1
  43. package/.scannerwork/scanner-report/component-41.pb +1 -1
  44. package/.scannerwork/scanner-report/component-42.pb +1 -1
  45. package/.scannerwork/scanner-report/component-43.pb +1 -0
  46. package/.scannerwork/scanner-report/component-44.pb +1 -1
  47. package/.scannerwork/scanner-report/component-45.pb +1 -0
  48. package/.scannerwork/scanner-report/component-46.pb +1 -1
  49. package/.scannerwork/scanner-report/component-47.pb +1 -1
  50. package/.scannerwork/scanner-report/component-48.pb +1 -1
  51. package/.scannerwork/scanner-report/component-49.pb +1 -1
  52. package/.scannerwork/scanner-report/component-5.pb +1 -0
  53. package/.scannerwork/scanner-report/component-50.pb +1 -1
  54. package/.scannerwork/scanner-report/component-51.pb +1 -1
  55. package/.scannerwork/scanner-report/component-52.pb +1 -1
  56. package/.scannerwork/scanner-report/component-54.pb +1 -1
  57. package/.scannerwork/scanner-report/component-55.pb +1 -1
  58. package/.scannerwork/scanner-report/component-6.pb +1 -1
  59. package/.scannerwork/scanner-report/component-60.pb +1 -1
  60. package/.scannerwork/scanner-report/component-61.pb +1 -0
  61. package/.scannerwork/scanner-report/component-64.pb +1 -1
  62. package/.scannerwork/scanner-report/component-66.pb +1 -0
  63. package/.scannerwork/scanner-report/component-68.pb +1 -1
  64. package/.scannerwork/scanner-report/component-7.pb +1 -1
  65. package/.scannerwork/scanner-report/component-8.pb +1 -0
  66. package/.scannerwork/scanner-report/component-9.pb +1 -1
  67. package/.scannerwork/scanner-report/coverages-10.pb +0 -0
  68. package/.scannerwork/scanner-report/coverages-12.pb +0 -0
  69. package/.scannerwork/scanner-report/coverages-13.pb +0 -0
  70. package/.scannerwork/scanner-report/coverages-14.pb +0 -0
  71. package/.scannerwork/scanner-report/coverages-15.pb +0 -0
  72. package/.scannerwork/scanner-report/coverages-16.pb +0 -0
  73. package/.scannerwork/scanner-report/coverages-17.pb +0 -0
  74. package/.scannerwork/scanner-report/coverages-18.pb +0 -0
  75. package/.scannerwork/scanner-report/coverages-19.pb +0 -0
  76. package/.scannerwork/scanner-report/coverages-2.pb +0 -0
  77. package/.scannerwork/scanner-report/coverages-20.pb +0 -0
  78. package/.scannerwork/scanner-report/coverages-21.pb +0 -0
  79. package/.scannerwork/scanner-report/coverages-22.pb +0 -0
  80. package/.scannerwork/scanner-report/coverages-34.pb +0 -0
  81. package/.scannerwork/scanner-report/coverages-35.pb +0 -0
  82. package/.scannerwork/scanner-report/coverages-36.pb +0 -0
  83. package/.scannerwork/scanner-report/coverages-39.pb +0 -0
  84. package/.scannerwork/scanner-report/coverages-4.pb +0 -0
  85. package/.scannerwork/scanner-report/coverages-40.pb +0 -0
  86. package/.scannerwork/scanner-report/coverages-41.pb +0 -0
  87. package/.scannerwork/scanner-report/coverages-42.pb +0 -0
  88. package/.scannerwork/scanner-report/coverages-45.pb +0 -0
  89. package/.scannerwork/scanner-report/coverages-46.pb +0 -0
  90. package/.scannerwork/scanner-report/coverages-47.pb +0 -0
  91. package/.scannerwork/scanner-report/coverages-48.pb +0 -0
  92. package/.scannerwork/scanner-report/coverages-49.pb +0 -0
  93. package/.scannerwork/scanner-report/coverages-5.pb +0 -0
  94. package/.scannerwork/scanner-report/coverages-50.pb +0 -0
  95. package/.scannerwork/scanner-report/coverages-51.pb +0 -0
  96. package/.scannerwork/scanner-report/coverages-52.pb +0 -0
  97. package/.scannerwork/scanner-report/coverages-54.pb +0 -0
  98. package/.scannerwork/scanner-report/coverages-6.pb +0 -0
  99. package/.scannerwork/scanner-report/coverages-7.pb +0 -0
  100. package/.scannerwork/scanner-report/coverages-8.pb +0 -0
  101. package/.scannerwork/scanner-report/coverages-9.pb +0 -0
  102. package/.scannerwork/scanner-report/duplications-12.pb +3 -0
  103. package/.scannerwork/scanner-report/duplications-16.pb +0 -2
  104. package/.scannerwork/scanner-report/duplications-17.pb +0 -2
  105. package/.scannerwork/scanner-report/duplications-4.pb +2 -0
  106. package/.scannerwork/scanner-report/duplications-46.pb +0 -2
  107. package/.scannerwork/scanner-report/duplications-50.pb +1 -1
  108. package/.scannerwork/scanner-report/duplications-51.pb +2 -0
  109. package/.scannerwork/scanner-report/duplications-64.pb +2 -0
  110. package/.scannerwork/scanner-report/duplications-66.pb +2 -0
  111. package/.scannerwork/scanner-report/duplications-9.pb +2 -0
  112. package/.scannerwork/scanner-report/issues-12.pb +3 -2
  113. package/.scannerwork/scanner-report/issues-35.pb +3 -0
  114. package/.scannerwork/scanner-report/measures-10.pb +0 -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-3.pb +0 -0
  128. package/.scannerwork/scanner-report/measures-34.pb +0 -0
  129. package/.scannerwork/scanner-report/measures-35.pb +0 -0
  130. package/.scannerwork/scanner-report/measures-36.pb +15 -0
  131. package/.scannerwork/scanner-report/measures-38.pb +0 -0
  132. package/.scannerwork/scanner-report/measures-39.pb +0 -0
  133. package/.scannerwork/scanner-report/measures-4.pb +0 -0
  134. package/.scannerwork/scanner-report/measures-40.pb +0 -0
  135. package/.scannerwork/scanner-report/measures-41.pb +0 -0
  136. package/.scannerwork/scanner-report/measures-42.pb +0 -0
  137. package/.scannerwork/scanner-report/measures-44.pb +0 -0
  138. package/.scannerwork/scanner-report/measures-45.pb +0 -0
  139. package/.scannerwork/scanner-report/measures-46.pb +0 -0
  140. package/.scannerwork/scanner-report/measures-47.pb +0 -0
  141. package/.scannerwork/scanner-report/measures-48.pb +0 -0
  142. package/.scannerwork/scanner-report/measures-49.pb +0 -0
  143. package/.scannerwork/scanner-report/measures-5.pb +0 -0
  144. package/.scannerwork/scanner-report/measures-50.pb +0 -0
  145. package/.scannerwork/scanner-report/measures-51.pb +0 -0
  146. package/.scannerwork/scanner-report/measures-52.pb +0 -0
  147. package/.scannerwork/scanner-report/measures-54.pb +0 -0
  148. package/.scannerwork/scanner-report/measures-55.pb +0 -0
  149. package/.scannerwork/scanner-report/measures-6.pb +0 -0
  150. package/.scannerwork/scanner-report/measures-60.pb +0 -0
  151. package/.scannerwork/scanner-report/measures-64.pb +0 -0
  152. package/.scannerwork/scanner-report/measures-68.pb +0 -0
  153. package/.scannerwork/scanner-report/measures-7.pb +0 -0
  154. package/.scannerwork/scanner-report/measures-8.pb +0 -0
  155. package/.scannerwork/scanner-report/measures-9.pb +0 -0
  156. package/.scannerwork/scanner-report/metadata.pb +0 -0
  157. package/.scannerwork/scanner-report/source-10.txt +16 -19
  158. package/.scannerwork/scanner-report/source-12.txt +193 -22
  159. package/.scannerwork/scanner-report/source-13.txt +78 -6
  160. package/.scannerwork/scanner-report/source-14.txt +112 -44
  161. package/.scannerwork/scanner-report/source-15.txt +428 -16
  162. package/.scannerwork/scanner-report/source-16.txt +259 -153
  163. package/.scannerwork/scanner-report/source-17.txt +84 -167
  164. package/.scannerwork/scanner-report/source-18.txt +83 -42
  165. package/.scannerwork/scanner-report/source-19.txt +114 -86
  166. package/.scannerwork/scanner-report/source-2.txt +414 -0
  167. package/.scannerwork/scanner-report/source-20.txt +41 -77
  168. package/.scannerwork/scanner-report/source-21.txt +9 -10
  169. package/.scannerwork/scanner-report/source-22.txt +22 -115
  170. package/.scannerwork/scanner-report/source-3.txt +424 -0
  171. package/.scannerwork/scanner-report/source-34.txt +37 -0
  172. package/.scannerwork/scanner-report/source-35.txt +42 -0
  173. package/.scannerwork/scanner-report/source-36.txt +151 -0
  174. package/.scannerwork/scanner-report/source-38.txt +424 -213
  175. package/.scannerwork/scanner-report/source-39.txt +115 -23
  176. package/.scannerwork/scanner-report/source-4.txt +187 -424
  177. package/.scannerwork/scanner-report/source-40.txt +88 -426
  178. package/.scannerwork/scanner-report/source-41.txt +32 -315
  179. package/.scannerwork/scanner-report/source-42.txt +60 -131
  180. package/.scannerwork/scanner-report/source-44.txt +178 -424
  181. package/.scannerwork/scanner-report/source-45.txt +118 -0
  182. package/.scannerwork/scanner-report/source-46.txt +14 -65
  183. package/.scannerwork/scanner-report/source-47.txt +91 -24
  184. package/.scannerwork/scanner-report/source-48.txt +140 -17
  185. package/.scannerwork/scanner-report/source-49.txt +256 -55
  186. package/.scannerwork/scanner-report/source-5.txt +29 -0
  187. package/.scannerwork/scanner-report/source-50.txt +29 -12
  188. package/.scannerwork/scanner-report/source-51.txt +50 -139
  189. package/.scannerwork/scanner-report/source-52.txt +16 -266
  190. package/.scannerwork/scanner-report/source-54.txt +32 -104
  191. package/.scannerwork/scanner-report/source-55.txt +424 -111
  192. package/.scannerwork/scanner-report/source-6.txt +305 -22
  193. package/.scannerwork/scanner-report/source-60.txt +60 -424
  194. package/.scannerwork/scanner-report/source-64.txt +190 -102
  195. package/.scannerwork/scanner-report/source-68.txt +102 -190
  196. package/.scannerwork/scanner-report/source-7.txt +159 -382
  197. package/.scannerwork/scanner-report/source-8.txt +62 -0
  198. package/.scannerwork/scanner-report/source-9.txt +167 -84
  199. package/.scannerwork/scanner-report/symbols-10.pb +9 -23
  200. package/.scannerwork/scanner-report/symbols-12.pb +264 -19
  201. package/.scannerwork/scanner-report/symbols-13.pb +58 -8
  202. package/.scannerwork/scanner-report/symbols-14.pb +86 -24
  203. package/.scannerwork/scanner-report/symbols-15.pb +790 -9
  204. package/.scannerwork/scanner-report/symbols-16.pb +417 -216
  205. package/.scannerwork/scanner-report/symbols-17.pb +69 -203
  206. package/.scannerwork/scanner-report/symbols-18.pb +59 -33
  207. package/.scannerwork/scanner-report/symbols-19.pb +71 -59
  208. package/.scannerwork/scanner-report/symbols-2.pb +604 -0
  209. package/.scannerwork/scanner-report/symbols-20.pb +32 -57
  210. package/.scannerwork/scanner-report/symbols-21.pb +13 -21
  211. package/.scannerwork/scanner-report/symbols-22.pb +31 -71
  212. package/.scannerwork/scanner-report/symbols-34.pb +13 -0
  213. package/.scannerwork/scanner-report/symbols-35.pb +19 -0
  214. package/.scannerwork/scanner-report/symbols-36.pb +93 -0
  215. package/.scannerwork/scanner-report/symbols-39.pb +33 -13
  216. package/.scannerwork/scanner-report/symbols-4.pb +227 -0
  217. package/.scannerwork/scanner-report/symbols-40.pb +56 -787
  218. package/.scannerwork/scanner-report/symbols-41.pb +20 -353
  219. package/.scannerwork/scanner-report/symbols-42.pb +45 -92
  220. package/.scannerwork/scanner-report/symbols-45.pb +30 -0
  221. package/.scannerwork/scanner-report/symbols-46.pb +16 -42
  222. package/.scannerwork/scanner-report/symbols-47.pb +44 -18
  223. package/.scannerwork/scanner-report/symbols-48.pb +126 -18
  224. package/.scannerwork/scanner-report/symbols-49.pb +354 -46
  225. package/.scannerwork/scanner-report/symbols-5.pb +8 -0
  226. package/.scannerwork/scanner-report/symbols-50.pb +38 -36
  227. package/.scannerwork/scanner-report/symbols-51.pb +42 -126
  228. package/.scannerwork/scanner-report/symbols-52.pb +14 -354
  229. package/.scannerwork/scanner-report/symbols-54.pb +7 -30
  230. package/.scannerwork/scanner-report/symbols-6.pb +353 -7
  231. package/.scannerwork/scanner-report/symbols-7.pb +203 -598
  232. package/.scannerwork/scanner-report/symbols-8.pb +24 -0
  233. package/.scannerwork/scanner-report/symbols-9.pb +203 -69
  234. package/.scannerwork/scanner-report/syntax-highlightings-10.pb +25 -20
  235. package/.scannerwork/scanner-report/syntax-highlightings-12.pb +257 -26
  236. package/.scannerwork/scanner-report/syntax-highlightings-13.pb +119 -14
  237. package/.scannerwork/scanner-report/syntax-highlightings-14.pb +89 -61
  238. package/.scannerwork/scanner-report/syntax-highlightings-15.pb +592 -26
  239. package/.scannerwork/scanner-report/syntax-highlightings-16.pb +613 -261
  240. package/.scannerwork/scanner-report/syntax-highlightings-17.pb +67 -240
  241. package/.scannerwork/scanner-report/syntax-highlightings-18.pb +140 -72
  242. package/.scannerwork/scanner-report/syntax-highlightings-19.pb +143 -140
  243. package/.scannerwork/scanner-report/syntax-highlightings-2.pb +641 -0
  244. package/.scannerwork/scanner-report/syntax-highlightings-20.pb +68 -112
  245. package/.scannerwork/scanner-report/syntax-highlightings-21.pb +13 -26
  246. package/.scannerwork/scanner-report/syntax-highlightings-22.pb +31 -143
  247. package/.scannerwork/scanner-report/syntax-highlightings-3.pb +3341 -0
  248. package/.scannerwork/scanner-report/syntax-highlightings-34.pb +62 -0
  249. package/.scannerwork/scanner-report/syntax-highlightings-35.pb +66 -0
  250. package/.scannerwork/scanner-report/syntax-highlightings-36.pb +237 -0
  251. package/.scannerwork/scanner-report/syntax-highlightings-38.pb +3257 -215
  252. package/.scannerwork/scanner-report/syntax-highlightings-39.pb +94 -27
  253. package/.scannerwork/scanner-report/syntax-highlightings-4.pb +289 -3261
  254. package/.scannerwork/scanner-report/syntax-highlightings-40.pb +91 -585
  255. package/.scannerwork/scanner-report/syntax-highlightings-41.pb +34 -590
  256. package/.scannerwork/scanner-report/syntax-highlightings-42.pb +62 -204
  257. package/.scannerwork/scanner-report/syntax-highlightings-44.pb +209 -3306
  258. package/.scannerwork/scanner-report/syntax-highlightings-45.pb +113 -0
  259. package/.scannerwork/scanner-report/syntax-highlightings-46.pb +18 -59
  260. package/.scannerwork/scanner-report/syntax-highlightings-47.pb +91 -29
  261. package/.scannerwork/scanner-report/syntax-highlightings-48.pb +180 -19
  262. package/.scannerwork/scanner-report/syntax-highlightings-49.pb +245 -55
  263. package/.scannerwork/scanner-report/syntax-highlightings-5.pb +49 -0
  264. package/.scannerwork/scanner-report/syntax-highlightings-50.pb +48 -36
  265. package/.scannerwork/scanner-report/syntax-highlightings-51.pb +42 -174
  266. package/.scannerwork/scanner-report/syntax-highlightings-52.pb +15 -255
  267. package/.scannerwork/scanner-report/syntax-highlightings-54.pb +33 -84
  268. package/.scannerwork/scanner-report/syntax-highlightings-55.pb +3329 -122
  269. package/.scannerwork/scanner-report/syntax-highlightings-6.pb +587 -29
  270. package/.scannerwork/scanner-report/syntax-highlightings-60.pb +72 -3330
  271. package/.scannerwork/scanner-report/syntax-highlightings-64.pb +218 -685
  272. package/.scannerwork/scanner-report/syntax-highlightings-68.pb +684 -218
  273. package/.scannerwork/scanner-report/syntax-highlightings-7.pb +179 -530
  274. package/.scannerwork/scanner-report/syntax-highlightings-8.pb +97 -0
  275. package/.scannerwork/scanner-report/syntax-highlightings-9.pb +240 -67
  276. package/CHANGES.md +3 -0
  277. package/package.json +1 -1
  278. package/test-18-results.xml +155 -155
  279. package/test-20-results.xml +155 -155
  280. package/test-21-results.xml +147 -147
  281. package/test-iam-20-results.xml +50 -50
  282. package/.scannerwork/scanner-report/changesets-23.pb +0 -1
  283. package/.scannerwork/scanner-report/changesets-24.pb +0 -1
  284. package/.scannerwork/scanner-report/changesets-25.pb +0 -1
  285. package/.scannerwork/scanner-report/changesets-26.pb +0 -1
  286. package/.scannerwork/scanner-report/changesets-38.pb +0 -1
  287. package/.scannerwork/scanner-report/changesets-53.pb +0 -1
  288. package/.scannerwork/scanner-report/changesets-55.pb +0 -1
  289. package/.scannerwork/scanner-report/changesets-56.pb +0 -1
  290. package/.scannerwork/scanner-report/changesets-57.pb +0 -1
  291. package/.scannerwork/scanner-report/changesets-58.pb +0 -1
  292. package/.scannerwork/scanner-report/changesets-59.pb +0 -1
  293. package/.scannerwork/scanner-report/changesets-62.pb +0 -1
  294. package/.scannerwork/scanner-report/changesets-63.pb +0 -1
  295. package/.scannerwork/scanner-report/changesets-68.pb +0 -1
  296. package/.scannerwork/scanner-report/changesets-69.pb +0 -1
  297. package/.scannerwork/scanner-report/component-23.pb +0 -1
  298. package/.scannerwork/scanner-report/component-24.pb +0 -1
  299. package/.scannerwork/scanner-report/component-25.pb +0 -1
  300. package/.scannerwork/scanner-report/component-26.pb +0 -1
  301. package/.scannerwork/scanner-report/component-53.pb +0 -1
  302. package/.scannerwork/scanner-report/component-56.pb +0 -1
  303. package/.scannerwork/scanner-report/component-57.pb +0 -1
  304. package/.scannerwork/scanner-report/component-58.pb +0 -1
  305. package/.scannerwork/scanner-report/component-59.pb +0 -1
  306. package/.scannerwork/scanner-report/component-62.pb +0 -1
  307. package/.scannerwork/scanner-report/component-63.pb +0 -1
  308. package/.scannerwork/scanner-report/component-69.pb +0 -1
  309. package/.scannerwork/scanner-report/coverages-23.pb +0 -0
  310. package/.scannerwork/scanner-report/coverages-24.pb +0 -0
  311. package/.scannerwork/scanner-report/coverages-25.pb +0 -0
  312. package/.scannerwork/scanner-report/coverages-38.pb +0 -0
  313. package/.scannerwork/scanner-report/coverages-53.pb +0 -0
  314. package/.scannerwork/scanner-report/coverages-55.pb +0 -0
  315. package/.scannerwork/scanner-report/coverages-57.pb +0 -0
  316. package/.scannerwork/scanner-report/coverages-59.pb +0 -0
  317. package/.scannerwork/scanner-report/duplications-38.pb +0 -3
  318. package/.scannerwork/scanner-report/duplications-68.pb +0 -2
  319. package/.scannerwork/scanner-report/duplications-69.pb +0 -2
  320. package/.scannerwork/scanner-report/issues-38.pb +0 -4
  321. package/.scannerwork/scanner-report/measures-23.pb +0 -0
  322. package/.scannerwork/scanner-report/measures-24.pb +0 -0
  323. package/.scannerwork/scanner-report/measures-25.pb +0 -16
  324. package/.scannerwork/scanner-report/measures-53.pb +0 -0
  325. package/.scannerwork/scanner-report/measures-56.pb +0 -16
  326. package/.scannerwork/scanner-report/measures-57.pb +0 -0
  327. package/.scannerwork/scanner-report/measures-59.pb +0 -15
  328. package/.scannerwork/scanner-report/measures-62.pb +0 -0
  329. package/.scannerwork/scanner-report/source-23.txt +0 -130
  330. package/.scannerwork/scanner-report/source-24.txt +0 -191
  331. package/.scannerwork/scanner-report/source-25.txt +0 -293
  332. package/.scannerwork/scanner-report/source-53.txt +0 -31
  333. package/.scannerwork/scanner-report/source-56.txt +0 -178
  334. package/.scannerwork/scanner-report/source-57.txt +0 -129
  335. package/.scannerwork/scanner-report/source-59.txt +0 -113
  336. package/.scannerwork/scanner-report/source-62.txt +0 -60
  337. package/.scannerwork/scanner-report/symbols-23.pb +0 -86
  338. package/.scannerwork/scanner-report/symbols-24.pb +0 -209
  339. package/.scannerwork/scanner-report/symbols-25.pb +0 -428
  340. package/.scannerwork/scanner-report/symbols-38.pb +0 -264
  341. package/.scannerwork/scanner-report/symbols-53.pb +0 -14
  342. package/.scannerwork/scanner-report/symbols-55.pb +0 -59
  343. package/.scannerwork/scanner-report/symbols-57.pb +0 -33
  344. package/.scannerwork/scanner-report/symbols-59.pb +0 -46
  345. package/.scannerwork/scanner-report/syntax-highlightings-23.pb +0 -125
  346. package/.scannerwork/scanner-report/syntax-highlightings-24.pb +0 -290
  347. package/.scannerwork/scanner-report/syntax-highlightings-25.pb +0 -720
  348. package/.scannerwork/scanner-report/syntax-highlightings-53.pb +0 -45
  349. package/.scannerwork/scanner-report/syntax-highlightings-56.pb +0 -243
  350. package/.scannerwork/scanner-report/syntax-highlightings-57.pb +0 -129
  351. package/.scannerwork/scanner-report/syntax-highlightings-59.pb +0 -126
  352. package/.scannerwork/scanner-report/syntax-highlightings-62.pb +0 -82
  353. /package/.scannerwork/scanner-report/{coverages-26.pb → coverages-37.pb} +0 -0
  354. /package/.scannerwork/scanner-report/{coverages-58.pb → coverages-43.pb} +0 -0
  355. /package/.scannerwork/scanner-report/{coverages-56.pb → coverages-44.pb} +0 -0
  356. /package/.scannerwork/scanner-report/{coverages-62.pb → coverages-60.pb} +0 -0
  357. /package/.scannerwork/scanner-report/{coverages-63.pb → coverages-61.pb} +0 -0
  358. /package/.scannerwork/scanner-report/{coverages-68.pb → coverages-64.pb} +0 -0
  359. /package/.scannerwork/scanner-report/{coverages-69.pb → coverages-66.pb} +0 -0
  360. /package/.scannerwork/scanner-report/{duplications-23.pb → duplications-13.pb} +0 -0
  361. /package/.scannerwork/scanner-report/{duplications-24.pb → duplications-2.pb} +0 -0
  362. /package/.scannerwork/scanner-report/{duplications-25.pb → duplications-34.pb} +0 -0
  363. /package/.scannerwork/scanner-report/{duplications-26.pb → duplications-35.pb} +0 -0
  364. /package/.scannerwork/scanner-report/{duplications-53.pb → duplications-36.pb} +0 -0
  365. /package/.scannerwork/scanner-report/{duplications-55.pb → duplications-37.pb} +0 -0
  366. /package/.scannerwork/scanner-report/{duplications-56.pb → duplications-43.pb} +0 -0
  367. /package/.scannerwork/scanner-report/{duplications-57.pb → duplications-44.pb} +0 -0
  368. /package/.scannerwork/scanner-report/{duplications-58.pb → duplications-45.pb} +0 -0
  369. /package/.scannerwork/scanner-report/{duplications-59.pb → duplications-60.pb} +0 -0
  370. /package/.scannerwork/scanner-report/{duplications-62.pb → duplications-61.pb} +0 -0
  371. /package/.scannerwork/scanner-report/{duplications-63.pb → duplications-8.pb} +0 -0
  372. /package/.scannerwork/scanner-report/{issues-23.pb → issues-14.pb} +0 -0
  373. /package/.scannerwork/scanner-report/{issues-41.pb → issues-6.pb} +0 -0
  374. /package/.scannerwork/scanner-report/{measures-26.pb → measures-37.pb} +0 -0
  375. /package/.scannerwork/scanner-report/{measures-58.pb → measures-43.pb} +0 -0
  376. /package/.scannerwork/scanner-report/{measures-63.pb → measures-61.pb} +0 -0
  377. /package/.scannerwork/scanner-report/{measures-69.pb → measures-66.pb} +0 -0
  378. /package/.scannerwork/scanner-report/{source-26.txt → source-37.txt} +0 -0
  379. /package/.scannerwork/scanner-report/{source-58.txt → source-43.txt} +0 -0
  380. /package/.scannerwork/scanner-report/{source-63.txt → source-61.txt} +0 -0
  381. /package/.scannerwork/scanner-report/{source-69.txt → source-66.txt} +0 -0
  382. /package/.scannerwork/scanner-report/{symbols-26.pb → symbols-37.pb} +0 -0
  383. /package/.scannerwork/scanner-report/{symbols-58.pb → symbols-43.pb} +0 -0
  384. /package/.scannerwork/scanner-report/{symbols-56.pb → symbols-44.pb} +0 -0
  385. /package/.scannerwork/scanner-report/{symbols-62.pb → symbols-60.pb} +0 -0
  386. /package/.scannerwork/scanner-report/{symbols-63.pb → symbols-61.pb} +0 -0
  387. /package/.scannerwork/scanner-report/{symbols-68.pb → symbols-64.pb} +0 -0
  388. /package/.scannerwork/scanner-report/{symbols-69.pb → symbols-66.pb} +0 -0
  389. /package/.scannerwork/scanner-report/{syntax-highlightings-26.pb → syntax-highlightings-37.pb} +0 -0
  390. /package/.scannerwork/scanner-report/{syntax-highlightings-58.pb → syntax-highlightings-43.pb} +0 -0
  391. /package/.scannerwork/scanner-report/{syntax-highlightings-63.pb → syntax-highlightings-61.pb} +0 -0
  392. /package/.scannerwork/scanner-report/{syntax-highlightings-69.pb → syntax-highlightings-66.pb} +0 -0
@@ -1,4 +1,4 @@
1
- // Copyright © 2017, 2023 IBM Corp. All rights reserved.
1
+ // Copyright © 2023 IBM Corp. All rights reserved.
2
2
  //
3
3
  // Licensed under the Apache License, Version 2.0 (the "License");
4
4
  // you may not use this file except in compliance with the License.
@@ -12,172 +12,89 @@
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
14
 
15
- /* global describe it beforeEach */
16
15
  'use strict';
17
16
 
18
- const assert = require('assert');
19
- const backup = require('../includes/shallowbackup.js');
20
- const request = require('../includes/request.js');
21
- const fs = require('fs');
22
- const nock = require('nock');
23
-
24
- // Function to create a DB object and call the shallow backup function
25
- // This is normally done by app.js
26
- function shallowBackup(dbUrl, opts) {
27
- const db = request.client(dbUrl, opts);
28
- // Disable compression to make body assertions easier
29
- db.service.setEnableGzipCompression(false);
30
- return backup(db, opts);
31
- }
32
-
33
- // Note all these tests include a body parameter of include_docs and a query
34
- // string of include_docs because of a quirk of nano that when using the fetch
35
- // method always adds the include_docs query string.
36
- describe('#unit Perform backup using shallow backup', function() {
37
- const dbUrl = 'http://localhost:5984/animaldb';
38
- // Query string keys are stringified by Nano
39
- const badgerKey = 'badger\0';
40
- const kookaburraKey = 'kookaburra\0';
41
- const snipeKey = 'snipe\0';
42
-
43
- beforeEach('Reset nocks', function() {
44
- nock.cleanAll();
45
- });
46
-
47
- it('should perform a shallow backup', async function() {
48
- const couch = nock(dbUrl)
49
- // batch 1
50
- .post('/_all_docs', { limit: 3, include_docs: true })
51
- .reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_1.json', 'utf8')))
52
- // batch 2
53
- .post('/_all_docs', { limit: 3, start_key: badgerKey, include_docs: true })
54
- .reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_2.json', 'utf8')))
55
- // batch 3
56
- .post('/_all_docs', { limit: 3, start_key: kookaburraKey, include_docs: true })
57
- .reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_3.json', 'utf8')))
58
- // batch 4
59
- .post('/_all_docs', { limit: 3, start_key: snipeKey, include_docs: true })
60
- .reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_4.json', 'utf8')));
61
-
62
- return new Promise((resolve, reject) => {
63
- shallowBackup(dbUrl, { bufferSize: 3, parallelism: 1 })
64
- .on('error', function(err) {
65
- reject(err);
66
- })
67
- .on('received', function(data) {
68
- try {
69
- if (data.batch === 3) {
70
- assert.strictEqual(data.length, 2); // smaller last batch
71
- } else {
72
- assert.strictEqual(data.length, 3);
73
- }
74
- } catch (err) {
75
- reject(err);
76
- }
77
- })
78
- .on('finished', function(data) {
79
- try {
80
- assert.strictEqual(data.total, 11);
81
- assert.ok(couch.isDone());
82
- resolve();
83
- } catch (err) {
84
- reject(err);
85
- }
86
- });
87
- });
88
- });
89
-
90
- it('should perform a shallow backup with transient error', async function() {
91
- const couch = nock(dbUrl)
92
- // batch 1
93
- .post('/_all_docs', { limit: 3, include_docs: true })
94
- .reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_1.json', 'utf8')))
95
- // batch 2
96
- .post('/_all_docs', { limit: 3, start_key: badgerKey, include_docs: true })
97
- .reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_2.json', 'utf8')))
98
- // batch 3 - transient error
99
- .post('/_all_docs', { limit: 3, start_key: kookaburraKey, include_docs: true })
100
- .reply(500, { error: 'Internal Server Error' })
101
- // batch 3 - retry
102
- .post('/_all_docs', { limit: 3, start_key: kookaburraKey, include_docs: true })
103
- .reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_3.json', 'utf8')))
104
- // batch 4
105
- .post('/_all_docs', { limit: 3, start_key: snipeKey, include_docs: true })
106
- .reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_4.json', 'utf8')));
107
-
108
- return new Promise((resolve, reject) => {
109
- shallowBackup(dbUrl, { bufferSize: 3, parallelism: 1 })
110
- .on('error', function(err) {
111
- try {
112
- assert.strictEqual(err.name, 'HTTPError');
113
- } catch (err) {
114
- reject(err);
115
- }
116
- })
117
- .on('received', function(data) {
118
- try {
119
- if (data.batch === 3) {
120
- assert.strictEqual(data.length, 2); // smaller last batch
121
- } else {
122
- assert.strictEqual(data.length, 3);
123
- }
124
- } catch (err) {
125
- reject(err);
126
- }
127
- })
128
- .on('finished', function(data) {
129
- try {
130
- assert.strictEqual(data.total, 11);
131
- assert.ok(couch.isDone());
132
- resolve();
133
- } catch (err) {
134
- reject(err);
135
- }
136
- });
137
- });
138
- });
139
-
140
- it('should fail to perform a shallow backup on fatal error', async function() {
141
- const couch = nock(dbUrl)
142
- // batch 1
143
- .post('/_all_docs', { limit: 3, include_docs: true })
144
- .reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_1.json', 'utf8')))
145
- // batch 2
146
- .post('/_all_docs', { limit: 3, start_key: badgerKey, include_docs: true })
147
- .reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_2.json', 'utf8')))
148
- // batch 3 - fatal error
149
- .post('/_all_docs', { limit: 3, start_key: kookaburraKey, include_docs: true })
150
- .reply(401, { error: 'Unauthorized' });
151
-
152
- let errCount = 0;
153
-
154
- return new Promise((resolve, reject) => {
155
- shallowBackup(dbUrl, { bufferSize: 3, parallelism: 1 })
156
- .on('error', function(err) {
157
- try {
158
- errCount++;
159
- assert.strictEqual(err.name, 'Unauthorized');
160
- } catch (err) {
161
- reject(err);
162
- }
163
- })
164
- .on('received', function(data) {
165
- try {
166
- assert.strictEqual(data.length, 3);
167
- } catch (err) {
168
- reject(err);
169
- }
170
- })
171
- .on('finished', function(data) {
172
- try {
173
- assert.strictEqual(data.total, 6);
174
- assert.ok(couch.isDone());
175
- assert.strictEqual(errCount, 1);
176
- resolve();
177
- } catch (err) {
178
- reject(err);
179
- }
180
- });
17
+ const chunk = require('lodash/chunk');
18
+ const difference = require('lodash/difference');
19
+ const forOwn = require('lodash/forOwn');
20
+ const isEmpty = require('lodash/isEmpty');
21
+ const union = require('lodash/union');
22
+
23
+ const compare = async function(database1, database2, client) {
24
+ // check docs same in both dbs
25
+ const allDocs1 = await getAllDocs(client, database1);
26
+ const allDocs2 = await getAllDocs(client, database2);
27
+
28
+ const onlyInDb1 = (difference(allDocs1, allDocs2));
29
+ const onlyInDb2 = (difference(allDocs2, allDocs1));
30
+
31
+ let databasesSame = isEmpty(onlyInDb1) && isEmpty(onlyInDb2);
32
+
33
+ if (!databasesSame) {
34
+ console.log(onlyInDb1.length + ' documents only in db 1.');
35
+ console.log('Document IDs only in db 1: ' + onlyInDb1);
36
+ console.log(onlyInDb2.length + ' documents only in db 2.');
37
+ console.log('Document IDs only in db 2: ' + onlyInDb2);
38
+ }
39
+
40
+ // check revs same in docs common to both dbs
41
+ const partitionSize = 500;
42
+ const batches = chunk(union(allDocs1, allDocs2), partitionSize);
43
+
44
+ const missingRevsInDb2 = await getMissingRevs(client, database1, database2, batches);
45
+ const missingRevsInDb1 = await getMissingRevs(client, database2, database1, batches);
46
+
47
+ databasesSame = databasesSame && isEmpty(missingRevsInDb1) && isEmpty(missingRevsInDb2);
48
+
49
+ if (!databasesSame) {
50
+ console.log('Missing revs in db 1:' + JSON.stringify(missingRevsInDb1));
51
+ console.log('Missing revs in db 2:' + JSON.stringify(missingRevsInDb2));
52
+ }
53
+
54
+ return databasesSame;
55
+ };
56
+
57
+ const getMissingRevs = async(client, databaseName1, databaseName2, batcheses) => {
58
+ const fakeRevisionId = '9999-a';
59
+
60
+ const missing = {};
61
+
62
+ // look in db1 - use a fake revision ID to fetch all leaf revisions
63
+
64
+ for (const batches of batcheses) {
65
+ const documentRevisions = {};
66
+ batches.forEach(id => (documentRevisions[id] = [fakeRevisionId]));
67
+
68
+ const result1 = await client.postRevsDiff({ db: databaseName1, documentRevisions });
69
+ const revsDiffRequestDb2 = {};
70
+ forOwn(result1.result, (v, k) => (revsDiffRequestDb2[k] = v.possible_ancestors));
71
+ // look in db2
72
+ const result2 = await client.postRevsDiff({ db: databaseName2, documentRevisions: revsDiffRequestDb2 });
73
+ forOwn(result2.result, (v, k) => {
74
+ if ('missing' in v) {
75
+ missing[k] = v.missing;
76
+ }
181
77
  });
182
- });
183
- });
78
+ }
79
+ return missing;
80
+ };
81
+
82
+ const getAllDocs = async function(client, database) {
83
+ let allDocIds = [];
84
+ const limit = 2000;
85
+ let startKey = '\u0000';
86
+ do {
87
+ const pageOfDocIds = (await client.postAllDocs({ db: database, startKey, limit })).result.rows.map(r => r.id);
88
+ allDocIds = allDocIds.concat(pageOfDocIds);
89
+ if (pageOfDocIds.length < limit) {
90
+ startKey = null;
91
+ } else {
92
+ startKey = pageOfDocIds[limit - 1] + '\u0000';
93
+ }
94
+ } while (startKey != null);
95
+ return allDocIds;
96
+ };
97
+
98
+ module.exports = {
99
+ compare
100
+ };
@@ -12,54 +12,95 @@
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
14
 
15
- /* global beforeEach afterEach */
15
+ /* global describe it */
16
16
  'use strict';
17
17
 
18
- const { CloudantV1 } = require('@ibm-cloud/cloudant');
19
- const url = new URL((process.env.COUCH_BACKEND_URL) ? process.env.COUCH_BACKEND_URL : 'https://no-couch-backend-url-set.test');
20
- const { BasicAuthenticator, NoAuthAuthenticator } = require('ibm-cloud-sdk-core');
21
- const authenticator = (url.username) ? new BasicAuthenticator({ username: url.username, password: decodeURIComponent(url.password) }) : new NoAuthAuthenticator();
22
- const serviceOpts = {
23
- authenticator: authenticator
24
- };
25
- const cloudant = new CloudantV1(serviceOpts);
26
- // Remove auth from URL before using for service
27
- cloudant.setServiceUrl(new URL(url.pathname, url.origin).toString());
28
- const uuid = require('uuid').v4;
29
18
  const fs = require('fs');
19
+ const { once } = require('node:events');
20
+ const u = require('./citestutils.js');
30
21
 
31
- // Mocha hooks that will be at the root context so run for all tests
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
+ });
32
37
 
33
- beforeEach('Create test database', async function() {
34
- // Don't run hook for unit tests, just for CI
35
- if (!this.currentTest.fullTitle().includes('#unit')) {
36
- // Allow 10 seconds to create the DB
37
- this.timeout(10 * 1000);
38
- const unique = uuid();
39
- this.fileName = `${unique}`;
40
- this.dbName = 'couchbackup_test_' + unique;
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
+ });
41
49
 
42
- return cloudant.putDatabase({ db: this.dbName });
43
- }
44
- });
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
+ });
45
64
 
46
- afterEach('Delete test database', async function() {
47
- // Don't run hook for unit tests, just for CI
48
- if (!this.currentTest.fullTitle().includes('#unit')) {
49
- // Allow 10 seconds to delete the DB
50
- this.timeout(10 * 1000);
51
- deleteIfExists(this.fileName);
52
- deleteIfExists(`${this.fileName}.log`);
53
- return cloudant.deleteDatabase({ db: this.dbName });
54
- }
55
- });
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
+ });
56
74
 
57
- function deleteIfExists(fileName) {
58
- fs.unlink(fileName, function(err) {
59
- if (err) {
60
- if (err.code !== 'ENOENT') {
61
- console.error(`${err.code} ${err.message}`);
62
- }
63
- }
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
+ });
89
+
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
+ });
64
105
  });
65
- }
106
+ });
@@ -12,95 +12,123 @@
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 describe it beforeEach */
16
16
  'use strict';
17
17
 
18
+ const assert = require('assert');
18
19
  const fs = require('fs');
20
+ const nock = require('nock');
21
+ const request = require('../includes/request.js');
22
+ const writer = require('../includes/writer.js');
23
+ const noopEmitter = new (require('events')).EventEmitter();
24
+ const liner = require('../includes/liner.js');
19
25
  const { once } = require('node:events');
20
- const u = require('./citestutils.js');
21
-
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
- });
89
-
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
- });
26
+ const { pipeline } = require('node:stream/promises');
27
+ const longTestTimeout = 3000;
28
+
29
+ describe('#unit Check database restore writer', function() {
30
+ const dbUrl = 'http://localhost:5984/animaldb';
31
+ const db = request.client(dbUrl, { parallelism: 1 });
32
+
33
+ beforeEach('Reset nocks', function() {
34
+ nock.cleanAll();
35
+ });
36
+
37
+ it('should complete successfully', async function() {
38
+ nock(dbUrl)
39
+ .post('/_bulk_docs')
40
+ .reply(200, []); // success
41
+
42
+ const w = writer(db, 500, 1, noopEmitter);
43
+ return Promise.all([pipeline(fs.createReadStream('./test/fixtures/animaldb_expected.json'), liner(), w),
44
+ once(w, 'finished').then((data) => {
45
+ assert.strictEqual(data[0].total, 15);
46
+ assert.ok(nock.isDone());
47
+ })]);
48
+ });
49
+
50
+ it('should terminate on a fatal error', async function() {
51
+ nock(dbUrl)
52
+ .post('/_bulk_docs')
53
+ .reply(401, { error: 'Unauthorized' }); // fatal error
54
+
55
+ const w = writer(db, 500, 1, noopEmitter);
56
+ return assert.rejects(
57
+ pipeline(fs.createReadStream('./test/fixtures/animaldb_expected.json'), liner(), w),
58
+ (err) => {
59
+ assert.strictEqual(err.name, 'Unauthorized');
60
+ assert.strictEqual(err.message, 'Access is denied due to invalid credentials.');
61
+ assert.ok(nock.isDone());
62
+ return true;
63
+ }
64
+ );
65
+ });
66
+
67
+ it('should retry on transient errors', async function() {
68
+ nock(dbUrl)
69
+ .post('/_bulk_docs')
70
+ .reply(429, { error: 'Too Many Requests' }) // transient error
71
+ .post('/_bulk_docs')
72
+ .reply(500, { error: 'Internal Server Error' }) // transient error
73
+ .post('/_bulk_docs')
74
+ .reply(200, { ok: true }); // third time lucky success
75
+
76
+ const w = writer(db, 500, 1, noopEmitter);
77
+ return Promise.all([pipeline(fs.createReadStream('./test/fixtures/animaldb_expected.json'), liner(), w),
78
+ once(w, 'finished').then((data) => {
79
+ assert.strictEqual(data[0].total, 15);
80
+ assert.ok(nock.isDone());
81
+ })]);
82
+ }).timeout(longTestTimeout);
83
+
84
+ it('should fail after 3 transient errors', async function() {
85
+ nock(dbUrl)
86
+ .post('/_bulk_docs')
87
+ .reply(429, { error: 'Too Many Requests' }) // transient error
88
+ .post('/_bulk_docs')
89
+ .reply(500, { error: 'Internal Server Error' }) // transient error
90
+ .post('/_bulk_docs')
91
+ .reply(503, { error: 'Service Unavailable' }); // Final transient error
92
+
93
+ const w = writer(db, 500, 1, noopEmitter);
94
+ return assert.rejects(
95
+ pipeline(fs.createReadStream('./test/fixtures/animaldb_expected.json'), liner(), w),
96
+ (err) => {
97
+ assert.strictEqual(err.name, 'HTTPFatalError');
98
+ assert.strictEqual(err.message, `503 : post ${dbUrl}/_bulk_docs - Error: Service Unavailable`);
99
+ assert.ok(nock.isDone());
100
+ return true;
101
+ }
102
+ );
103
+ }).timeout(longTestTimeout);
104
+
105
+ it('should restore shallow backups without rev info successfully', async function() {
106
+ nock(dbUrl)
107
+ .post('/_bulk_docs')
108
+ .reply(200, [{ ok: true, id: 'foo', rev: '1-abc' }]); // success
109
+
110
+ const w = writer(db, 500, 1, noopEmitter);
111
+ return Promise.all([pipeline(fs.createReadStream('./test/fixtures/animaldb_old_shallow.json'), liner(), w),
112
+ once(w, 'finished').then((data) => {
113
+ assert.strictEqual(data[0].total, 11);
114
+ assert.ok(nock.isDone());
115
+ })]);
116
+ });
117
+
118
+ it('should get a batch error for non-empty array response with new_edits false', async function() {
119
+ nock(dbUrl)
120
+ .post('/_bulk_docs')
121
+ .reply(200, [{ id: 'foo', error: 'foo', reason: 'bar' }]);
122
+
123
+ const w = writer(db, 500, 1, noopEmitter);
124
+ return assert.rejects(
125
+ pipeline(fs.createReadStream('./test/fixtures/animaldb_expected.json'), liner(), w),
126
+ (err) => {
127
+ assert.strictEqual(err.name, 'Error');
128
+ assert.strictEqual(err.message, 'Error writing batch with new_edits:false and 1 items');
129
+ assert.ok(nock.isDone());
130
+ return true;
131
+ }
132
+ );
105
133
  });
106
134
  });