@cloudant/couchbackup 2.9.15-SNAPSHOT.175 → 2.9.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/analysis.log +1 -1
- package/.scannerwork/scanner-report/changesets-12.pb +1 -0
- package/.scannerwork/scanner-report/changesets-14.pb +1 -0
- package/.scannerwork/scanner-report/changesets-16.pb +1 -0
- package/.scannerwork/scanner-report/changesets-17.pb +1 -0
- package/.scannerwork/scanner-report/changesets-18.pb +1 -0
- package/.scannerwork/scanner-report/changesets-19.pb +1 -0
- package/.scannerwork/scanner-report/changesets-20.pb +1 -0
- package/.scannerwork/scanner-report/changesets-22.pb +1 -0
- package/.scannerwork/scanner-report/changesets-39.pb +1 -0
- package/.scannerwork/scanner-report/component-1.pb +2 -1
- package/.scannerwork/scanner-report/component-10.pb +2 -0
- package/.scannerwork/scanner-report/component-12.pb +1 -1
- package/.scannerwork/scanner-report/component-14.pb +1 -0
- package/.scannerwork/scanner-report/component-16.pb +1 -0
- package/.scannerwork/scanner-report/component-17.pb +1 -0
- package/.scannerwork/scanner-report/component-18.pb +1 -0
- package/.scannerwork/scanner-report/component-19.pb +1 -0
- package/.scannerwork/scanner-report/component-20.pb +1 -0
- package/.scannerwork/scanner-report/component-21.pb +1 -1
- package/.scannerwork/scanner-report/component-22.pb +1 -0
- package/.scannerwork/scanner-report/component-23.pb +1 -1
- package/.scannerwork/scanner-report/component-24.pb +1 -1
- package/.scannerwork/scanner-report/component-25.pb +1 -1
- package/.scannerwork/scanner-report/component-26.pb +1 -1
- package/.scannerwork/scanner-report/component-27.pb +1 -1
- package/.scannerwork/scanner-report/component-28.pb +1 -1
- package/.scannerwork/scanner-report/component-29.pb +1 -1
- package/.scannerwork/scanner-report/component-3.pb +1 -1
- package/.scannerwork/scanner-report/component-30.pb +1 -1
- package/.scannerwork/scanner-report/component-31.pb +1 -1
- package/.scannerwork/scanner-report/component-32.pb +1 -1
- package/.scannerwork/scanner-report/component-33.pb +1 -1
- package/.scannerwork/scanner-report/component-34.pb +1 -1
- package/.scannerwork/scanner-report/component-35.pb +1 -1
- package/.scannerwork/scanner-report/component-36.pb +1 -1
- 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 -0
- package/.scannerwork/scanner-report/component-53.pb +1 -1
- 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 -1
- 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-62.pb +1 -1
- package/.scannerwork/scanner-report/component-64.pb +1 -1
- package/.scannerwork/scanner-report/component-65.pb +1 -1
- package/.scannerwork/scanner-report/component-66.pb +1 -1
- package/.scannerwork/scanner-report/component-67.pb +1 -1
- package/.scannerwork/scanner-report/component-68.pb +1 -1
- package/.scannerwork/scanner-report/component-69.pb +1 -1
- package/.scannerwork/scanner-report/component-70.pb +1 -1
- 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-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-24.pb +0 -0
- package/.scannerwork/scanner-report/coverages-25.pb +0 -0
- package/.scannerwork/scanner-report/coverages-26.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-29.pb +0 -0
- package/.scannerwork/scanner-report/coverages-30.pb +0 -0
- package/.scannerwork/scanner-report/coverages-31.pb +0 -0
- package/.scannerwork/scanner-report/coverages-32.pb +0 -0
- package/.scannerwork/scanner-report/coverages-33.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-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-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-60.pb +0 -0
- package/.scannerwork/scanner-report/coverages-62.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-66.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/coverages-69.pb +0 -0
- package/.scannerwork/scanner-report/duplications-12.pb +2 -0
- package/.scannerwork/scanner-report/duplications-14.pb +2 -0
- package/.scannerwork/scanner-report/duplications-24.pb +0 -2
- package/.scannerwork/scanner-report/duplications-25.pb +2 -0
- package/.scannerwork/scanner-report/duplications-26.pb +3 -0
- package/.scannerwork/scanner-report/duplications-33.pb +0 -3
- package/.scannerwork/scanner-report/duplications-36.pb +0 -2
- package/.scannerwork/scanner-report/duplications-39.pb +2 -0
- package/.scannerwork/scanner-report/duplications-56.pb +2 -0
- package/.scannerwork/scanner-report/duplications-58.pb +0 -2
- package/.scannerwork/scanner-report/duplications-60.pb +0 -2
- package/.scannerwork/scanner-report/duplications-66.pb +2 -0
- package/.scannerwork/scanner-report/issues-17.pb +3 -0
- package/.scannerwork/scanner-report/issues-26.pb +3 -2
- package/.scannerwork/scanner-report/measures-12.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-21.pb +0 -0
- package/.scannerwork/scanner-report/measures-22.pb +16 -0
- package/.scannerwork/scanner-report/measures-23.pb +0 -0
- package/.scannerwork/scanner-report/measures-24.pb +0 -0
- package/.scannerwork/scanner-report/measures-25.pb +0 -0
- package/.scannerwork/scanner-report/measures-26.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-29.pb +0 -0
- package/.scannerwork/scanner-report/measures-30.pb +0 -0
- package/.scannerwork/scanner-report/measures-31.pb +0 -0
- package/.scannerwork/scanner-report/measures-32.pb +0 -0
- package/.scannerwork/scanner-report/measures-33.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-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-53.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-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-62.pb +0 -0
- package/.scannerwork/scanner-report/measures-64.pb +0 -0
- package/.scannerwork/scanner-report/measures-65.pb +0 -0
- package/.scannerwork/scanner-report/measures-66.pb +0 -0
- package/.scannerwork/scanner-report/measures-67.pb +0 -0
- package/.scannerwork/scanner-report/measures-68.pb +0 -0
- package/.scannerwork/scanner-report/measures-69.pb +0 -0
- package/.scannerwork/scanner-report/measures-70.pb +0 -0
- package/.scannerwork/scanner-report/metadata.pb +0 -0
- package/.scannerwork/scanner-report/{source-4.txt → source-10.txt} +162 -162
- package/.scannerwork/scanner-report/source-12.txt +190 -424
- package/.scannerwork/scanner-report/source-16.txt +46 -0
- package/.scannerwork/scanner-report/source-17.txt +130 -0
- package/.scannerwork/scanner-report/source-18.txt +134 -0
- package/.scannerwork/scanner-report/source-19.txt +37 -0
- package/.scannerwork/scanner-report/source-21.txt +22 -27
- package/.scannerwork/scanner-report/source-22.txt +293 -0
- package/.scannerwork/scanner-report/source-23.txt +83 -82
- package/.scannerwork/scanner-report/source-24.txt +13 -168
- package/.scannerwork/scanner-report/source-25.txt +163 -9
- package/.scannerwork/scanner-report/source-26.txt +180 -97
- package/.scannerwork/scanner-report/source-27.txt +85 -60
- package/.scannerwork/scanner-report/source-28.txt +428 -16
- package/.scannerwork/scanner-report/source-29.txt +20 -18
- package/.scannerwork/scanner-report/source-3.txt +154 -154
- package/.scannerwork/scanner-report/source-30.txt +10 -115
- package/.scannerwork/scanner-report/source-31.txt +17 -21
- package/.scannerwork/scanner-report/source-32.txt +314 -136
- package/.scannerwork/scanner-report/source-33.txt +44 -192
- package/.scannerwork/scanner-report/source-34.txt +73 -158
- package/.scannerwork/scanner-report/source-35.txt +54 -16
- package/.scannerwork/scanner-report/source-36.txt +130 -162
- package/.scannerwork/scanner-report/source-37.txt +158 -68
- package/.scannerwork/scanner-report/source-38.txt +19 -272
- package/.scannerwork/scanner-report/source-39.txt +187 -0
- package/.scannerwork/scanner-report/source-53.txt +104 -18
- package/.scannerwork/scanner-report/source-54.txt +22 -425
- package/.scannerwork/scanner-report/source-55.txt +150 -28
- package/.scannerwork/scanner-report/source-56.txt +53 -43
- package/.scannerwork/scanner-report/source-57.txt +241 -78
- package/.scannerwork/scanner-report/source-58.txt +59 -71
- package/.scannerwork/scanner-report/source-59.txt +147 -133
- package/.scannerwork/scanner-report/source-6.txt +102 -81
- package/.scannerwork/scanner-report/source-60.txt +91 -53
- package/.scannerwork/scanner-report/source-62.txt +108 -25
- package/.scannerwork/scanner-report/source-64.txt +20 -260
- package/.scannerwork/scanner-report/source-65.txt +87 -154
- package/.scannerwork/scanner-report/source-66.txt +65 -14
- package/.scannerwork/scanner-report/source-67.txt +388 -85
- package/.scannerwork/scanner-report/source-68.txt +41 -61
- package/.scannerwork/scanner-report/source-69.txt +63 -111
- package/.scannerwork/scanner-report/source-70.txt +424 -113
- package/.scannerwork/scanner-report/symbols-16.pb +7 -0
- package/.scannerwork/scanner-report/symbols-17.pb +86 -0
- package/.scannerwork/scanner-report/symbols-18.pb +71 -0
- package/.scannerwork/scanner-report/symbols-19.pb +9 -0
- package/.scannerwork/scanner-report/symbols-21.pb +31 -7
- package/.scannerwork/scanner-report/symbols-22.pb +428 -0
- package/.scannerwork/scanner-report/symbols-23.pb +57 -68
- package/.scannerwork/scanner-report/symbols-24.pb +9 -227
- package/.scannerwork/scanner-report/symbols-25.pb +203 -8
- package/.scannerwork/scanner-report/symbols-26.pb +263 -85
- package/.scannerwork/scanner-report/symbols-27.pb +68 -38
- package/.scannerwork/scanner-report/symbols-28.pb +790 -9
- package/.scannerwork/scanner-report/symbols-29.pb +19 -23
- package/.scannerwork/scanner-report/symbols-30.pb +8 -71
- package/.scannerwork/scanner-report/symbols-31.pb +13 -31
- package/.scannerwork/scanner-report/symbols-32.pb +353 -93
- package/.scannerwork/scanner-report/symbols-33.pb +33 -264
- package/.scannerwork/scanner-report/symbols-34.pb +59 -209
- package/.scannerwork/scanner-report/symbols-35.pb +39 -13
- package/.scannerwork/scanner-report/symbols-36.pb +88 -198
- package/.scannerwork/scanner-report/symbols-37.pb +209 -58
- package/.scannerwork/scanner-report/symbols-38.pb +23 -428
- package/.scannerwork/scanner-report/symbols-39.pb +227 -0
- package/.scannerwork/scanner-report/symbols-53.pb +30 -9
- package/.scannerwork/scanner-report/symbols-54.pb +19 -789
- package/.scannerwork/scanner-report/symbols-55.pb +126 -19
- package/.scannerwork/scanner-report/symbols-56.pb +41 -32
- package/.scannerwork/scanner-report/symbols-57.pb +354 -30
- package/.scannerwork/scanner-report/symbols-58.pb +45 -43
- package/.scannerwork/scanner-report/symbols-59.pb +129 -111
- package/.scannerwork/scanner-report/symbols-60.pb +44 -40
- package/.scannerwork/scanner-report/symbols-62.pb +33 -20
- package/.scannerwork/scanner-report/symbols-64.pb +18 -354
- package/.scannerwork/scanner-report/symbols-65.pb +56 -141
- package/.scannerwork/scanner-report/symbols-66.pb +42 -16
- package/.scannerwork/scanner-report/symbols-67.pb +604 -59
- package/.scannerwork/scanner-report/symbols-68.pb +21 -46
- package/.scannerwork/scanner-report/symbols-69.pb +31 -32
- package/.scannerwork/scanner-report/{syntax-highlightings-4.pb → syntax-highlightings-10.pb} +94 -94
- package/.scannerwork/scanner-report/syntax-highlightings-12.pb +202 -3317
- package/.scannerwork/scanner-report/syntax-highlightings-16.pb +62 -0
- package/.scannerwork/scanner-report/syntax-highlightings-17.pb +125 -0
- package/.scannerwork/scanner-report/syntax-highlightings-18.pb +181 -0
- package/.scannerwork/scanner-report/syntax-highlightings-19.pb +61 -0
- package/.scannerwork/scanner-report/syntax-highlightings-21.pb +36 -29
- package/.scannerwork/scanner-report/syntax-highlightings-22.pb +720 -0
- package/.scannerwork/scanner-report/syntax-highlightings-23.pb +114 -67
- package/.scannerwork/scanner-report/syntax-highlightings-24.pb +19 -333
- package/.scannerwork/scanner-report/syntax-highlightings-25.pb +246 -15
- package/.scannerwork/scanner-report/syntax-highlightings-26.pb +260 -88
- package/.scannerwork/scanner-report/syntax-highlightings-27.pb +68 -62
- package/.scannerwork/scanner-report/syntax-highlightings-28.pb +592 -26
- package/.scannerwork/scanner-report/syntax-highlightings-29.pb +27 -17
- package/.scannerwork/scanner-report/syntax-highlightings-3.pb +88 -87
- package/.scannerwork/scanner-report/syntax-highlightings-30.pb +15 -147
- package/.scannerwork/scanner-report/syntax-highlightings-31.pb +26 -33
- package/.scannerwork/scanner-report/syntax-highlightings-32.pb +550 -167
- package/.scannerwork/scanner-report/syntax-highlightings-33.pb +64 -251
- package/.scannerwork/scanner-report/syntax-highlightings-34.pb +138 -250
- package/.scannerwork/scanner-report/syntax-highlightings-35.pb +64 -25
- package/.scannerwork/scanner-report/syntax-highlightings-36.pb +162 -205
- package/.scannerwork/scanner-report/syntax-highlightings-37.pb +246 -110
- package/.scannerwork/scanner-report/syntax-highlightings-38.pb +19 -683
- package/.scannerwork/scanner-report/syntax-highlightings-39.pb +368 -0
- package/.scannerwork/scanner-report/syntax-highlightings-53.pb +83 -24
- package/.scannerwork/scanner-report/syntax-highlightings-54.pb +33 -596
- package/.scannerwork/scanner-report/syntax-highlightings-55.pb +177 -30
- package/.scannerwork/scanner-report/syntax-highlightings-56.pb +47 -76
- package/.scannerwork/scanner-report/syntax-highlightings-57.pb +250 -78
- package/.scannerwork/scanner-report/syntax-highlightings-58.pb +57 -55
- package/.scannerwork/scanner-report/syntax-highlightings-59.pb +166 -136
- package/.scannerwork/scanner-report/syntax-highlightings-6.pb +689 -98
- package/.scannerwork/scanner-report/syntax-highlightings-60.pb +93 -48
- package/.scannerwork/scanner-report/syntax-highlightings-62.pb +94 -29
- package/.scannerwork/scanner-report/syntax-highlightings-64.pb +19 -252
- package/.scannerwork/scanner-report/syntax-highlightings-65.pb +88 -198
- package/.scannerwork/scanner-report/syntax-highlightings-66.pb +59 -18
- package/.scannerwork/scanner-report/syntax-highlightings-67.pb +609 -101
- package/.scannerwork/scanner-report/syntax-highlightings-68.pb +61 -74
- package/.scannerwork/scanner-report/syntax-highlightings-69.pb +74 -103
- package/.scannerwork/scanner-report/syntax-highlightings-70.pb +3328 -115
- package/CHANGES.md +4 -0
- package/package.json +2 -2
- package/test-18-results.xml +157 -157
- package/test-20-results.xml +162 -162
- package/test-21-results.xml +163 -163
- package/test-iam-20-results.xml +50 -50
- package/.scannerwork/scanner-report/changesets-11.pb +0 -1
- package/.scannerwork/scanner-report/changesets-2.pb +0 -1
- package/.scannerwork/scanner-report/changesets-50.pb +0 -1
- package/.scannerwork/scanner-report/changesets-51.pb +0 -1
- package/.scannerwork/scanner-report/changesets-52.pb +0 -1
- package/.scannerwork/scanner-report/changesets-6.pb +0 -1
- package/.scannerwork/scanner-report/changesets-7.pb +0 -1
- package/.scannerwork/scanner-report/changesets-70.pb +0 -1
- package/.scannerwork/scanner-report/changesets-8.pb +0 -1
- package/.scannerwork/scanner-report/component-11.pb +0 -1
- package/.scannerwork/scanner-report/component-2.pb +0 -1
- package/.scannerwork/scanner-report/component-4.pb +0 -1
- package/.scannerwork/scanner-report/component-5.pb +0 -1
- package/.scannerwork/scanner-report/component-50.pb +0 -1
- package/.scannerwork/scanner-report/component-51.pb +0 -1
- package/.scannerwork/scanner-report/component-52.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-2.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-6.pb +0 -0
- package/.scannerwork/scanner-report/coverages-7.pb +0 -0
- package/.scannerwork/scanner-report/coverages-70.pb +0 -0
- package/.scannerwork/scanner-report/duplications-11.pb +0 -2
- package/.scannerwork/scanner-report/duplications-7.pb +0 -0
- package/.scannerwork/scanner-report/duplications-70.pb +0 -0
- package/.scannerwork/scanner-report/duplications-8.pb +0 -2
- package/.scannerwork/scanner-report/issues-33.pb +0 -4
- package/.scannerwork/scanner-report/measures-11.pb +0 -0
- package/.scannerwork/scanner-report/measures-2.pb +0 -0
- package/.scannerwork/scanner-report/measures-5.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-7.pb +0 -0
- package/.scannerwork/scanner-report/source-11.txt +0 -190
- package/.scannerwork/scanner-report/source-2.txt +0 -414
- package/.scannerwork/scanner-report/source-5.txt +0 -102
- package/.scannerwork/scanner-report/source-51.txt +0 -329
- package/.scannerwork/scanner-report/source-52.txt +0 -106
- package/.scannerwork/scanner-report/source-7.txt +0 -60
- package/.scannerwork/scanner-report/symbols-2.pb +0 -604
- package/.scannerwork/scanner-report/symbols-51.pb +0 -353
- package/.scannerwork/scanner-report/symbols-52.pb +0 -59
- package/.scannerwork/scanner-report/symbols-6.pb +0 -32
- package/.scannerwork/scanner-report/symbols-7.pb +0 -21
- package/.scannerwork/scanner-report/symbols-70.pb +0 -46
- package/.scannerwork/scanner-report/syntax-highlightings-11.pb +0 -225
- package/.scannerwork/scanner-report/syntax-highlightings-2.pb +0 -641
- package/.scannerwork/scanner-report/syntax-highlightings-5.pb +0 -691
- package/.scannerwork/scanner-report/syntax-highlightings-51.pb +0 -620
- package/.scannerwork/scanner-report/syntax-highlightings-52.pb +0 -178
- package/.scannerwork/scanner-report/syntax-highlightings-7.pb +0 -82
- /package/.scannerwork/scanner-report/{coverages-11.pb → coverages-12.pb} +0 -0
- /package/.scannerwork/scanner-report/{coverages-8.pb → coverages-14.pb} +0 -0
- /package/.scannerwork/scanner-report/{coverages-50.pb → coverages-20.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-2.pb → duplications-16.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-30.pb → duplications-17.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-50.pb → duplications-18.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-51.pb → duplications-19.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-52.pb → duplications-20.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-6.pb → duplications-22.pb} +0 -0
- /package/.scannerwork/scanner-report/{issues-55.pb → issues-29.pb} +0 -0
- /package/.scannerwork/scanner-report/{issues-51.pb → issues-32.pb} +0 -0
- /package/.scannerwork/scanner-report/{measures-4.pb → measures-10.pb} +0 -0
- /package/.scannerwork/scanner-report/{measures-8.pb → measures-14.pb} +0 -0
- /package/.scannerwork/scanner-report/{measures-50.pb → measures-20.pb} +0 -0
- /package/.scannerwork/scanner-report/{source-8.txt → source-14.txt} +0 -0
- /package/.scannerwork/scanner-report/{source-50.txt → source-20.txt} +0 -0
- /package/.scannerwork/scanner-report/{symbols-11.pb → symbols-12.pb} +0 -0
- /package/.scannerwork/scanner-report/{symbols-8.pb → symbols-14.pb} +0 -0
- /package/.scannerwork/scanner-report/{symbols-50.pb → symbols-20.pb} +0 -0
- /package/.scannerwork/scanner-report/{syntax-highlightings-8.pb → syntax-highlightings-14.pb} +0 -0
- /package/.scannerwork/scanner-report/{syntax-highlightings-50.pb → syntax-highlightings-20.pb} +0 -0
|
@@ -12,202 +12,54 @@
|
|
|
12
12
|
// See the License for the specific language governing permissions and
|
|
13
13
|
// limitations under the License.
|
|
14
14
|
|
|
15
|
-
/* global
|
|
15
|
+
/* global beforeEach afterEach */
|
|
16
16
|
'use strict';
|
|
17
17
|
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
18
|
+
const { CloudantV1 } = require('@ibm-cloud/cloudant');
|
|
19
|
+
const url = new URL((process.env.COUCH_BACKEND_URL) ? process.env.COUCH_BACKEND_URL : 'https://no-couch-backend-url-set.test');
|
|
20
|
+
const { BasicAuthenticator, NoAuthAuthenticator } = require('ibm-cloud-sdk-core');
|
|
21
|
+
const authenticator = (url.username) ? new BasicAuthenticator({ username: url.username, password: decodeURIComponent(url.password) }) : new NoAuthAuthenticator();
|
|
22
|
+
const serviceOpts = {
|
|
23
|
+
authenticator: authenticator
|
|
24
|
+
};
|
|
25
|
+
const cloudant = new CloudantV1(serviceOpts);
|
|
26
|
+
// Remove auth from URL before using for service
|
|
27
|
+
cloudant.setServiceUrl(new URL(url.pathname, url.origin).toString());
|
|
28
|
+
const uuid = require('uuid').v4;
|
|
29
|
+
const fs = require('fs');
|
|
30
|
+
|
|
31
|
+
// Mocha hooks that will be at the root context so run for all tests
|
|
32
|
+
|
|
33
|
+
beforeEach('Create test database', async function() {
|
|
34
|
+
// Don't run hook for unit tests, just for CI
|
|
35
|
+
if (!this.currentTest.fullTitle().includes('#unit')) {
|
|
36
|
+
// Allow 10 seconds to create the DB
|
|
37
|
+
this.timeout(10 * 1000);
|
|
38
|
+
const unique = uuid();
|
|
39
|
+
this.fileName = `${unique}`;
|
|
40
|
+
this.dbName = 'couchbackup_test_' + unique;
|
|
41
|
+
|
|
42
|
+
return cloudant.putDatabase({ db: this.dbName });
|
|
43
|
+
}
|
|
30
44
|
});
|
|
31
45
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
return
|
|
40
|
-
|
|
41
|
-
});
|
|
42
|
-
});
|
|
46
|
+
afterEach('Delete test database', async function() {
|
|
47
|
+
// Don't run hook for unit tests, just for CI
|
|
48
|
+
if (!this.currentTest.fullTitle().includes('#unit')) {
|
|
49
|
+
// Allow 10 seconds to delete the DB
|
|
50
|
+
this.timeout(10 * 1000);
|
|
51
|
+
deleteIfExists(this.fileName);
|
|
52
|
+
deleteIfExists(`${this.fileName}.log`);
|
|
53
|
+
return cloudant.deleteDatabase({ db: this.dbName });
|
|
54
|
+
}
|
|
43
55
|
});
|
|
44
56
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
.
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
assert.ok(response.result);
|
|
53
|
-
assert.ok(couch.isDone());
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
it('should callback with error after 3 500 responses', async function() {
|
|
58
|
-
const couch = nock(url)
|
|
59
|
-
.get('/bad')
|
|
60
|
-
.times(3)
|
|
61
|
-
.reply(500, function(uri, requestBody) {
|
|
62
|
-
this.req.response.statusMessage = 'Internal Server Error';
|
|
63
|
-
return { error: 'foo', reason: 'bar' };
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
return assert.rejects(
|
|
67
|
-
db.service.getDocument({ db: db.db, docId: 'bad' }),
|
|
68
|
-
(err) => {
|
|
69
|
-
err = error.convertResponseError(err);
|
|
70
|
-
assert.strictEqual(err.name, 'HTTPFatalError');
|
|
71
|
-
assert.strictEqual(err.message, `500 Internal Server Error: get ${url}/bad - Error: foo, Reason: bar`);
|
|
72
|
-
assert.ok(couch.isDone());
|
|
73
|
-
return true;
|
|
74
|
-
});
|
|
75
|
-
}).timeout(longTestTimeout);
|
|
76
|
-
|
|
77
|
-
it('should callback with error after 3 POST 503 responses', async function() {
|
|
78
|
-
const couch = nock(url)
|
|
79
|
-
.post('/_bulk_get')
|
|
80
|
-
.query(true)
|
|
81
|
-
.times(3)
|
|
82
|
-
.reply(503, function(uri, requestBody) {
|
|
83
|
-
this.req.response.statusMessage = 'Service Unavailable';
|
|
84
|
-
return { error: 'service_unavailable', reason: 'Service unavailable' };
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
return assert.rejects(
|
|
88
|
-
db.service.postBulkGet({ db: db.db, revs: true, docs: [] }),
|
|
89
|
-
(err) => {
|
|
90
|
-
err = error.convertResponseError(err);
|
|
91
|
-
assert.strictEqual(err.name, 'HTTPFatalError');
|
|
92
|
-
assert.strictEqual(err.message, `503 Service Unavailable: post ${url}/_bulk_get - Error: service_unavailable, Reason: Service unavailable`);
|
|
93
|
-
assert.ok(couch.isDone());
|
|
94
|
-
return true;
|
|
95
|
-
});
|
|
96
|
-
}).timeout(longTestTimeout);
|
|
97
|
-
|
|
98
|
-
it('should callback with error after 3 429 responses', async function() {
|
|
99
|
-
const couch = nock(url)
|
|
100
|
-
.get('/bad')
|
|
101
|
-
.times(3)
|
|
102
|
-
.reply(429, function(uri, requestBody) {
|
|
103
|
-
this.req.response.statusMessage = 'Too Many Requests';
|
|
104
|
-
return { error: 'foo', reason: 'bar' };
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
return assert.rejects(
|
|
108
|
-
db.service.getDocument({ db: db.db, docId: 'bad' }),
|
|
109
|
-
(err) => {
|
|
110
|
-
err = error.convertResponseError(err);
|
|
111
|
-
assert.strictEqual(err.name, 'HTTPFatalError');
|
|
112
|
-
assert.strictEqual(err.message, `429 Too Many Requests: get ${url}/bad - Error: foo, Reason: bar`);
|
|
113
|
-
assert.ok(couch.isDone());
|
|
114
|
-
return true;
|
|
115
|
-
});
|
|
116
|
-
}).timeout(longTestTimeout);
|
|
117
|
-
|
|
118
|
-
it('should callback with fatal error for 404 response', async function() {
|
|
119
|
-
const couch = nock(url)
|
|
120
|
-
.get('/bad')
|
|
121
|
-
.reply(404, function(uri, requestBody) {
|
|
122
|
-
this.req.response.statusMessage = 'Not Found';
|
|
123
|
-
return { error: 'foo', reason: 'bar' };
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
return assert.rejects(
|
|
127
|
-
db.service.getDocument({ db: db.db, docId: 'bad' }),
|
|
128
|
-
(err) => {
|
|
129
|
-
err = error.convertResponseError(err);
|
|
130
|
-
assert.strictEqual(err.name, 'HTTPFatalError');
|
|
131
|
-
assert.strictEqual(err.message, `404 Not Found: get ${url}/bad - Error: foo, Reason: bar`);
|
|
132
|
-
assert.ok(couch.isDone());
|
|
133
|
-
return true;
|
|
134
|
-
});
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
it('should callback with same error for no status code error response', async function() {
|
|
138
|
-
const couch = nock(url)
|
|
139
|
-
.get('/bad')
|
|
140
|
-
.times(3)
|
|
141
|
-
.replyWithError('testing badness');
|
|
142
|
-
|
|
143
|
-
return assert.rejects(
|
|
144
|
-
db.service.getDocument({ db: db.db, docId: 'bad' }),
|
|
145
|
-
(err) => {
|
|
146
|
-
const err2 = error.convertResponseError(err);
|
|
147
|
-
assert.strictEqual(err, err2);
|
|
148
|
-
assert.ok(couch.isDone());
|
|
149
|
-
return true;
|
|
150
|
-
});
|
|
151
|
-
}).timeout(longTestTimeout);
|
|
152
|
-
|
|
153
|
-
it('should retry request if HTTP request gets timed out', async function() {
|
|
154
|
-
const couch = nock(url)
|
|
155
|
-
.post('/_bulk_get')
|
|
156
|
-
.query(true)
|
|
157
|
-
.delay(1000)
|
|
158
|
-
.reply(200, { results: { docs: [{ id: '1', ok: { _id: '1' } }] } })
|
|
159
|
-
.post('/_bulk_get')
|
|
160
|
-
.query(true)
|
|
161
|
-
.reply(200, { results: { docs: [{ id: '1', ok: { _id: '1' } }, { id: '2', ok: { _id: '2' } }] } });
|
|
162
|
-
|
|
163
|
-
return timeoutDb.service.postBulkGet({ db: db.db, revs: true, docs: [] }).then((response) => {
|
|
164
|
-
assert.ok(response);
|
|
165
|
-
assert.ok(response.result);
|
|
166
|
-
assert.ok(response.result.results);
|
|
167
|
-
assert.ok(response.result.results.docs);
|
|
168
|
-
assert.strictEqual(response.result.results.docs.length, 2);
|
|
169
|
-
assert.ok(couch.isDone());
|
|
170
|
-
});
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
it('should callback with error code ESOCKETTIMEDOUT if 3 HTTP requests gets timed out', async function() {
|
|
174
|
-
// Increase the timeout for this test to allow for the delays
|
|
175
|
-
this.timeout(3000);
|
|
176
|
-
const couch = nock(url)
|
|
177
|
-
.post('/_bulk_get')
|
|
178
|
-
.query(true)
|
|
179
|
-
.delay(1000)
|
|
180
|
-
.times(3)
|
|
181
|
-
.reply(200, { ok: true });
|
|
182
|
-
|
|
183
|
-
return assert.rejects(
|
|
184
|
-
timeoutDb.service.postBulkGet({ db: db.db, revs: true, docs: [] }),
|
|
185
|
-
(err) => {
|
|
186
|
-
err = error.convertResponseError(err);
|
|
187
|
-
// Note axios returns ECONNABORTED rather than ESOCKETTIMEDOUT
|
|
188
|
-
// See https://github.com/axios/axios/issues/2710 via https://github.com/axios/axios/issues/1543`
|
|
189
|
-
assert.strictEqual(err.statusText, 'ECONNABORTED');
|
|
190
|
-
assert.strictEqual(err.message, `timeout of 500ms exceeded: post ${url}/_bulk_get ECONNABORTED`);
|
|
191
|
-
assert.ok(couch.isDone());
|
|
192
|
-
return true;
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
|
-
describe('#unit Check credentials', async function() {
|
|
196
|
-
it('should properly decode username and password', async function() {
|
|
197
|
-
const username = 'user%123';
|
|
198
|
-
const password = 'colon:at@321';
|
|
199
|
-
const url = `http://${encodeURIComponent(username)}:${encodeURIComponent(password)}@localhost:7777/testdb`;
|
|
200
|
-
const sessionUrl = 'http://localhost:7777';
|
|
201
|
-
const couch = nock(sessionUrl)
|
|
202
|
-
.post('/_session', { username: username, password: password })
|
|
203
|
-
.reply(200, { ok: true }, { 'Set-Cookie': 'AuthSession=ABC123DEF4356;' })
|
|
204
|
-
.get('/')
|
|
205
|
-
.reply(200);
|
|
206
|
-
const db = request.client(url, { parallelism: 1 });
|
|
207
|
-
return db.service.getServerInformation().then(response => {
|
|
208
|
-
assert.ok(response);
|
|
209
|
-
assert.ok(couch.isDone());
|
|
210
|
-
});
|
|
211
|
-
});
|
|
57
|
+
function deleteIfExists(fileName) {
|
|
58
|
+
fs.unlink(fileName, function(err) {
|
|
59
|
+
if (err) {
|
|
60
|
+
if (err.code !== 'ENOENT') {
|
|
61
|
+
console.error(`${err.code} ${err.message}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
212
64
|
});
|
|
213
|
-
}
|
|
65
|
+
}
|
|
@@ -15,176 +15,91 @@
|
|
|
15
15
|
/* global describe it */
|
|
16
16
|
'use strict';
|
|
17
17
|
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
const changes = require('../includes/spoolchanges.js');
|
|
18
|
+
const fs = require('fs');
|
|
19
|
+
const { once } = require('node:events');
|
|
20
|
+
const u = require('./citestutils.js');
|
|
22
21
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
nock(url)
|
|
38
|
-
.post(`/${dbName}/_changes`)
|
|
39
|
-
.query(true)
|
|
40
|
-
.times(totalChanges / batchSize + (totalChanges % batchSize > 0 ? 1 : 0))
|
|
41
|
-
.reply(200, (uri, requestBody) => {
|
|
42
|
-
pending -= batchSize;
|
|
43
|
-
const lastSeq = (totalChanges - pending);
|
|
44
|
-
const seq = lastSeq - batchSize;
|
|
45
|
-
return {
|
|
46
|
-
results: fullResponse
|
|
47
|
-
? Array.from(Array(batchSize), (_, i) => {
|
|
48
|
-
return {
|
|
49
|
-
seq: `${seq + i}-${seqSuffix}`,
|
|
50
|
-
id: `doc${seq + i}`,
|
|
51
|
-
changes: [{ rev: '1-abcdef0123456789abcdef0123456789' }]
|
|
52
|
-
};
|
|
53
|
-
})
|
|
54
|
-
: sparseResultsArray,
|
|
55
|
-
pending: pending,
|
|
56
|
-
last_seq: `${lastSeq}-abc`
|
|
57
|
-
};
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
describe('#unit Check spool changes', function() {
|
|
62
|
-
it('should terminate on request error', async function() {
|
|
63
|
-
nock(url)
|
|
64
|
-
.post(`/${dbName}/_changes`)
|
|
65
|
-
.query(true)
|
|
66
|
-
.times(3)
|
|
67
|
-
.replyWithError({ code: 'ECONNRESET', message: 'socket hang up' });
|
|
68
|
-
|
|
69
|
-
return new Promise((resolve, reject) => {
|
|
70
|
-
changes(db, '/dev/null', 500, null, function(err) {
|
|
71
|
-
try {
|
|
72
|
-
assert.strictEqual(err.name, 'SpoolChangesError');
|
|
73
|
-
assert.strictEqual(err.message, `Failed changes request - socket hang up: post ${url}/${dbName}/_changes`);
|
|
74
|
-
assert.ok(nock.isDone());
|
|
75
|
-
resolve();
|
|
76
|
-
} catch (err) {
|
|
77
|
-
reject(err);
|
|
78
|
-
}
|
|
79
|
-
});
|
|
22
|
+
[{ useApi: true }, { useApi: false }].forEach(function(params) {
|
|
23
|
+
describe(u.scenario('Basic backup and restore', params), function() {
|
|
24
|
+
it('should backup animaldb to a file correctly', async function() {
|
|
25
|
+
// Allow up to 40 s to backup and compare (it should be much faster)!
|
|
26
|
+
u.setTimeout(this, 40);
|
|
27
|
+
const actualBackup = `./${this.fileName}`;
|
|
28
|
+
// Create a file and backup to it
|
|
29
|
+
const output = fs.createWriteStream(actualBackup);
|
|
30
|
+
return once(output, 'open')
|
|
31
|
+
.then(() => {
|
|
32
|
+
return u.testBackup(params, 'animaldb', output);
|
|
33
|
+
}).then(() => {
|
|
34
|
+
return u.readSortAndDeepEqual(actualBackup, './test/fixtures/animaldb_expected.json');
|
|
35
|
+
});
|
|
80
36
|
});
|
|
81
|
-
}).timeout(longTestTimeout);
|
|
82
37
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
.
|
|
86
|
-
.
|
|
87
|
-
.
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
return new Promise((resolve, reject) => {
|
|
93
|
-
changes(db, '/dev/null', 500, null, function(err) {
|
|
94
|
-
try {
|
|
95
|
-
assert.strictEqual(err.name, 'HTTPFatalError');
|
|
96
|
-
assert.strictEqual(err.message, `500 Internal Server Error: post ${url}/${dbName}/_changes - Error: foo, Reason: bar`);
|
|
97
|
-
assert.ok(nock.isDone());
|
|
98
|
-
resolve();
|
|
99
|
-
} catch (err) {
|
|
100
|
-
reject(err);
|
|
101
|
-
}
|
|
38
|
+
it('should restore animaldb to a database correctly', async function() {
|
|
39
|
+
// Allow up to 60 s to restore and compare (again it should be faster)!
|
|
40
|
+
u.setTimeout(this, 60);
|
|
41
|
+
const input = fs.createReadStream('./test/fixtures/animaldb_expected.json');
|
|
42
|
+
const dbName = this.dbName;
|
|
43
|
+
return once(input, 'open').then(() => {
|
|
44
|
+
return u.testRestore(params, input, dbName);
|
|
45
|
+
}).then(() => {
|
|
46
|
+
return u.dbCompare('animaldb', dbName);
|
|
102
47
|
});
|
|
103
48
|
});
|
|
104
|
-
}).timeout(longTestTimeout);
|
|
105
49
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
assert.ok(nock.isDone());
|
|
120
|
-
resolve();
|
|
121
|
-
} catch (err) {
|
|
122
|
-
reject(err);
|
|
123
|
-
}
|
|
124
|
-
});
|
|
50
|
+
it('should execute a shallow mode backup successfully', async function() {
|
|
51
|
+
// Allow 30 s
|
|
52
|
+
u.setTimeout(this, 30);
|
|
53
|
+
const actualBackup = `./${this.fileName}`;
|
|
54
|
+
const output = fs.createWriteStream(actualBackup);
|
|
55
|
+
// Add the shallow mode option
|
|
56
|
+
const p = u.p(params, { opts: { mode: 'shallow' } });
|
|
57
|
+
return once(output, 'open')
|
|
58
|
+
.then(() => {
|
|
59
|
+
return u.testBackup(p, 'animaldb', output);
|
|
60
|
+
}).then(() => {
|
|
61
|
+
return u.readSortAndDeepEqual(actualBackup, './test/fixtures/animaldb_expected_shallow.json');
|
|
62
|
+
});
|
|
125
63
|
});
|
|
126
|
-
});
|
|
127
64
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
changes(db, '/dev/null', 500, null, function(err) {
|
|
137
|
-
try {
|
|
138
|
-
assert.ok(!err);
|
|
139
|
-
assert.ok(nock.isDone());
|
|
140
|
-
resolve();
|
|
141
|
-
} catch (err) {
|
|
142
|
-
reject(err);
|
|
143
|
-
}
|
|
65
|
+
describe(u.scenario('Buffer size tests', params), function() {
|
|
66
|
+
it('should backup/restore animaldb with the same buffer size', async function() {
|
|
67
|
+
// Allow up to 60 s for backup and restore of animaldb
|
|
68
|
+
u.setTimeout(this, 60);
|
|
69
|
+
const actualBackup = `./${this.fileName}`;
|
|
70
|
+
const logFile = `./${this.fileName}` + '.log';
|
|
71
|
+
const p = u.p(params, { opts: { log: logFile, bufferSize: 1 } });
|
|
72
|
+
return u.testBackupAndRestoreViaFile(p, 'animaldb', actualBackup, this.dbName);
|
|
144
73
|
});
|
|
145
|
-
});
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
74
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
assert.ok(nock.isDone());
|
|
163
|
-
resolve();
|
|
164
|
-
} catch (err) {
|
|
165
|
-
reject(err);
|
|
166
|
-
}
|
|
75
|
+
it('should backup/restore animaldb with backup buffer > restore buffer', async function() {
|
|
76
|
+
// Allow up to 60 s for backup and restore of animaldb
|
|
77
|
+
u.setTimeout(this, 60);
|
|
78
|
+
const actualBackup = `./${this.fileName}`;
|
|
79
|
+
const logFile = `./${this.fileName}` + '.log';
|
|
80
|
+
const dbName = this.dbName;
|
|
81
|
+
const p = u.p(params, { opts: { log: logFile, bufferSize: 2 } }); // backup
|
|
82
|
+
const q = u.p(params, { opts: { bufferSize: 1 } }); // restore
|
|
83
|
+
return u.testBackupToFile(p, 'animaldb', actualBackup).then(() => {
|
|
84
|
+
return u.testRestoreFromFile(q, actualBackup, dbName);
|
|
85
|
+
}).then(() => {
|
|
86
|
+
return u.dbCompare('animaldb', dbName);
|
|
87
|
+
});
|
|
167
88
|
});
|
|
168
|
-
});
|
|
169
|
-
});
|
|
170
89
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
resolve();
|
|
185
|
-
} catch (err) {
|
|
186
|
-
reject(err);
|
|
187
|
-
}
|
|
90
|
+
it('should backup/restore animaldb with backup buffer < restore buffer', async function() {
|
|
91
|
+
// Allow up to 60 s for backup and restore of animaldb
|
|
92
|
+
u.setTimeout(this, 60);
|
|
93
|
+
const actualBackup = `./${this.fileName}`;
|
|
94
|
+
const logFile = `./${this.fileName}` + '.log';
|
|
95
|
+
const dbName = this.dbName;
|
|
96
|
+
const p = u.p(params, { opts: { log: logFile, bufferSize: 1 } }); // backup
|
|
97
|
+
const q = u.p(params, { opts: { bufferSize: 2 } }); // restore
|
|
98
|
+
return u.testBackupToFile(p, 'animaldb', actualBackup).then(() => {
|
|
99
|
+
return u.testRestoreFromFile(q, actualBackup, dbName);
|
|
100
|
+
}).then(() => {
|
|
101
|
+
return u.dbCompare('animaldb', dbName);
|
|
102
|
+
});
|
|
188
103
|
});
|
|
189
104
|
});
|
|
190
105
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Copyright ©
|
|
1
|
+
// Copyright © 2018, 2023 IBM Corp. All rights reserved.
|
|
2
2
|
//
|
|
3
3
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
4
|
// you may not use this file except in compliance with the License.
|
|
@@ -15,23 +15,61 @@
|
|
|
15
15
|
/* global describe it */
|
|
16
16
|
'use strict';
|
|
17
17
|
|
|
18
|
+
const fs = require('fs');
|
|
19
|
+
const { once } = require('node:events');
|
|
20
|
+
const readline = require('readline');
|
|
18
21
|
const u = require('./citestutils.js');
|
|
22
|
+
const uuid = require('uuid').v4;
|
|
19
23
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
24
|
+
const params = { useApi: true };
|
|
25
|
+
|
|
26
|
+
describe(u.scenario('Concurrent database backups', params), function() {
|
|
27
|
+
it('should run concurrent API database backups correctly #slower', async function() {
|
|
28
|
+
// Allow up to 900 s to backup and compare (it should be much faster)!
|
|
29
|
+
u.setTimeout(this, 900);
|
|
30
|
+
|
|
31
|
+
const checkForEmptyBatches = async function(fileName) {
|
|
32
|
+
let foundEmptyBatch = false;
|
|
33
|
+
|
|
34
|
+
const rd = readline.createInterface({
|
|
35
|
+
input: fs.createReadStream(fileName),
|
|
36
|
+
output: fs.createWriteStream('/dev/null'),
|
|
37
|
+
terminal: false
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
rd.on('line', function(line) {
|
|
41
|
+
if (JSON.parse(line).length === 0) {
|
|
42
|
+
// Note: Empty batch arrays indicate that the running backup is
|
|
43
|
+
// incorrectly sharing a log file with another ongoing backup job.
|
|
44
|
+
foundEmptyBatch = true;
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
rd.on('close', function() {
|
|
49
|
+
if (foundEmptyBatch) {
|
|
50
|
+
return Promise.reject(new Error(`Log file '${fileName}' contains empty batches`));
|
|
51
|
+
} else {
|
|
52
|
+
return Promise.resolve();
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const backupPromise = async function() {
|
|
58
|
+
const actualBackup = `./${uuid()}`;
|
|
59
|
+
const output = fs.createWriteStream(actualBackup);
|
|
60
|
+
return once(output, 'open').then(() => {
|
|
61
|
+
return u.testBackup(params, 'largedb1g', output);
|
|
62
|
+
}).then(() => {
|
|
63
|
+
return checkForEmptyBatches(actualBackup);
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
// [1] Run 'largedb1g' database backup
|
|
68
|
+
const backup1 = backupPromise();
|
|
69
|
+
|
|
70
|
+
// [2] Run 'largedb1g' database backup
|
|
71
|
+
const backup2 = backupPromise();
|
|
29
72
|
|
|
30
|
-
|
|
31
|
-
u.setTimeout(this, 40);
|
|
32
|
-
// Use the API so we can get events, pass eventEmitter so we get the emitter back
|
|
33
|
-
const params = { useApi: true };
|
|
34
|
-
const actualBackup = `./${this.fileName}`;
|
|
35
|
-
return u.testBackupToFile(params, 'animaldb', actualBackup);
|
|
73
|
+
return Promise.all([backup1, backup2]);
|
|
36
74
|
});
|
|
37
75
|
});
|