@cloudant/couchbackup 2.9.15-SNAPSHOT.175 → 2.9.15

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 (357) 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-12.pb +1 -0
  6. package/.scannerwork/scanner-report/changesets-14.pb +1 -0
  7. package/.scannerwork/scanner-report/changesets-16.pb +1 -0
  8. package/.scannerwork/scanner-report/changesets-17.pb +1 -0
  9. package/.scannerwork/scanner-report/changesets-18.pb +1 -0
  10. package/.scannerwork/scanner-report/changesets-19.pb +1 -0
  11. package/.scannerwork/scanner-report/changesets-20.pb +1 -0
  12. package/.scannerwork/scanner-report/changesets-22.pb +1 -0
  13. package/.scannerwork/scanner-report/changesets-39.pb +1 -0
  14. package/.scannerwork/scanner-report/component-1.pb +2 -1
  15. package/.scannerwork/scanner-report/component-10.pb +2 -0
  16. package/.scannerwork/scanner-report/component-12.pb +1 -1
  17. package/.scannerwork/scanner-report/component-14.pb +1 -0
  18. package/.scannerwork/scanner-report/component-16.pb +1 -0
  19. package/.scannerwork/scanner-report/component-17.pb +1 -0
  20. package/.scannerwork/scanner-report/component-18.pb +1 -0
  21. package/.scannerwork/scanner-report/component-19.pb +1 -0
  22. package/.scannerwork/scanner-report/component-20.pb +1 -0
  23. package/.scannerwork/scanner-report/component-21.pb +1 -1
  24. package/.scannerwork/scanner-report/component-22.pb +1 -0
  25. package/.scannerwork/scanner-report/component-23.pb +1 -1
  26. package/.scannerwork/scanner-report/component-24.pb +1 -1
  27. package/.scannerwork/scanner-report/component-25.pb +1 -1
  28. package/.scannerwork/scanner-report/component-26.pb +1 -1
  29. package/.scannerwork/scanner-report/component-27.pb +1 -1
  30. package/.scannerwork/scanner-report/component-28.pb +1 -1
  31. package/.scannerwork/scanner-report/component-29.pb +1 -1
  32. package/.scannerwork/scanner-report/component-3.pb +1 -1
  33. package/.scannerwork/scanner-report/component-30.pb +1 -1
  34. package/.scannerwork/scanner-report/component-31.pb +1 -1
  35. package/.scannerwork/scanner-report/component-32.pb +1 -1
  36. package/.scannerwork/scanner-report/component-33.pb +1 -1
  37. package/.scannerwork/scanner-report/component-34.pb +1 -1
  38. package/.scannerwork/scanner-report/component-35.pb +1 -1
  39. package/.scannerwork/scanner-report/component-36.pb +1 -1
  40. package/.scannerwork/scanner-report/component-37.pb +1 -1
  41. package/.scannerwork/scanner-report/component-38.pb +1 -1
  42. package/.scannerwork/scanner-report/component-39.pb +1 -0
  43. package/.scannerwork/scanner-report/component-53.pb +1 -1
  44. package/.scannerwork/scanner-report/component-54.pb +1 -1
  45. package/.scannerwork/scanner-report/component-55.pb +1 -1
  46. package/.scannerwork/scanner-report/component-56.pb +1 -1
  47. package/.scannerwork/scanner-report/component-57.pb +1 -1
  48. package/.scannerwork/scanner-report/component-58.pb +1 -1
  49. package/.scannerwork/scanner-report/component-59.pb +1 -1
  50. package/.scannerwork/scanner-report/component-6.pb +1 -1
  51. package/.scannerwork/scanner-report/component-60.pb +1 -1
  52. package/.scannerwork/scanner-report/component-62.pb +1 -1
  53. package/.scannerwork/scanner-report/component-64.pb +1 -1
  54. package/.scannerwork/scanner-report/component-65.pb +1 -1
  55. package/.scannerwork/scanner-report/component-66.pb +1 -1
  56. package/.scannerwork/scanner-report/component-67.pb +1 -1
  57. package/.scannerwork/scanner-report/component-68.pb +1 -1
  58. package/.scannerwork/scanner-report/component-69.pb +1 -1
  59. package/.scannerwork/scanner-report/component-70.pb +1 -1
  60. package/.scannerwork/scanner-report/coverages-16.pb +0 -0
  61. package/.scannerwork/scanner-report/coverages-17.pb +0 -0
  62. package/.scannerwork/scanner-report/coverages-18.pb +0 -0
  63. package/.scannerwork/scanner-report/coverages-19.pb +0 -0
  64. package/.scannerwork/scanner-report/coverages-21.pb +0 -0
  65. package/.scannerwork/scanner-report/coverages-22.pb +0 -0
  66. package/.scannerwork/scanner-report/coverages-23.pb +0 -0
  67. package/.scannerwork/scanner-report/coverages-24.pb +0 -0
  68. package/.scannerwork/scanner-report/coverages-25.pb +0 -0
  69. package/.scannerwork/scanner-report/coverages-26.pb +0 -0
  70. package/.scannerwork/scanner-report/coverages-27.pb +0 -0
  71. package/.scannerwork/scanner-report/coverages-28.pb +0 -0
  72. package/.scannerwork/scanner-report/coverages-29.pb +0 -0
  73. package/.scannerwork/scanner-report/coverages-30.pb +0 -0
  74. package/.scannerwork/scanner-report/coverages-31.pb +0 -0
  75. package/.scannerwork/scanner-report/coverages-32.pb +0 -0
  76. package/.scannerwork/scanner-report/coverages-33.pb +0 -0
  77. package/.scannerwork/scanner-report/coverages-34.pb +0 -0
  78. package/.scannerwork/scanner-report/coverages-35.pb +0 -0
  79. package/.scannerwork/scanner-report/coverages-36.pb +0 -0
  80. package/.scannerwork/scanner-report/coverages-37.pb +0 -0
  81. package/.scannerwork/scanner-report/coverages-38.pb +0 -0
  82. package/.scannerwork/scanner-report/coverages-39.pb +0 -0
  83. package/.scannerwork/scanner-report/coverages-53.pb +0 -0
  84. package/.scannerwork/scanner-report/coverages-54.pb +0 -0
  85. package/.scannerwork/scanner-report/coverages-55.pb +0 -0
  86. package/.scannerwork/scanner-report/coverages-56.pb +0 -0
  87. package/.scannerwork/scanner-report/coverages-57.pb +0 -0
  88. package/.scannerwork/scanner-report/coverages-58.pb +0 -0
  89. package/.scannerwork/scanner-report/coverages-59.pb +0 -0
  90. package/.scannerwork/scanner-report/coverages-60.pb +0 -0
  91. package/.scannerwork/scanner-report/coverages-62.pb +0 -0
  92. package/.scannerwork/scanner-report/coverages-64.pb +0 -0
  93. package/.scannerwork/scanner-report/coverages-65.pb +0 -0
  94. package/.scannerwork/scanner-report/coverages-66.pb +0 -0
  95. package/.scannerwork/scanner-report/coverages-67.pb +0 -0
  96. package/.scannerwork/scanner-report/coverages-68.pb +0 -0
  97. package/.scannerwork/scanner-report/coverages-69.pb +0 -0
  98. package/.scannerwork/scanner-report/duplications-12.pb +2 -0
  99. package/.scannerwork/scanner-report/duplications-14.pb +2 -0
  100. package/.scannerwork/scanner-report/duplications-24.pb +0 -2
  101. package/.scannerwork/scanner-report/duplications-25.pb +2 -0
  102. package/.scannerwork/scanner-report/duplications-26.pb +3 -0
  103. package/.scannerwork/scanner-report/duplications-33.pb +0 -3
  104. package/.scannerwork/scanner-report/duplications-36.pb +0 -2
  105. package/.scannerwork/scanner-report/duplications-39.pb +2 -0
  106. package/.scannerwork/scanner-report/duplications-56.pb +2 -0
  107. package/.scannerwork/scanner-report/duplications-58.pb +0 -2
  108. package/.scannerwork/scanner-report/duplications-60.pb +0 -2
  109. package/.scannerwork/scanner-report/duplications-66.pb +2 -0
  110. package/.scannerwork/scanner-report/issues-17.pb +3 -0
  111. package/.scannerwork/scanner-report/issues-26.pb +3 -2
  112. package/.scannerwork/scanner-report/measures-12.pb +0 -0
  113. package/.scannerwork/scanner-report/measures-16.pb +0 -0
  114. package/.scannerwork/scanner-report/measures-17.pb +0 -0
  115. package/.scannerwork/scanner-report/measures-18.pb +0 -0
  116. package/.scannerwork/scanner-report/measures-19.pb +0 -0
  117. package/.scannerwork/scanner-report/measures-21.pb +0 -0
  118. package/.scannerwork/scanner-report/measures-22.pb +16 -0
  119. package/.scannerwork/scanner-report/measures-23.pb +0 -0
  120. package/.scannerwork/scanner-report/measures-24.pb +0 -0
  121. package/.scannerwork/scanner-report/measures-25.pb +0 -0
  122. package/.scannerwork/scanner-report/measures-26.pb +0 -0
  123. package/.scannerwork/scanner-report/measures-27.pb +0 -0
  124. package/.scannerwork/scanner-report/measures-28.pb +0 -0
  125. package/.scannerwork/scanner-report/measures-29.pb +0 -0
  126. package/.scannerwork/scanner-report/measures-30.pb +0 -0
  127. package/.scannerwork/scanner-report/measures-31.pb +0 -0
  128. package/.scannerwork/scanner-report/measures-32.pb +0 -0
  129. package/.scannerwork/scanner-report/measures-33.pb +0 -0
  130. package/.scannerwork/scanner-report/measures-34.pb +0 -0
  131. package/.scannerwork/scanner-report/measures-35.pb +0 -0
  132. package/.scannerwork/scanner-report/measures-36.pb +0 -0
  133. package/.scannerwork/scanner-report/measures-37.pb +0 -0
  134. package/.scannerwork/scanner-report/measures-38.pb +0 -0
  135. package/.scannerwork/scanner-report/measures-39.pb +0 -0
  136. package/.scannerwork/scanner-report/measures-53.pb +0 -0
  137. package/.scannerwork/scanner-report/measures-54.pb +0 -0
  138. package/.scannerwork/scanner-report/measures-55.pb +0 -0
  139. package/.scannerwork/scanner-report/measures-56.pb +0 -0
  140. package/.scannerwork/scanner-report/measures-57.pb +0 -0
  141. package/.scannerwork/scanner-report/measures-58.pb +0 -0
  142. package/.scannerwork/scanner-report/measures-59.pb +0 -0
  143. package/.scannerwork/scanner-report/measures-6.pb +0 -0
  144. package/.scannerwork/scanner-report/measures-60.pb +0 -0
  145. package/.scannerwork/scanner-report/measures-62.pb +0 -0
  146. package/.scannerwork/scanner-report/measures-64.pb +0 -0
  147. package/.scannerwork/scanner-report/measures-65.pb +0 -0
  148. package/.scannerwork/scanner-report/measures-66.pb +0 -0
  149. package/.scannerwork/scanner-report/measures-67.pb +0 -0
  150. package/.scannerwork/scanner-report/measures-68.pb +0 -0
  151. package/.scannerwork/scanner-report/measures-69.pb +0 -0
  152. package/.scannerwork/scanner-report/measures-70.pb +0 -0
  153. package/.scannerwork/scanner-report/metadata.pb +0 -0
  154. package/.scannerwork/scanner-report/{source-4.txt → source-10.txt} +162 -162
  155. package/.scannerwork/scanner-report/source-12.txt +190 -424
  156. package/.scannerwork/scanner-report/source-16.txt +46 -0
  157. package/.scannerwork/scanner-report/source-17.txt +130 -0
  158. package/.scannerwork/scanner-report/source-18.txt +134 -0
  159. package/.scannerwork/scanner-report/source-19.txt +37 -0
  160. package/.scannerwork/scanner-report/source-21.txt +22 -27
  161. package/.scannerwork/scanner-report/source-22.txt +293 -0
  162. package/.scannerwork/scanner-report/source-23.txt +83 -82
  163. package/.scannerwork/scanner-report/source-24.txt +13 -168
  164. package/.scannerwork/scanner-report/source-25.txt +163 -9
  165. package/.scannerwork/scanner-report/source-26.txt +180 -97
  166. package/.scannerwork/scanner-report/source-27.txt +85 -60
  167. package/.scannerwork/scanner-report/source-28.txt +428 -16
  168. package/.scannerwork/scanner-report/source-29.txt +20 -18
  169. package/.scannerwork/scanner-report/source-3.txt +154 -154
  170. package/.scannerwork/scanner-report/source-30.txt +10 -115
  171. package/.scannerwork/scanner-report/source-31.txt +17 -21
  172. package/.scannerwork/scanner-report/source-32.txt +314 -136
  173. package/.scannerwork/scanner-report/source-33.txt +44 -192
  174. package/.scannerwork/scanner-report/source-34.txt +73 -158
  175. package/.scannerwork/scanner-report/source-35.txt +54 -16
  176. package/.scannerwork/scanner-report/source-36.txt +130 -162
  177. package/.scannerwork/scanner-report/source-37.txt +158 -68
  178. package/.scannerwork/scanner-report/source-38.txt +19 -272
  179. package/.scannerwork/scanner-report/source-39.txt +187 -0
  180. package/.scannerwork/scanner-report/source-53.txt +104 -18
  181. package/.scannerwork/scanner-report/source-54.txt +22 -425
  182. package/.scannerwork/scanner-report/source-55.txt +150 -28
  183. package/.scannerwork/scanner-report/source-56.txt +53 -43
  184. package/.scannerwork/scanner-report/source-57.txt +241 -78
  185. package/.scannerwork/scanner-report/source-58.txt +59 -71
  186. package/.scannerwork/scanner-report/source-59.txt +147 -133
  187. package/.scannerwork/scanner-report/source-6.txt +102 -81
  188. package/.scannerwork/scanner-report/source-60.txt +91 -53
  189. package/.scannerwork/scanner-report/source-62.txt +108 -25
  190. package/.scannerwork/scanner-report/source-64.txt +20 -260
  191. package/.scannerwork/scanner-report/source-65.txt +87 -154
  192. package/.scannerwork/scanner-report/source-66.txt +65 -14
  193. package/.scannerwork/scanner-report/source-67.txt +388 -85
  194. package/.scannerwork/scanner-report/source-68.txt +41 -61
  195. package/.scannerwork/scanner-report/source-69.txt +63 -111
  196. package/.scannerwork/scanner-report/source-70.txt +424 -113
  197. package/.scannerwork/scanner-report/symbols-16.pb +7 -0
  198. package/.scannerwork/scanner-report/symbols-17.pb +86 -0
  199. package/.scannerwork/scanner-report/symbols-18.pb +71 -0
  200. package/.scannerwork/scanner-report/symbols-19.pb +9 -0
  201. package/.scannerwork/scanner-report/symbols-21.pb +31 -7
  202. package/.scannerwork/scanner-report/symbols-22.pb +428 -0
  203. package/.scannerwork/scanner-report/symbols-23.pb +57 -68
  204. package/.scannerwork/scanner-report/symbols-24.pb +9 -227
  205. package/.scannerwork/scanner-report/symbols-25.pb +203 -8
  206. package/.scannerwork/scanner-report/symbols-26.pb +263 -85
  207. package/.scannerwork/scanner-report/symbols-27.pb +68 -38
  208. package/.scannerwork/scanner-report/symbols-28.pb +790 -9
  209. package/.scannerwork/scanner-report/symbols-29.pb +19 -23
  210. package/.scannerwork/scanner-report/symbols-30.pb +8 -71
  211. package/.scannerwork/scanner-report/symbols-31.pb +13 -31
  212. package/.scannerwork/scanner-report/symbols-32.pb +353 -93
  213. package/.scannerwork/scanner-report/symbols-33.pb +33 -264
  214. package/.scannerwork/scanner-report/symbols-34.pb +59 -209
  215. package/.scannerwork/scanner-report/symbols-35.pb +39 -13
  216. package/.scannerwork/scanner-report/symbols-36.pb +88 -198
  217. package/.scannerwork/scanner-report/symbols-37.pb +209 -58
  218. package/.scannerwork/scanner-report/symbols-38.pb +23 -428
  219. package/.scannerwork/scanner-report/symbols-39.pb +227 -0
  220. package/.scannerwork/scanner-report/symbols-53.pb +30 -9
  221. package/.scannerwork/scanner-report/symbols-54.pb +19 -789
  222. package/.scannerwork/scanner-report/symbols-55.pb +126 -19
  223. package/.scannerwork/scanner-report/symbols-56.pb +41 -32
  224. package/.scannerwork/scanner-report/symbols-57.pb +354 -30
  225. package/.scannerwork/scanner-report/symbols-58.pb +45 -43
  226. package/.scannerwork/scanner-report/symbols-59.pb +129 -111
  227. package/.scannerwork/scanner-report/symbols-60.pb +44 -40
  228. package/.scannerwork/scanner-report/symbols-62.pb +33 -20
  229. package/.scannerwork/scanner-report/symbols-64.pb +18 -354
  230. package/.scannerwork/scanner-report/symbols-65.pb +56 -141
  231. package/.scannerwork/scanner-report/symbols-66.pb +42 -16
  232. package/.scannerwork/scanner-report/symbols-67.pb +604 -59
  233. package/.scannerwork/scanner-report/symbols-68.pb +21 -46
  234. package/.scannerwork/scanner-report/symbols-69.pb +31 -32
  235. package/.scannerwork/scanner-report/{syntax-highlightings-4.pb → syntax-highlightings-10.pb} +94 -94
  236. package/.scannerwork/scanner-report/syntax-highlightings-12.pb +202 -3317
  237. package/.scannerwork/scanner-report/syntax-highlightings-16.pb +62 -0
  238. package/.scannerwork/scanner-report/syntax-highlightings-17.pb +125 -0
  239. package/.scannerwork/scanner-report/syntax-highlightings-18.pb +181 -0
  240. package/.scannerwork/scanner-report/syntax-highlightings-19.pb +61 -0
  241. package/.scannerwork/scanner-report/syntax-highlightings-21.pb +36 -29
  242. package/.scannerwork/scanner-report/syntax-highlightings-22.pb +720 -0
  243. package/.scannerwork/scanner-report/syntax-highlightings-23.pb +114 -67
  244. package/.scannerwork/scanner-report/syntax-highlightings-24.pb +19 -333
  245. package/.scannerwork/scanner-report/syntax-highlightings-25.pb +246 -15
  246. package/.scannerwork/scanner-report/syntax-highlightings-26.pb +260 -88
  247. package/.scannerwork/scanner-report/syntax-highlightings-27.pb +68 -62
  248. package/.scannerwork/scanner-report/syntax-highlightings-28.pb +592 -26
  249. package/.scannerwork/scanner-report/syntax-highlightings-29.pb +27 -17
  250. package/.scannerwork/scanner-report/syntax-highlightings-3.pb +88 -87
  251. package/.scannerwork/scanner-report/syntax-highlightings-30.pb +15 -147
  252. package/.scannerwork/scanner-report/syntax-highlightings-31.pb +26 -33
  253. package/.scannerwork/scanner-report/syntax-highlightings-32.pb +550 -167
  254. package/.scannerwork/scanner-report/syntax-highlightings-33.pb +64 -251
  255. package/.scannerwork/scanner-report/syntax-highlightings-34.pb +138 -250
  256. package/.scannerwork/scanner-report/syntax-highlightings-35.pb +64 -25
  257. package/.scannerwork/scanner-report/syntax-highlightings-36.pb +162 -205
  258. package/.scannerwork/scanner-report/syntax-highlightings-37.pb +246 -110
  259. package/.scannerwork/scanner-report/syntax-highlightings-38.pb +19 -683
  260. package/.scannerwork/scanner-report/syntax-highlightings-39.pb +368 -0
  261. package/.scannerwork/scanner-report/syntax-highlightings-53.pb +83 -24
  262. package/.scannerwork/scanner-report/syntax-highlightings-54.pb +33 -596
  263. package/.scannerwork/scanner-report/syntax-highlightings-55.pb +177 -30
  264. package/.scannerwork/scanner-report/syntax-highlightings-56.pb +47 -76
  265. package/.scannerwork/scanner-report/syntax-highlightings-57.pb +250 -78
  266. package/.scannerwork/scanner-report/syntax-highlightings-58.pb +57 -55
  267. package/.scannerwork/scanner-report/syntax-highlightings-59.pb +166 -136
  268. package/.scannerwork/scanner-report/syntax-highlightings-6.pb +689 -98
  269. package/.scannerwork/scanner-report/syntax-highlightings-60.pb +93 -48
  270. package/.scannerwork/scanner-report/syntax-highlightings-62.pb +94 -29
  271. package/.scannerwork/scanner-report/syntax-highlightings-64.pb +19 -252
  272. package/.scannerwork/scanner-report/syntax-highlightings-65.pb +88 -198
  273. package/.scannerwork/scanner-report/syntax-highlightings-66.pb +59 -18
  274. package/.scannerwork/scanner-report/syntax-highlightings-67.pb +609 -101
  275. package/.scannerwork/scanner-report/syntax-highlightings-68.pb +61 -74
  276. package/.scannerwork/scanner-report/syntax-highlightings-69.pb +74 -103
  277. package/.scannerwork/scanner-report/syntax-highlightings-70.pb +3328 -115
  278. package/CHANGES.md +4 -0
  279. package/package.json +2 -2
  280. package/test-18-results.xml +157 -157
  281. package/test-20-results.xml +162 -162
  282. package/test-21-results.xml +163 -163
  283. package/test-iam-20-results.xml +50 -50
  284. package/.scannerwork/scanner-report/changesets-11.pb +0 -1
  285. package/.scannerwork/scanner-report/changesets-2.pb +0 -1
  286. package/.scannerwork/scanner-report/changesets-50.pb +0 -1
  287. package/.scannerwork/scanner-report/changesets-51.pb +0 -1
  288. package/.scannerwork/scanner-report/changesets-52.pb +0 -1
  289. package/.scannerwork/scanner-report/changesets-6.pb +0 -1
  290. package/.scannerwork/scanner-report/changesets-7.pb +0 -1
  291. package/.scannerwork/scanner-report/changesets-70.pb +0 -1
  292. package/.scannerwork/scanner-report/changesets-8.pb +0 -1
  293. package/.scannerwork/scanner-report/component-11.pb +0 -1
  294. package/.scannerwork/scanner-report/component-2.pb +0 -1
  295. package/.scannerwork/scanner-report/component-4.pb +0 -1
  296. package/.scannerwork/scanner-report/component-5.pb +0 -1
  297. package/.scannerwork/scanner-report/component-50.pb +0 -1
  298. package/.scannerwork/scanner-report/component-51.pb +0 -1
  299. package/.scannerwork/scanner-report/component-52.pb +0 -1
  300. package/.scannerwork/scanner-report/component-7.pb +0 -1
  301. package/.scannerwork/scanner-report/component-8.pb +0 -1
  302. package/.scannerwork/scanner-report/coverages-2.pb +0 -0
  303. package/.scannerwork/scanner-report/coverages-51.pb +0 -0
  304. package/.scannerwork/scanner-report/coverages-52.pb +0 -0
  305. package/.scannerwork/scanner-report/coverages-6.pb +0 -0
  306. package/.scannerwork/scanner-report/coverages-7.pb +0 -0
  307. package/.scannerwork/scanner-report/coverages-70.pb +0 -0
  308. package/.scannerwork/scanner-report/duplications-11.pb +0 -2
  309. package/.scannerwork/scanner-report/duplications-7.pb +0 -0
  310. package/.scannerwork/scanner-report/duplications-70.pb +0 -0
  311. package/.scannerwork/scanner-report/duplications-8.pb +0 -2
  312. package/.scannerwork/scanner-report/issues-33.pb +0 -4
  313. package/.scannerwork/scanner-report/measures-11.pb +0 -0
  314. package/.scannerwork/scanner-report/measures-2.pb +0 -0
  315. package/.scannerwork/scanner-report/measures-5.pb +0 -0
  316. package/.scannerwork/scanner-report/measures-51.pb +0 -0
  317. package/.scannerwork/scanner-report/measures-52.pb +0 -0
  318. package/.scannerwork/scanner-report/measures-7.pb +0 -0
  319. package/.scannerwork/scanner-report/source-11.txt +0 -190
  320. package/.scannerwork/scanner-report/source-2.txt +0 -414
  321. package/.scannerwork/scanner-report/source-5.txt +0 -102
  322. package/.scannerwork/scanner-report/source-51.txt +0 -329
  323. package/.scannerwork/scanner-report/source-52.txt +0 -106
  324. package/.scannerwork/scanner-report/source-7.txt +0 -60
  325. package/.scannerwork/scanner-report/symbols-2.pb +0 -604
  326. package/.scannerwork/scanner-report/symbols-51.pb +0 -353
  327. package/.scannerwork/scanner-report/symbols-52.pb +0 -59
  328. package/.scannerwork/scanner-report/symbols-6.pb +0 -32
  329. package/.scannerwork/scanner-report/symbols-7.pb +0 -21
  330. package/.scannerwork/scanner-report/symbols-70.pb +0 -46
  331. package/.scannerwork/scanner-report/syntax-highlightings-11.pb +0 -225
  332. package/.scannerwork/scanner-report/syntax-highlightings-2.pb +0 -641
  333. package/.scannerwork/scanner-report/syntax-highlightings-5.pb +0 -691
  334. package/.scannerwork/scanner-report/syntax-highlightings-51.pb +0 -620
  335. package/.scannerwork/scanner-report/syntax-highlightings-52.pb +0 -178
  336. package/.scannerwork/scanner-report/syntax-highlightings-7.pb +0 -82
  337. /package/.scannerwork/scanner-report/{coverages-11.pb → coverages-12.pb} +0 -0
  338. /package/.scannerwork/scanner-report/{coverages-8.pb → coverages-14.pb} +0 -0
  339. /package/.scannerwork/scanner-report/{coverages-50.pb → coverages-20.pb} +0 -0
  340. /package/.scannerwork/scanner-report/{duplications-2.pb → duplications-16.pb} +0 -0
  341. /package/.scannerwork/scanner-report/{duplications-30.pb → duplications-17.pb} +0 -0
  342. /package/.scannerwork/scanner-report/{duplications-50.pb → duplications-18.pb} +0 -0
  343. /package/.scannerwork/scanner-report/{duplications-51.pb → duplications-19.pb} +0 -0
  344. /package/.scannerwork/scanner-report/{duplications-52.pb → duplications-20.pb} +0 -0
  345. /package/.scannerwork/scanner-report/{duplications-6.pb → duplications-22.pb} +0 -0
  346. /package/.scannerwork/scanner-report/{issues-55.pb → issues-29.pb} +0 -0
  347. /package/.scannerwork/scanner-report/{issues-51.pb → issues-32.pb} +0 -0
  348. /package/.scannerwork/scanner-report/{measures-4.pb → measures-10.pb} +0 -0
  349. /package/.scannerwork/scanner-report/{measures-8.pb → measures-14.pb} +0 -0
  350. /package/.scannerwork/scanner-report/{measures-50.pb → measures-20.pb} +0 -0
  351. /package/.scannerwork/scanner-report/{source-8.txt → source-14.txt} +0 -0
  352. /package/.scannerwork/scanner-report/{source-50.txt → source-20.txt} +0 -0
  353. /package/.scannerwork/scanner-report/{symbols-11.pb → symbols-12.pb} +0 -0
  354. /package/.scannerwork/scanner-report/{symbols-8.pb → symbols-14.pb} +0 -0
  355. /package/.scannerwork/scanner-report/{symbols-50.pb → symbols-20.pb} +0 -0
  356. /package/.scannerwork/scanner-report/{syntax-highlightings-8.pb → syntax-highlightings-14.pb} +0 -0
  357. /package/.scannerwork/scanner-report/{syntax-highlightings-50.pb → syntax-highlightings-20.pb} +0 -0
