@cloudant/couchbackup 2.9.16 → 2.9.17-SNAPSHOT.185
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.
- package/.scannerwork/report-task.txt +2 -2
- package/.scannerwork/scanner-report/analysis-cache2.pb +0 -0
- package/.scannerwork/scanner-report/analysis-warnings.pb +2 -2
- package/.scannerwork/scanner-report/changesets-23.pb +1 -0
- package/.scannerwork/scanner-report/changesets-24.pb +1 -0
- package/.scannerwork/scanner-report/changesets-26.pb +1 -0
- package/.scannerwork/scanner-report/changesets-27.pb +1 -0
- package/.scannerwork/scanner-report/changesets-28.pb +1 -0
- package/.scannerwork/scanner-report/changesets-29.pb +1 -0
- package/.scannerwork/scanner-report/changesets-53.pb +1 -0
- package/.scannerwork/scanner-report/changesets-55.pb +1 -0
- package/.scannerwork/scanner-report/changesets-56.pb +1 -0
- package/.scannerwork/scanner-report/changesets-57.pb +1 -0
- package/.scannerwork/scanner-report/changesets-58.pb +1 -0
- package/.scannerwork/scanner-report/changesets-59.pb +1 -0
- package/.scannerwork/scanner-report/changesets-62.pb +1 -0
- package/.scannerwork/scanner-report/changesets-63.pb +1 -0
- package/.scannerwork/scanner-report/changesets-67.pb +1 -0
- package/.scannerwork/scanner-report/changesets-69.pb +1 -0
- package/.scannerwork/scanner-report/component-1.pb +1 -2
- package/.scannerwork/scanner-report/component-11.pb +1 -1
- package/.scannerwork/scanner-report/component-12.pb +1 -1
- package/.scannerwork/scanner-report/component-13.pb +1 -1
- package/.scannerwork/scanner-report/component-14.pb +1 -1
- package/.scannerwork/scanner-report/component-15.pb +1 -1
- package/.scannerwork/scanner-report/component-16.pb +1 -1
- package/.scannerwork/scanner-report/component-17.pb +1 -1
- package/.scannerwork/scanner-report/component-18.pb +1 -1
- package/.scannerwork/scanner-report/component-19.pb +1 -1
- package/.scannerwork/scanner-report/component-20.pb +1 -1
- package/.scannerwork/scanner-report/component-21.pb +1 -1
- package/.scannerwork/scanner-report/component-22.pb +1 -1
- package/.scannerwork/scanner-report/component-23.pb +1 -0
- package/.scannerwork/scanner-report/component-24.pb +1 -0
- package/.scannerwork/scanner-report/component-25.pb +1 -0
- package/.scannerwork/scanner-report/component-26.pb +1 -0
- package/.scannerwork/scanner-report/component-27.pb +1 -0
- package/.scannerwork/scanner-report/component-28.pb +1 -0
- package/.scannerwork/scanner-report/component-29.pb +1 -0
- package/.scannerwork/scanner-report/component-3.pb +1 -1
- package/.scannerwork/scanner-report/component-41.pb +1 -1
- package/.scannerwork/scanner-report/component-42.pb +1 -1
- package/.scannerwork/scanner-report/component-43.pb +1 -1
- package/.scannerwork/scanner-report/component-44.pb +1 -1
- package/.scannerwork/scanner-report/component-45.pb +1 -1
- package/.scannerwork/scanner-report/component-46.pb +1 -1
- package/.scannerwork/scanner-report/component-47.pb +1 -1
- package/.scannerwork/scanner-report/component-48.pb +1 -1
- package/.scannerwork/scanner-report/component-49.pb +1 -1
- package/.scannerwork/scanner-report/component-50.pb +1 -1
- package/.scannerwork/scanner-report/component-51.pb +1 -1
- package/.scannerwork/scanner-report/component-52.pb +1 -1
- package/.scannerwork/scanner-report/component-53.pb +1 -0
- package/.scannerwork/scanner-report/component-54.pb +1 -1
- package/.scannerwork/scanner-report/component-55.pb +1 -1
- package/.scannerwork/scanner-report/component-56.pb +1 -0
- package/.scannerwork/scanner-report/component-57.pb +1 -0
- package/.scannerwork/scanner-report/component-58.pb +1 -0
- package/.scannerwork/scanner-report/component-59.pb +1 -0
- package/.scannerwork/scanner-report/component-60.pb +1 -1
- package/.scannerwork/scanner-report/component-62.pb +1 -0
- package/.scannerwork/scanner-report/component-63.pb +1 -0
- package/.scannerwork/scanner-report/component-67.pb +1 -0
- package/.scannerwork/scanner-report/component-69.pb +1 -0
- package/.scannerwork/scanner-report/component-70.pb +1 -0
- package/.scannerwork/scanner-report/component-9.pb +1 -1
- package/.scannerwork/scanner-report/coverages-11.pb +0 -0
- package/.scannerwork/scanner-report/coverages-12.pb +0 -0
- package/.scannerwork/scanner-report/coverages-13.pb +0 -0
- package/.scannerwork/scanner-report/coverages-14.pb +0 -0
- package/.scannerwork/scanner-report/coverages-15.pb +0 -0
- package/.scannerwork/scanner-report/coverages-16.pb +0 -0
- package/.scannerwork/scanner-report/coverages-17.pb +0 -0
- package/.scannerwork/scanner-report/coverages-18.pb +0 -0
- package/.scannerwork/scanner-report/coverages-19.pb +0 -0
- package/.scannerwork/scanner-report/coverages-20.pb +0 -0
- package/.scannerwork/scanner-report/coverages-21.pb +0 -0
- package/.scannerwork/scanner-report/coverages-22.pb +0 -0
- package/.scannerwork/scanner-report/coverages-24.pb +0 -0
- package/.scannerwork/scanner-report/coverages-27.pb +0 -0
- package/.scannerwork/scanner-report/coverages-28.pb +0 -0
- package/.scannerwork/scanner-report/coverages-41.pb +0 -0
- package/.scannerwork/scanner-report/coverages-42.pb +0 -0
- package/.scannerwork/scanner-report/coverages-43.pb +0 -0
- package/.scannerwork/scanner-report/coverages-44.pb +0 -0
- package/.scannerwork/scanner-report/coverages-45.pb +0 -0
- package/.scannerwork/scanner-report/coverages-46.pb +0 -0
- package/.scannerwork/scanner-report/coverages-47.pb +0 -0
- package/.scannerwork/scanner-report/coverages-48.pb +0 -0
- package/.scannerwork/scanner-report/coverages-49.pb +0 -0
- package/.scannerwork/scanner-report/coverages-50.pb +0 -0
- package/.scannerwork/scanner-report/coverages-51.pb +0 -0
- package/.scannerwork/scanner-report/coverages-52.pb +0 -0
- package/.scannerwork/scanner-report/coverages-54.pb +0 -0
- package/.scannerwork/scanner-report/coverages-56.pb +0 -0
- package/.scannerwork/scanner-report/coverages-58.pb +0 -0
- package/.scannerwork/scanner-report/coverages-59.pb +0 -0
- package/.scannerwork/scanner-report/coverages-60.pb +0 -0
- package/.scannerwork/scanner-report/coverages-62.pb +0 -0
- package/.scannerwork/scanner-report/coverages-69.pb +0 -0
- package/.scannerwork/scanner-report/duplications-12.pb +0 -3
- package/.scannerwork/scanner-report/duplications-15.pb +2 -0
- package/.scannerwork/scanner-report/duplications-24.pb +2 -0
- package/.scannerwork/scanner-report/duplications-43.pb +2 -0
- package/.scannerwork/scanner-report/duplications-50.pb +0 -2
- package/.scannerwork/scanner-report/duplications-51.pb +3 -2
- package/.scannerwork/scanner-report/duplications-66.pb +1 -1
- package/.scannerwork/scanner-report/measures-11.pb +0 -0
- package/.scannerwork/scanner-report/measures-12.pb +0 -0
- package/.scannerwork/scanner-report/measures-13.pb +0 -0
- package/.scannerwork/scanner-report/measures-14.pb +0 -0
- package/.scannerwork/scanner-report/measures-15.pb +0 -0
- package/.scannerwork/scanner-report/measures-16.pb +0 -0
- package/.scannerwork/scanner-report/measures-17.pb +0 -0
- package/.scannerwork/scanner-report/measures-18.pb +0 -0
- package/.scannerwork/scanner-report/measures-19.pb +0 -0
- package/.scannerwork/scanner-report/measures-20.pb +0 -0
- package/.scannerwork/scanner-report/measures-21.pb +0 -0
- package/.scannerwork/scanner-report/measures-22.pb +0 -0
- package/.scannerwork/scanner-report/measures-24.pb +0 -0
- package/.scannerwork/scanner-report/measures-27.pb +0 -0
- package/.scannerwork/scanner-report/measures-28.pb +0 -0
- package/.scannerwork/scanner-report/measures-41.pb +0 -0
- package/.scannerwork/scanner-report/measures-42.pb +0 -0
- package/.scannerwork/scanner-report/measures-43.pb +0 -0
- package/.scannerwork/scanner-report/measures-44.pb +0 -0
- package/.scannerwork/scanner-report/measures-45.pb +0 -0
- package/.scannerwork/scanner-report/measures-46.pb +0 -0
- package/.scannerwork/scanner-report/measures-47.pb +0 -0
- package/.scannerwork/scanner-report/measures-48.pb +0 -0
- package/.scannerwork/scanner-report/measures-49.pb +0 -0
- package/.scannerwork/scanner-report/measures-50.pb +0 -0
- package/.scannerwork/scanner-report/measures-51.pb +0 -0
- package/.scannerwork/scanner-report/measures-52.pb +0 -0
- package/.scannerwork/scanner-report/measures-54.pb +0 -0
- package/.scannerwork/scanner-report/measures-55.pb +0 -0
- package/.scannerwork/scanner-report/measures-56.pb +0 -0
- package/.scannerwork/scanner-report/measures-58.pb +0 -0
- package/.scannerwork/scanner-report/measures-59.pb +0 -0
- package/.scannerwork/scanner-report/measures-60.pb +0 -0
- package/.scannerwork/scanner-report/measures-62.pb +0 -0
- package/.scannerwork/scanner-report/measures-69.pb +0 -0
- package/.scannerwork/scanner-report/measures-9.pb +0 -0
- package/.scannerwork/scanner-report/metadata.pb +0 -0
- package/.scannerwork/scanner-report/source-11.txt +25 -16
- package/.scannerwork/scanner-report/source-12.txt +32 -199
- package/.scannerwork/scanner-report/source-13.txt +17 -87
- package/.scannerwork/scanner-report/source-14.txt +115 -116
- package/.scannerwork/scanner-report/source-15.txt +66 -423
- package/.scannerwork/scanner-report/source-16.txt +64 -277
- package/.scannerwork/scanner-report/source-17.txt +247 -66
- package/.scannerwork/scanner-report/source-18.txt +104 -92
- package/.scannerwork/scanner-report/source-19.txt +45 -120
- package/.scannerwork/scanner-report/source-20.txt +89 -41
- package/.scannerwork/scanner-report/source-21.txt +148 -24
- package/.scannerwork/scanner-report/source-22.txt +162 -25
- package/.scannerwork/scanner-report/source-24.txt +75 -0
- package/.scannerwork/scanner-report/{source-38.txt → source-25.txt} +143 -143
- package/.scannerwork/scanner-report/source-27.txt +65 -0
- package/.scannerwork/scanner-report/source-28.txt +100 -0
- package/.scannerwork/scanner-report/source-3.txt +152 -152
- package/.scannerwork/scanner-report/source-41.txt +315 -32
- package/.scannerwork/scanner-report/source-42.txt +23 -63
- package/.scannerwork/scanner-report/source-43.txt +169 -45
- package/.scannerwork/scanner-report/source-44.txt +23 -164
- package/.scannerwork/scanner-report/source-45.txt +116 -104
- package/.scannerwork/scanner-report/source-46.txt +14 -26
- package/.scannerwork/scanner-report/source-47.txt +48 -99
- package/.scannerwork/scanner-report/source-48.txt +52 -141
- package/.scannerwork/scanner-report/source-49.txt +254 -242
- package/.scannerwork/scanner-report/source-50.txt +114 -72
- package/.scannerwork/scanner-report/source-51.txt +198 -60
- package/.scannerwork/scanner-report/source-52.txt +134 -14
- package/.scannerwork/scanner-report/source-54.txt +80 -25
- package/.scannerwork/scanner-report/source-55.txt +187 -424
- package/.scannerwork/scanner-report/{source-5.txt → source-56.txt} +10 -7
- package/.scannerwork/scanner-report/source-58.txt +106 -0
- package/.scannerwork/scanner-report/source-59.txt +449 -0
- package/.scannerwork/scanner-report/source-60.txt +25 -44
- package/.scannerwork/scanner-report/source-62.txt +60 -0
- package/.scannerwork/scanner-report/source-69.txt +46 -0
- package/.scannerwork/scanner-report/{source-68.txt → source-70.txt} +49 -49
- package/.scannerwork/scanner-report/source-9.txt +424 -183
- package/.scannerwork/scanner-report/symbols-11.pb +18 -9
- package/.scannerwork/scanner-report/symbols-12.pb +20 -264
- package/.scannerwork/scanner-report/symbols-13.pb +13 -57
- package/.scannerwork/scanner-report/symbols-14.pb +33 -86
- package/.scannerwork/scanner-report/symbols-15.pb +43 -789
- package/.scannerwork/scanner-report/symbols-16.pb +44 -426
- package/.scannerwork/scanner-report/symbols-17.pb +354 -69
- package/.scannerwork/scanner-report/symbols-18.pb +30 -59
- package/.scannerwork/scanner-report/symbols-19.pb +19 -71
- package/.scannerwork/scanner-report/symbols-20.pb +45 -32
- package/.scannerwork/scanner-report/symbols-21.pb +126 -23
- package/.scannerwork/scanner-report/symbols-22.pb +143 -30
- package/.scannerwork/scanner-report/symbols-24.pb +42 -0
- package/.scannerwork/scanner-report/symbols-27.pb +33 -0
- package/.scannerwork/scanner-report/symbols-28.pb +69 -0
- package/.scannerwork/scanner-report/symbols-41.pb +353 -20
- package/.scannerwork/scanner-report/symbols-42.pb +23 -46
- package/.scannerwork/scanner-report/symbols-43.pb +203 -19
- package/.scannerwork/scanner-report/symbols-44.pb +9 -144
- package/.scannerwork/scanner-report/symbols-45.pb +86 -30
- package/.scannerwork/scanner-report/symbols-46.pb +8 -18
- package/.scannerwork/scanner-report/symbols-47.pb +23 -45
- package/.scannerwork/scanner-report/symbols-48.pb +39 -126
- package/.scannerwork/scanner-report/symbols-49.pb +402 -328
- package/.scannerwork/scanner-report/symbols-50.pb +71 -44
- package/.scannerwork/scanner-report/symbols-51.pb +264 -42
- package/.scannerwork/scanner-report/symbols-52.pb +92 -13
- package/.scannerwork/scanner-report/symbols-54.pb +58 -7
- package/.scannerwork/scanner-report/symbols-56.pb +9 -0
- package/.scannerwork/scanner-report/symbols-58.pb +59 -0
- package/.scannerwork/scanner-report/symbols-59.pb +790 -0
- package/.scannerwork/scanner-report/symbols-60.pb +31 -21
- package/.scannerwork/scanner-report/symbols-62.pb +21 -0
- package/.scannerwork/scanner-report/symbols-69.pb +7 -0
- package/.scannerwork/scanner-report/syntax-highlightings-11.pb +23 -25
- package/.scannerwork/scanner-report/syntax-highlightings-12.pb +33 -266
- package/.scannerwork/scanner-report/syntax-highlightings-13.pb +15 -124
- package/.scannerwork/scanner-report/syntax-highlightings-14.pb +94 -90
- package/.scannerwork/scanner-report/syntax-highlightings-15.pb +57 -591
- package/.scannerwork/scanner-report/syntax-highlightings-16.pb +62 -687
- package/.scannerwork/scanner-report/syntax-highlightings-17.pb +245 -67
- package/.scannerwork/scanner-report/syntax-highlightings-18.pb +83 -148
- package/.scannerwork/scanner-report/syntax-highlightings-19.pb +23 -145
- package/.scannerwork/scanner-report/syntax-highlightings-20.pb +93 -77
- package/.scannerwork/scanner-report/syntax-highlightings-21.pb +177 -20
- package/.scannerwork/scanner-report/syntax-highlightings-22.pb +207 -33
- package/.scannerwork/scanner-report/syntax-highlightings-24.pb +81 -0
- package/.scannerwork/scanner-report/{syntax-highlightings-38.pb → syntax-highlightings-25.pb} +103 -100
- package/.scannerwork/scanner-report/syntax-highlightings-27.pb +110 -0
- package/.scannerwork/scanner-report/syntax-highlightings-28.pb +107 -0
- package/.scannerwork/scanner-report/syntax-highlightings-3.pb +107 -108
- package/.scannerwork/scanner-report/syntax-highlightings-41.pb +590 -34
- package/.scannerwork/scanner-report/syntax-highlightings-42.pb +22 -61
- package/.scannerwork/scanner-report/syntax-highlightings-43.pb +246 -25
- package/.scannerwork/scanner-report/syntax-highlightings-44.pb +27 -209
- package/.scannerwork/scanner-report/syntax-highlightings-45.pb +95 -83
- package/.scannerwork/scanner-report/syntax-highlightings-46.pb +20 -23
- package/.scannerwork/scanner-report/syntax-highlightings-47.pb +67 -96
- package/.scannerwork/scanner-report/syntax-highlightings-48.pb +64 -176
- package/.scannerwork/scanner-report/syntax-highlightings-49.pb +606 -171
- package/.scannerwork/scanner-report/syntax-highlightings-50.pb +145 -57
- package/.scannerwork/scanner-report/syntax-highlightings-51.pb +263 -47
- package/.scannerwork/scanner-report/syntax-highlightings-52.pb +208 -16
- package/.scannerwork/scanner-report/syntax-highlightings-54.pb +119 -27
- package/.scannerwork/scanner-report/syntax-highlightings-55.pb +289 -3261
- package/.scannerwork/scanner-report/syntax-highlightings-56.pb +54 -0
- package/.scannerwork/scanner-report/syntax-highlightings-58.pb +178 -0
- package/.scannerwork/scanner-report/syntax-highlightings-59.pb +627 -0
- package/.scannerwork/scanner-report/syntax-highlightings-60.pb +48 -61
- package/.scannerwork/scanner-report/syntax-highlightings-62.pb +82 -0
- package/.scannerwork/scanner-report/syntax-highlightings-69.pb +62 -0
- package/.scannerwork/scanner-report/{syntax-highlightings-68.pb → syntax-highlightings-70.pb} +14 -13
- package/.scannerwork/scanner-report/syntax-highlightings-9.pb +3286 -226
- package/package.json +1 -1
- package/test-18-results.xml +147 -147
- package/test-20-results.xml +141 -141
- package/test-21-results.xml +143 -143
- package/test-iam-20-results.xml +49 -49
- package/.scannerwork/scanner-report/changesets-10.pb +0 -2
- package/.scannerwork/scanner-report/changesets-2.pb +0 -1
- package/.scannerwork/scanner-report/changesets-34.pb +0 -1
- package/.scannerwork/scanner-report/changesets-35.pb +0 -1
- package/.scannerwork/scanner-report/changesets-36.pb +0 -1
- package/.scannerwork/scanner-report/changesets-37.pb +0 -1
- package/.scannerwork/scanner-report/changesets-39.pb +0 -1
- package/.scannerwork/scanner-report/changesets-4.pb +0 -1
- package/.scannerwork/scanner-report/changesets-40.pb +0 -1
- package/.scannerwork/scanner-report/changesets-5.pb +0 -1
- package/.scannerwork/scanner-report/changesets-6.pb +0 -1
- package/.scannerwork/scanner-report/changesets-61.pb +0 -1
- package/.scannerwork/scanner-report/changesets-64.pb +0 -1
- package/.scannerwork/scanner-report/changesets-7.pb +0 -1
- package/.scannerwork/scanner-report/changesets-8.pb +0 -1
- package/.scannerwork/scanner-report/changesets-9.pb +0 -1
- package/.scannerwork/scanner-report/component-10.pb +0 -2
- package/.scannerwork/scanner-report/component-2.pb +0 -1
- package/.scannerwork/scanner-report/component-34.pb +0 -1
- package/.scannerwork/scanner-report/component-35.pb +0 -1
- package/.scannerwork/scanner-report/component-36.pb +0 -1
- package/.scannerwork/scanner-report/component-37.pb +0 -1
- package/.scannerwork/scanner-report/component-38.pb +0 -1
- package/.scannerwork/scanner-report/component-39.pb +0 -1
- package/.scannerwork/scanner-report/component-4.pb +0 -1
- package/.scannerwork/scanner-report/component-40.pb +0 -1
- package/.scannerwork/scanner-report/component-5.pb +0 -1
- package/.scannerwork/scanner-report/component-6.pb +0 -1
- package/.scannerwork/scanner-report/component-61.pb +0 -1
- package/.scannerwork/scanner-report/component-64.pb +0 -1
- package/.scannerwork/scanner-report/component-68.pb +0 -1
- package/.scannerwork/scanner-report/component-7.pb +0 -1
- package/.scannerwork/scanner-report/component-8.pb +0 -1
- package/.scannerwork/scanner-report/coverages-10.pb +0 -0
- package/.scannerwork/scanner-report/coverages-36.pb +0 -0
- package/.scannerwork/scanner-report/coverages-37.pb +0 -0
- package/.scannerwork/scanner-report/coverages-39.pb +0 -0
- package/.scannerwork/scanner-report/coverages-5.pb +0 -0
- package/.scannerwork/scanner-report/coverages-6.pb +0 -0
- package/.scannerwork/scanner-report/coverages-8.pb +0 -0
- package/.scannerwork/scanner-report/coverages-9.pb +0 -0
- package/.scannerwork/scanner-report/duplications-9.pb +0 -2
- package/.scannerwork/scanner-report/measures-10.pb +0 -0
- package/.scannerwork/scanner-report/measures-36.pb +0 -15
- package/.scannerwork/scanner-report/measures-37.pb +0 -0
- package/.scannerwork/scanner-report/measures-39.pb +0 -0
- package/.scannerwork/scanner-report/measures-4.pb +0 -0
- package/.scannerwork/scanner-report/measures-5.pb +0 -0
- package/.scannerwork/scanner-report/measures-6.pb +0 -0
- package/.scannerwork/scanner-report/measures-8.pb +0 -0
- package/.scannerwork/scanner-report/source-10.txt +0 -37
- package/.scannerwork/scanner-report/source-36.txt +0 -151
- package/.scannerwork/scanner-report/source-37.txt +0 -75
- package/.scannerwork/scanner-report/source-39.txt +0 -129
- package/.scannerwork/scanner-report/source-4.txt +0 -187
- package/.scannerwork/scanner-report/source-6.txt +0 -329
- package/.scannerwork/scanner-report/source-8.txt +0 -62
- package/.scannerwork/scanner-report/symbols-10.pb +0 -9
- package/.scannerwork/scanner-report/symbols-36.pb +0 -93
- package/.scannerwork/scanner-report/symbols-37.pb +0 -39
- package/.scannerwork/scanner-report/symbols-39.pb +0 -33
- package/.scannerwork/scanner-report/symbols-5.pb +0 -8
- package/.scannerwork/scanner-report/symbols-6.pb +0 -353
- package/.scannerwork/scanner-report/symbols-8.pb +0 -24
- package/.scannerwork/scanner-report/symbols-9.pb +0 -203
- package/.scannerwork/scanner-report/syntax-highlightings-10.pb +0 -61
- package/.scannerwork/scanner-report/syntax-highlightings-36.pb +0 -237
- package/.scannerwork/scanner-report/syntax-highlightings-37.pb +0 -101
- package/.scannerwork/scanner-report/syntax-highlightings-39.pb +0 -129
- package/.scannerwork/scanner-report/syntax-highlightings-4.pb +0 -368
- package/.scannerwork/scanner-report/syntax-highlightings-5.pb +0 -49
- package/.scannerwork/scanner-report/syntax-highlightings-6.pb +0 -620
- package/.scannerwork/scanner-report/syntax-highlightings-8.pb +0 -97
- /package/.scannerwork/scanner-report/{coverages-40.pb → coverages-23.pb} +0 -0
- /package/.scannerwork/scanner-report/{coverages-2.pb → coverages-26.pb} +0 -0
- /package/.scannerwork/scanner-report/{coverages-34.pb → coverages-29.pb} +0 -0
- /package/.scannerwork/scanner-report/{coverages-7.pb → coverages-53.pb} +0 -0
- /package/.scannerwork/scanner-report/{coverages-4.pb → coverages-55.pb} +0 -0
- /package/.scannerwork/scanner-report/{coverages-35.pb → coverages-57.pb} +0 -0
- /package/.scannerwork/scanner-report/{coverages-61.pb → coverages-63.pb} +0 -0
- /package/.scannerwork/scanner-report/{coverages-64.pb → coverages-67.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-10.pb → duplications-23.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-2.pb → duplications-26.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-34.pb → duplications-27.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-35.pb → duplications-28.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-36.pb → duplications-29.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-37.pb → duplications-53.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-4.pb → duplications-55.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-39.pb → duplications-56.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-40.pb → duplications-57.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-46.pb → duplications-58.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-6.pb → duplications-59.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-61.pb → duplications-62.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-7.pb → duplications-63.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-64.pb → duplications-67.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-8.pb → duplications-69.pb} +0 -0
- /package/.scannerwork/scanner-report/{issues-6.pb → issues-41.pb} +0 -0
- /package/.scannerwork/scanner-report/{issues-14.pb → issues-45.pb} +0 -0
- /package/.scannerwork/scanner-report/{issues-12.pb → issues-51.pb} +0 -0
- /package/.scannerwork/scanner-report/{issues-35.pb → issues-57.pb} +0 -0
- /package/.scannerwork/scanner-report/{measures-40.pb → measures-23.pb} +0 -0
- /package/.scannerwork/scanner-report/{measures-38.pb → measures-25.pb} +0 -0
- /package/.scannerwork/scanner-report/{measures-2.pb → measures-26.pb} +0 -0
- /package/.scannerwork/scanner-report/{measures-34.pb → measures-29.pb} +0 -0
- /package/.scannerwork/scanner-report/{measures-7.pb → measures-53.pb} +0 -0
- /package/.scannerwork/scanner-report/{measures-35.pb → measures-57.pb} +0 -0
- /package/.scannerwork/scanner-report/{measures-61.pb → measures-63.pb} +0 -0
- /package/.scannerwork/scanner-report/{measures-64.pb → measures-67.pb} +0 -0
- /package/.scannerwork/scanner-report/{measures-68.pb → measures-70.pb} +0 -0
- /package/.scannerwork/scanner-report/{source-40.txt → source-23.txt} +0 -0
- /package/.scannerwork/scanner-report/{source-2.txt → source-26.txt} +0 -0
- /package/.scannerwork/scanner-report/{source-34.txt → source-29.txt} +0 -0
- /package/.scannerwork/scanner-report/{source-7.txt → source-53.txt} +0 -0
- /package/.scannerwork/scanner-report/{source-35.txt → source-57.txt} +0 -0
- /package/.scannerwork/scanner-report/{source-61.txt → source-63.txt} +0 -0
- /package/.scannerwork/scanner-report/{source-64.txt → source-67.txt} +0 -0
- /package/.scannerwork/scanner-report/{symbols-40.pb → symbols-23.pb} +0 -0
- /package/.scannerwork/scanner-report/{symbols-2.pb → symbols-26.pb} +0 -0
- /package/.scannerwork/scanner-report/{symbols-34.pb → symbols-29.pb} +0 -0
- /package/.scannerwork/scanner-report/{symbols-7.pb → symbols-53.pb} +0 -0
- /package/.scannerwork/scanner-report/{symbols-4.pb → symbols-55.pb} +0 -0
- /package/.scannerwork/scanner-report/{symbols-35.pb → symbols-57.pb} +0 -0
- /package/.scannerwork/scanner-report/{symbols-61.pb → symbols-63.pb} +0 -0
- /package/.scannerwork/scanner-report/{symbols-64.pb → symbols-67.pb} +0 -0
- /package/.scannerwork/scanner-report/{syntax-highlightings-40.pb → syntax-highlightings-23.pb} +0 -0
- /package/.scannerwork/scanner-report/{syntax-highlightings-2.pb → syntax-highlightings-26.pb} +0 -0
- /package/.scannerwork/scanner-report/{syntax-highlightings-34.pb → syntax-highlightings-29.pb} +0 -0
- /package/.scannerwork/scanner-report/{syntax-highlightings-7.pb → syntax-highlightings-53.pb} +0 -0
- /package/.scannerwork/scanner-report/{syntax-highlightings-35.pb → syntax-highlightings-57.pb} +0 -0
- /package/.scannerwork/scanner-report/{syntax-highlightings-61.pb → syntax-highlightings-63.pb} +0 -0
- /package/.scannerwork/scanner-report/{syntax-highlightings-64.pb → syntax-highlightings-67.pb} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Copyright © 2017 IBM Corp. All rights reserved.
|
|
1
|
+
// Copyright © 2017, 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.
|
|
@@ -11,82 +11,124 @@
|
|
|
11
11
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
// See the License for the specific language governing permissions and
|
|
13
13
|
// limitations under the License.
|
|
14
|
+
|
|
15
|
+
/* global describe it beforeEach */
|
|
14
16
|
'use strict';
|
|
15
17
|
|
|
18
|
+
const assert = require('assert');
|
|
16
19
|
const fs = require('fs');
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
20
|
+
const nock = require('nock');
|
|
21
|
+
const request = require('../includes/request.js');
|
|
22
|
+
const writer = require('../includes/writer.js');
|
|
23
|
+
const noopEmitter = new (require('events')).EventEmitter();
|
|
24
|
+
const liner = require('../includes/liner.js');
|
|
25
|
+
const { once } = require('node:events');
|
|
26
|
+
const { pipeline } = require('node:stream/promises');
|
|
27
|
+
const longTestTimeout = 3000;
|
|
28
|
+
|
|
29
|
+
describe('#unit Check database restore writer', function() {
|
|
30
|
+
const dbUrl = 'http://localhost:5984/animaldb';
|
|
31
|
+
const db = request.client(dbUrl, { parallelism: 1 });
|
|
32
|
+
|
|
33
|
+
beforeEach('Reset nocks', function() {
|
|
34
|
+
nock.cleanAll();
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('should complete successfully', async function() {
|
|
38
|
+
nock(dbUrl)
|
|
39
|
+
.post('/_bulk_docs')
|
|
40
|
+
.reply(200, []); // success
|
|
41
|
+
|
|
42
|
+
const w = writer(db, 500, 1, noopEmitter);
|
|
43
|
+
return Promise.all([pipeline(fs.createReadStream('./test/fixtures/animaldb_expected.json'), liner(), w),
|
|
44
|
+
once(w, 'finished').then((data) => {
|
|
45
|
+
assert.strictEqual(data[0].total, 15);
|
|
46
|
+
assert.ok(nock.isDone());
|
|
47
|
+
})]);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('should terminate on a fatal error', async function() {
|
|
51
|
+
nock(dbUrl)
|
|
52
|
+
.post('/_bulk_docs')
|
|
53
|
+
.reply(401, { error: 'Unauthorized' }); // fatal error
|
|
54
|
+
|
|
55
|
+
const w = writer(db, 500, 1, noopEmitter);
|
|
56
|
+
return assert.rejects(
|
|
57
|
+
pipeline(fs.createReadStream('./test/fixtures/animaldb_expected.json'), liner(), w),
|
|
58
|
+
(err) => {
|
|
59
|
+
assert.strictEqual(err.name, 'Unauthorized');
|
|
60
|
+
assert.strictEqual(err.message, 'Access is denied due to invalid credentials.');
|
|
61
|
+
assert.ok(nock.isDone());
|
|
62
|
+
return true;
|
|
37
63
|
}
|
|
64
|
+
);
|
|
65
|
+
});
|
|
38
66
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
67
|
+
it('should retry on transient errors', async function() {
|
|
68
|
+
nock(dbUrl)
|
|
69
|
+
.post('/_bulk_docs')
|
|
70
|
+
.reply(429, { error: 'Too Many Requests' }) // transient error
|
|
71
|
+
.post('/_bulk_docs')
|
|
72
|
+
.reply(500, { error: 'Internal Server Error' }) // transient error
|
|
73
|
+
.post('/_bulk_docs')
|
|
74
|
+
.reply(200, { ok: true }); // third time lucky success
|
|
75
|
+
|
|
76
|
+
const w = writer(db, 500, 1, noopEmitter);
|
|
77
|
+
return Promise.all([pipeline(fs.createReadStream('./test/fixtures/animaldb_expected.json'), liner(), w),
|
|
78
|
+
once(w, 'finished').then((data) => {
|
|
79
|
+
assert.strictEqual(data[0].total, 15);
|
|
80
|
+
assert.ok(nock.isDone());
|
|
81
|
+
})]);
|
|
82
|
+
}).timeout(longTestTimeout);
|
|
83
|
+
|
|
84
|
+
it('should fail after 3 transient errors', async function() {
|
|
85
|
+
nock(dbUrl)
|
|
86
|
+
.post('/_bulk_docs')
|
|
87
|
+
.reply(429, { error: 'Too Many Requests' }) // transient error
|
|
88
|
+
.post('/_bulk_docs')
|
|
89
|
+
.reply(500, { error: 'Internal Server Error' }) // transient error
|
|
90
|
+
.post('/_bulk_docs')
|
|
91
|
+
.reply(503, { error: 'Service Unavailable' }); // Final transient error
|
|
92
|
+
|
|
93
|
+
const w = writer(db, 500, 1, noopEmitter);
|
|
94
|
+
return assert.rejects(
|
|
95
|
+
pipeline(fs.createReadStream('./test/fixtures/animaldb_expected.json'), liner(), w),
|
|
96
|
+
(err) => {
|
|
97
|
+
assert.strictEqual(err.name, 'HTTPFatalError');
|
|
98
|
+
assert.strictEqual(err.message, `503 : post ${dbUrl}/_bulk_docs - Error: Service Unavailable`);
|
|
99
|
+
assert.ok(nock.isDone());
|
|
100
|
+
return true;
|
|
43
101
|
}
|
|
102
|
+
);
|
|
103
|
+
}).timeout(longTestTimeout);
|
|
104
|
+
|
|
105
|
+
it('should restore shallow backups without rev info successfully', async function() {
|
|
106
|
+
nock(dbUrl)
|
|
107
|
+
.post('/_bulk_docs')
|
|
108
|
+
.reply(200, [{ ok: true, id: 'foo', rev: '1-abc' }]); // success
|
|
109
|
+
|
|
110
|
+
const w = writer(db, 500, 1, noopEmitter);
|
|
111
|
+
return Promise.all([pipeline(fs.createReadStream('./test/fixtures/animaldb_old_shallow.json'), liner(), w),
|
|
112
|
+
once(w, 'finished').then((data) => {
|
|
113
|
+
assert.strictEqual(data[0].total, 11);
|
|
114
|
+
assert.ok(nock.isDone());
|
|
115
|
+
})]);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it('should get a batch error for non-empty array response with new_edits false', async function() {
|
|
119
|
+
nock(dbUrl)
|
|
120
|
+
.post('/_bulk_docs')
|
|
121
|
+
.reply(200, [{ id: 'foo', error: 'foo', reason: 'bar' }]);
|
|
44
122
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
123
|
+
const w = writer(db, 500, 1, noopEmitter);
|
|
124
|
+
return assert.rejects(
|
|
125
|
+
pipeline(fs.createReadStream('./test/fixtures/animaldb_expected.json'), liner(), w),
|
|
126
|
+
(err) => {
|
|
127
|
+
assert.strictEqual(err.name, 'Error');
|
|
128
|
+
assert.strictEqual(err.message, 'Error writing batch with new_edits:false and 1 items');
|
|
129
|
+
assert.ok(nock.isDone());
|
|
130
|
+
return true;
|
|
49
131
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
};
|
|
54
|
-
return change;
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Generate a list of remaining batches from a download file.
|
|
59
|
-
*
|
|
60
|
-
* @param {string} log - log file name
|
|
61
|
-
* @param {function} callback - callback with err, {changesComplete: N, batches: N}.
|
|
62
|
-
* changesComplete signifies whether the log file appeared to
|
|
63
|
-
* have completed reading the changes feed (contains :changes_complete).
|
|
64
|
-
* batches are remaining batch IDs for download.
|
|
65
|
-
*/
|
|
66
|
-
module.exports = function(log, callback) {
|
|
67
|
-
// our sense of state
|
|
68
|
-
const state = {
|
|
69
|
-
|
|
70
|
-
};
|
|
71
|
-
let changesComplete = false;
|
|
72
|
-
|
|
73
|
-
// called with each line from the log file
|
|
74
|
-
const onCommand = function(obj) {
|
|
75
|
-
if (obj.command === 't') {
|
|
76
|
-
state[obj.batch] = true;
|
|
77
|
-
} else if (obj.command === 'd') {
|
|
78
|
-
delete state[obj.batch];
|
|
79
|
-
} else if (obj.command === 'changes_complete') {
|
|
80
|
-
changesComplete = true;
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
// stream through the previous log file
|
|
85
|
-
fs.createReadStream(log)
|
|
86
|
-
.pipe(liner())
|
|
87
|
-
.pipe(onLine(onCommand, false))
|
|
88
|
-
.on('finish', function() {
|
|
89
|
-
const obj = { changesComplete: changesComplete, batches: state };
|
|
90
|
-
callback(null, obj);
|
|
91
|
-
});
|
|
92
|
-
};
|
|
132
|
+
);
|
|
133
|
+
});
|
|
134
|
+
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Copyright © 2017 IBM Corp. All rights reserved.
|
|
1
|
+
// Copyright © 2017, 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.
|
|
@@ -11,65 +11,203 @@
|
|
|
11
11
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
// See the License for the specific language governing permissions and
|
|
13
13
|
// limitations under the License.
|
|
14
|
+
|
|
15
|
+
/* global describe it beforeEach */
|
|
14
16
|
'use strict';
|
|
15
17
|
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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();
|
|
30
|
+
});
|
|
31
|
+
|
|
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
|
+
});
|
|
43
|
+
});
|
|
44
|
+
|
|
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
|
+
});
|
|
74
211
|
});
|
|
75
|
-
};
|
|
212
|
+
});
|
|
213
|
+
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Copyright ©
|
|
1
|
+
// Copyright © 2023 IBM Corp. All rights reserved.
|
|
2
2
|
//
|
|
3
3
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
4
|
// you may not use this file except in compliance with the License.
|
|
@@ -11,21 +11,141 @@
|
|
|
11
11
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
// See the License for the specific language governing permissions and
|
|
13
13
|
// limitations under the License.
|
|
14
|
+
|
|
15
|
+
/* global */
|
|
14
16
|
'use strict';
|
|
15
17
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
const { fork, spawn } = require('node:child_process');
|
|
19
|
+
const { once } = require('node:events');
|
|
20
|
+
const { Duplex } = require('node:stream');
|
|
21
|
+
const debug = require('debug');
|
|
22
|
+
const logProcess = debug('couchbackup:test:process');
|
|
23
|
+
|
|
24
|
+
class TestProcess {
|
|
25
|
+
constructor(cmd, args, mode) {
|
|
26
|
+
this.cmd = cmd;
|
|
27
|
+
// Child process stdio [stdin, stdout, stderr, ...extra channels]
|
|
28
|
+
const childProcessOptions = { stdio: [] };
|
|
29
|
+
switch (mode) {
|
|
30
|
+
case 'readable':
|
|
31
|
+
// Readable only, no writing to stdin so ignore it
|
|
32
|
+
childProcessOptions.stdio = ['ignore', 'pipe', 'inherit'];
|
|
33
|
+
break;
|
|
34
|
+
case 'writable':
|
|
35
|
+
// Writable only, no reading from stdout so ignore it
|
|
36
|
+
childProcessOptions.stdio = ['pipe', 'ignore', 'inherit'];
|
|
37
|
+
break;
|
|
38
|
+
default:
|
|
39
|
+
// Default Duplex mode pipe both stdin and stdout
|
|
40
|
+
childProcessOptions.stdio = ['pipe', 'pipe', 'inherit'];
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
if (cmd.endsWith('.js')) {
|
|
44
|
+
// Add Node fork ipc channel
|
|
45
|
+
childProcessOptions.stdio.push('ipc');
|
|
46
|
+
logProcess(`Forking Node process for ${cmd} with stdio:[${childProcessOptions.stdio}]`);
|
|
47
|
+
this.childProcess = fork(cmd, args, childProcessOptions);
|
|
48
|
+
} else {
|
|
49
|
+
logProcess(`Spawning process for ${cmd} with stdio:[${childProcessOptions.stdio}]`);
|
|
50
|
+
this.childProcess = spawn(cmd, args, childProcessOptions);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
this.childProcessPromise = once(this.childProcess, 'close').then(() => {
|
|
54
|
+
const code = this.childProcess.exitCode;
|
|
55
|
+
const signal = this.childProcess.signalCode;
|
|
56
|
+
logProcess(`Test process ${cmd} closed with code ${code} and signal ${signal}`);
|
|
57
|
+
if (code === 0) {
|
|
58
|
+
logProcess(`Resolving process promise for ${cmd}`);
|
|
59
|
+
return Promise.resolve(code);
|
|
60
|
+
} else {
|
|
61
|
+
const e = new Error(`Test child process ${cmd} exited with code ${code} and ${signal}. This may be normal for error case testing.`);
|
|
62
|
+
e.code = code;
|
|
63
|
+
e.signal = signal;
|
|
64
|
+
logProcess(`Will reject process promise for ${cmd} with ${e}`);
|
|
65
|
+
return Promise.reject(e);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
switch (mode) {
|
|
70
|
+
case 'readable':
|
|
71
|
+
this.duplexFrom = this.childProcess.stdout;
|
|
72
|
+
break;
|
|
73
|
+
case 'writable':
|
|
74
|
+
this.duplexFrom = this.childProcess.stdin;
|
|
75
|
+
break;
|
|
76
|
+
default:
|
|
77
|
+
// Default is duplex
|
|
78
|
+
this.duplexFrom = { writable: this.childProcess.stdin, readable: this.childProcess.stdout };
|
|
79
|
+
}
|
|
19
80
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
.on('error', function(err) {
|
|
24
|
-
// Forward the error to the writer event emitter where we already have
|
|
25
|
-
// listeners on for handling errors
|
|
26
|
-
writer.emit('error', err);
|
|
27
|
-
})
|
|
28
|
-
.pipe(writer); // transform the data
|
|
81
|
+
this.stream = Duplex.from(this.duplexFrom);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
29
84
|
|
|
30
|
-
|
|
85
|
+
module.exports = {
|
|
86
|
+
TestProcess,
|
|
87
|
+
cliBackup: function(databaseName, params = {}) {
|
|
88
|
+
const args = ['--db', databaseName];
|
|
89
|
+
if (params.opts) {
|
|
90
|
+
if (params.opts.mode) {
|
|
91
|
+
args.push('--mode');
|
|
92
|
+
args.push(params.opts.mode);
|
|
93
|
+
}
|
|
94
|
+
if (params.opts.output) {
|
|
95
|
+
args.push('--output');
|
|
96
|
+
args.push(params.opts.output);
|
|
97
|
+
}
|
|
98
|
+
if (params.opts.log) {
|
|
99
|
+
args.push('--log');
|
|
100
|
+
args.push(params.opts.log);
|
|
101
|
+
}
|
|
102
|
+
if (params.opts.resume) {
|
|
103
|
+
args.push('--resume');
|
|
104
|
+
args.push(params.opts.resume);
|
|
105
|
+
}
|
|
106
|
+
if (params.opts.bufferSize) {
|
|
107
|
+
args.push('--buffer-size');
|
|
108
|
+
args.push(params.opts.bufferSize);
|
|
109
|
+
}
|
|
110
|
+
if (params.opts.iamApiKey) {
|
|
111
|
+
args.push('--iam-api-key');
|
|
112
|
+
args.push(params.opts.iamApiKey);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return new TestProcess('./bin/couchbackup.bin.js', args, 'readable');
|
|
116
|
+
},
|
|
117
|
+
cliRestore: function(databaseName, params) {
|
|
118
|
+
const args = ['--db', databaseName];
|
|
119
|
+
if (params.opts) {
|
|
120
|
+
if (params.opts.bufferSize) {
|
|
121
|
+
args.push('--buffer-size');
|
|
122
|
+
args.push(params.opts.bufferSize);
|
|
123
|
+
}
|
|
124
|
+
if (params.opts.parallelism) {
|
|
125
|
+
args.push('--parallelism');
|
|
126
|
+
args.push(params.opts.parallelism);
|
|
127
|
+
}
|
|
128
|
+
if (params.opts.requestTimeout) {
|
|
129
|
+
args.push('--request-timeout');
|
|
130
|
+
args.push(params.opts.requestTimeout);
|
|
131
|
+
}
|
|
132
|
+
if (params.opts.iamApiKey) {
|
|
133
|
+
args.push('--iam-api-key');
|
|
134
|
+
args.push(params.opts.iamApiKey);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return new TestProcess('./bin/couchrestore.bin.js', args, 'writable');
|
|
138
|
+
},
|
|
139
|
+
cliGzip: function() {
|
|
140
|
+
return new TestProcess('gzip', []);
|
|
141
|
+
},
|
|
142
|
+
cliGunzip: function() {
|
|
143
|
+
return new TestProcess('gunzip', []);
|
|
144
|
+
},
|
|
145
|
+
cliEncrypt: function() {
|
|
146
|
+
return new TestProcess('openssl', ['aes-128-cbc', '-pass', 'pass:12345']);
|
|
147
|
+
},
|
|
148
|
+
cliDecrypt: function() {
|
|
149
|
+
return new TestProcess('openssl', ['aes-128-cbc', '-d', '-pass', 'pass:12345']);
|
|
150
|
+
}
|
|
31
151
|
};
|