@cloudant/couchbackup 2.9.14-SNAPSHOT.159 → 2.9.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.scannerwork/report-task.txt +2 -2
- package/.scannerwork/scanner-report/analysis-warnings.pb +2 -2
- package/.scannerwork/scanner-report/changesets-18.pb +1 -0
- package/.scannerwork/scanner-report/changesets-21.pb +1 -0
- package/.scannerwork/scanner-report/changesets-23.pb +1 -0
- package/.scannerwork/scanner-report/changesets-24.pb +1 -0
- package/.scannerwork/scanner-report/changesets-25.pb +1 -0
- package/.scannerwork/scanner-report/changesets-49.pb +1 -0
- package/.scannerwork/scanner-report/changesets-50.pb +1 -0
- package/.scannerwork/scanner-report/changesets-51.pb +1 -0
- package/.scannerwork/scanner-report/changesets-52.pb +1 -0
- package/.scannerwork/scanner-report/changesets-53.pb +1 -0
- package/.scannerwork/scanner-report/changesets-54.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/component-1.pb +3 -2
- package/.scannerwork/scanner-report/component-10.pb +1 -1
- 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-2.pb +1 -0
- package/.scannerwork/scanner-report/component-20.pb +1 -1
- package/.scannerwork/scanner-report/component-21.pb +1 -0
- 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-37.pb +1 -1
- package/.scannerwork/scanner-report/component-38.pb +1 -1
- package/.scannerwork/scanner-report/component-39.pb +1 -1
- package/.scannerwork/scanner-report/component-40.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-49.pb +1 -0
- package/.scannerwork/scanner-report/component-5.pb +1 -1
- package/.scannerwork/scanner-report/component-50.pb +1 -0
- package/.scannerwork/scanner-report/component-51.pb +1 -0
- package/.scannerwork/scanner-report/component-52.pb +1 -0
- package/.scannerwork/scanner-report/component-53.pb +1 -0
- package/.scannerwork/scanner-report/component-54.pb +1 -0
- package/.scannerwork/scanner-report/component-55.pb +1 -0
- package/.scannerwork/scanner-report/component-56.pb +1 -0
- package/.scannerwork/scanner-report/component-57.pb +1 -1
- package/.scannerwork/scanner-report/component-58.pb +1 -1
- package/.scannerwork/scanner-report/component-59.pb +1 -1
- package/.scannerwork/scanner-report/component-6.pb +1 -1
- package/.scannerwork/scanner-report/component-60.pb +1 -1
- package/.scannerwork/scanner-report/component-61.pb +1 -1
- package/.scannerwork/scanner-report/component-62.pb +1 -1
- package/.scannerwork/scanner-report/component-67.pb +1 -1
- package/.scannerwork/scanner-report/component-7.pb +1 -1
- package/.scannerwork/scanner-report/component-8.pb +1 -1
- package/.scannerwork/scanner-report/component-9.pb +1 -1
- package/.scannerwork/scanner-report/coverages-10.pb +0 -0
- 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-23.pb +0 -0
- package/.scannerwork/scanner-report/coverages-25.pb +0 -0
- package/.scannerwork/scanner-report/coverages-37.pb +0 -0
- package/.scannerwork/scanner-report/coverages-38.pb +0 -0
- package/.scannerwork/scanner-report/coverages-39.pb +0 -0
- package/.scannerwork/scanner-report/coverages-40.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-49.pb +0 -0
- package/.scannerwork/scanner-report/coverages-5.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-53.pb +0 -0
- package/.scannerwork/scanner-report/coverages-54.pb +0 -0
- package/.scannerwork/scanner-report/coverages-55.pb +0 -0
- package/.scannerwork/scanner-report/coverages-56.pb +0 -0
- package/.scannerwork/scanner-report/coverages-57.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-6.pb +0 -0
- package/.scannerwork/scanner-report/coverages-60.pb +0 -0
- package/.scannerwork/scanner-report/coverages-61.pb +0 -0
- package/.scannerwork/scanner-report/coverages-62.pb +0 -0
- package/.scannerwork/scanner-report/coverages-7.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-14.pb +0 -2
- package/.scannerwork/scanner-report/duplications-20.pb +0 -2
- package/.scannerwork/scanner-report/duplications-22.pb +0 -2
- package/.scannerwork/scanner-report/duplications-23.pb +3 -0
- package/.scannerwork/scanner-report/duplications-37.pb +0 -2
- package/.scannerwork/scanner-report/duplications-42.pb +2 -0
- package/.scannerwork/scanner-report/duplications-43.pb +2 -0
- package/.scannerwork/scanner-report/duplications-44.pb +2 -0
- package/.scannerwork/scanner-report/duplications-51.pb +2 -0
- package/.scannerwork/scanner-report/duplications-53.pb +2 -0
- package/.scannerwork/scanner-report/duplications-58.pb +0 -3
- package/.scannerwork/scanner-report/duplications-7.pb +0 -2
- package/.scannerwork/scanner-report/duplications-9.pb +2 -0
- package/.scannerwork/scanner-report/measures-10.pb +0 -0
- 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-23.pb +0 -0
- package/.scannerwork/scanner-report/measures-25.pb +0 -0
- package/.scannerwork/scanner-report/measures-37.pb +0 -0
- package/.scannerwork/scanner-report/measures-38.pb +0 -0
- package/.scannerwork/scanner-report/measures-39.pb +0 -0
- package/.scannerwork/scanner-report/measures-40.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-49.pb +0 -0
- package/.scannerwork/scanner-report/measures-5.pb +0 -0
- package/.scannerwork/scanner-report/measures-50.pb +15 -0
- package/.scannerwork/scanner-report/measures-51.pb +0 -0
- package/.scannerwork/scanner-report/measures-53.pb +0 -0
- package/.scannerwork/scanner-report/measures-54.pb +16 -0
- package/.scannerwork/scanner-report/measures-55.pb +0 -0
- package/.scannerwork/scanner-report/measures-56.pb +0 -0
- package/.scannerwork/scanner-report/measures-57.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-6.pb +0 -0
- package/.scannerwork/scanner-report/measures-60.pb +0 -0
- package/.scannerwork/scanner-report/measures-61.pb +0 -0
- package/.scannerwork/scanner-report/measures-62.pb +0 -0
- package/.scannerwork/scanner-report/measures-67.pb +0 -0
- package/.scannerwork/scanner-report/measures-7.pb +0 -0
- package/.scannerwork/scanner-report/measures-8.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-10.txt +69 -87
- package/.scannerwork/scanner-report/source-11.txt +119 -249
- package/.scannerwork/scanner-report/source-12.txt +21 -95
- package/.scannerwork/scanner-report/source-13.txt +413 -142
- package/.scannerwork/scanner-report/source-14.txt +84 -53
- package/.scannerwork/scanner-report/source-15.txt +80 -92
- package/.scannerwork/scanner-report/source-16.txt +26 -16
- package/.scannerwork/scanner-report/source-17.txt +120 -115
- package/.scannerwork/scanner-report/source-18.txt +37 -424
- package/.scannerwork/scanner-report/source-19.txt +10 -95
- package/.scannerwork/scanner-report/{source-32.txt → source-2.txt} +49 -49
- package/.scannerwork/scanner-report/source-20.txt +13 -156
- package/.scannerwork/scanner-report/source-21.txt +40 -0
- package/.scannerwork/scanner-report/source-22.txt +40 -168
- package/.scannerwork/scanner-report/source-23.txt +213 -0
- package/.scannerwork/scanner-report/source-25.txt +42 -0
- package/.scannerwork/scanner-report/source-37.txt +47 -155
- package/.scannerwork/scanner-report/source-38.txt +41 -77
- package/.scannerwork/scanner-report/source-39.txt +266 -19
- package/.scannerwork/scanner-report/source-40.txt +161 -10
- package/.scannerwork/scanner-report/source-41.txt +97 -416
- package/.scannerwork/scanner-report/source-42.txt +158 -105
- package/.scannerwork/scanner-report/source-43.txt +148 -262
- package/.scannerwork/scanner-report/source-44.txt +168 -40
- package/.scannerwork/scanner-report/source-49.txt +59 -0
- package/.scannerwork/scanner-report/source-5.txt +390 -22
- package/.scannerwork/scanner-report/source-50.txt +113 -0
- package/.scannerwork/scanner-report/source-51.txt +75 -0
- package/.scannerwork/scanner-report/source-53.txt +92 -0
- package/.scannerwork/scanner-report/source-54.txt +178 -0
- package/.scannerwork/scanner-report/source-55.txt +129 -0
- package/.scannerwork/scanner-report/source-56.txt +46 -0
- package/.scannerwork/scanner-report/source-57.txt +251 -161
- package/.scannerwork/scanner-report/source-58.txt +95 -197
- package/.scannerwork/scanner-report/source-59.txt +25 -21
- package/.scannerwork/scanner-report/source-6.txt +41 -61
- package/.scannerwork/scanner-report/source-60.txt +104 -27
- package/.scannerwork/scanner-report/source-61.txt +15 -49
- package/.scannerwork/scanner-report/source-62.txt +65 -85
- package/.scannerwork/scanner-report/source-67.txt +424 -75
- package/.scannerwork/scanner-report/source-7.txt +57 -68
- package/.scannerwork/scanner-report/source-8.txt +98 -43
- package/.scannerwork/scanner-report/source-9.txt +167 -21
- package/.scannerwork/scanner-report/symbols-10.pb +69 -30
- package/.scannerwork/scanner-report/symbols-11.pb +91 -352
- package/.scannerwork/scanner-report/symbols-12.pb +13 -59
- package/.scannerwork/scanner-report/symbols-13.pb +785 -139
- package/.scannerwork/scanner-report/symbols-14.pb +59 -42
- package/.scannerwork/scanner-report/symbols-15.pb +57 -45
- package/.scannerwork/scanner-report/symbols-16.pb +31 -14
- package/.scannerwork/scanner-report/symbols-17.pb +71 -33
- package/.scannerwork/scanner-report/symbols-18.pb +9 -0
- package/.scannerwork/scanner-report/symbols-19.pb +8 -28
- package/.scannerwork/scanner-report/symbols-20.pb +9 -153
- package/.scannerwork/scanner-report/symbols-21.pb +23 -0
- package/.scannerwork/scanner-report/symbols-22.pb +24 -180
- package/.scannerwork/scanner-report/symbols-23.pb +264 -0
- package/.scannerwork/scanner-report/symbols-25.pb +19 -0
- package/.scannerwork/scanner-report/symbols-37.pb +38 -202
- package/.scannerwork/scanner-report/symbols-38.pb +32 -57
- package/.scannerwork/scanner-report/symbols-39.pb +421 -19
- package/.scannerwork/scanner-report/symbols-40.pb +207 -21
- package/.scannerwork/scanner-report/symbols-41.pb +85 -789
- package/.scannerwork/scanner-report/symbols-42.pb +203 -86
- package/.scannerwork/scanner-report/symbols-43.pb +152 -420
- package/.scannerwork/scanner-report/symbols-44.pb +180 -24
- package/.scannerwork/scanner-report/symbols-49.pb +19 -0
- package/.scannerwork/scanner-report/symbols-5.pb +604 -20
- package/.scannerwork/scanner-report/symbols-50.pb +46 -0
- package/.scannerwork/scanner-report/symbols-51.pb +42 -0
- package/.scannerwork/scanner-report/symbols-53.pb +44 -0
- package/.scannerwork/scanner-report/symbols-54.pb +144 -0
- package/.scannerwork/scanner-report/symbols-55.pb +33 -0
- package/.scannerwork/scanner-report/symbols-56.pb +20 -0
- package/.scannerwork/scanner-report/symbols-57.pb +336 -191
- package/.scannerwork/scanner-report/symbols-58.pb +59 -264
- package/.scannerwork/scanner-report/symbols-59.pb +18 -9
- package/.scannerwork/scanner-report/symbols-6.pb +21 -46
- package/.scannerwork/scanner-report/symbols-60.pb +30 -31
- package/.scannerwork/scanner-report/symbols-61.pb +13 -32
- package/.scannerwork/scanner-report/symbols-62.pb +45 -68
- package/.scannerwork/scanner-report/symbols-7.pb +32 -44
- package/.scannerwork/scanner-report/symbols-8.pb +28 -19
- package/.scannerwork/scanner-report/symbols-9.pb +226 -17
- package/.scannerwork/scanner-report/syntax-highlightings-10.pb +76 -82
- package/.scannerwork/scanner-report/syntax-highlightings-11.pb +157 -205
- package/.scannerwork/scanner-report/syntax-highlightings-12.pb +27 -98
- package/.scannerwork/scanner-report/syntax-highlightings-13.pb +535 -153
- package/.scannerwork/scanner-report/syntax-highlightings-14.pb +144 -44
- package/.scannerwork/scanner-report/syntax-highlightings-15.pb +122 -94
- package/.scannerwork/scanner-report/syntax-highlightings-16.pb +39 -15
- package/.scannerwork/scanner-report/syntax-highlightings-17.pb +141 -89
- package/.scannerwork/scanner-report/syntax-highlightings-18.pb +50 -3330
- package/.scannerwork/scanner-report/syntax-highlightings-19.pb +16 -105
- package/.scannerwork/scanner-report/{syntax-highlightings-32.pb → syntax-highlightings-2.pb} +26 -26
- package/.scannerwork/scanner-report/syntax-highlightings-20.pb +23 -183
- package/.scannerwork/scanner-report/syntax-highlightings-21.pb +56 -0
- package/.scannerwork/scanner-report/syntax-highlightings-22.pb +66 -194
- package/.scannerwork/scanner-report/syntax-highlightings-23.pb +296 -0
- package/.scannerwork/scanner-report/syntax-highlightings-25.pb +66 -0
- package/.scannerwork/scanner-report/syntax-highlightings-37.pb +55 -234
- package/.scannerwork/scanner-report/syntax-highlightings-38.pb +68 -112
- package/.scannerwork/scanner-report/syntax-highlightings-39.pb +668 -26
- package/.scannerwork/scanner-report/syntax-highlightings-40.pb +250 -16
- package/.scannerwork/scanner-report/syntax-highlightings-41.pb +89 -589
- package/.scannerwork/scanner-report/syntax-highlightings-42.pb +243 -88
- package/.scannerwork/scanner-report/syntax-highlightings-43.pb +169 -663
- package/.scannerwork/scanner-report/syntax-highlightings-44.pb +194 -66
- package/.scannerwork/scanner-report/syntax-highlightings-49.pb +59 -0
- package/.scannerwork/scanner-report/syntax-highlightings-5.pb +610 -33
- package/.scannerwork/scanner-report/syntax-highlightings-50.pb +126 -0
- package/.scannerwork/scanner-report/syntax-highlightings-51.pb +78 -0
- package/.scannerwork/scanner-report/syntax-highlightings-53.pb +90 -0
- package/.scannerwork/scanner-report/syntax-highlightings-54.pb +243 -0
- package/.scannerwork/scanner-report/syntax-highlightings-55.pb +129 -0
- package/.scannerwork/scanner-report/syntax-highlightings-56.pb +64 -0
- package/.scannerwork/scanner-report/syntax-highlightings-57.pb +180 -185
- package/.scannerwork/scanner-report/syntax-highlightings-58.pb +93 -256
- package/.scannerwork/scanner-report/syntax-highlightings-59.pb +21 -32
- package/.scannerwork/scanner-report/syntax-highlightings-6.pb +59 -74
- package/.scannerwork/scanner-report/syntax-highlightings-60.pb +83 -39
- package/.scannerwork/scanner-report/syntax-highlightings-61.pb +15 -80
- package/.scannerwork/scanner-report/syntax-highlightings-62.pb +61 -73
- package/.scannerwork/scanner-report/syntax-highlightings-67.pb +3331 -90
- package/.scannerwork/scanner-report/syntax-highlightings-7.pb +75 -67
- package/.scannerwork/scanner-report/syntax-highlightings-8.pb +108 -29
- package/.scannerwork/scanner-report/syntax-highlightings-9.pb +339 -21
- package/CHANGES.md +1 -1
- package/package.json +1 -1
- package/test-18-results.xml +159 -159
- package/test-iam-18-results.xml +49 -49
- package/.scannerwork/scanner-report/changesets-29.pb +0 -1
- package/.scannerwork/scanner-report/changesets-30.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-4.pb +0 -1
- package/.scannerwork/scanner-report/changesets-45.pb +0 -1
- package/.scannerwork/scanner-report/changesets-63.pb +0 -1
- package/.scannerwork/scanner-report/changesets-64.pb +0 -1
- package/.scannerwork/scanner-report/changesets-65.pb +0 -1
- package/.scannerwork/scanner-report/changesets-66.pb +0 -1
- package/.scannerwork/scanner-report/changesets-67.pb +0 -1
- package/.scannerwork/scanner-report/changesets-68.pb +0 -1
- package/.scannerwork/scanner-report/component-29.pb +0 -1
- package/.scannerwork/scanner-report/component-30.pb +0 -1
- package/.scannerwork/scanner-report/component-32.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-4.pb +0 -1
- package/.scannerwork/scanner-report/component-45.pb +0 -1
- package/.scannerwork/scanner-report/component-63.pb +0 -1
- package/.scannerwork/scanner-report/component-64.pb +0 -1
- package/.scannerwork/scanner-report/component-65.pb +0 -1
- package/.scannerwork/scanner-report/component-66.pb +0 -1
- package/.scannerwork/scanner-report/component-68.pb +0 -1
- package/.scannerwork/scanner-report/coverages-29.pb +0 -0
- package/.scannerwork/scanner-report/coverages-30.pb +0 -0
- package/.scannerwork/scanner-report/coverages-34.pb +0 -0
- package/.scannerwork/scanner-report/coverages-35.pb +0 -0
- package/.scannerwork/scanner-report/coverages-36.pb +0 -0
- package/.scannerwork/scanner-report/coverages-45.pb +0 -0
- package/.scannerwork/scanner-report/coverages-63.pb +0 -0
- package/.scannerwork/scanner-report/coverages-64.pb +0 -0
- package/.scannerwork/scanner-report/coverages-65.pb +0 -0
- package/.scannerwork/scanner-report/coverages-67.pb +0 -0
- package/.scannerwork/scanner-report/coverages-68.pb +0 -0
- package/.scannerwork/scanner-report/duplications-64.pb +0 -2
- package/.scannerwork/scanner-report/duplications-66.pb +0 -0
- package/.scannerwork/scanner-report/duplications-67.pb +0 -0
- package/.scannerwork/scanner-report/measures-29.pb +0 -0
- package/.scannerwork/scanner-report/measures-30.pb +0 -0
- package/.scannerwork/scanner-report/measures-34.pb +0 -0
- package/.scannerwork/scanner-report/measures-35.pb +0 -0
- package/.scannerwork/scanner-report/measures-36.pb +0 -0
- package/.scannerwork/scanner-report/measures-45.pb +0 -0
- package/.scannerwork/scanner-report/measures-63.pb +0 -15
- package/.scannerwork/scanner-report/measures-64.pb +0 -0
- package/.scannerwork/scanner-report/measures-65.pb +0 -0
- package/.scannerwork/scanner-report/measures-68.pb +0 -0
- package/.scannerwork/scanner-report/source-29.txt +0 -81
- package/.scannerwork/scanner-report/source-30.txt +0 -60
- package/.scannerwork/scanner-report/source-34.txt +0 -414
- package/.scannerwork/scanner-report/source-35.txt +0 -134
- package/.scannerwork/scanner-report/source-36.txt +0 -106
- package/.scannerwork/scanner-report/source-45.txt +0 -37
- package/.scannerwork/scanner-report/source-63.txt +0 -151
- package/.scannerwork/scanner-report/source-64.txt +0 -187
- package/.scannerwork/scanner-report/source-65.txt +0 -32
- package/.scannerwork/scanner-report/source-68.txt +0 -29
- package/.scannerwork/scanner-report/symbols-29.pb +0 -32
- package/.scannerwork/scanner-report/symbols-30.pb +0 -21
- package/.scannerwork/scanner-report/symbols-34.pb +0 -604
- package/.scannerwork/scanner-report/symbols-35.pb +0 -71
- package/.scannerwork/scanner-report/symbols-36.pb +0 -59
- package/.scannerwork/scanner-report/symbols-45.pb +0 -13
- package/.scannerwork/scanner-report/symbols-63.pb +0 -93
- package/.scannerwork/scanner-report/symbols-64.pb +0 -227
- package/.scannerwork/scanner-report/symbols-65.pb +0 -9
- package/.scannerwork/scanner-report/symbols-67.pb +0 -39
- package/.scannerwork/scanner-report/symbols-68.pb +0 -8
- package/.scannerwork/scanner-report/syntax-highlightings-29.pb +0 -98
- package/.scannerwork/scanner-report/syntax-highlightings-30.pb +0 -80
- package/.scannerwork/scanner-report/syntax-highlightings-34.pb +0 -641
- package/.scannerwork/scanner-report/syntax-highlightings-35.pb +0 -181
- package/.scannerwork/scanner-report/syntax-highlightings-36.pb +0 -178
- package/.scannerwork/scanner-report/syntax-highlightings-45.pb +0 -62
- package/.scannerwork/scanner-report/syntax-highlightings-63.pb +0 -237
- package/.scannerwork/scanner-report/syntax-highlightings-64.pb +0 -368
- package/.scannerwork/scanner-report/syntax-highlightings-65.pb +0 -54
- package/.scannerwork/scanner-report/syntax-highlightings-68.pb +0 -49
- /package/.scannerwork/scanner-report/{coverages-66.pb → coverages-24.pb} +0 -0
- /package/.scannerwork/scanner-report/{coverages-4.pb → coverages-52.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-19.pb → duplications-18.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-29.pb → duplications-21.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-30.pb → duplications-24.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-34.pb → duplications-25.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-35.pb → duplications-49.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-36.pb → duplications-50.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-4.pb → duplications-52.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-45.pb → duplications-54.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-63.pb → duplications-55.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-65.pb → duplications-56.pb} +0 -0
- /package/.scannerwork/scanner-report/{issues-58.pb → issues-23.pb} +0 -0
- /package/.scannerwork/scanner-report/{issues-66.pb → issues-24.pb} +0 -0
- /package/.scannerwork/scanner-report/{issues-39.pb → issues-25.pb} +0 -0
- /package/.scannerwork/scanner-report/{issues-42.pb → issues-41.pb} +0 -0
- /package/.scannerwork/scanner-report/{measures-32.pb → measures-2.pb} +0 -0
- /package/.scannerwork/scanner-report/{measures-66.pb → measures-24.pb} +0 -0
- /package/.scannerwork/scanner-report/{measures-4.pb → measures-52.pb} +0 -0
- /package/.scannerwork/scanner-report/{source-66.txt → source-24.txt} +0 -0
- /package/.scannerwork/scanner-report/{source-4.txt → source-52.txt} +0 -0
- /package/.scannerwork/scanner-report/{symbols-66.pb → symbols-24.pb} +0 -0
- /package/.scannerwork/scanner-report/{symbols-4.pb → symbols-52.pb} +0 -0
- /package/.scannerwork/scanner-report/{syntax-highlightings-66.pb → syntax-highlightings-24.pb} +0 -0
- /package/.scannerwork/scanner-report/{syntax-highlightings-4.pb → syntax-highlightings-52.pb} +0 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
// Copyright © 2017, 2023 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 beforeEach */
|
|
16
|
+
'use strict';
|
|
17
|
+
|
|
18
|
+
const assert = require('assert');
|
|
19
|
+
const nock = require('nock');
|
|
20
|
+
const request = require('../includes/request.js');
|
|
21
|
+
const error = require('../includes/error.js');
|
|
22
|
+
|
|
23
|
+
const url = 'http://localhost:7777/testdb';
|
|
24
|
+
const db = request.client(url, { parallelism: 1 });
|
|
25
|
+
const timeoutDb = request.client(url, { parallelism: 1, requestTimeout: 500 });
|
|
26
|
+
const longTestTimeout = 3000;
|
|
27
|
+
|
|
28
|
+
beforeEach('Clean nock', function() {
|
|
29
|
+
nock.cleanAll();
|
|
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
|
+
});
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
});
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// Copyright © 2017, 2023 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 assert = require('assert');
|
|
19
|
+
const fs = require('fs');
|
|
20
|
+
const u = require('./citestutils.js');
|
|
21
|
+
|
|
22
|
+
describe('Write error tests', function() {
|
|
23
|
+
it('calls callback with error set when stream is not writeable', async function() {
|
|
24
|
+
u.setTimeout(this, 10);
|
|
25
|
+
const dirname = fs.mkdtempSync('test_backup_');
|
|
26
|
+
// make temp dir read only
|
|
27
|
+
fs.chmodSync(dirname, 0o444);
|
|
28
|
+
const filename = dirname + '/test.backup';
|
|
29
|
+
const backupStream = fs.createWriteStream(filename, { flags: 'w' });
|
|
30
|
+
const params = { useApi: true };
|
|
31
|
+
// try to do backup and check err was set in callback
|
|
32
|
+
return u.testBackup(params, 'animaldb', backupStream).then(() => {
|
|
33
|
+
assert.fail('Should throw an "EACCES" error');
|
|
34
|
+
}).catch((resultErr) => {
|
|
35
|
+
// cleanup temp dir
|
|
36
|
+
fs.rmdirSync(dirname);
|
|
37
|
+
// error should have been set
|
|
38
|
+
assert.ok(resultErr);
|
|
39
|
+
assert.strictEqual(resultErr.code, 'EACCES');
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Copyright ©
|
|
1
|
+
// Copyright © 2018, 2023 IBM Corp. All rights reserved.
|
|
2
2
|
//
|
|
3
3
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
4
|
// you may not use this file except in compliance with the License.
|
|
@@ -12,172 +12,64 @@
|
|
|
12
12
|
// See the License for the specific language governing permissions and
|
|
13
13
|
// limitations under the License.
|
|
14
14
|
|
|
15
|
-
/* global describe it
|
|
15
|
+
/* global describe it */
|
|
16
16
|
'use strict';
|
|
17
17
|
|
|
18
|
-
const assert = require('assert');
|
|
19
|
-
const backup = require('../includes/shallowbackup.js');
|
|
20
|
-
const request = require('../includes/request.js');
|
|
21
18
|
const fs = require('fs');
|
|
22
|
-
const
|
|
19
|
+
const { once } = require('node:events');
|
|
20
|
+
const readline = require('readline');
|
|
21
|
+
const u = require('./citestutils.js');
|
|
22
|
+
const uuid = require('uuid').v4;
|
|
23
23
|
|
|
24
|
-
|
|
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
|
-
}
|
|
24
|
+
const params = { useApi: true };
|
|
32
25
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
//
|
|
36
|
-
|
|
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';
|
|
26
|
+
describe(u.scenario('Concurrent database backups', params), function() {
|
|
27
|
+
it('should run concurrent API database backups correctly #slower', async function() {
|
|
28
|
+
// Allow up to 900 s to backup and compare (it should be much faster)!
|
|
29
|
+
u.setTimeout(this, 900);
|
|
42
30
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
});
|
|
31
|
+
const checkForEmptyBatches = async function(fileName) {
|
|
32
|
+
let foundEmptyBatch = false;
|
|
46
33
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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')));
|
|
34
|
+
const rd = readline.createInterface({
|
|
35
|
+
input: fs.createReadStream(fileName),
|
|
36
|
+
output: fs.createWriteStream('/dev/null'),
|
|
37
|
+
terminal: false
|
|
38
|
+
});
|
|
61
39
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
if (data.batch === 3) {
|
|
70
|
-
assert.strictEqual(data.length, 2); // smaller last batch
|
|
71
|
-
} else {
|
|
72
|
-
assert.strictEqual(data.length, 3);
|
|
73
|
-
}
|
|
74
|
-
} catch (err) {
|
|
75
|
-
reject(err);
|
|
76
|
-
}
|
|
77
|
-
})
|
|
78
|
-
.on('finished', function(data) {
|
|
79
|
-
try {
|
|
80
|
-
assert.strictEqual(data.total, 11);
|
|
81
|
-
assert.ok(couch.isDone());
|
|
82
|
-
resolve();
|
|
83
|
-
} catch (err) {
|
|
84
|
-
reject(err);
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
});
|
|
40
|
+
rd.on('line', function(line) {
|
|
41
|
+
if (JSON.parse(line).length === 0) {
|
|
42
|
+
// Note: Empty batch arrays indicate that the running backup is
|
|
43
|
+
// incorrectly sharing a log file with another ongoing backup job.
|
|
44
|
+
foundEmptyBatch = true;
|
|
45
|
+
}
|
|
46
|
+
});
|
|
89
47
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
// batch 3 - transient error
|
|
99
|
-
.post('/_all_docs', { limit: 3, start_key: kookaburraKey, include_docs: true })
|
|
100
|
-
.reply(500, { error: 'Internal Server Error' })
|
|
101
|
-
// batch 3 - retry
|
|
102
|
-
.post('/_all_docs', { limit: 3, start_key: kookaburraKey, include_docs: true })
|
|
103
|
-
.reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_3.json', 'utf8')))
|
|
104
|
-
// batch 4
|
|
105
|
-
.post('/_all_docs', { limit: 3, start_key: snipeKey, include_docs: true })
|
|
106
|
-
.reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_4.json', 'utf8')));
|
|
48
|
+
rd.on('close', function() {
|
|
49
|
+
if (foundEmptyBatch) {
|
|
50
|
+
return Promise.reject(new Error(`Log file '${fileName}' contains empty batches`));
|
|
51
|
+
} else {
|
|
52
|
+
return Promise.resolve();
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
};
|
|
107
56
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
.on('received', function(data) {
|
|
118
|
-
try {
|
|
119
|
-
if (data.batch === 3) {
|
|
120
|
-
assert.strictEqual(data.length, 2); // smaller last batch
|
|
121
|
-
} else {
|
|
122
|
-
assert.strictEqual(data.length, 3);
|
|
123
|
-
}
|
|
124
|
-
} catch (err) {
|
|
125
|
-
reject(err);
|
|
126
|
-
}
|
|
127
|
-
})
|
|
128
|
-
.on('finished', function(data) {
|
|
129
|
-
try {
|
|
130
|
-
assert.strictEqual(data.total, 11);
|
|
131
|
-
assert.ok(couch.isDone());
|
|
132
|
-
resolve();
|
|
133
|
-
} catch (err) {
|
|
134
|
-
reject(err);
|
|
135
|
-
}
|
|
136
|
-
});
|
|
137
|
-
});
|
|
138
|
-
});
|
|
57
|
+
const backupPromise = async function() {
|
|
58
|
+
const actualBackup = `./${uuid()}`;
|
|
59
|
+
const output = fs.createWriteStream(actualBackup);
|
|
60
|
+
return once(output, 'open').then(() => {
|
|
61
|
+
return u.testBackup(params, 'largedb1g', output);
|
|
62
|
+
}).then(() => {
|
|
63
|
+
return checkForEmptyBatches(actualBackup);
|
|
64
|
+
});
|
|
65
|
+
};
|
|
139
66
|
|
|
140
|
-
|
|
141
|
-
const
|
|
142
|
-
// batch 1
|
|
143
|
-
.post('/_all_docs', { limit: 3, include_docs: true })
|
|
144
|
-
.reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_1.json', 'utf8')))
|
|
145
|
-
// batch 2
|
|
146
|
-
.post('/_all_docs', { limit: 3, start_key: badgerKey, include_docs: true })
|
|
147
|
-
.reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_2.json', 'utf8')))
|
|
148
|
-
// batch 3 - fatal error
|
|
149
|
-
.post('/_all_docs', { limit: 3, start_key: kookaburraKey, include_docs: true })
|
|
150
|
-
.reply(401, { error: 'Unauthorized' });
|
|
67
|
+
// [1] Run 'largedb1g' database backup
|
|
68
|
+
const backup1 = backupPromise();
|
|
151
69
|
|
|
152
|
-
|
|
70
|
+
// [2] Run 'largedb1g' database backup
|
|
71
|
+
const backup2 = backupPromise();
|
|
153
72
|
|
|
154
|
-
return
|
|
155
|
-
shallowBackup(dbUrl, { bufferSize: 3, parallelism: 1 })
|
|
156
|
-
.on('error', function(err) {
|
|
157
|
-
try {
|
|
158
|
-
errCount++;
|
|
159
|
-
assert.strictEqual(err.name, 'Unauthorized');
|
|
160
|
-
} catch (err) {
|
|
161
|
-
reject(err);
|
|
162
|
-
}
|
|
163
|
-
})
|
|
164
|
-
.on('received', function(data) {
|
|
165
|
-
try {
|
|
166
|
-
assert.strictEqual(data.length, 3);
|
|
167
|
-
} catch (err) {
|
|
168
|
-
reject(err);
|
|
169
|
-
}
|
|
170
|
-
})
|
|
171
|
-
.on('finished', function(data) {
|
|
172
|
-
try {
|
|
173
|
-
assert.strictEqual(data.total, 6);
|
|
174
|
-
assert.ok(couch.isDone());
|
|
175
|
-
assert.strictEqual(errCount, 1);
|
|
176
|
-
resolve();
|
|
177
|
-
} catch (err) {
|
|
178
|
-
reject(err);
|
|
179
|
-
}
|
|
180
|
-
});
|
|
181
|
-
});
|
|
73
|
+
return Promise.all([backup1, backup2]);
|
|
182
74
|
});
|
|
183
75
|
});
|
|
@@ -12,90 +12,54 @@
|
|
|
12
12
|
// See the License for the specific language governing permissions and
|
|
13
13
|
// limitations under the License.
|
|
14
14
|
|
|
15
|
-
/* global
|
|
15
|
+
/* global beforeEach afterEach */
|
|
16
16
|
'use strict';
|
|
17
17
|
|
|
18
|
-
const
|
|
18
|
+
const { CloudantV1 } = require('@ibm-cloud/cloudant');
|
|
19
|
+
const url = new URL((process.env.COUCH_BACKEND_URL) ? process.env.COUCH_BACKEND_URL : 'https://no-couch-backend-url-set.test');
|
|
20
|
+
const { BasicAuthenticator, NoAuthAuthenticator } = require('ibm-cloud-sdk-core');
|
|
21
|
+
const authenticator = (url.username) ? new BasicAuthenticator({ username: url.username, password: decodeURIComponent(url.password) }) : new NoAuthAuthenticator();
|
|
22
|
+
const serviceOpts = {
|
|
23
|
+
authenticator: authenticator
|
|
24
|
+
};
|
|
25
|
+
const cloudant = new CloudantV1(serviceOpts);
|
|
26
|
+
// Remove auth from URL before using for service
|
|
27
|
+
cloudant.setServiceUrl(new URL(url.pathname, url.origin).toString());
|
|
28
|
+
const uuid = require('uuid').v4;
|
|
19
29
|
const fs = require('fs');
|
|
20
|
-
const { once } = require('node:events');
|
|
21
|
-
const u = require('./citestutils.js');
|
|
22
30
|
|
|
23
|
-
|
|
24
|
-
describe(u.scenario('Resume tests', params), function() {
|
|
25
|
-
it('should create a log file', async function() {
|
|
26
|
-
// Allow up to 90 s for this test
|
|
27
|
-
u.setTimeout(this, 60);
|
|
31
|
+
// Mocha hooks that will be at the root context so run for all tests
|
|
28
32
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
33
|
+
beforeEach('Create test database', async function() {
|
|
34
|
+
// Don't run hook for unit tests, just for CI
|
|
35
|
+
if (!this.currentTest.fullTitle().includes('#unit')) {
|
|
36
|
+
// Allow 10 seconds to create the DB
|
|
37
|
+
this.timeout(10 * 1000);
|
|
38
|
+
const unique = uuid();
|
|
39
|
+
this.fileName = `${unique}`;
|
|
40
|
+
this.dbName = 'couchbackup_test_' + unique;
|
|
36
41
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
u.setTimeout(this, 60);
|
|
40
|
-
const input = fs.createReadStream('./test/fixtures/animaldb_corrupted.json');
|
|
41
|
-
const dbName = this.dbName;
|
|
42
|
-
const p = u.p(params, { expectedRestoreErrorRecoverable: { name: 'BackupFileJsonError' } });
|
|
43
|
-
return once(input, 'open')
|
|
44
|
-
.then(() => {
|
|
45
|
-
return u.testRestore(p, input, dbName);
|
|
46
|
-
}).then(() => {
|
|
47
|
-
return u.dbCompare('animaldb', dbName);
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
it('should restore resumed animaldb with blank line to a database correctly', async function() {
|
|
52
|
-
// Allow up to 60 s to restore and compare (again it should be faster)!
|
|
53
|
-
u.setTimeout(this, 60);
|
|
54
|
-
const input = fs.createReadStream('./test/fixtures/animaldb_resumed_blank.json');
|
|
55
|
-
const dbName = this.dbName;
|
|
56
|
-
return once(input, 'open')
|
|
57
|
-
.then(() => {
|
|
58
|
-
return u.testRestore(params, input, dbName);
|
|
59
|
-
}).then(() => {
|
|
60
|
-
return u.dbCompare('animaldb', dbName);
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
});
|
|
42
|
+
return cloudant.putDatabase({ db: this.dbName });
|
|
43
|
+
}
|
|
64
44
|
});
|
|
65
45
|
|
|
66
|
-
|
|
67
|
-
//
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
const p = u.p(params, { abort: true }, { opts: { log: logFile } });
|
|
77
|
-
const restoreDb = this.dbName;
|
|
78
|
-
// Set the database doc count as fewer than this should be written during
|
|
79
|
-
// resumed backup.
|
|
80
|
-
p.exclusiveMaxExpected = 5096;
|
|
81
|
-
|
|
82
|
-
return u.testBackupAbortResumeRestore(p, 'backup10m', actualBackup, restoreDb);
|
|
83
|
-
});
|
|
84
|
-
// Note --output is only valid for CLI usage, this test should only run for CLI
|
|
85
|
-
const params = { useApi: false };
|
|
86
|
-
it('should correctly backup and restore backup10m using --output', async function() {
|
|
87
|
-
// Allow up to 90 s for this test
|
|
88
|
-
u.setTimeout(this, 90);
|
|
89
|
-
|
|
90
|
-
const actualBackup = `./${this.fileName}`;
|
|
91
|
-
const logFile = `./${this.fileName}` + '.log';
|
|
92
|
-
// Use abort parameter to terminate the backup
|
|
93
|
-
const p = u.p(params, { abort: true }, { opts: { output: actualBackup, log: logFile } });
|
|
94
|
-
const restoreDb = this.dbName;
|
|
95
|
-
// Set the database doc count as fewer than this should be written during
|
|
96
|
-
// resumed backup.
|
|
97
|
-
p.exclusiveMaxExpected = 5096;
|
|
46
|
+
afterEach('Delete test database', async function() {
|
|
47
|
+
// Don't run hook for unit tests, just for CI
|
|
48
|
+
if (!this.currentTest.fullTitle().includes('#unit')) {
|
|
49
|
+
// Allow 10 seconds to delete the DB
|
|
50
|
+
this.timeout(10 * 1000);
|
|
51
|
+
deleteIfExists(this.fileName);
|
|
52
|
+
deleteIfExists(`${this.fileName}.log`);
|
|
53
|
+
return cloudant.deleteDatabase({ db: this.dbName });
|
|
54
|
+
}
|
|
55
|
+
});
|
|
98
56
|
|
|
99
|
-
|
|
57
|
+
function deleteIfExists(fileName) {
|
|
58
|
+
fs.unlink(fileName, function(err) {
|
|
59
|
+
if (err) {
|
|
60
|
+
if (err.code !== 'ENOENT') {
|
|
61
|
+
console.error(`${err.code} ${err.message}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
100
64
|
});
|
|
101
|
-
}
|
|
65
|
+
}
|