@@ -12,202 +12,54 @@
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 */
15
+ /* global beforeEach afterEach */
16
16
  'use strict';
17
17
 
18
- const assert = require('assert');
19
- const nock = require('nock');
20
- const request = require('../includes/request.js');
21
- const error = require('../includes/error.js');
22
-
23
- const url = 'http://localhost:7777/testdb';
24
- const db = request.client(url, { parallelism: 1 });
25
- const timeoutDb = request.client(url, { parallelism: 1, requestTimeout: 500 });
26
- const longTestTimeout = 3000;
27
-
28
- beforeEach('Clean nock', function() {
29
- nock.cleanAll();
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
+ const fs = require('fs');
30
+
31
+ // Mocha hooks that will be at the root context so run for all tests
32
+
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;
41
+
42
+ return cloudant.putDatabase({ db: this.dbName });
43
+ }
30
44
  });
31
45
 
32
- describe('#unit Check request headers', function() {
33
- it('should have a couchbackup user-agent', async function() {
34
- const couch = nock(url)
35
- .matchHeader('user-agent', /couchbackup-cloudant\/\d+\.\d+\.\d+(?:-SNAPSHOT)? \(Node.js v\d+\.\d+\.\d+\)/)
36
- .head('/good')
37
- .reply(200);
38
-
39
- return db.service.headDocument({ db: db.db, docId: 'good' }).then(() => {
40
- assert.ok(couch.isDone());
41
- });
42
- });
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
+ }
43
55
  });
