@cloudant/couchbackup 2.9.15 → 2.9.16-SNAPSHOT.179
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.scannerwork/report-task.txt +2 -2
- package/.scannerwork/scanner-report/analysis-cache2.pb +0 -0
- package/.scannerwork/scanner-report/analysis-warnings.pb +2 -2
- package/.scannerwork/scanner-report/changesets-10.pb +2 -0
- package/.scannerwork/scanner-report/changesets-11.pb +1 -0
- package/.scannerwork/scanner-report/changesets-13.pb +1 -0
- package/.scannerwork/scanner-report/changesets-15.pb +1 -0
- package/.scannerwork/scanner-report/changesets-3.pb +1 -0
- package/.scannerwork/scanner-report/changesets-4.pb +1 -0
- package/.scannerwork/scanner-report/changesets-40.pb +1 -0
- package/.scannerwork/scanner-report/changesets-41.pb +1 -0
- package/.scannerwork/scanner-report/changesets-42.pb +1 -0
- package/.scannerwork/scanner-report/changesets-43.pb +1 -0
- package/.scannerwork/scanner-report/changesets-44.pb +1 -0
- package/.scannerwork/scanner-report/changesets-5.pb +1 -0
- package/.scannerwork/scanner-report/changesets-6.pb +1 -0
- package/.scannerwork/scanner-report/changesets-7.pb +1 -0
- package/.scannerwork/scanner-report/changesets-70.pb +1 -0
- package/.scannerwork/scanner-report/changesets-8.pb +1 -0
- package/.scannerwork/scanner-report/changesets-9.pb +1 -0
- package/.scannerwork/scanner-report/component-1.pb +2 -2
- package/.scannerwork/scanner-report/component-10.pb +1 -1
- package/.scannerwork/scanner-report/component-11.pb +1 -0
- package/.scannerwork/scanner-report/component-12.pb +1 -1
- package/.scannerwork/scanner-report/component-13.pb +1 -0
- package/.scannerwork/scanner-report/component-14.pb +1 -1
- package/.scannerwork/scanner-report/component-15.pb +1 -0
- package/.scannerwork/scanner-report/component-16.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-24.pb +1 -1
- package/.scannerwork/scanner-report/component-27.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-34.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 -1
- package/.scannerwork/scanner-report/component-4.pb +1 -0
- package/.scannerwork/scanner-report/component-40.pb +1 -0
- package/.scannerwork/scanner-report/component-41.pb +1 -0
- package/.scannerwork/scanner-report/component-42.pb +1 -0
- package/.scannerwork/scanner-report/component-43.pb +1 -0
- package/.scannerwork/scanner-report/component-44.pb +1 -0
- package/.scannerwork/scanner-report/component-5.pb +1 -0
- 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-61.pb +1 -1
- package/.scannerwork/scanner-report/component-62.pb +1 -1
- package/.scannerwork/scanner-report/component-63.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-7.pb +1 -0
- package/.scannerwork/scanner-report/component-70.pb +1 -1
- package/.scannerwork/scanner-report/component-8.pb +1 -0
- package/.scannerwork/scanner-report/component-9.pb +1 -0
- package/.scannerwork/scanner-report/coverages-10.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-18.pb +0 -0
- package/.scannerwork/scanner-report/coverages-19.pb +0 -0
- package/.scannerwork/scanner-report/coverages-24.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-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-4.pb +0 -0
- package/.scannerwork/scanner-report/coverages-40.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-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-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-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/coverages-7.pb +0 -0
- package/.scannerwork/scanner-report/coverages-70.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-10.pb +2 -0
- package/.scannerwork/scanner-report/duplications-12.pb +0 -2
- package/.scannerwork/scanner-report/duplications-13.pb +3 -0
- package/.scannerwork/scanner-report/duplications-14.pb +0 -2
- package/.scannerwork/scanner-report/duplications-18.pb +2 -0
- package/.scannerwork/scanner-report/duplications-19.pb +2 -0
- package/.scannerwork/scanner-report/duplications-39.pb +0 -2
- package/.scannerwork/scanner-report/duplications-43.pb +2 -0
- package/.scannerwork/scanner-report/duplications-56.pb +0 -2
- package/.scannerwork/scanner-report/duplications-60.pb +3 -0
- package/.scannerwork/scanner-report/duplications-66.pb +0 -2
- package/.scannerwork/scanner-report/measures-10.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-18.pb +0 -0
- package/.scannerwork/scanner-report/measures-19.pb +0 -0
- package/.scannerwork/scanner-report/measures-2.pb +0 -0
- package/.scannerwork/scanner-report/measures-24.pb +0 -0
- package/.scannerwork/scanner-report/measures-27.pb +0 -0
- package/.scannerwork/scanner-report/measures-29.pb +0 -0
- package/.scannerwork/scanner-report/measures-3.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-34.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-4.pb +0 -0
- package/.scannerwork/scanner-report/measures-40.pb +0 -0
- package/.scannerwork/scanner-report/measures-43.pb +0 -0
- package/.scannerwork/scanner-report/measures-44.pb +15 -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-63.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-7.pb +0 -0
- package/.scannerwork/scanner-report/measures-70.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 +92 -424
- package/.scannerwork/scanner-report/source-12.txt +150 -162
- package/.scannerwork/scanner-report/source-13.txt +75 -0
- package/.scannerwork/scanner-report/source-14.txt +88 -150
- package/.scannerwork/scanner-report/source-15.txt +281 -0
- package/.scannerwork/scanner-report/source-16.txt +21 -26
- package/.scannerwork/scanner-report/source-18.txt +154 -113
- package/.scannerwork/scanner-report/source-19.txt +170 -17
- package/.scannerwork/scanner-report/source-2.txt +424 -0
- package/.scannerwork/scanner-report/source-24.txt +397 -15
- package/.scannerwork/scanner-report/source-27.txt +102 -100
- package/.scannerwork/scanner-report/source-29.txt +424 -42
- package/.scannerwork/scanner-report/source-3.txt +46 -424
- package/.scannerwork/scanner-report/source-30.txt +65 -13
- package/.scannerwork/scanner-report/source-31.txt +43 -20
- package/.scannerwork/scanner-report/source-34.txt +424 -106
- package/.scannerwork/scanner-report/source-36.txt +40 -129
- package/.scannerwork/scanner-report/source-37.txt +101 -158
- package/.scannerwork/scanner-report/source-38.txt +161 -10
- package/.scannerwork/scanner-report/source-39.txt +18 -168
- package/.scannerwork/scanner-report/source-4.txt +31 -0
- package/.scannerwork/scanner-report/source-40.txt +29 -0
- package/.scannerwork/scanner-report/source-43.txt +187 -0
- package/.scannerwork/scanner-report/source-44.txt +151 -0
- package/.scannerwork/scanner-report/source-56.txt +15 -58
- package/.scannerwork/scanner-report/source-57.txt +22 -263
- package/.scannerwork/scanner-report/source-58.txt +116 -66
- package/.scannerwork/scanner-report/source-59.txt +47 -150
- package/.scannerwork/scanner-report/source-6.txt +111 -102
- package/.scannerwork/scanner-report/source-60.txt +199 -99
- package/.scannerwork/scanner-report/source-61.txt +430 -40
- package/.scannerwork/scanner-report/source-62.txt +92 -115
- package/.scannerwork/scanner-report/source-63.txt +87 -17
- package/.scannerwork/scanner-report/source-64.txt +79 -20
- package/.scannerwork/scanner-report/source-65.txt +26 -95
- package/.scannerwork/scanner-report/source-66.txt +26 -77
- package/.scannerwork/scanner-report/source-67.txt +41 -390
- package/.scannerwork/scanner-report/source-68.txt +20 -43
- package/.scannerwork/scanner-report/source-69.txt +274 -62
- package/.scannerwork/scanner-report/source-7.txt +59 -0
- package/.scannerwork/scanner-report/source-70.txt +46 -424
- package/.scannerwork/scanner-report/source-8.txt +80 -0
- package/.scannerwork/scanner-report/source-9.txt +129 -0
- package/.scannerwork/scanner-report/symbols-10.pb +44 -0
- package/.scannerwork/scanner-report/symbols-12.pb +143 -179
- package/.scannerwork/scanner-report/symbols-13.pb +42 -0
- package/.scannerwork/scanner-report/symbols-14.pb +45 -152
- package/.scannerwork/scanner-report/symbols-15.pb +354 -0
- package/.scannerwork/scanner-report/symbols-16.pb +18 -7
- package/.scannerwork/scanner-report/symbols-18.pb +153 -71
- package/.scannerwork/scanner-report/symbols-19.pb +180 -9
- package/.scannerwork/scanner-report/symbols-24.pb +604 -9
- package/.scannerwork/scanner-report/symbols-30.pb +32 -8
- package/.scannerwork/scanner-report/symbols-31.pb +21 -13
- package/.scannerwork/scanner-report/symbols-36.pb +22 -91
- package/.scannerwork/scanner-report/symbols-37.pb +71 -209
- package/.scannerwork/scanner-report/symbols-38.pb +207 -21
- package/.scannerwork/scanner-report/symbols-39.pb +9 -227
- package/.scannerwork/scanner-report/symbols-4.pb +14 -0
- package/.scannerwork/scanner-report/symbols-40.pb +8 -0
- package/.scannerwork/scanner-report/symbols-43.pb +227 -0
- package/.scannerwork/scanner-report/symbols-44.pb +93 -0
- package/.scannerwork/scanner-report/symbols-56.pb +9 -42
- package/.scannerwork/scanner-report/symbols-57.pb +23 -354
- package/.scannerwork/scanner-report/symbols-58.pb +86 -46
- package/.scannerwork/scanner-report/symbols-59.pb +39 -144
- package/.scannerwork/scanner-report/symbols-6.pb +59 -0
- package/.scannerwork/scanner-report/symbols-60.pb +264 -46
- package/.scannerwork/scanner-report/symbols-61.pb +789 -18
- package/.scannerwork/scanner-report/symbols-62.pb +59 -33
- package/.scannerwork/scanner-report/symbols-63.pb +57 -13
- package/.scannerwork/scanner-report/symbols-64.pb +68 -17
- package/.scannerwork/scanner-report/symbols-65.pb +19 -59
- package/.scannerwork/scanner-report/symbols-66.pb +30 -43
- package/.scannerwork/scanner-report/symbols-67.pb +33 -604
- package/.scannerwork/scanner-report/symbols-68.pb +13 -21
- package/.scannerwork/scanner-report/symbols-69.pb +428 -32
- package/.scannerwork/scanner-report/symbols-7.pb +19 -0
- package/.scannerwork/scanner-report/symbols-70.pb +7 -0
- package/.scannerwork/scanner-report/symbols-8.pb +46 -0
- package/.scannerwork/scanner-report/symbols-9.pb +33 -0
- package/.scannerwork/scanner-report/syntax-highlightings-10.pb +82 -3329
- package/.scannerwork/scanner-report/syntax-highlightings-12.pb +171 -153
- package/.scannerwork/scanner-report/syntax-highlightings-13.pb +81 -0
- package/.scannerwork/scanner-report/syntax-highlightings-14.pb +90 -178
- package/.scannerwork/scanner-report/syntax-highlightings-15.pb +285 -0
- package/.scannerwork/scanner-report/syntax-highlightings-16.pb +22 -32
- package/.scannerwork/scanner-report/syntax-highlightings-18.pb +168 -135
- package/.scannerwork/scanner-report/syntax-highlightings-19.pb +195 -31
- package/.scannerwork/scanner-report/syntax-highlightings-2.pb +3341 -0
- package/.scannerwork/scanner-report/syntax-highlightings-24.pb +611 -24
- package/.scannerwork/scanner-report/syntax-highlightings-27.pb +690 -105
- package/.scannerwork/scanner-report/syntax-highlightings-29.pb +3331 -55
- package/.scannerwork/scanner-report/syntax-highlightings-3.pb +53 -3331
- package/.scannerwork/scanner-report/syntax-highlightings-30.pb +81 -30
- package/.scannerwork/scanner-report/syntax-highlightings-31.pb +63 -43
- package/.scannerwork/scanner-report/syntax-highlightings-34.pb +3331 -167
- package/.scannerwork/scanner-report/syntax-highlightings-36.pb +59 -199
- package/.scannerwork/scanner-report/syntax-highlightings-37.pb +127 -236
- package/.scannerwork/scanner-report/syntax-highlightings-38.pb +250 -16
- package/.scannerwork/scanner-report/syntax-highlightings-39.pb +25 -332
- package/.scannerwork/scanner-report/syntax-highlightings-4.pb +45 -0
- package/.scannerwork/scanner-report/syntax-highlightings-40.pb +49 -0
- package/.scannerwork/scanner-report/syntax-highlightings-43.pb +368 -0
- package/.scannerwork/scanner-report/syntax-highlightings-44.pb +237 -0
- package/.scannerwork/scanner-report/syntax-highlightings-56.pb +22 -49
- package/.scannerwork/scanner-report/syntax-highlightings-57.pb +20 -249
- package/.scannerwork/scanner-report/syntax-highlightings-58.pb +92 -62
- package/.scannerwork/scanner-report/syntax-highlightings-59.pb +59 -201
- package/.scannerwork/scanner-report/syntax-highlightings-6.pb +131 -689
- package/.scannerwork/scanner-report/syntax-highlightings-60.pb +261 -90
- package/.scannerwork/scanner-report/syntax-highlightings-61.pb +591 -23
- package/.scannerwork/scanner-report/syntax-highlightings-62.pb +141 -92
- package/.scannerwork/scanner-report/syntax-highlightings-63.pb +124 -15
- package/.scannerwork/scanner-report/syntax-highlightings-64.pb +75 -20
- package/.scannerwork/scanner-report/syntax-highlightings-65.pb +28 -95
- package/.scannerwork/scanner-report/syntax-highlightings-66.pb +36 -60
- package/.scannerwork/scanner-report/syntax-highlightings-67.pb +69 -600
- package/.scannerwork/scanner-report/syntax-highlightings-68.pb +43 -63
- package/.scannerwork/scanner-report/syntax-highlightings-69.pb +689 -69
- package/.scannerwork/scanner-report/syntax-highlightings-7.pb +59 -0
- package/.scannerwork/scanner-report/syntax-highlightings-70.pb +51 -3328
- package/.scannerwork/scanner-report/syntax-highlightings-8.pb +95 -0
- package/.scannerwork/scanner-report/syntax-highlightings-9.pb +129 -0
- package/package.json +1 -1
- package/test-18-results.xml +160 -160
- package/test-20-results.xml +163 -163
- package/test-21-results.xml +161 -161
- package/test-iam-20-results.xml +50 -50
- package/.scannerwork/scanner-report/changesets-17.pb +0 -1
- package/.scannerwork/scanner-report/changesets-20.pb +0 -1
- package/.scannerwork/scanner-report/changesets-21.pb +0 -1
- package/.scannerwork/scanner-report/changesets-22.pb +0 -1
- package/.scannerwork/scanner-report/changesets-23.pb +0 -1
- package/.scannerwork/scanner-report/changesets-25.pb +0 -1
- package/.scannerwork/scanner-report/changesets-26.pb +0 -1
- package/.scannerwork/scanner-report/changesets-27.pb +0 -1
- package/.scannerwork/scanner-report/changesets-28.pb +0 -1
- package/.scannerwork/scanner-report/changesets-29.pb +0 -1
- package/.scannerwork/scanner-report/changesets-32.pb +0 -1
- package/.scannerwork/scanner-report/changesets-33.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-53.pb +0 -1
- package/.scannerwork/scanner-report/changesets-54.pb +0 -1
- package/.scannerwork/scanner-report/changesets-55.pb +0 -1
- package/.scannerwork/scanner-report/component-17.pb +0 -1
- package/.scannerwork/scanner-report/component-20.pb +0 -1
- package/.scannerwork/scanner-report/component-21.pb +0 -1
- package/.scannerwork/scanner-report/component-22.pb +0 -1
- package/.scannerwork/scanner-report/component-23.pb +0 -1
- package/.scannerwork/scanner-report/component-25.pb +0 -1
- package/.scannerwork/scanner-report/component-26.pb +0 -1
- package/.scannerwork/scanner-report/component-28.pb +0 -1
- package/.scannerwork/scanner-report/component-32.pb +0 -1
- package/.scannerwork/scanner-report/component-33.pb +0 -1
- package/.scannerwork/scanner-report/component-35.pb +0 -1
- package/.scannerwork/scanner-report/component-53.pb +0 -1
- package/.scannerwork/scanner-report/component-54.pb +0 -1
- package/.scannerwork/scanner-report/component-55.pb +0 -1
- package/.scannerwork/scanner-report/coverages-17.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-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-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/duplications-26.pb +0 -3
- package/.scannerwork/scanner-report/duplications-54.pb +0 -0
- package/.scannerwork/scanner-report/duplications-55.pb +0 -0
- package/.scannerwork/scanner-report/measures-17.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 -16
- package/.scannerwork/scanner-report/measures-23.pb +0 -0
- package/.scannerwork/scanner-report/measures-26.pb +0 -0
- package/.scannerwork/scanner-report/measures-28.pb +0 -0
- package/.scannerwork/scanner-report/measures-33.pb +0 -0
- package/.scannerwork/scanner-report/measures-35.pb +0 -0
- package/.scannerwork/scanner-report/measures-54.pb +0 -0
- package/.scannerwork/scanner-report/source-17.txt +0 -130
- package/.scannerwork/scanner-report/source-20.txt +0 -62
- package/.scannerwork/scanner-report/source-21.txt +0 -41
- package/.scannerwork/scanner-report/source-22.txt +0 -293
- package/.scannerwork/scanner-report/source-23.txt +0 -101
- package/.scannerwork/scanner-report/source-26.txt +0 -213
- package/.scannerwork/scanner-report/source-28.txt +0 -449
- package/.scannerwork/scanner-report/source-33.txt +0 -65
- package/.scannerwork/scanner-report/source-35.txt +0 -75
- package/.scannerwork/scanner-report/source-54.txt +0 -46
- package/.scannerwork/scanner-report/symbols-17.pb +0 -86
- package/.scannerwork/scanner-report/symbols-20.pb +0 -24
- package/.scannerwork/scanner-report/symbols-21.pb +0 -31
- package/.scannerwork/scanner-report/symbols-22.pb +0 -428
- package/.scannerwork/scanner-report/symbols-23.pb +0 -58
- package/.scannerwork/scanner-report/symbols-26.pb +0 -264
- package/.scannerwork/scanner-report/symbols-27.pb +0 -69
- package/.scannerwork/scanner-report/symbols-28.pb +0 -790
- package/.scannerwork/scanner-report/symbols-29.pb +0 -19
- package/.scannerwork/scanner-report/symbols-33.pb +0 -33
- package/.scannerwork/scanner-report/symbols-34.pb +0 -59
- package/.scannerwork/scanner-report/symbols-35.pb +0 -39
- package/.scannerwork/scanner-report/syntax-highlightings-17.pb +0 -125
- package/.scannerwork/scanner-report/syntax-highlightings-20.pb +0 -97
- package/.scannerwork/scanner-report/syntax-highlightings-21.pb +0 -69
- package/.scannerwork/scanner-report/syntax-highlightings-22.pb +0 -720
- package/.scannerwork/scanner-report/syntax-highlightings-23.pb +0 -154
- package/.scannerwork/scanner-report/syntax-highlightings-26.pb +0 -297
- package/.scannerwork/scanner-report/syntax-highlightings-28.pb +0 -627
- package/.scannerwork/scanner-report/syntax-highlightings-33.pb +0 -110
- package/.scannerwork/scanner-report/syntax-highlightings-35.pb +0 -101
- package/.scannerwork/scanner-report/syntax-highlightings-54.pb +0 -64
- /package/.scannerwork/scanner-report/{coverages-53.pb → coverages-11.pb} +0 -0
- /package/.scannerwork/scanner-report/{coverages-54.pb → coverages-3.pb} +0 -0
- /package/.scannerwork/scanner-report/{coverages-25.pb → coverages-41.pb} +0 -0
- /package/.scannerwork/scanner-report/{coverages-32.pb → coverages-42.pb} +0 -0
- /package/.scannerwork/scanner-report/{coverages-55.pb → coverages-5.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-17.pb → duplications-11.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-20.pb → duplications-15.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-21.pb → duplications-3.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-22.pb → duplications-30.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-23.pb → duplications-4.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-25.pb → duplications-41.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-27.pb → duplications-42.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-28.pb → duplications-44.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-29.pb → duplications-5.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-32.pb → duplications-6.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-33.pb → duplications-7.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-34.pb → duplications-70.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-35.pb → duplications-8.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-53.pb → duplications-9.pb} +0 -0
- /package/.scannerwork/scanner-report/{issues-32.pb → issues-42.pb} +0 -0
- /package/.scannerwork/scanner-report/{issues-17.pb → issues-58.pb} +0 -0
- /package/.scannerwork/scanner-report/{issues-26.pb → issues-60.pb} +0 -0
- /package/.scannerwork/scanner-report/{issues-29.pb → issues-65.pb} +0 -0
- /package/.scannerwork/scanner-report/{measures-53.pb → measures-11.pb} +0 -0
- /package/.scannerwork/scanner-report/{measures-25.pb → measures-41.pb} +0 -0
- /package/.scannerwork/scanner-report/{measures-32.pb → measures-42.pb} +0 -0
- /package/.scannerwork/scanner-report/{measures-55.pb → measures-5.pb} +0 -0
- /package/.scannerwork/scanner-report/{source-53.txt → source-11.txt} +0 -0
- /package/.scannerwork/scanner-report/{source-25.txt → source-41.txt} +0 -0
- /package/.scannerwork/scanner-report/{source-32.txt → source-42.txt} +0 -0
- /package/.scannerwork/scanner-report/{source-55.txt → source-5.txt} +0 -0
- /package/.scannerwork/scanner-report/{symbols-53.pb → symbols-11.pb} +0 -0
- /package/.scannerwork/scanner-report/{symbols-54.pb → symbols-3.pb} +0 -0
- /package/.scannerwork/scanner-report/{symbols-25.pb → symbols-41.pb} +0 -0
- /package/.scannerwork/scanner-report/{symbols-32.pb → symbols-42.pb} +0 -0
- /package/.scannerwork/scanner-report/{symbols-55.pb → symbols-5.pb} +0 -0
- /package/.scannerwork/scanner-report/{syntax-highlightings-53.pb → syntax-highlightings-11.pb} +0 -0
- /package/.scannerwork/scanner-report/{syntax-highlightings-25.pb → syntax-highlightings-41.pb} +0 -0
- /package/.scannerwork/scanner-report/{syntax-highlightings-32.pb → syntax-highlightings-42.pb} +0 -0
- /package/.scannerwork/scanner-report/{syntax-highlightings-55.pb → syntax-highlightings-5.pb} +0 -0
|
@@ -1,449 +0,0 @@
|
|
|
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 */
|
|
16
|
-
'use strict';
|
|
17
|
-
|
|
18
|
-
const assert = require('node:assert');
|
|
19
|
-
const { once } = require('node:events');
|
|
20
|
-
const fs = require('node:fs');
|
|
21
|
-
const { PassThrough } = require('node:stream');
|
|
22
|
-
const { pipeline } = require('node:stream/promises');
|
|
23
|
-
const { createGzip, createGunzip } = require('node:zlib');
|
|
24
|
-
const debug = require('debug');
|
|
25
|
-
const { Tail } = require('tail');
|
|
26
|
-
const app = require('../app.js');
|
|
27
|
-
const dbUrl = require('../includes/cliutils.js').databaseUrl;
|
|
28
|
-
const compare = require('./compare.js');
|
|
29
|
-
const request = require('../includes/request.js');
|
|
30
|
-
const { cliBackup, cliDecrypt, cliEncrypt, cliGzip, cliGunzip, cliRestore } = require('./test_process.js');
|
|
31
|
-
const testLogger = debug('couchbackup:test:utils');
|
|
32
|
-
|
|
33
|
-
function scenario(test, params) {
|
|
34
|
-
return `${test} ${(params.useApi) ? 'using API' : 'using CLI'}`;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
function params() {
|
|
38
|
-
const p = {};
|
|
39
|
-
for (let i = 0; i < arguments.length; i++) {
|
|
40
|
-
Object.assign(p, arguments[i]);
|
|
41
|
-
}
|
|
42
|
-
return p;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// Returns the event emitter for API calls, or the child process for CLI calls
|
|
46
|
-
async function testBackup(params, databaseName, outputStream) {
|
|
47
|
-
const pipelineStreams = [];
|
|
48
|
-
const promises = [];
|
|
49
|
-
|
|
50
|
-
// Configure API key if needed
|
|
51
|
-
augmentParamsWithApiKey(params);
|
|
52
|
-
|
|
53
|
-
let backup;
|
|
54
|
-
let backupStream;
|
|
55
|
-
let backupPromise;
|
|
56
|
-
let tail;
|
|
57
|
-
if (params.useApi) {
|
|
58
|
-
if (params.useStdOut) {
|
|
59
|
-
backupStream = outputStream;
|
|
60
|
-
} else {
|
|
61
|
-
backupStream = new PassThrough();
|
|
62
|
-
}
|
|
63
|
-
const backupCallbackPromise = new Promise((resolve, reject) => {
|
|
64
|
-
backup = app.backup(
|
|
65
|
-
dbUrl(process.env.COUCH_URL, databaseName),
|
|
66
|
-
backupStream,
|
|
67
|
-
params.opts,
|
|
68
|
-
(err, data) => {
|
|
69
|
-
if (err) {
|
|
70
|
-
testLogger(`API backup callback with ${JSON.stringify(err)}, will reject.`);
|
|
71
|
-
reject(err);
|
|
72
|
-
} else {
|
|
73
|
-
testLogger(`API backup callback with ${JSON.stringify(data)}, will resolve.`);
|
|
74
|
-
resolve(data);
|
|
75
|
-
}
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
const backupFinshedPromise = once(backup, 'finished')
|
|
79
|
-
.then((summary) => {
|
|
80
|
-
testLogger(`Resolving API backup event promise with ${JSON.stringify(summary)}`);
|
|
81
|
-
if (params.resume) {
|
|
82
|
-
assertWrittenFewerThan(summary.total, params.exclusiveMaxExpected);
|
|
83
|
-
}
|
|
84
|
-
})
|
|
85
|
-
.catch((err) => {
|
|
86
|
-
testLogger(`Rejecting API backup event promise with error ${JSON.stringify(err)}`);
|
|
87
|
-
throw err;
|
|
88
|
-
});
|
|
89
|
-
backupPromise = Promise.all([backupCallbackPromise, backupFinshedPromise])
|
|
90
|
-
.then(() => {
|
|
91
|
-
testLogger('Both API backup promises resolved.');
|
|
92
|
-
});
|
|
93
|
-
} else {
|
|
94
|
-
backup = cliBackup(databaseName, params);
|
|
95
|
-
backupStream = backup.stream;
|
|
96
|
-
backupPromise = backup.childProcessPromise;
|
|
97
|
-
if (params.abort) {
|
|
98
|
-
// Create the log file for abort tests so we can tail it, other tests assert
|
|
99
|
-
// the log file is usually created normally by the backup process.
|
|
100
|
-
const f = fs.openSync(params.opts.log, 'w');
|
|
101
|
-
fs.closeSync(f);
|
|
102
|
-
|
|
103
|
-
// Use tail to watch the log file for a batch to be completed then abort
|
|
104
|
-
tail = new Tail(params.opts.log, { useWatchFile: true, fsWatchOptions: { interval: 500 }, follow: false });
|
|
105
|
-
tail.on('line', function(data) {
|
|
106
|
-
const matches = data.match(/:d batch\d+/);
|
|
107
|
-
if (matches !== null) {
|
|
108
|
-
// Turn off the tail.
|
|
109
|
-
tail.unwatch();
|
|
110
|
-
// Abort the backup
|
|
111
|
-
backup.childProcess.kill();
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
if (params.resume) {
|
|
116
|
-
const listenerPromise = new Promise((resolve, reject) => {
|
|
117
|
-
const listener = function(data) {
|
|
118
|
-
const matches = data.toString().match(/.*Finished - Total document revisions written: (\d+).*/);
|
|
119
|
-
if (matches !== null) {
|
|
120
|
-
try {
|
|
121
|
-
assertWrittenFewerThan(matches[1], params.exclusiveMaxExpected);
|
|
122
|
-
resolve();
|
|
123
|
-
} catch (err) {
|
|
124
|
-
reject(err);
|
|
125
|
-
}
|
|
126
|
-
process.stderr.removeListener('data', listener);
|
|
127
|
-
}
|
|
128
|
-
};
|
|
129
|
-
backup.childProcess.stderr.on('data', listener);
|
|
130
|
-
});
|
|
131
|
-
promises.push(listenerPromise);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
promises.push(backupPromise);
|
|
136
|
-
if (!params.useStdOut) {
|
|
137
|
-
pipelineStreams.push(backupStream);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
if (params.compression) {
|
|
141
|
-
if (params.useApi) {
|
|
142
|
-
pipelineStreams.push(createGzip());
|
|
143
|
-
} else {
|
|
144
|
-
const gzipProcess = cliGzip();
|
|
145
|
-
pipelineStreams.push(gzipProcess.stream);
|
|
146
|
-
promises.push(gzipProcess.childProcessPromise);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// Pipe via encryption if requested
|
|
151
|
-
if (params.encryption) {
|
|
152
|
-
if (params.useApi) {
|
|
153
|
-
// Currently only CLI support for testing encryption
|
|
154
|
-
return Promise.reject(new Error('Not implemented: cannot test encrypted API backups at this time.'));
|
|
155
|
-
} else {
|
|
156
|
-
const encryptProcess = cliEncrypt();
|
|
157
|
-
pipelineStreams.push(encryptProcess.stream);
|
|
158
|
-
promises.push(encryptProcess.childProcessPromise);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
if (!params.useStdOut) {
|
|
163
|
-
// Finally add the outputStream to the list we want to pipeline
|
|
164
|
-
pipelineStreams.push(outputStream);
|
|
165
|
-
|
|
166
|
-
// Create the promisified pipeline and add it to the array of promises we'll wait for
|
|
167
|
-
promises.unshift(pipeline(pipelineStreams));
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
// Wait for the promises and then assert
|
|
171
|
-
return Promise.all(promises)
|
|
172
|
-
.then(() => testLogger('All backup promises resolved.'))
|
|
173
|
-
.then(() => {
|
|
174
|
-
if (params.expectedBackupError) {
|
|
175
|
-
return Promise.reject(new Error('Backup passed when it should have failed.'));
|
|
176
|
-
}
|
|
177
|
-
})
|
|
178
|
-
.catch((err) => {
|
|
179
|
-
if (params.expectedBackupError || params.abort) {
|
|
180
|
-
if (params.useApi) {
|
|
181
|
-
assert.strictEqual(err.name, params.expectedBackupError.name, 'The backup should receive the expected error.');
|
|
182
|
-
} else {
|
|
183
|
-
if (params.abort) {
|
|
184
|
-
// The tail should be stopped when we match a line and abort, but if
|
|
185
|
-
// something didn't work we need to make sure the tail is stopped
|
|
186
|
-
tail.unwatch();
|
|
187
|
-
// Assert that the process was aborted as expected
|
|
188
|
-
assert.strictEqual(err.signal, 'SIGTERM', `The backup should have terminated with SIGTERM, but was ${err.signal}.`);
|
|
189
|
-
} else if (params.expectedBackupError) {
|
|
190
|
-
assert.strictEqual(err.code, params.expectedBackupError.code, `The backup exited with unexpected code ${err.code} and signal ${err.signal}.`);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
} else {
|
|
194
|
-
return Promise.reject(err);
|
|
195
|
-
}
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
async function testRestore(params, inputStream, databaseName) {
|
|
200
|
-
const pipelineStreams = [inputStream];
|
|
201
|
-
const promises = [];
|
|
202
|
-
|
|
203
|
-
// Configure API key if needed
|
|
204
|
-
augmentParamsWithApiKey(params);
|
|
205
|
-
|
|
206
|
-
let restore;
|
|
207
|
-
let restoreStream;
|
|
208
|
-
let restorePromise;
|
|
209
|
-
|
|
210
|
-
if (params.useApi) {
|
|
211
|
-
restoreStream = new PassThrough();
|
|
212
|
-
const restoreCallbackPromise = new Promise((resolve, reject) => {
|
|
213
|
-
restore = app.restore(
|
|
214
|
-
restoreStream,
|
|
215
|
-
dbUrl(process.env.COUCH_URL, databaseName),
|
|
216
|
-
params.opts,
|
|
217
|
-
(err, data) => {
|
|
218
|
-
if (err) {
|
|
219
|
-
testLogger(`API restore callback with ${err}, will reject.`);
|
|
220
|
-
reject(err);
|
|
221
|
-
} else {
|
|
222
|
-
resolve(data);
|
|
223
|
-
}
|
|
224
|
-
});
|
|
225
|
-
});
|
|
226
|
-
const restoreFinshedPromise = once(restore, 'finished')
|
|
227
|
-
.then((summary) => {
|
|
228
|
-
testLogger(`Resolving API restore promise with ${summary}`);
|
|
229
|
-
})
|
|
230
|
-
.catch((err) => {
|
|
231
|
-
testLogger(`Handling API restore error event ${JSON.stringify(err)}`);
|
|
232
|
-
if (params.expectedRestoreErrorRecoverable) {
|
|
233
|
-
testLogger(`Expecting restore error ${params.expectedRestoreErrorRecoverable.name}`);
|
|
234
|
-
assert.strictEqual(err.name, params.expectedRestoreErrorRecoverable.name, 'The restore should receive the expected recoverable error.');
|
|
235
|
-
} else {
|
|
236
|
-
testLogger(`API restore will reject by throwing error event ${JSON.stringify(err)}`);
|
|
237
|
-
return Promise.reject(err);
|
|
238
|
-
}
|
|
239
|
-
});
|
|
240
|
-
restorePromise = Promise.all([restoreCallbackPromise, restoreFinshedPromise]);
|
|
241
|
-
} else {
|
|
242
|
-
restore = cliRestore(databaseName, params);
|
|
243
|
-
restoreStream = restore.stream;
|
|
244
|
-
restorePromise = restore.childProcessPromise;
|
|
245
|
-
}
|
|
246
|
-
promises.push(restorePromise);
|
|
247
|
-
|
|
248
|
-
// Pipe via decompression if requested
|
|
249
|
-
if (params.compression) {
|
|
250
|
-
if (params.useApi) {
|
|
251
|
-
pipelineStreams.push(createGunzip());
|
|
252
|
-
} else {
|
|
253
|
-
const gunzipProcess = cliGunzip();
|
|
254
|
-
pipelineStreams.push(gunzipProcess.stream);
|
|
255
|
-
promises.push(gunzipProcess.childProcessPromise);
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
// Pipe via decryption if requested
|
|
260
|
-
if (params.encryption) {
|
|
261
|
-
if (params.useApi) {
|
|
262
|
-
// Currently only CLI support for testing encryption
|
|
263
|
-
return Promise.reject(new Error('Not implemented: cannot test encrypted API backups at this time.'));
|
|
264
|
-
} else {
|
|
265
|
-
const decryptProcess = cliDecrypt();
|
|
266
|
-
pipelineStreams.push(decryptProcess.stream);
|
|
267
|
-
promises.push(decryptProcess.childProcessPromise);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
// pipeline everything into the restoreStream
|
|
272
|
-
pipelineStreams.push(restoreStream);
|
|
273
|
-
|
|
274
|
-
// Create the promisified pipeline and add it to the array of promises we'll wait for
|
|
275
|
-
promises.unshift(pipeline(pipelineStreams));
|
|
276
|
-
|
|
277
|
-
// Wait for the all the promises to settle and then assert based on the process promise
|
|
278
|
-
return Promise.allSettled(promises)
|
|
279
|
-
.then(() => { return restorePromise; })
|
|
280
|
-
.then((summary) => {
|
|
281
|
-
testLogger(`Restore promise resolved with ${summary}.`);
|
|
282
|
-
if (params.expectedRestoreError) {
|
|
283
|
-
return Promise.reject(new Error('Restore passed when it should have failed.'));
|
|
284
|
-
}
|
|
285
|
-
})
|
|
286
|
-
.catch((err) => {
|
|
287
|
-
testLogger(`Restore promise rejected with ${err}.`);
|
|
288
|
-
if (params.expectedRestoreError) {
|
|
289
|
-
if (params.useApi) {
|
|
290
|
-
assert.strictEqual(err.name, params.expectedRestoreError.name, 'The restore should receive the expected error.');
|
|
291
|
-
} else {
|
|
292
|
-
assert.strictEqual(err.code, params.expectedRestoreError.code, `The restore exited with unexpected code ${err.code} and signal ${err.signal}.`);
|
|
293
|
-
}
|
|
294
|
-
} else {
|
|
295
|
-
return Promise.reject(err);
|
|
296
|
-
}
|
|
297
|
-
});
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
// Serial backup and restore via a file on disk
|
|
301
|
-
async function testBackupAndRestoreViaFile(params, srcDb, backupFile, targetDb) {
|
|
302
|
-
return testBackupToFile(params, srcDb, backupFile).then(() => {
|
|
303
|
-
return testRestoreFromFile(params, backupFile, targetDb);
|
|
304
|
-
});
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
async function testBackupToFile(params, srcDb, backupFile) {
|
|
308
|
-
// Open the file for appending if this is a resume
|
|
309
|
-
const output = fs.createWriteStream(backupFile, { flags: (params.opts && params.opts.resume) ? 'a' : 'w' });
|
|
310
|
-
return once(output, 'open')
|
|
311
|
-
.then(() => {
|
|
312
|
-
return testBackup(params, srcDb, output);
|
|
313
|
-
});
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
async function testRestoreFromFile(params, backupFile, targetDb) {
|
|
317
|
-
const input = fs.createReadStream(backupFile);
|
|
318
|
-
return once(input, 'open')
|
|
319
|
-
.then(() => {
|
|
320
|
-
return testRestore(params, input, targetDb);
|
|
321
|
-
});
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
async function testDirectBackupAndRestore(params, srcDb, targetDb) {
|
|
325
|
-
// Allow a 64 MB highWaterMark for the passthrough during testing
|
|
326
|
-
const passthrough = new PassThrough({ highWaterMark: 67108864 });
|
|
327
|
-
const backup = testBackup(params, srcDb, passthrough);
|
|
328
|
-
const restore = testRestore(params, passthrough, targetDb);
|
|
329
|
-
return Promise.all([backup, restore]).then(() => {
|
|
330
|
-
return dbCompare(srcDb, targetDb);
|
|
331
|
-
});
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
async function testBackupAbortResumeRestore(params, srcDb, backupFile, targetDb) {
|
|
335
|
-
return Promise.resolve()
|
|
336
|
-
.then(() => {
|
|
337
|
-
// First backup with an abort
|
|
338
|
-
if (params.opts && params.opts.output) {
|
|
339
|
-
return testBackup(params, srcDb, new PassThrough());
|
|
340
|
-
} else {
|
|
341
|
-
return testBackupToFile(params, srcDb, backupFile);
|
|
342
|
-
}
|
|
343
|
-
}).then(() => {
|
|
344
|
-
// Remove the abort parameter and add the resume parameter
|
|
345
|
-
delete params.abort;
|
|
346
|
-
params.opts.resume = true;
|
|
347
|
-
// Resume the backup
|
|
348
|
-
if (params.opts && params.opts.output) {
|
|
349
|
-
return testBackup(params, srcDb, new PassThrough());
|
|
350
|
-
} else {
|
|
351
|
-
return testBackupToFile(params, srcDb, backupFile);
|
|
352
|
-
}
|
|
353
|
-
}).then(() => {
|
|
354
|
-
// Restore the backup
|
|
355
|
-
return testRestoreFromFile(params, backupFile, targetDb);
|
|
356
|
-
}).then(() => {
|
|
357
|
-
// Now compare the restored to the original for validation
|
|
358
|
-
return dbCompare(srcDb, targetDb);
|
|
359
|
-
});
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
async function dbCompare(db1Name, db2Name) {
|
|
363
|
-
const client = request.client(process.env.COUCH_BACKEND_URL, {});
|
|
364
|
-
return compare.compare(db1Name, db2Name, client.service)
|
|
365
|
-
.then(result => {
|
|
366
|
-
return assert.strictEqual(result, true, 'The database comparison should succeed, but failed');
|
|
367
|
-
});
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
function sortByIdThenRev(o1, o2) {
|
|
371
|
-
if (o1._id < o2._id) return -1;
|
|
372
|
-
if (o1._id > o2._id) return 1;
|
|
373
|
-
if (o1._rev < o2._rev) return -1;
|
|
374
|
-
if (o1._rev > o2._rev) return 1;
|
|
375
|
-
return 0;
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
function readSortAndDeepEqual(actualContentPath, expectedContentPath) {
|
|
379
|
-
const backupContent = JSON.parse(fs.readFileSync(actualContentPath, 'utf8'));
|
|
380
|
-
const expectedContent = JSON.parse(fs.readFileSync(expectedContentPath, 'utf8'));
|
|
381
|
-
// Array order of the docs is important for equality, but not for backup
|
|
382
|
-
backupContent.sort(sortByIdThenRev);
|
|
383
|
-
expectedContent.sort(sortByIdThenRev);
|
|
384
|
-
// Assert that the backup matches the expected
|
|
385
|
-
assert.deepStrictEqual(backupContent, expectedContent);
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
function setTimeout(context, timeout) {
|
|
389
|
-
// Increase timeout using TEST_TIMEOUT_MULTIPLIER
|
|
390
|
-
const multiplier = (typeof process.env.TEST_TIMEOUT_MULTIPLIER !== 'undefined') ? parseInt(process.env.TEST_TIMEOUT_MULTIPLIER) : 1;
|
|
391
|
-
timeout *= multiplier;
|
|
392
|
-
// Set the mocha timeout
|
|
393
|
-
context.timeout(timeout * 1000);
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
function assertGzipFile(path) {
|
|
397
|
-
// 1f 8b is the gzip magic number
|
|
398
|
-
const expectedBytes = Buffer.from([0x1f, 0x8b]);
|
|
399
|
-
const buffer = Buffer.alloc(2);
|
|
400
|
-
const fd = fs.openSync(path, 'r');
|
|
401
|
-
// Read the first two bytes
|
|
402
|
-
fs.readSync(fd, buffer, 0, 2, 0);
|
|
403
|
-
fs.closeSync(fd);
|
|
404
|
-
// Assert the magic number corresponds to gz extension
|
|
405
|
-
assert.deepStrictEqual(buffer, expectedBytes, 'The backup file should be gz compressed.');
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
function assertEncryptedFile(path) {
|
|
409
|
-
// Openssl encrypted files start with Salted
|
|
410
|
-
const expectedBytes = Buffer.from('Salted');
|
|
411
|
-
const buffer = Buffer.alloc(6);
|
|
412
|
-
const fd = fs.openSync(path, 'r');
|
|
413
|
-
// Read the first six bytes
|
|
414
|
-
fs.readSync(fd, buffer, 0, 6, 0);
|
|
415
|
-
fs.closeSync(fd);
|
|
416
|
-
// Assert first 6 characters of the file are "Salted"
|
|
417
|
-
assert.deepStrictEqual(buffer, expectedBytes, 'The backup file should be encrypted.');
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
function assertWrittenFewerThan(total, number) {
|
|
421
|
-
assert(total < number && total > 0, `Saw ${total} but expected between 1 and ${number - 1} documents for the resumed backup.`);
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
function augmentParamsWithApiKey(params) {
|
|
425
|
-
if (process.env.COUCHBACKUP_TEST_IAM_API_KEY) {
|
|
426
|
-
if (!params.opts) {
|
|
427
|
-
params.opts = {};
|
|
428
|
-
}
|
|
429
|
-
params.opts.iamApiKey = process.env.COUCHBACKUP_TEST_IAM_API_KEY;
|
|
430
|
-
params.opts.iamTokenUrl = process.env.CLOUDANT_IAM_TOKEN_URL;
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
module.exports = {
|
|
435
|
-
scenario,
|
|
436
|
-
p: params,
|
|
437
|
-
setTimeout,
|
|
438
|
-
dbCompare,
|
|
439
|
-
readSortAndDeepEqual,
|
|
440
|
-
assertGzipFile,
|
|
441
|
-
assertEncryptedFile,
|
|
442
|
-
testBackup,
|
|
443
|
-
testRestore,
|
|
444
|
-
testDirectBackupAndRestore,
|
|
445
|
-
testBackupToFile,
|
|
446
|
-
testRestoreFromFile,
|
|
447
|
-
testBackupAndRestoreViaFile,
|
|
448
|
-
testBackupAbortResumeRestore
|
|
449
|
-
};
|
|
@@ -1,65 +0,0 @@
|
|
|
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 beforeEach afterEach */
|
|
16
|
-
'use strict';
|
|
17
|
-
|
|
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
|
-
}
|
|
44
|
-
});
|
|
45
|
-
|
|
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
|
-
});
|
|
56
|
-
|
|
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
|
-
}
|
|
64
|
-
});
|
|
65
|
-
}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
// Copyright © 2018, 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 fs = require('fs');
|
|
19
|
-
const { once } = require('node:events');
|
|
20
|
-
const readline = require('readline');
|
|
21
|
-
const u = require('./citestutils.js');
|
|
22
|
-
const uuid = require('uuid').v4;
|
|
23
|
-
|
|
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();
|
|
72
|
-
|
|
73
|
-
return Promise.all([backup1, backup2]);
|
|
74
|
-
});
|
|
75
|
-
});
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
// Copyright © 2017 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
|
-
'use strict';
|
|
15
|
-
|
|
16
|
-
// stolen from http://strongloop.com/strongblog/practical-examples-of-the-new-node-js-streams-api/
|
|
17
|
-
const stream = require('stream');
|
|
18
|
-
|
|
19
|
-
module.exports = function() {
|
|
20
|
-
const liner = new stream.Transform({ objectMode: true });
|
|
21
|
-
|
|
22
|
-
liner._transform = function(chunk, encoding, done) {
|
|
23
|
-
let data = chunk.toString();
|
|
24
|
-
if (this._lastLineData) {
|
|
25
|
-
data = this._lastLineData + data;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const lines = data.split('\n');
|
|
29
|
-
this._lastLineData = lines.splice(lines.length - 1, 1)[0];
|
|
30
|
-
|
|
31
|
-
for (const i in lines) {
|
|
32
|
-
this.push(lines[i]);
|
|
33
|
-
}
|
|
34
|
-
done();
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
liner._flush = function(done) {
|
|
38
|
-
if (this._lastLineData) {
|
|
39
|
-
this.push(this._lastLineData);
|
|
40
|
-
}
|
|
41
|
-
this._lastLineData = null;
|
|
42
|
-
done();
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
return liner;
|
|
46
|
-
};
|