@cloudant/couchbackup 2.9.12 → 2.9.13-SNAPSHOT.139

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 (379) hide show
  1. package/.scannerwork/report-task.txt +2 -2
  2. package/.scannerwork/scanner-report/analysis-warnings.pb +2 -2
  3. package/.scannerwork/scanner-report/analysis.log +1 -1
  4. package/.scannerwork/scanner-report/changesets-21.pb +1 -0
  5. package/.scannerwork/scanner-report/changesets-37.pb +1 -0
  6. package/.scannerwork/scanner-report/changesets-38.pb +1 -0
  7. package/.scannerwork/scanner-report/changesets-39.pb +1 -0
  8. package/.scannerwork/scanner-report/changesets-4.pb +1 -0
  9. package/.scannerwork/scanner-report/changesets-40.pb +1 -0
  10. package/.scannerwork/scanner-report/changesets-57.pb +1 -0
  11. package/.scannerwork/scanner-report/changesets-60.pb +1 -0
  12. package/.scannerwork/scanner-report/changesets-62.pb +1 -0
  13. package/.scannerwork/scanner-report/changesets-66.pb +1 -0
  14. package/.scannerwork/scanner-report/component-1.pb +2 -2
  15. package/.scannerwork/scanner-report/component-10.pb +1 -1
  16. package/.scannerwork/scanner-report/component-11.pb +1 -1
  17. package/.scannerwork/scanner-report/component-12.pb +1 -1
  18. package/.scannerwork/scanner-report/component-13.pb +1 -1
  19. package/.scannerwork/scanner-report/component-14.pb +1 -1
  20. package/.scannerwork/scanner-report/component-15.pb +1 -1
  21. package/.scannerwork/scanner-report/component-16.pb +1 -1
  22. package/.scannerwork/scanner-report/component-17.pb +1 -1
  23. package/.scannerwork/scanner-report/component-18.pb +1 -1
  24. package/.scannerwork/scanner-report/component-19.pb +1 -1
  25. package/.scannerwork/scanner-report/component-20.pb +1 -1
  26. package/.scannerwork/scanner-report/component-21.pb +1 -0
  27. package/.scannerwork/scanner-report/component-22.pb +1 -1
  28. package/.scannerwork/scanner-report/component-23.pb +1 -1
  29. package/.scannerwork/scanner-report/component-24.pb +1 -1
  30. package/.scannerwork/scanner-report/component-25.pb +1 -1
  31. package/.scannerwork/scanner-report/component-37.pb +1 -0
  32. package/.scannerwork/scanner-report/component-38.pb +1 -0
  33. package/.scannerwork/scanner-report/component-39.pb +1 -0
  34. package/.scannerwork/scanner-report/component-4.pb +1 -0
  35. package/.scannerwork/scanner-report/component-40.pb +1 -0
  36. package/.scannerwork/scanner-report/component-44.pb +1 -1
  37. package/.scannerwork/scanner-report/component-45.pb +1 -1
  38. package/.scannerwork/scanner-report/component-46.pb +1 -1
  39. package/.scannerwork/scanner-report/component-47.pb +1 -1
  40. package/.scannerwork/scanner-report/component-48.pb +1 -1
  41. package/.scannerwork/scanner-report/component-49.pb +1 -1
  42. package/.scannerwork/scanner-report/component-5.pb +1 -1
  43. package/.scannerwork/scanner-report/component-50.pb +1 -1
  44. package/.scannerwork/scanner-report/component-51.pb +1 -1
  45. package/.scannerwork/scanner-report/component-52.pb +1 -1
  46. package/.scannerwork/scanner-report/component-53.pb +1 -1
  47. package/.scannerwork/scanner-report/component-54.pb +1 -1
  48. package/.scannerwork/scanner-report/component-55.pb +1 -1
  49. package/.scannerwork/scanner-report/component-56.pb +1 -1
  50. package/.scannerwork/scanner-report/component-57.pb +1 -0
  51. package/.scannerwork/scanner-report/component-58.pb +1 -1
  52. package/.scannerwork/scanner-report/component-6.pb +1 -1
  53. package/.scannerwork/scanner-report/component-60.pb +1 -0
  54. package/.scannerwork/scanner-report/component-62.pb +1 -0
  55. package/.scannerwork/scanner-report/component-66.pb +1 -0
  56. package/.scannerwork/scanner-report/component-7.pb +1 -1
  57. package/.scannerwork/scanner-report/component-8.pb +1 -1
  58. package/.scannerwork/scanner-report/component-9.pb +1 -1
  59. package/.scannerwork/scanner-report/coverages-10.pb +0 -0
  60. package/.scannerwork/scanner-report/coverages-11.pb +0 -0
  61. package/.scannerwork/scanner-report/coverages-12.pb +0 -0
  62. package/.scannerwork/scanner-report/coverages-13.pb +0 -0
  63. package/.scannerwork/scanner-report/coverages-14.pb +0 -0
  64. package/.scannerwork/scanner-report/coverages-15.pb +0 -0
  65. package/.scannerwork/scanner-report/coverages-16.pb +0 -0
  66. package/.scannerwork/scanner-report/coverages-17.pb +0 -0
  67. package/.scannerwork/scanner-report/coverages-18.pb +0 -0
  68. package/.scannerwork/scanner-report/coverages-19.pb +0 -0
  69. package/.scannerwork/scanner-report/coverages-20.pb +0 -0
  70. package/.scannerwork/scanner-report/coverages-21.pb +0 -0
  71. package/.scannerwork/scanner-report/coverages-22.pb +0 -0
  72. package/.scannerwork/scanner-report/coverages-23.pb +0 -0
  73. package/.scannerwork/scanner-report/coverages-24.pb +0 -0
  74. package/.scannerwork/scanner-report/coverages-25.pb +0 -0
  75. package/.scannerwork/scanner-report/coverages-37.pb +0 -0
  76. package/.scannerwork/scanner-report/coverages-38.pb +0 -0
  77. package/.scannerwork/scanner-report/coverages-4.pb +0 -0
  78. package/.scannerwork/scanner-report/coverages-40.pb +0 -0
  79. package/.scannerwork/scanner-report/coverages-44.pb +0 -0
  80. package/.scannerwork/scanner-report/coverages-45.pb +0 -0
  81. package/.scannerwork/scanner-report/coverages-46.pb +0 -0
  82. package/.scannerwork/scanner-report/coverages-47.pb +0 -0
  83. package/.scannerwork/scanner-report/coverages-48.pb +0 -0
  84. package/.scannerwork/scanner-report/coverages-49.pb +0 -0
  85. package/.scannerwork/scanner-report/coverages-5.pb +0 -0
  86. package/.scannerwork/scanner-report/coverages-50.pb +0 -0
  87. package/.scannerwork/scanner-report/coverages-51.pb +0 -0
  88. package/.scannerwork/scanner-report/coverages-52.pb +0 -0
  89. package/.scannerwork/scanner-report/coverages-53.pb +0 -0
  90. package/.scannerwork/scanner-report/coverages-54.pb +0 -0
  91. package/.scannerwork/scanner-report/coverages-55.pb +0 -0
  92. package/.scannerwork/scanner-report/coverages-56.pb +0 -0
  93. package/.scannerwork/scanner-report/coverages-57.pb +0 -0
  94. package/.scannerwork/scanner-report/coverages-58.pb +0 -0
  95. package/.scannerwork/scanner-report/coverages-62.pb +0 -0
  96. package/.scannerwork/scanner-report/coverages-66.pb +0 -0
  97. package/.scannerwork/scanner-report/coverages-8.pb +0 -0
  98. package/.scannerwork/scanner-report/coverages-9.pb +0 -0
  99. package/.scannerwork/scanner-report/duplications-12.pb +2 -0
  100. package/.scannerwork/scanner-report/duplications-15.pb +0 -2
  101. package/.scannerwork/scanner-report/duplications-16.pb +2 -0
  102. package/.scannerwork/scanner-report/duplications-17.pb +3 -0
  103. package/.scannerwork/scanner-report/duplications-22.pb +2 -0
  104. package/.scannerwork/scanner-report/duplications-24.pb +3 -2
  105. package/.scannerwork/scanner-report/duplications-25.pb +3 -0
  106. package/.scannerwork/scanner-report/duplications-46.pb +2 -0
  107. package/.scannerwork/scanner-report/duplications-5.pb +0 -2
  108. package/.scannerwork/scanner-report/duplications-52.pb +0 -3
  109. package/.scannerwork/scanner-report/duplications-55.pb +0 -2
  110. package/.scannerwork/scanner-report/duplications-57.pb +0 -0
  111. package/.scannerwork/scanner-report/duplications-58.pb +2 -0
  112. package/.scannerwork/scanner-report/duplications-60.pb +2 -0
  113. package/.scannerwork/scanner-report/duplications-62.pb +2 -0
  114. package/.scannerwork/scanner-report/duplications-66.pb +0 -0
  115. package/.scannerwork/scanner-report/duplications-9.pb +0 -2
  116. package/.scannerwork/scanner-report/measures-10.pb +0 -0
  117. package/.scannerwork/scanner-report/measures-11.pb +0 -0
  118. package/.scannerwork/scanner-report/measures-12.pb +0 -0
  119. package/.scannerwork/scanner-report/measures-13.pb +0 -0
  120. package/.scannerwork/scanner-report/measures-14.pb +0 -0
  121. package/.scannerwork/scanner-report/measures-15.pb +0 -0
  122. package/.scannerwork/scanner-report/measures-16.pb +0 -0
  123. package/.scannerwork/scanner-report/measures-17.pb +0 -0
  124. package/.scannerwork/scanner-report/measures-18.pb +0 -0
  125. package/.scannerwork/scanner-report/measures-19.pb +0 -0
  126. package/.scannerwork/scanner-report/measures-20.pb +0 -0
  127. package/.scannerwork/scanner-report/measures-21.pb +0 -0
  128. package/.scannerwork/scanner-report/measures-22.pb +0 -0
  129. package/.scannerwork/scanner-report/measures-23.pb +0 -0
  130. package/.scannerwork/scanner-report/measures-24.pb +0 -0
  131. package/.scannerwork/scanner-report/measures-25.pb +0 -0
  132. package/.scannerwork/scanner-report/measures-37.pb +0 -0
  133. package/.scannerwork/scanner-report/measures-38.pb +0 -0
  134. package/.scannerwork/scanner-report/measures-4.pb +0 -0
  135. package/.scannerwork/scanner-report/measures-40.pb +0 -0
  136. package/.scannerwork/scanner-report/measures-44.pb +0 -0
  137. package/.scannerwork/scanner-report/measures-45.pb +0 -0
  138. package/.scannerwork/scanner-report/measures-46.pb +0 -0
  139. package/.scannerwork/scanner-report/measures-47.pb +0 -0
  140. package/.scannerwork/scanner-report/measures-48.pb +0 -0
  141. package/.scannerwork/scanner-report/measures-49.pb +0 -0
  142. package/.scannerwork/scanner-report/measures-5.pb +0 -0
  143. package/.scannerwork/scanner-report/measures-50.pb +0 -0
  144. package/.scannerwork/scanner-report/measures-51.pb +0 -0
  145. package/.scannerwork/scanner-report/measures-52.pb +0 -0
  146. package/.scannerwork/scanner-report/measures-53.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-56.pb +0 -0
  150. package/.scannerwork/scanner-report/measures-57.pb +0 -0
  151. package/.scannerwork/scanner-report/measures-58.pb +0 -0
  152. package/.scannerwork/scanner-report/measures-6.pb +0 -0
  153. package/.scannerwork/scanner-report/measures-60.pb +0 -0
  154. package/.scannerwork/scanner-report/measures-62.pb +0 -0
  155. package/.scannerwork/scanner-report/measures-66.pb +0 -0
  156. package/.scannerwork/scanner-report/measures-7.pb +0 -0
  157. package/.scannerwork/scanner-report/measures-8.pb +0 -0
  158. package/.scannerwork/scanner-report/measures-9.pb +0 -0
  159. package/.scannerwork/scanner-report/metadata.pb +0 -0
  160. package/.scannerwork/scanner-report/source-10.txt +14 -96
  161. package/.scannerwork/scanner-report/source-11.txt +19 -39
  162. package/.scannerwork/scanner-report/source-12.txt +126 -22
  163. package/.scannerwork/scanner-report/source-13.txt +33 -115
  164. package/.scannerwork/scanner-report/source-14.txt +584 -123
  165. package/.scannerwork/scanner-report/source-15.txt +127 -60
  166. package/.scannerwork/scanner-report/source-16.txt +202 -95
  167. package/.scannerwork/scanner-report/source-17.txt +99 -84
  168. package/.scannerwork/scanner-report/source-18.txt +18 -160
  169. package/.scannerwork/scanner-report/source-19.txt +52 -15
  170. package/.scannerwork/scanner-report/source-20.txt +346 -261
  171. package/.scannerwork/scanner-report/source-21.txt +63 -0
  172. package/.scannerwork/scanner-report/source-22.txt +277 -40
  173. package/.scannerwork/scanner-report/source-23.txt +131 -52
  174. package/.scannerwork/scanner-report/source-24.txt +213 -114
  175. package/.scannerwork/scanner-report/source-25.txt +110 -13
  176. package/.scannerwork/scanner-report/source-37.txt +92 -0
  177. package/.scannerwork/scanner-report/source-38.txt +100 -0
  178. package/.scannerwork/scanner-report/source-4.txt +56 -0
  179. package/.scannerwork/scanner-report/source-40.txt +35 -0
  180. package/.scannerwork/scanner-report/source-44.txt +403 -20
  181. package/.scannerwork/scanner-report/source-45.txt +24 -120
  182. package/.scannerwork/scanner-report/source-46.txt +71 -47
  183. package/.scannerwork/scanner-report/source-47.txt +64 -20
  184. package/.scannerwork/scanner-report/source-48.txt +39 -21
  185. package/.scannerwork/scanner-report/source-49.txt +82 -78
  186. package/.scannerwork/scanner-report/source-5.txt +60 -158
  187. package/.scannerwork/scanner-report/source-50.txt +71 -578
  188. package/.scannerwork/scanner-report/source-51.txt +255 -42
  189. package/.scannerwork/scanner-report/source-52.txt +17 -230
  190. package/.scannerwork/scanner-report/source-53.txt +25 -47
  191. package/.scannerwork/scanner-report/source-54.txt +115 -15
  192. package/.scannerwork/scanner-report/source-55.txt +87 -201
  193. package/.scannerwork/scanner-report/source-56.txt +151 -65
  194. package/.scannerwork/scanner-report/source-57.txt +164 -0
  195. package/.scannerwork/scanner-report/source-58.txt +51 -90
  196. package/.scannerwork/scanner-report/source-6.txt +509 -190
  197. package/.scannerwork/scanner-report/source-60.txt +190 -0
  198. package/.scannerwork/scanner-report/source-62.txt +175 -0
  199. package/.scannerwork/scanner-report/source-66.txt +114 -0
  200. package/.scannerwork/scanner-report/source-7.txt +167 -46
  201. package/.scannerwork/scanner-report/source-8.txt +46 -58
  202. package/.scannerwork/scanner-report/source-9.txt +19 -75
  203. package/.scannerwork/scanner-report/symbols-10.pb +9 -59
  204. package/.scannerwork/scanner-report/symbols-11.pb +9 -14
  205. package/.scannerwork/scanner-report/symbols-12.pb +102 -18
  206. package/.scannerwork/scanner-report/symbols-13.pb +26 -32
  207. package/.scannerwork/scanner-report/symbols-14.pb +1241 -113
  208. package/.scannerwork/scanner-report/symbols-15.pb +115 -41
  209. package/.scannerwork/scanner-report/symbols-16.pb +417 -29
  210. package/.scannerwork/scanner-report/symbols-17.pb +76 -41
  211. package/.scannerwork/scanner-report/symbols-18.pb +14 -144
  212. package/.scannerwork/scanner-report/symbols-19.pb +44 -13
  213. package/.scannerwork/scanner-report/symbols-20.pb +462 -322
  214. package/.scannerwork/scanner-report/symbols-21.pb +43 -0
  215. package/.scannerwork/scanner-report/symbols-22.pb +485 -18
  216. package/.scannerwork/scanner-report/symbols-23.pb +111 -29
  217. package/.scannerwork/scanner-report/symbols-24.pb +393 -101
  218. package/.scannerwork/scanner-report/symbols-25.pb +97 -10
  219. package/.scannerwork/scanner-report/symbols-37.pb +60 -0
  220. package/.scannerwork/scanner-report/symbols-38.pb +69 -0
  221. package/.scannerwork/scanner-report/symbols-4.pb +19 -0
  222. package/.scannerwork/scanner-report/symbols-40.pb +17 -0
  223. package/.scannerwork/scanner-report/symbols-44.pb +610 -17
  224. package/.scannerwork/scanner-report/symbols-45.pb +19 -115
  225. package/.scannerwork/scanner-report/symbols-46.pb +43 -44
  226. package/.scannerwork/scanner-report/symbols-47.pb +46 -14
  227. package/.scannerwork/scanner-report/symbols-48.pb +15 -11
  228. package/.scannerwork/scanner-report/symbols-49.pb +41 -68
  229. package/.scannerwork/scanner-report/symbols-5.pb +29 -152
  230. package/.scannerwork/scanner-report/symbols-50.pb +30 -1254
  231. package/.scannerwork/scanner-report/symbols-51.pb +354 -36
  232. package/.scannerwork/scanner-report/symbols-52.pb +13 -393
  233. package/.scannerwork/scanner-report/symbols-53.pb +17 -42
  234. package/.scannerwork/scanner-report/symbols-54.pb +33 -9
  235. package/.scannerwork/scanner-report/symbols-55.pb +58 -417
  236. package/.scannerwork/scanner-report/symbols-56.pb +144 -60
  237. package/.scannerwork/scanner-report/symbols-57.pb +126 -0
  238. package/.scannerwork/scanner-report/symbols-58.pb +42 -28
  239. package/.scannerwork/scanner-report/symbols-62.pb +153 -0
  240. package/.scannerwork/scanner-report/symbols-66.pb +28 -0
  241. package/.scannerwork/scanner-report/symbols-8.pb +33 -43
  242. package/.scannerwork/scanner-report/symbols-9.pb +11 -44
  243. package/.scannerwork/scanner-report/syntax-highlightings-10.pb +16 -101
  244. package/.scannerwork/scanner-report/syntax-highlightings-11.pb +21 -25
  245. package/.scannerwork/scanner-report/syntax-highlightings-12.pb +198 -21
  246. package/.scannerwork/scanner-report/syntax-highlightings-13.pb +31 -92
  247. package/.scannerwork/scanner-report/syntax-highlightings-14.pb +815 -141
  248. package/.scannerwork/scanner-report/syntax-highlightings-15.pb +102 -46
  249. package/.scannerwork/scanner-report/syntax-highlightings-16.pb +301 -83
  250. package/.scannerwork/scanner-report/syntax-highlightings-17.pb +128 -86
  251. package/.scannerwork/scanner-report/syntax-highlightings-18.pb +22 -211
  252. package/.scannerwork/scanner-report/syntax-highlightings-19.pb +80 -15
  253. package/.scannerwork/scanner-report/syntax-highlightings-20.pb +523 -178
  254. package/.scannerwork/scanner-report/syntax-highlightings-21.pb +82 -0
  255. package/.scannerwork/scanner-report/syntax-highlightings-22.pb +630 -53
  256. package/.scannerwork/scanner-report/syntax-highlightings-23.pb +194 -74
  257. package/.scannerwork/scanner-report/syntax-highlightings-24.pb +285 -183
  258. package/.scannerwork/scanner-report/syntax-highlightings-25.pb +145 -13
  259. package/.scannerwork/scanner-report/syntax-highlightings-37.pb +110 -0
  260. package/.scannerwork/scanner-report/syntax-highlightings-38.pb +105 -0
  261. package/.scannerwork/scanner-report/syntax-highlightings-4.pb +82 -0
  262. package/.scannerwork/scanner-report/syntax-highlightings-40.pb +63 -0
  263. package/.scannerwork/scanner-report/syntax-highlightings-44.pb +619 -34
  264. package/.scannerwork/scanner-report/syntax-highlightings-45.pb +35 -105
  265. package/.scannerwork/scanner-report/syntax-highlightings-46.pb +56 -76
  266. package/.scannerwork/scanner-report/syntax-highlightings-47.pb +62 -21
  267. package/.scannerwork/scanner-report/syntax-highlightings-48.pb +25 -30
  268. package/.scannerwork/scanner-report/syntax-highlightings-49.pb +84 -73
  269. package/.scannerwork/scanner-report/syntax-highlightings-5.pb +71 -182
  270. package/.scannerwork/scanner-report/syntax-highlightings-50.pb +83 -857
  271. package/.scannerwork/scanner-report/syntax-highlightings-51.pb +247 -57
  272. package/.scannerwork/scanner-report/syntax-highlightings-52.pb +15 -299
  273. package/.scannerwork/scanner-report/syntax-highlightings-53.pb +20 -52
  274. package/.scannerwork/scanner-report/syntax-highlightings-54.pb +97 -16
  275. package/.scannerwork/scanner-report/syntax-highlightings-55.pb +96 -294
  276. package/.scannerwork/scanner-report/syntax-highlightings-56.pb +202 -69
  277. package/.scannerwork/scanner-report/syntax-highlightings-57.pb +213 -0
  278. package/.scannerwork/scanner-report/syntax-highlightings-58.pb +45 -105
  279. package/.scannerwork/scanner-report/syntax-highlightings-6.pb +3725 -202
  280. package/.scannerwork/scanner-report/syntax-highlightings-60.pb +225 -0
  281. package/.scannerwork/scanner-report/syntax-highlightings-62.pb +214 -0
  282. package/.scannerwork/scanner-report/syntax-highlightings-66.pb +138 -0
  283. package/.scannerwork/scanner-report/syntax-highlightings-7.pb +938 -53
  284. package/.scannerwork/scanner-report/syntax-highlightings-8.pb +60 -60
  285. package/.scannerwork/scanner-report/syntax-highlightings-9.pb +29 -60
  286. package/README.md +1 -1
  287. package/package.json +2 -2
  288. package/test-18-results.xml +159 -159
  289. package/test-iam-18-results.xml +50 -50
  290. package/.scannerwork/scanner-report/changesets-26.pb +0 -1
  291. package/.scannerwork/scanner-report/changesets-27.pb +0 -1
  292. package/.scannerwork/scanner-report/changesets-28.pb +0 -1
  293. package/.scannerwork/scanner-report/changesets-29.pb +0 -1
  294. package/.scannerwork/scanner-report/changesets-30.pb +0 -1
  295. package/.scannerwork/scanner-report/changesets-42.pb +0 -1
  296. package/.scannerwork/scanner-report/changesets-43.pb +0 -1
  297. package/.scannerwork/scanner-report/changesets-6.pb +0 -1
  298. package/.scannerwork/scanner-report/changesets-64.pb +0 -1
  299. package/.scannerwork/scanner-report/changesets-7.pb +0 -1
  300. package/.scannerwork/scanner-report/component-2.pb +0 -1
  301. package/.scannerwork/scanner-report/component-26.pb +0 -1
  302. package/.scannerwork/scanner-report/component-27.pb +0 -1
  303. package/.scannerwork/scanner-report/component-28.pb +0 -1
  304. package/.scannerwork/scanner-report/component-29.pb +0 -1
  305. package/.scannerwork/scanner-report/component-30.pb +0 -1
  306. package/.scannerwork/scanner-report/component-42.pb +0 -1
  307. package/.scannerwork/scanner-report/component-43.pb +0 -1
  308. package/.scannerwork/scanner-report/component-61.pb +0 -1
  309. package/.scannerwork/scanner-report/component-64.pb +0 -1
  310. package/.scannerwork/scanner-report/component-68.pb +0 -1
  311. package/.scannerwork/scanner-report/coverages-26.pb +0 -0
  312. package/.scannerwork/scanner-report/coverages-27.pb +0 -0
  313. package/.scannerwork/scanner-report/coverages-28.pb +0 -0
  314. package/.scannerwork/scanner-report/coverages-29.pb +0 -0
  315. package/.scannerwork/scanner-report/coverages-30.pb +0 -0
  316. package/.scannerwork/scanner-report/coverages-42.pb +0 -0
  317. package/.scannerwork/scanner-report/coverages-64.pb +0 -0
  318. package/.scannerwork/scanner-report/coverages-7.pb +0 -0
  319. package/.scannerwork/scanner-report/duplications-26.pb +0 -3
  320. package/.scannerwork/scanner-report/duplications-29.pb +0 -2
  321. package/.scannerwork/scanner-report/duplications-30.pb +0 -3
  322. package/.scannerwork/scanner-report/duplications-6.pb +0 -2
  323. package/.scannerwork/scanner-report/measures-2.pb +0 -0
  324. package/.scannerwork/scanner-report/measures-26.pb +0 -0
  325. package/.scannerwork/scanner-report/measures-27.pb +0 -0
  326. package/.scannerwork/scanner-report/measures-28.pb +0 -0
  327. package/.scannerwork/scanner-report/measures-29.pb +0 -15
  328. package/.scannerwork/scanner-report/measures-30.pb +0 -0
  329. package/.scannerwork/scanner-report/measures-42.pb +0 -0
  330. package/.scannerwork/scanner-report/measures-61.pb +0 -0
  331. package/.scannerwork/scanner-report/measures-64.pb +0 -0
  332. package/.scannerwork/scanner-report/measures-68.pb +0 -0
  333. package/.scannerwork/scanner-report/source-2.txt +0 -509
  334. package/.scannerwork/scanner-report/source-26.txt +0 -119
  335. package/.scannerwork/scanner-report/source-27.txt +0 -156
  336. package/.scannerwork/scanner-report/source-28.txt +0 -47
  337. package/.scannerwork/scanner-report/source-29.txt +0 -293
  338. package/.scannerwork/scanner-report/source-30.txt +0 -131
  339. package/.scannerwork/scanner-report/source-42.txt +0 -366
  340. package/.scannerwork/scanner-report/source-61.txt +0 -509
  341. package/.scannerwork/scanner-report/source-64.txt +0 -418
  342. package/.scannerwork/scanner-report/source-68.txt +0 -167
  343. package/.scannerwork/scanner-report/symbols-26.pb +0 -77
  344. package/.scannerwork/scanner-report/symbols-27.pb +0 -112
  345. package/.scannerwork/scanner-report/symbols-28.pb +0 -27
  346. package/.scannerwork/scanner-report/symbols-29.pb +0 -486
  347. package/.scannerwork/scanner-report/symbols-30.pb +0 -97
  348. package/.scannerwork/scanner-report/symbols-42.pb +0 -494
  349. package/.scannerwork/scanner-report/symbols-64.pb +0 -610
  350. package/.scannerwork/scanner-report/symbols-7.pb +0 -20
  351. package/.scannerwork/scanner-report/syntax-highlightings-2.pb +0 -3749
  352. package/.scannerwork/scanner-report/syntax-highlightings-26.pb +0 -158
  353. package/.scannerwork/scanner-report/syntax-highlightings-27.pb +0 -223
  354. package/.scannerwork/scanner-report/syntax-highlightings-28.pb +0 -68
  355. package/.scannerwork/scanner-report/syntax-highlightings-29.pb +0 -659
  356. package/.scannerwork/scanner-report/syntax-highlightings-30.pb +0 -182
  357. package/.scannerwork/scanner-report/syntax-highlightings-42.pb +0 -630
  358. package/.scannerwork/scanner-report/syntax-highlightings-61.pb +0 -3748
  359. package/.scannerwork/scanner-report/syntax-highlightings-64.pb +0 -648
  360. package/.scannerwork/scanner-report/syntax-highlightings-68.pb +0 -949
  361. package/test-16-results.xml +0 -509
  362. /package/.scannerwork/scanner-report/{coverages-43.pb → coverages-39.pb} +0 -0
  363. /package/.scannerwork/scanner-report/{coverages-6.pb → coverages-60.pb} +0 -0
  364. /package/.scannerwork/scanner-report/{duplications-10.pb → duplications-21.pb} +0 -0
  365. /package/.scannerwork/scanner-report/{duplications-27.pb → duplications-37.pb} +0 -0
  366. /package/.scannerwork/scanner-report/{duplications-28.pb → duplications-38.pb} +0 -0
  367. /package/.scannerwork/scanner-report/{duplications-42.pb → duplications-39.pb} +0 -0
  368. /package/.scannerwork/scanner-report/{duplications-43.pb → duplications-4.pb} +0 -0
  369. /package/.scannerwork/scanner-report/{duplications-64.pb → duplications-40.pb} +0 -0
  370. /package/.scannerwork/scanner-report/{duplications-7.pb → duplications-54.pb} +0 -0
  371. /package/.scannerwork/scanner-report/{issues-28.pb → issues-13.pb} +0 -0
  372. /package/.scannerwork/scanner-report/{issues-45.pb → issues-15.pb} +0 -0
  373. /package/.scannerwork/scanner-report/{issues-42.pb → issues-20.pb} +0 -0
  374. /package/.scannerwork/scanner-report/{issues-52.pb → issues-24.pb} +0 -0
  375. /package/.scannerwork/scanner-report/{measures-43.pb → measures-39.pb} +0 -0
  376. /package/.scannerwork/scanner-report/{source-43.txt → source-39.txt} +0 -0
  377. /package/.scannerwork/scanner-report/{symbols-43.pb → symbols-39.pb} +0 -0
  378. /package/.scannerwork/scanner-report/{symbols-6.pb → symbols-60.pb} +0 -0
  379. /package/.scannerwork/scanner-report/{syntax-highlightings-43.pb → syntax-highlightings-39.pb} +0 -0