44
56
 
45
- describe('#unit Check request response error callback', function() {
46
- it('should not callback with error for 200 response', async function() {
47
- const couch = nock(url)
48
- .get('/good')
49
- .reply(200, { ok: true });
50
-
51
- return db.service.getDocument({ db: db.db, docId: 'good' }).then(response => {
52
- assert.ok(response.result);
53
- assert.ok(couch.isDone());
54
- });
55
- });
56
-
57
- it('should callback with error after 3 500 responses', async function() {
58
- const couch = nock(url)
59
- .get('/bad')
60
- .times(3)
61
- .reply(500, function(uri, requestBody) {
62
- this.req.response.statusMessage = 'Internal Server Error';
63
- return { error: 'foo', reason: 'bar' };
64
- });
65
-
66
- return assert.rejects(
67
- db.service.getDocument({ db: db.db, docId: 'bad' }),
68
- (err) => {
69
- err = error.convertResponseError(err);
70
- assert.strictEqual(err.name, 'HTTPFatalError');
71
- assert.strictEqual(err.message, `500 Internal Server Error: get ${url}/bad - Error: foo, Reason: bar`);
72
- assert.ok(couch.isDone());
73
- return true;
74
- });
75
- }).timeout(longTestTimeout);
76
-
77
- it('should callback with error after 3 POST 503 responses', async function() {
78
- const couch = nock(url)
79
- .post('/_bulk_get')
80
- .query(true)
81
- .times(3)
82
- .reply(503, function(uri, requestBody) {
83
- this.req.response.statusMessage = 'Service Unavailable';
84
- return { error: 'service_unavailable', reason: 'Service unavailable' };
85
- });
86
-
87
- return assert.rejects(
88
- db.service.postBulkGet({ db: db.db, revs: true, docs: [] }),
89
- (err) => {
90
- err = error.convertResponseError(err);
91
- assert.strictEqual(err.name, 'HTTPFatalError');
92
- assert.strictEqual(err.message, `503 Service Unavailable: post ${url}/_bulk_get - Error: service_unavailable, Reason: Service unavailable`);
93
- assert.ok(couch.isDone());
94
- return true;
95
- });
96
- }).timeout(longTestTimeout);
97
-
98
- it('should callback with error after 3 429 responses', async function() {
99
- const couch = nock(url)
100
- .get('/bad')
101
- .times(3)
102
- .reply(429, function(uri, requestBody) {
103
- this.req.response.statusMessage = 'Too Many Requests';
104
- return { error: 'foo', reason: 'bar' };
105
- });
106
-
107
- return assert.rejects(
108
- db.service.getDocument({ db: db.db, docId: 'bad' }),
109
- (err) => {
110
- err = error.convertResponseError(err);
111
- assert.strictEqual(err.name, 'HTTPFatalError');
112
- assert.strictEqual(err.message, `429 Too Many Requests: get ${url}/bad - Error: foo, Reason: bar`);
113
- assert.ok(couch.isDone());
114
- return true;
115
- });
116
- }).timeout(longTestTimeout);
117
-
118
- it('should callback with fatal error for 404 response', async function() {
119
- const couch = nock(url)
120
- .get('/bad')
121
- .reply(404, function(uri, requestBody) {
122
- this.req.response.statusMessage = 'Not Found';
123
- return { error: 'foo', reason: 'bar' };
124
- });
125
-
126
- return assert.rejects(
127
- db.service.getDocument({ db: db.db, docId: 'bad' }),
128
- (err) => {
129
- err = error.convertResponseError(err);
130
- assert.strictEqual(err.name, 'HTTPFatalError');
131
- assert.strictEqual(err.message, `404 Not Found: get ${url}/bad - Error: foo, Reason: bar`);
132
- assert.ok(couch.isDone());
133
- return true;
134
- });
135
- });
136
-
137
- it('should callback with same error for no status code error response', async function() {
138
- const couch = nock(url)
139
- .get('/bad')
140
- .times(3)
141
- .replyWithError('testing badness');
142
-
143
- return assert.rejects(
144
- db.service.getDocument({ db: db.db, docId: 'bad' }),
145
- (err) => {
146
- const err2 = error.convertResponseError(err);
147
- assert.strictEqual(err, err2);
148
- assert.ok(couch.isDone());
149
- return true;
150
- });
151
- }).timeout(longTestTimeout);
152
-
153
- it('should retry request if HTTP request gets timed out', async function() {
154
- const couch = nock(url)
155
- .post('/_bulk_get')
156
- .query(true)
157
- .delay(1000)
158
- .reply(200, { results: { docs: [{ id: '1', ok: { _id: '1' } }] } })
159
- .post('/_bulk_get')
160
- .query(true)
161
- .reply(200, { results: { docs: [{ id: '1', ok: { _id: '1' } }, { id: '2', ok: { _id: '2' } }] } });
162
-
163
- return timeoutDb.service.postBulkGet({ db: db.db, revs: true, docs: [] }).then((response) => {
164
- assert.ok(response);
165
- assert.ok(response.result);
166
- assert.ok(response.result.results);
167
- assert.ok(response.result.results.docs);
168
- assert.strictEqual(response.result.results.docs.length, 2);
169
- assert.ok(couch.isDone());
170
- });
171
- });
172
-
173
- it('should callback with error code ESOCKETTIMEDOUT if 3 HTTP requests gets timed out', async function() {
174
- // Increase the timeout for this test to allow for the delays
175
- this.timeout(3000);
176
- const couch = nock(url)
177
- .post('/_bulk_get')
178
- .query(true)
179
- .delay(1000)
180
- .times(3)
181
- .reply(200, { ok: true });
182
-
183
- return assert.rejects(
184
- timeoutDb.service.postBulkGet({ db: db.db, revs: true, docs: [] }),
185
- (err) => {
186
- err = error.convertResponseError(err);
187
- // Note axios returns ECONNABORTED rather than ESOCKETTIMEDOUT
188
- // See https://github.com/axios/axios/issues/2710 via https://github.com/axios/axios/issues/1543`
189
- assert.strictEqual(err.statusText, 'ECONNABORTED');
190
- assert.strictEqual(err.message, `timeout of 500ms exceeded: post ${url}/_bulk_get ECONNABORTED`);
191
- assert.ok(couch.isDone());
192
- return true;
193
- });
194
- });
195
- describe('#unit Check credentials', async function() {
196
- it('should properly decode username and password', async function() {
197
- const username = 'user%123';
198
- const password = 'colon:at@321';
199
- const url = `http://${encodeURIComponent(username)}:${encodeURIComponent(password)}@localhost:7777/testdb`;
200
- const sessionUrl = 'http://localhost:7777';
201
- const couch = nock(sessionUrl)
202
- .post('/_session', { username: username, password: password })
203
- .reply(200, { ok: true }, { 'Set-Cookie': 'AuthSession=ABC123DEF4356;' })
204
- .get('/')
205
- .reply(200);
206
- const db = request.client(url, { parallelism: 1 });
207
- return db.service.getServerInformation().then(response => {
208
- assert.ok(response);
209
- assert.ok(couch.isDone());
210
- });
211
- });
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
+ }
212
64
  });
213
- });
65
+ }
@@ -15,176 +15,91 @@
15
15
  /* global describe it */