@@ -1,4 +1,4 @@
1
- // Copyright © 2017, 2022 IBM Corp. All rights reserved.
1
+ // Copyright © 2017, 2021 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.
@@ -16,130 +16,229 @@
16
16
  'use strict';
17
17
 
18
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
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();
30
+ });
31
+
32
+ describe('#unit Check request headers', function() {
33
+ it('should have a couchbackup user-agent', function(done) {
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);
23
38
 
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();
39
+ db.service.headDocument({ db: db.db, docId: 'good' }).then(response => {
40
+ assert.ok(couch.isDone());
41
+ done();
42
+ }).catch(err => {
43
+ done(err);
44
+ });
45
45
  });
46
+ });
46
47
 
47
- it('should perform a shallow backup', function(done) {
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
- shallowBackup(dbUrl, { bufferSize: 3, parallelism: 1 })
63
- .on('error', function(err) {
64
- assert.fail(err);
65
- })
66
- .on('received', function(data) {
67
- if (data.batch === 3) {
68
- assert.strictEqual(data.length, 2); // smaller last batch
69
- } else {
70
- assert.strictEqual(data.length, 3);
71
- }
72
- })
73
- .on('finished', function(data) {
74
- assert.strictEqual(data.total, 11);
75
- assert.ok(couch.isDone());
76
- done();
77
- });
48
+ describe('#unit Check request response error callback', function() {
49
+ it('should not callback with error for 200 response', function(done) {
50
+ const couch = nock(url)
51
+ .get('/good')
52
+ .reply(200, { ok: true });
53
+
54
+ db.service.getDocument({ db: db.db, docId: 'good' }).then(response => {
55
+ assert.ok(response.result);
56
+ assert.ok(couch.isDone());
57
+ done();
58
+ }).catch(err => {
59
+ err = error.convertResponseError(err);
60
+ done(err);
61
+ });
78
62
  });
79
63
 
80
- it('should perform a shallow backup with transient error', function(done) {
81
- const couch = nock(dbUrl)
82
- // batch 1
83
- .post('/_all_docs', { limit: 3, include_docs: true })
84
- .reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_1.json', 'utf8')))
85
- // batch 2
86
- .post('/_all_docs', { limit: 3, start_key: badgerKey, include_docs: true })
87
- .reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_2.json', 'utf8')))
88
- // batch 3 - transient error
89
- .post('/_all_docs', { limit: 3, start_key: kookaburraKey, include_docs: true })
90
- .reply(500, { error: 'Internal Server Error' })
91
- // batch 3 - retry
92
- .post('/_all_docs', { limit: 3, start_key: kookaburraKey, include_docs: true })
93
- .reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_3.json', 'utf8')))
94
- // batch 4
95
- .post('/_all_docs', { limit: 3, start_key: snipeKey, include_docs: true })
96
- .reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_4.json', 'utf8')));
97
-
98
- shallowBackup(dbUrl, { bufferSize: 3, parallelism: 1 })
99
- .on('error', function(err) {
100
- assert.strictEqual(err.name, 'HTTPError');
101
- })
102
- .on('received', function(data) {
103
- if (data.batch === 3) {
104
- assert.strictEqual(data.length, 2); // smaller last batch
105
- } else {
106
- assert.strictEqual(data.length, 3);
107
- }
108
- })
109
- .on('finished', function(data) {
110
- assert.strictEqual(data.total, 11);
111
- assert.ok(couch.isDone());
112
- done();
64
+ it('should callback with error after 3 500 responses', function(done) {
65
+ const couch = nock(url)
66
+ .get('/bad')
67
+ .times(3)
68
+ .reply(500, function(uri, requestBody) {
69
+ this.req.response.statusMessage = 'Internal Server Error';
70
+ return { error: 'foo', reason: 'bar' };
71
+ });
72
+
73
+ db.service.getDocument({ db: db.db, docId: 'bad' }).then(response => {
74
+ done(new Error('Successful response when error expected.'));
75
+ }).catch(err => {
76
+ err = error.convertResponseError(err);
77
+ assert.strictEqual(err.name, 'HTTPFatalError');
78
+ assert.strictEqual(err.message, `500 Internal Server Error: get ${url}/bad - Error: foo, Reason: bar`);
79
+ assert.ok(couch.isDone());
80
+ done();
81
+ }).catch(err => {
82
+ // Handle assertion errors
83
+ done(err);
84
+ });
85
+ }).timeout(longTestTimeout);
86
+
87
+ it('should callback with error after 3 POST 503 responses', function(done) {
88
+ const couch = nock(url)
89
+ .post('/_bulk_get')
90
+ .query(true)
91
+ .times(3)
92
+ .reply(503, function(uri, requestBody) {
93
+ this.req.response.statusMessage = 'Service Unavailable';
94
+ return { error: 'service_unavailable', reason: 'Service unavailable' };
95
+ });
96
+
97
+ db.service.postBulkGet({ db: db.db, revs: true, docs: [] }).then(response => {
98
+ done(new Error('Successful response when error expected.'));
99
+ }).catch(err => {
100
+ err = error.convertResponseError(err);
101
+ assert.strictEqual(err.name, 'HTTPFatalError');
102
+ assert.strictEqual(err.message, `503 Service Unavailable: post ${url}/_bulk_get - Error: service_unavailable, Reason: Service unavailable`);
103
+ assert.ok(couch.isDone());
104
+ done();
105
+ }).catch(err => {
106
+ // Handle assertion errors
107
+ done(err);
108
+ });
109
+ }).timeout(longTestTimeout);
110
+
111
+ it('should callback with error after 3 429 responses', function(done) {
112
+ const couch = nock(url)
113
+ .get('/bad')
114
+ .times(3)
115
+ .reply(429, function(uri, requestBody) {
116
+ this.req.response.statusMessage = 'Too Many Requests';
117
+ return { error: 'foo', reason: 'bar' };
113
118
  });
119
+
120
+ db.service.getDocument({ db: db.db, docId: 'bad' }).then(response => {
121
+ done(new Error('Successful response when error expected.'));
122
+ }).catch(err => {
123
+ err = error.convertResponseError(err);
124
+ assert.strictEqual(err.name, 'HTTPFatalError');
125
+ assert.strictEqual(err.message, `429 Too Many Requests: get ${url}/bad - Error: foo, Reason: bar`);
126
+ assert.ok(couch.isDone());
127
+ done();
128
+ }).catch(err => {
129
+ // Handle assertion errors
130
+ done(err);
131
+ });
132
+ }).timeout(longTestTimeout);
133
+
134
+ it('should callback with fatal error for 404 response', function(done) {
135
+ const couch = nock(url)
136
+ .get('/bad')
137
+ .reply(404, function(uri, requestBody) {
138
+ this.req.response.statusMessage = 'Not Found';
139
+ return { error: 'foo', reason: 'bar' };
140
+ });
141
+
142
+ db.service.getDocument({ db: db.db, docId: 'bad' }).then(response => {
143
+ done(new Error('Successful response when error expected.'));
144
+ }).catch(err => {
145
+ err = error.convertResponseError(err);
146
+ assert.strictEqual(err.name, 'HTTPFatalError');
147
+ assert.strictEqual(err.message, `404 Not Found: get ${url}/bad - Error: foo, Reason: bar`);
148
+ assert.ok(couch.isDone());
149
+ done();
150
+ }).catch(err => {
151
+ // Handle assertion errors
152
+ done(err);
153
+ });
114
154
  });
115
155
 
116
- it('should fail to perform a shallow backup on fatal error', function(done) {
117
- const couch = nock(dbUrl)
118
- // batch 1
119
- .post('/_all_docs', { limit: 3, include_docs: true })
120
- .reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_1.json', 'utf8')))
121
- // batch 2
122
- .post('/_all_docs', { limit: 3, start_key: badgerKey, include_docs: true })
123
- .reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_2.json', 'utf8')))
124
- // batch 3 - fatal error
125
- .post('/_all_docs', { limit: 3, start_key: kookaburraKey, include_docs: true })
126
- .reply(401, { error: 'Unauthorized' });
127
-
128
- let errCount = 0;
129
-
130
- shallowBackup(dbUrl, { bufferSize: 3, parallelism: 1 })
131
- .on('error', function(err) {
132
- errCount++;
133
- assert.strictEqual(err.name, 'Unauthorized');
134
- })
135
- .on('received', function(data) {
136
- assert.strictEqual(data.length, 3);
137
- })
138
- .on('finished', function(data) {
139
- assert.strictEqual(data.total, 6);
156
+ it('should callback with same error for no status code error response', function(done) {
157
+ const couch = nock(url)
158
+ .get('/bad')
159
+ .times(3)
160
+ .replyWithError('testing badness');
161
+
162
+ db.service.getDocument({ db: db.db, docId: 'bad' }).then(response => {
163
+ done(new Error('Successful response when error expected.'));
164
+ }).catch(err => {
165
+ const err2 = error.convertResponseError(err);
166
+ assert.strictEqual(err, err2);
167
+ assert.ok(couch.isDone());
168
+ done();
169
+ }).catch(err => {
170
+ // Handle assertion errors
171
+ done(err);
172
+ });
173
+ }).timeout(longTestTimeout);
174
+
175
+ it('should retry request if HTTP request gets timed out', function(done) {
176
+ const couch = nock(url)
177
+ .post('/_bulk_get')
178
+ .query(true)
179
+ .delay(1000)
180
+ .reply(200, { results: { docs: [{ id: '1', ok: { _id: '1' } }] } })
181
+ .post('/_bulk_get')
182
+ .query(true)
183
+ .reply(200, { results: { docs: [{ id: '1', ok: { _id: '1' } }, { id: '2', ok: { _id: '2' } }] } });
184
+
185
+ timeoutDb.service.postBulkGet({ db: db.db, revs: true, docs: [] }).then(response => {
186
+ assert.ok(response);
187
+ assert.ok(response.result);
188
+ assert.ok(response.result.results);
189
+ assert.ok(response.result.results.docs);
190
+ assert.strictEqual(response.result.results.docs.length, 2);
191
+ assert.ok(couch.isDone());
192
+ done();
193
+ }).catch(err => {
194
+ done(err);
195
+ });
196
+ });
197
+
198
+ it('should callback with error code ESOCKETTIMEDOUT if 3 HTTP requests gets timed out', function(done) {
199
+ // Increase the timeout for this test to allow for the delays
200
+ this.timeout(3000);
201
+ const couch = nock(url)
202
+ .post('/_bulk_get')
203
+ .query(true)
204
+ .delay(1000)
205
+ .times(3)
206
+ .reply(200, { ok: true });
207
+
208
+ timeoutDb.service.postBulkGet({ db: db.db, revs: true, docs: [] }).then(response => {
209
+ done(new Error('Successful response when error expected.'));
210
+ }).catch(err => {
211
+ err = error.convertResponseError(err);
212
+ // Note axios returns ECONNABORTED rather than ESOCKETTIMEDOUT
213
+ // See https://github.com/axios/axios/issues/2710 via https://github.com/axios/axios/issues/1543`
214
+ assert.strictEqual(err.statusText, 'ECONNABORTED');
215
+ assert.strictEqual(err.message, `timeout of 500ms exceeded: post ${url}/_bulk_get ECONNABORTED`);
216
+ assert.ok(couch.isDone());
217
+ done();
218
+ }).catch(err => {
219
+ // Handle assertion errors
220
+ done(err);
221
+ });
222
+ });
223
+ describe('#unit Check credentials', function() {
224
+ it('should properly decode username and password', function(done) {
225
+ const username = 'user%123';
226
+ const password = 'colon:at@321';
227
+ const url = `http://${encodeURIComponent(username)}:${encodeURIComponent(password)}@localhost:7777/testdb`;
228
+ const sessionUrl = 'http://localhost:7777';
229
+ const couch = nock(sessionUrl)
230
+ .post('/_session', { username: username, password: password })
231
+ .reply(200, { ok: true }, { 'Set-Cookie': 'AuthSession=ABC123DEF4356;' })
232
+ .get('/')
233
+ .reply(200);
234
+ const db = request.client(url, { parallelism: 1 });
235
+ db.service.getServerInformation().then(response => {
236
+ assert.ok(response);
140
237
  assert.ok(couch.isDone());
141
- assert.strictEqual(errCount, 1);
142
238
  done();
239
+ }).catch(err => {
240
+ done(err);
143
241
  });
242
+ });
144
243
  });
145
244
  });
@@ -15,20 +15,117 @@
15
15
  /* global describe it */
16
16
  'use strict';
17
17
 
18
- const assert = require('assert');
19
- const logfilesummary = require('../includes/logfilesummary.js');
18
+ const fs = require('fs');
19
+ const u = require('./citestutils.js');
20
20
 
21
- describe('#unit Fetching summary from the log file', function() {
22
- it('should fetch a summary correctly', function(done) {
23
- logfilesummary('./test/fixtures/test.log', function(err, data) {
24
- assert.ok(!err);
25
- assert.ok(data);
26
- assert.strictEqual(data.changesComplete, true);
27
- assert.strictEqual(typeof data.batches, 'object');
28
- assert.strictEqual(Object.keys(data.batches).length, 2);
29
- assert.deepStrictEqual(data.batches['1'], true);
30
- assert.deepStrictEqual(data.batches['4'], true);
31
- done();
21
+ [{ useApi: true }, { useApi: false }].forEach(function(params) {
22
+ describe(u.scenario('Basic backup and restore', params), function() {
23
+ it('should backup animaldb to a file correctly', function(done) {
24
+ // Allow up to 40 s to backup and compare (it should be much faster)!
25
+ u.setTimeout(this, 40);
26
+ const actualBackup = `./${this.fileName}`;
27
+ // Create a file and backup to it
28
+ const output = fs.createWriteStream(actualBackup);
29
+ output.on('open', function() {
30
+ u.testBackup(params, 'animaldb', output, function(err) {
31
+ if (err) {
32
+ done(err);
33
+ } else {
34
+ u.readSortAndDeepEqual(actualBackup, './test/fixtures/animaldb_expected.json', done);
35
+ }
36
+ });
37
+ });
38
+ });
39
+
40
+ it('should restore animaldb to a database correctly', function(done) {
41
+ // Allow up to 60 s to restore and compare (again it should be faster)!
42
+ u.setTimeout(this, 60);
43
+ const input = fs.createReadStream('./test/fixtures/animaldb_expected.json');
44
+ const dbName = this.dbName;
45
+ input.on('open', function() {
46
+ u.testRestore(params, input, dbName, function(err) {
47
+ if (err) {
48
+ done(err);
49
+ } else {
50
+ u.dbCompare('animaldb', dbName, done);
51
+ }
52
+ });
53
+ });
54
+ });
55
+
56
+ it('should execute a shallow mode backup successfully', function(done) {
57
+ // Allow 30 s
58
+ u.setTimeout(this, 30);
59
+ const actualBackup = `./${this.fileName}`;
60
+ const output = fs.createWriteStream(actualBackup);
61
+ // Add the shallow mode option
62
+ const p = u.p(params, { opts: { mode: 'shallow' } });
63
+ output.on('open', function() {
64
+ u.testBackup(p, 'animaldb', output, function(err) {
65
+ if (err) {
66
+ done(err);
67
+ } else {
68
+ u.readSortAndDeepEqual(actualBackup, './test/fixtures/animaldb_expected_shallow.json', done);
69
+ }
70
+ });
71
+ });
72
+ });
73
+
74
+ describe(u.scenario('Buffer size tests', params), function() {
75
+ it('should backup/restore animaldb with the same buffer size', function(done) {
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 p = u.p(params, { opts: { log: logFile, bufferSize: 1 } });
81
+ u.testBackupAndRestoreViaFile(p, 'animaldb', actualBackup, this.dbName, done);
82
+ });
83
+ it('should backup/restore animaldb with backup buffer > restore buffer', function(done) {
84
+ // Allow up to 60 s for backup and restore of animaldb
85
+ u.setTimeout(this, 60);
86
+ const actualBackup = `./${this.fileName}`;
87
+ const logFile = `./${this.fileName}` + '.log';
88
+ const dbName = this.dbName;
89
+ const p = u.p(params, { opts: { log: logFile, bufferSize: 2 } }); // backup
90
+ const q = u.p(params, { opts: { bufferSize: 1 } }); // restore
91
+ u.testBackupToFile(p, 'animaldb', actualBackup, function(err) {
92
+ if (err) {
93
+ done(err);
94
+ } else {
95
+ // restore
96
+ u.testRestoreFromFile(q, actualBackup, dbName, function(err) {
97
+ if (!err) {
98
+ u.dbCompare('animaldb', dbName, done);
99
+ } else {
100
+ done(err);
101
+ }
102
+ });
103
+ }
104
+ });
105
+ });
106
+ it('should backup/restore animaldb with backup buffer < restore buffer', function(done) {
107
+ // Allow up to 60 s for backup and restore of animaldb
108
+ u.setTimeout(this, 60);
109
+ const actualBackup = `./${this.fileName}`;
110
+ const logFile = `./${this.fileName}` + '.log';
111
+ const dbName = this.dbName;
112
+ const p = u.p(params, { opts: { log: logFile, bufferSize: 1 } }); // backup
113
+ const q = u.p(params, { opts: { bufferSize: 2 } }); // restore
114
+ u.testBackupToFile(p, 'animaldb', actualBackup, function(err) {
115
+ if (err) {
116
+ done(err);
117
+ } else {
118
+ // restore
119
+ u.testRestoreFromFile(q, actualBackup, dbName, function(err) {
120
+ if (!err) {
121
+ u.dbCompare('animaldb', dbName, done);
122
+ } else {
123
+ done(err);
124
+ }
125
+ });
126
+ }
127
+ });
128
+ });
32
129
  });
33
130
  });
34
131
  });
@@ -0,0 +1,92 @@
1
+ // Copyright © 2018, 2021 IBM Corp. All rights reserved.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ /* global describe it */
16
+ 'use strict';
17
+
18
+ const fs = require('fs');
19
+ const readline = require('readline');
20
+ const u = require('./citestutils.js');
21
+ const uuid = require('uuid').v4;
22
+
23
+ const params = { useApi: true };
24
+
25
+ describe(u.scenario('Concurrent database backups', params), function() {
26
+ it('should run concurrent API database backups correctly #slower', function(done) {
27
+ // Allow up to 900 s to backup and compare (it should be much faster)!
28
+ u.setTimeout(this, 900);
29
+
30
+ let doneCount = 0;
31
+ let doneErr;
32
+ const finished = function(err) {
33
+ doneCount++;
34
+ if (doneCount === 2) {
35
+ done(doneErr || err);
36
+ }
37
+ doneErr = err;
38
+ };
39
+
40
+ const checkForEmptyBatches = function(fileName, cb) {
41
+ let foundEmptyBatch = false;
42
+
43
+ const rd = readline.createInterface({
44
+ input: fs.createReadStream(fileName),
45
+ output: fs.createWriteStream('/dev/null'),
46
+ terminal: false
47
+ });
48
+
49
+ rd.on('line', function(line) {
50
+ if (JSON.parse(line).length === 0) {
51
+ // Note: Empty batch arrays indicate that the running backup is
52
+ // incorrectly sharing a log file with another ongoing backup job.
53
+ foundEmptyBatch = true;
54
+ }
55
+ });
56
+
57
+ rd.on('close', function() {
58
+ if (foundEmptyBatch) {
59
+ cb(new Error(`Log file '${fileName}' contains empty batches`));
60
+ } else {
61
+ cb();
62
+ }
63
+ });
64
+ };
65
+
66
+ // [1] Run 'largedb2g' database backup
67
+ const actualBackup1 = `./${uuid()}`;
68
+ const output1 = fs.createWriteStream(actualBackup1);
69
+ output1.on('open', function() {
70
+ u.testBackup(params, 'largedb2g', output1, function(err) {
71
+ if (err) {
72
+ finished(err);
73
+ } else {
74
+ checkForEmptyBatches(actualBackup1, finished);
75
+ }
76
+ });
77
+ });
78
+
79
+ // [2] Run 'largedb1g' database backup
80
+ const actualBackup2 = `./${uuid()}`;
81
+ const output2 = fs.createWriteStream(actualBackup2);
82
+ output2.on('open', function() {
83
+ u.testBackup(params, 'largedb1g', output2, function(err) {
84
+ if (err) {
85
+ finished(err);
86
+ } else {
87
+ checkForEmptyBatches(actualBackup2, finished);
88
+ }
89
+ });
90
+ });
91
+ });
92
+ });