16
16
  'use strict';
17
17
 
18
- const assert = require('assert');
19
- const nock = require('nock');
20
- const request = require('../includes/request.js');
21
- const changes = require('../includes/spoolchanges.js');
18
+ const fs = require('fs');
19
+ const { once } = require('node:events');
20
+ const u = require('./citestutils.js');
22
21
 
23
- const url = 'http://localhost:7777';
24
- const dbName = 'fakenockdb';
25
- const longTestTimeout = 3000;
26
-
27
- const db = request.client(`${url}/${dbName}`, { parallelism: 1 });
28
-
29
- const seqSuffix = Buffer.alloc(124, 'abc123').toString('base64');
30
- function provideChanges(batchSize, totalChanges, fullResponse = false) {
31
- let pending = totalChanges;
32
- const sparseResultsArray = Array(batchSize).fill({
33
- seq: null,
34
- id: 'doc',
35
- changes: [{ rev: '1-abcdef0123456789abcdef0123456789' }]
36
- });
37
- nock(url)
38
- .post(`/${dbName}/_changes`)
39
- .query(true)
40
- .times(totalChanges / batchSize + (totalChanges % batchSize > 0 ? 1 : 0))
41
- .reply(200, (uri, requestBody) => {
42
- pending -= batchSize;
43
- const lastSeq = (totalChanges - pending);
44
- const seq = lastSeq - batchSize;
45
- return {
46
- results: fullResponse
47
- ? Array.from(Array(batchSize), (_, i) => {
48
- return {
49
- seq: `${seq + i}-${seqSuffix}`,
50
- id: `doc${seq + i}`,
51
- changes: [{ rev: '1-abcdef0123456789abcdef0123456789' }]
52
- };
53
- })
54
- : sparseResultsArray,
55
- pending: pending,
56
- last_seq: `${lastSeq}-abc`
57
- };
58
- });
59
- }
60
-
61
- describe('#unit Check spool changes', function() {
62
- it('should terminate on request error', async function() {
63
- nock(url)
64
- .post(`/${dbName}/_changes`)
65
- .query(true)
66
- .times(3)
67
- .replyWithError({ code: 'ECONNRESET', message: 'socket hang up' });
68
-
69
- return new Promise((resolve, reject) => {
70
- changes(db, '/dev/null', 500, null, function(err) {
71
- try {
72
- assert.strictEqual(err.name, 'SpoolChangesError');
73
- assert.strictEqual(err.message, `Failed changes request - socket hang up: post ${url}/${dbName}/_changes`);
74
- assert.ok(nock.isDone());
75
- resolve();
76
- } catch (err) {
77
- reject(err);
78
- }
79
- });
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
+ });
80
36
  });
81
- }).timeout(longTestTimeout);
82
37
 
83
- it('should terminate on bad HTTP status code response', async function() {
84
- nock(url)
85
- .post(`/${dbName}/_changes`)
86
- .query(true)
87
- .times(3)
88
- .reply(500, function(uri, requestBody) {
89
- this.req.response.statusMessage = 'Internal Server Error';
90
- return { error: 'foo', reason: 'bar' };
91
- });
92
- return new Promise((resolve, reject) => {
93
- changes(db, '/dev/null', 500, null, function(err) {
94
- try {
95
- assert.strictEqual(err.name, 'HTTPFatalError');
96
- assert.strictEqual(err.message, `500 Internal Server Error: post ${url}/${dbName}/_changes - Error: foo, Reason: bar`);
97
- assert.ok(nock.isDone());
98
- resolve();
99
- } catch (err) {
100
- reject(err);
101
- }
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);
102
47
  });
103
48
  });
104
- }).timeout(longTestTimeout);
105
49
 
106
- it('should keep collecting changes', async function() {
107
- // This test validates that spooling will correctly
108
- // continue across multiple requests
109
- // (4 batches of 100000 to be precise).
110
- // This test might take up to 10 seconds
111
- this.timeout(10 * 1000);
112
-
113
- // Use full changes for this test
114
- provideChanges(100000, 400000, true);
115
- return new Promise((resolve, reject) => {
116
- changes(db, '/dev/null', 500, null, function(err) {
117
- try {
118
- assert.ok(!err);
119
- assert.ok(nock.isDone());
120
- resolve();
121
- } catch (err) {
122
- reject(err);
123
- }
124
- });
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
+ });
125
63
  });
126
- });
127
64
 
128
- it('should keep collecting sparse changes', async function() {
129
- // This test checks that making thousands of requests doesn't
130
- // make anything bad happen.
131
- // This test might take up to 25 seconds
132
- this.timeout(25 * 1000);
133
- // Use sparse changes for this test and a batch size of 1
134
- provideChanges(1, 2500);
135
- return new Promise((resolve, reject) => {
136
- changes(db, '/dev/null', 500, null, function(err) {
137
- try {
138
- assert.ok(!err);
139
- assert.ok(nock.isDone());
140
- resolve();
141
- } catch (err) {
142
- reject(err);
143
- }
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);
144
73
  });
145
- });
146
- });
147
- });
148
74
 
149
- describe('Longer spool changes checks', function() {
150
- it('#slow should keep collecting changes (25M)', async function() {
151
- // This test might take up to 5 minutes
152
- this.timeout(5 * 60 * 1000);
153
- // Note changes spooling uses a constant batch size, we are setting
154
- // a test value here and setting the buffer to match
155
- const batch = 100000;
156
- // Use sparse changes for this test
157
- provideChanges(batch, 25000000);
158
- return new Promise((resolve, reject) => {
159
- changes(db, '/dev/null', batch, null, function(err) {
160
- try {
161
- assert.ok(!err);
162
- assert.ok(nock.isDone());
163
- resolve();
164
- } catch (err) {
165
- reject(err);
166
- }
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
+ });
167
88
  });
168
- });
169
- });
170
89
 
171
- it('#slower should keep collecting changes (500M)', async function() {
172
- // This test might take up to 90 minutes
173
- this.timeout(90 * 60 * 1000);
174
- // Note changes spooling uses a constant batch size, we are setting
175
- // a test value here and setting the buffer to match
176
- const batch = 1000000;
177
- // Use full changes for this test to exercise load
178
- provideChanges(batch, 500000000, true);
179
- return new Promise((resolve, reject) => {
180
- changes(db, '/dev/null', batch, null, function(err) {
181
- try {
182
- assert.ok(!err);
183
- assert.ok(nock.isDone());
184
- resolve();
185
- } catch (err) {
186
- reject(err);
187
- }
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
+ });
188
103
  });
189
104
  });
190
105
  });
@@ -1,4 +1,4 @@
1
- // Copyright © 2017, 2023 IBM Corp. All rights reserved.
1
+ // Copyright © 2018, 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.
@@ -15,23 +15,61 @@
15
15
  /* global describe it */
16
16
  'use strict';
17
17
 
18
+ const fs = require('fs');
19
+ const { once } = require('node:events');
20
+ const readline = require('readline');
18
21
  const u = require('./citestutils.js');
22
+ const uuid = require('uuid').v4;
19
23
 
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
- });
24
+ const params = { useApi: true };
25
+
26
+ describe(u.scenario('Concurrent database backups', params), function() {
27
+ it('should run concurrent API database backups correctly #slower', async function() {
28
+ // Allow up to 900 s to backup and compare (it should be much faster)!
29
+ u.setTimeout(this, 900);
30
+
31
+ const checkForEmptyBatches = async function(fileName) {
32
+ let foundEmptyBatch = false;
33
+
34
+ const rd = readline.createInterface({
35
+ input: fs.createReadStream(fileName),
36
+ output: fs.createWriteStream('/dev/null'),
37
+ terminal: false
38
+ });
39
+
40
+ rd.on('line', function(line) {
41
+ if (JSON.parse(line).length === 0) {
42
+ // Note: Empty batch arrays indicate that the running backup is
43
+ // incorrectly sharing a log file with another ongoing backup job.
44
+ foundEmptyBatch = true;
45
+ }
46
+ });
47
+
48
+ rd.on('close', function() {
49
+ if (foundEmptyBatch) {
50
+ return Promise.reject(new Error(`Log file '${fileName}' contains empty batches`));
51
+ } else {
52
+ return Promise.resolve();
53
+ }
54
+ });
55
+ };
56
+
57
+ const backupPromise = async function() {
58
+ const actualBackup = `./${uuid()}`;
59
+ const output = fs.createWriteStream(actualBackup);
60
+ return once(output, 'open').then(() => {
61
+ return u.testBackup(params, 'largedb1g', output);
62
+ }).then(() => {
63
+ return checkForEmptyBatches(actualBackup);
64
+ });
65
+ };
66
+
67
+ // [1] Run 'largedb1g' database backup
68
+ const backup1 = backupPromise();
69
+
70
+ // [2] Run 'largedb1g' database backup
71
+ const backup2 = backupPromise();
29
72
 
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);
73
+ return Promise.all([backup1, backup2]);
36
74
  });
37
75
  });