@cloudant/couchbackup 2.9.10-SNAPSHOT.112 → 2.9.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.scannerwork/report-task.txt +2 -2
- package/.scannerwork/scanner-report/analysis-warnings.pb +2 -2
- package/.scannerwork/scanner-report/analysis.log +1 -1
- package/.scannerwork/scanner-report/changesets-2.pb +1 -0
- package/.scannerwork/scanner-report/changesets-3.pb +1 -0
- package/.scannerwork/scanner-report/changesets-52.pb +1 -0
- package/.scannerwork/scanner-report/changesets-56.pb +1 -0
- package/.scannerwork/scanner-report/changesets-67.pb +1 -0
- package/.scannerwork/scanner-report/changesets-68.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 -1
- package/.scannerwork/scanner-report/component-12.pb +1 -1
- package/.scannerwork/scanner-report/component-13.pb +1 -1
- package/.scannerwork/scanner-report/component-14.pb +1 -1
- package/.scannerwork/scanner-report/component-15.pb +1 -1
- package/.scannerwork/scanner-report/component-19.pb +1 -1
- package/.scannerwork/scanner-report/component-2.pb +1 -0
- package/.scannerwork/scanner-report/component-20.pb +1 -1
- package/.scannerwork/scanner-report/component-21.pb +1 -1
- package/.scannerwork/scanner-report/component-22.pb +1 -1
- 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 -0
- 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-35.pb +1 -1
- package/.scannerwork/scanner-report/component-4.pb +1 -1
- package/.scannerwork/scanner-report/component-47.pb +1 -1
- package/.scannerwork/scanner-report/component-48.pb +1 -1
- package/.scannerwork/scanner-report/component-49.pb +1 -1
- package/.scannerwork/scanner-report/component-5.pb +1 -1
- package/.scannerwork/scanner-report/component-50.pb +1 -1
- package/.scannerwork/scanner-report/component-51.pb +1 -1
- package/.scannerwork/scanner-report/component-52.pb +1 -0
- package/.scannerwork/scanner-report/component-54.pb +1 -1
- package/.scannerwork/scanner-report/component-56.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-65.pb +1 -1
- package/.scannerwork/scanner-report/component-66.pb +1 -1
- package/.scannerwork/scanner-report/component-67.pb +1 -0
- package/.scannerwork/scanner-report/component-68.pb +1 -0
- package/.scannerwork/scanner-report/component-7.pb +1 -1
- package/.scannerwork/scanner-report/component-8.pb +1 -1
- package/.scannerwork/scanner-report/component-9.pb +1 -1
- package/.scannerwork/scanner-report/coverages-10.pb +0 -0
- package/.scannerwork/scanner-report/coverages-11.pb +0 -0
- package/.scannerwork/scanner-report/coverages-12.pb +0 -0
- package/.scannerwork/scanner-report/coverages-13.pb +0 -0
- package/.scannerwork/scanner-report/coverages-14.pb +0 -0
- package/.scannerwork/scanner-report/coverages-15.pb +0 -0
- package/.scannerwork/scanner-report/coverages-19.pb +0 -0
- package/.scannerwork/scanner-report/coverages-20.pb +0 -0
- package/.scannerwork/scanner-report/coverages-21.pb +0 -0
- package/.scannerwork/scanner-report/coverages-22.pb +0 -0
- package/.scannerwork/scanner-report/coverages-23.pb +0 -0
- package/.scannerwork/scanner-report/coverages-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-3.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-35.pb +0 -0
- package/.scannerwork/scanner-report/coverages-4.pb +0 -0
- package/.scannerwork/scanner-report/coverages-47.pb +0 -0
- package/.scannerwork/scanner-report/coverages-48.pb +0 -0
- package/.scannerwork/scanner-report/coverages-49.pb +0 -0
- package/.scannerwork/scanner-report/coverages-5.pb +0 -0
- package/.scannerwork/scanner-report/coverages-50.pb +0 -0
- package/.scannerwork/scanner-report/coverages-51.pb +0 -0
- package/.scannerwork/scanner-report/coverages-52.pb +0 -0
- package/.scannerwork/scanner-report/coverages-56.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-67.pb +0 -0
- package/.scannerwork/scanner-report/coverages-7.pb +0 -0
- package/.scannerwork/scanner-report/coverages-8.pb +0 -0
- package/.scannerwork/scanner-report/coverages-9.pb +0 -0
- package/.scannerwork/scanner-report/duplications-2.pb +2 -0
- package/.scannerwork/scanner-report/duplications-21.pb +3 -0
- package/.scannerwork/scanner-report/duplications-22.pb +0 -3
- package/.scannerwork/scanner-report/duplications-23.pb +0 -2
- package/.scannerwork/scanner-report/duplications-27.pb +2 -0
- package/.scannerwork/scanner-report/duplications-29.pb +2 -0
- package/.scannerwork/scanner-report/duplications-32.pb +3 -0
- package/.scannerwork/scanner-report/duplications-35.pb +0 -3
- package/.scannerwork/scanner-report/duplications-4.pb +2 -0
- package/.scannerwork/scanner-report/duplications-48.pb +0 -3
- package/.scannerwork/scanner-report/duplications-49.pb +0 -2
- package/.scannerwork/scanner-report/duplications-5.pb +0 -2
- package/.scannerwork/scanner-report/duplications-52.pb +3 -0
- package/.scannerwork/scanner-report/duplications-59.pb +2 -0
- package/.scannerwork/scanner-report/duplications-60.pb +2 -0
- package/.scannerwork/scanner-report/duplications-68.pb +0 -0
- package/.scannerwork/scanner-report/measures-10.pb +0 -0
- package/.scannerwork/scanner-report/measures-11.pb +0 -0
- package/.scannerwork/scanner-report/measures-12.pb +0 -0
- package/.scannerwork/scanner-report/measures-13.pb +0 -0
- package/.scannerwork/scanner-report/measures-14.pb +0 -0
- package/.scannerwork/scanner-report/measures-15.pb +0 -0
- package/.scannerwork/scanner-report/measures-19.pb +0 -0
- package/.scannerwork/scanner-report/measures-20.pb +0 -0
- package/.scannerwork/scanner-report/measures-21.pb +0 -0
- package/.scannerwork/scanner-report/measures-22.pb +0 -0
- package/.scannerwork/scanner-report/measures-23.pb +0 -0
- package/.scannerwork/scanner-report/measures-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-3.pb +16 -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-35.pb +0 -0
- package/.scannerwork/scanner-report/measures-4.pb +0 -0
- package/.scannerwork/scanner-report/measures-47.pb +0 -0
- package/.scannerwork/scanner-report/measures-48.pb +0 -0
- package/.scannerwork/scanner-report/measures-49.pb +0 -0
- package/.scannerwork/scanner-report/measures-5.pb +0 -0
- package/.scannerwork/scanner-report/measures-50.pb +0 -0
- package/.scannerwork/scanner-report/measures-51.pb +0 -0
- package/.scannerwork/scanner-report/measures-52.pb +0 -0
- package/.scannerwork/scanner-report/measures-54.pb +0 -0
- package/.scannerwork/scanner-report/measures-56.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-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-7.pb +0 -0
- package/.scannerwork/scanner-report/measures-8.pb +0 -0
- package/.scannerwork/scanner-report/measures-9.pb +0 -0
- package/.scannerwork/scanner-report/metadata.pb +0 -0
- package/.scannerwork/scanner-report/source-10.txt +258 -23
- package/.scannerwork/scanner-report/source-11.txt +92 -103
- package/.scannerwork/scanner-report/source-12.txt +24 -82
- package/.scannerwork/scanner-report/source-13.txt +110 -145
- package/.scannerwork/scanner-report/source-14.txt +72 -249
- package/.scannerwork/scanner-report/source-15.txt +24 -14
- package/.scannerwork/scanner-report/source-19.txt +93 -121
- package/.scannerwork/scanner-report/source-20.txt +14 -8
- package/.scannerwork/scanner-report/source-21.txt +224 -14
- package/.scannerwork/scanner-report/source-22.txt +15 -223
- package/.scannerwork/scanner-report/source-23.txt +595 -115
- package/.scannerwork/scanner-report/source-24.txt +13 -26
- package/.scannerwork/scanner-report/source-25.txt +135 -15
- package/.scannerwork/scanner-report/source-26.txt +120 -339
- package/.scannerwork/scanner-report/source-27.txt +128 -19
- package/.scannerwork/scanner-report/source-28.txt +11 -43
- package/.scannerwork/scanner-report/source-29.txt +227 -559
- package/.scannerwork/scanner-report/source-3.txt +178 -0
- package/.scannerwork/scanner-report/source-30.txt +71 -47
- package/.scannerwork/scanner-report/source-31.txt +125 -46
- package/.scannerwork/scanner-report/source-32.txt +101 -62
- package/.scannerwork/scanner-report/source-33.txt +48 -127
- package/.scannerwork/scanner-report/source-35.txt +24 -96
- package/.scannerwork/scanner-report/source-4.txt +72 -98
- package/.scannerwork/scanner-report/source-47.txt +46 -83
- package/.scannerwork/scanner-report/source-48.txt +47 -110
- package/.scannerwork/scanner-report/source-49.txt +344 -271
- package/.scannerwork/scanner-report/source-5.txt +84 -65
- package/.scannerwork/scanner-report/source-50.txt +9 -136
- package/.scannerwork/scanner-report/source-51.txt +84 -19
- package/.scannerwork/scanner-report/source-52.txt +119 -0
- package/.scannerwork/scanner-report/source-54.txt +167 -114
- package/.scannerwork/scanner-report/source-56.txt +418 -509
- package/.scannerwork/scanner-report/source-59.txt +172 -59
- package/.scannerwork/scanner-report/source-6.txt +147 -37
- package/.scannerwork/scanner-report/source-60.txt +142 -385
- package/.scannerwork/scanner-report/source-65.txt +509 -175
- package/.scannerwork/scanner-report/source-66.txt +509 -190
- package/.scannerwork/scanner-report/source-67.txt +77 -0
- package/.scannerwork/scanner-report/source-7.txt +56 -154
- package/.scannerwork/scanner-report/source-8.txt +34 -21
- package/.scannerwork/scanner-report/source-9.txt +14 -63
- package/.scannerwork/scanner-report/symbols-10.pb +354 -20
- package/.scannerwork/scanner-report/symbols-11.pb +29 -32
- package/.scannerwork/scanner-report/symbols-12.pb +18 -40
- package/.scannerwork/scanner-report/symbols-13.pb +32 -125
- package/.scannerwork/scanner-report/symbols-14.pb +42 -354
- package/.scannerwork/scanner-report/symbols-15.pb +17 -13
- package/.scannerwork/scanner-report/symbols-19.pb +28 -116
- package/.scannerwork/scanner-report/symbols-20.pb +17 -9
- package/.scannerwork/scanner-report/symbols-21.pb +394 -10
- package/.scannerwork/scanner-report/symbols-22.pb +14 -394
- package/.scannerwork/scanner-report/symbols-23.pb +1254 -102
- package/.scannerwork/scanner-report/symbols-24.pb +10 -27
- package/.scannerwork/scanner-report/symbols-25.pb +112 -11
- package/.scannerwork/scanner-report/symbols-26.pb +85 -494
- package/.scannerwork/scanner-report/symbols-27.pb +102 -14
- package/.scannerwork/scanner-report/symbols-28.pb +9 -34
- package/.scannerwork/scanner-report/symbols-29.pb +406 -1174
- package/.scannerwork/scanner-report/symbols-3.pb +144 -0
- package/.scannerwork/scanner-report/symbols-30.pb +60 -45
- package/.scannerwork/scanner-report/symbols-31.pb +115 -42
- package/.scannerwork/scanner-report/symbols-32.pb +97 -60
- package/.scannerwork/scanner-report/symbols-33.pb +36 -85
- package/.scannerwork/scanner-report/symbols-35.pb +27 -77
- package/.scannerwork/scanner-report/symbols-4.pb +44 -30
- package/.scannerwork/scanner-report/symbols-47.pb +42 -68
- package/.scannerwork/scanner-report/symbols-48.pb +45 -97
- package/.scannerwork/scanner-report/symbols-49.pb +458 -450
- package/.scannerwork/scanner-report/symbols-5.pb +58 -43
- package/.scannerwork/scanner-report/symbols-50.pb +9 -112
- package/.scannerwork/scanner-report/symbols-51.pb +68 -16
- package/.scannerwork/scanner-report/symbols-52.pb +77 -0
- package/.scannerwork/scanner-report/symbols-56.pb +610 -0
- package/.scannerwork/scanner-report/symbols-59.pb +180 -30
- package/.scannerwork/scanner-report/symbols-6.pb +126 -15
- package/.scannerwork/scanner-report/symbols-60.pb +146 -603
- package/.scannerwork/scanner-report/symbols-67.pb +30 -0
- package/.scannerwork/scanner-report/symbols-7.pb +43 -141
- package/.scannerwork/scanner-report/symbols-8.pb +12 -15
- package/.scannerwork/scanner-report/symbols-9.pb +13 -45
- package/.scannerwork/scanner-report/syntax-highlightings-10.pb +250 -29
- package/.scannerwork/scanner-report/syntax-highlightings-11.pb +75 -91
- package/.scannerwork/scanner-report/syntax-highlightings-12.pb +29 -81
- package/.scannerwork/scanner-report/syntax-highlightings-13.pb +86 -170
- package/.scannerwork/scanner-report/syntax-highlightings-14.pb +78 -247
- package/.scannerwork/scanner-report/syntax-highlightings-15.pb +21 -16
- package/.scannerwork/scanner-report/syntax-highlightings-19.pb +103 -99
- package/.scannerwork/scanner-report/syntax-highlightings-20.pb +28 -13
- package/.scannerwork/scanner-report/syntax-highlightings-21.pb +293 -14
- package/.scannerwork/scanner-report/syntax-highlightings-22.pb +21 -296
- package/.scannerwork/scanner-report/syntax-highlightings-23.pb +832 -172
- package/.scannerwork/scanner-report/syntax-highlightings-24.pb +13 -31
- package/.scannerwork/scanner-report/syntax-highlightings-25.pb +188 -24
- package/.scannerwork/scanner-report/syntax-highlightings-26.pb +154 -593
- package/.scannerwork/scanner-report/syntax-highlightings-27.pb +194 -21
- package/.scannerwork/scanner-report/syntax-highlightings-28.pb +22 -58
- package/.scannerwork/scanner-report/syntax-highlightings-29.pb +354 -582
- package/.scannerwork/scanner-report/syntax-highlightings-3.pb +243 -0
- package/.scannerwork/scanner-report/syntax-highlightings-30.pb +70 -70
- package/.scannerwork/scanner-report/syntax-highlightings-31.pb +98 -46
- package/.scannerwork/scanner-report/syntax-highlightings-32.pb +144 -72
- package/.scannerwork/scanner-report/syntax-highlightings-33.pb +59 -155
- package/.scannerwork/scanner-report/syntax-highlightings-35.pb +27 -117
- package/.scannerwork/scanner-report/syntax-highlightings-4.pb +56 -79
- package/.scannerwork/scanner-report/syntax-highlightings-47.pb +46 -69
- package/.scannerwork/scanner-report/syntax-highlightings-48.pb +74 -146
- package/.scannerwork/scanner-report/syntax-highlightings-49.pb +346 -375
- package/.scannerwork/scanner-report/syntax-highlightings-5.pb +92 -49
- package/.scannerwork/scanner-report/syntax-highlightings-50.pb +14 -189
- package/.scannerwork/scanner-report/syntax-highlightings-51.pb +70 -28
- package/.scannerwork/scanner-report/syntax-highlightings-52.pb +158 -0
- package/.scannerwork/scanner-report/syntax-highlightings-54.pb +938 -127
- package/.scannerwork/scanner-report/syntax-highlightings-56.pb +445 -3544
- package/.scannerwork/scanner-report/syntax-highlightings-59.pb +200 -78
- package/.scannerwork/scanner-report/syntax-highlightings-6.pb +179 -20
- package/.scannerwork/scanner-report/syntax-highlightings-60.pb +156 -590
- package/.scannerwork/scanner-report/syntax-highlightings-65.pb +3733 -199
- package/.scannerwork/scanner-report/syntax-highlightings-66.pb +3724 -202
- package/.scannerwork/scanner-report/syntax-highlightings-67.pb +103 -0
- package/.scannerwork/scanner-report/syntax-highlightings-7.pb +55 -203
- package/.scannerwork/scanner-report/syntax-highlightings-8.pb +23 -19
- package/.scannerwork/scanner-report/syntax-highlightings-9.pb +15 -65
- package/CHANGES.md +7 -0
- package/package.json +4 -4
- package/test-16-results.xml +151 -151
- package/test-18-results.xml +143 -143
- package/test-iam-18-results.xml +49 -49
- package/.scannerwork/scanner-report/changesets-16.pb +0 -1
- package/.scannerwork/scanner-report/changesets-17.pb +0 -1
- package/.scannerwork/scanner-report/changesets-54.pb +0 -1
- package/.scannerwork/scanner-report/changesets-58.pb +0 -1
- package/.scannerwork/scanner-report/changesets-65.pb +0 -1
- package/.scannerwork/scanner-report/changesets-66.pb +0 -1
- package/.scannerwork/scanner-report/component-16.pb +0 -1
- package/.scannerwork/scanner-report/component-17.pb +0 -1
- package/.scannerwork/scanner-report/component-18.pb +0 -1
- package/.scannerwork/scanner-report/component-58.pb +0 -1
- package/.scannerwork/scanner-report/component-61.pb +0 -1
- package/.scannerwork/scanner-report/coverages-16.pb +0 -0
- package/.scannerwork/scanner-report/coverages-54.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/duplications-17.pb +0 -2
- package/.scannerwork/scanner-report/duplications-65.pb +0 -2
- package/.scannerwork/scanner-report/duplications-66.pb +0 -2
- package/.scannerwork/scanner-report/measures-16.pb +0 -0
- package/.scannerwork/scanner-report/measures-18.pb +0 -0
- package/.scannerwork/scanner-report/measures-61.pb +0 -0
- package/.scannerwork/scanner-report/source-16.txt +0 -111
- package/.scannerwork/scanner-report/source-18.txt +0 -167
- package/.scannerwork/scanner-report/source-61.txt +0 -509
- package/.scannerwork/scanner-report/symbols-16.pb +0 -59
- package/.scannerwork/scanner-report/symbols-54.pb +0 -28
- package/.scannerwork/scanner-report/symbols-65.pb +0 -153
- package/.scannerwork/scanner-report/symbols-66.pb +0 -180
- package/.scannerwork/scanner-report/syntax-highlightings-16.pb +0 -133
- package/.scannerwork/scanner-report/syntax-highlightings-18.pb +0 -949
- package/.scannerwork/scanner-report/syntax-highlightings-61.pb +0 -3748
- /package/.scannerwork/scanner-report/{coverages-17.pb → coverages-2.pb} +0 -0
- /package/.scannerwork/scanner-report/{coverages-58.pb → coverages-68.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-16.pb → duplications-20.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-50.pb → duplications-3.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-54.pb → duplications-56.pb} +0 -0
- /package/.scannerwork/scanner-report/{duplications-58.pb → duplications-67.pb} +0 -0
- /package/.scannerwork/scanner-report/{issues-22.pb → issues-21.pb} +0 -0
- /package/.scannerwork/scanner-report/{issues-19.pb → issues-31.pb} +0 -0
- /package/.scannerwork/scanner-report/{issues-24.pb → issues-35.pb} +0 -0
- /package/.scannerwork/scanner-report/{issues-26.pb → issues-49.pb} +0 -0
- /package/.scannerwork/scanner-report/{measures-17.pb → measures-2.pb} +0 -0
- /package/.scannerwork/scanner-report/{measures-58.pb → measures-68.pb} +0 -0
- /package/.scannerwork/scanner-report/{source-17.txt → source-2.txt} +0 -0
- /package/.scannerwork/scanner-report/{source-58.txt → source-68.txt} +0 -0
- /package/.scannerwork/scanner-report/{symbols-17.pb → symbols-2.pb} +0 -0
- /package/.scannerwork/scanner-report/{symbols-58.pb → symbols-68.pb} +0 -0
- /package/.scannerwork/scanner-report/{syntax-highlightings-17.pb → syntax-highlightings-2.pb} +0 -0
- /package/.scannerwork/scanner-report/{syntax-highlightings-58.pb → syntax-highlightings-68.pb} +0 -0
|
@@ -12,355 +12,136 @@
|
|
|
12
12
|
// See the License for the specific language governing permissions and
|
|
13
13
|
// limitations under the License.
|
|
14
14
|
|
|
15
|
-
/* global describe
|
|
15
|
+
/* global describe it beforeEach */
|
|
16
16
|
'use strict';
|
|
17
17
|
|
|
18
18
|
const assert = require('assert');
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
19
|
+
const fs = require('fs');
|
|
20
|
+
const nock = require('nock');
|
|
21
|
+
const request = require('../includes/request.js');
|
|
22
|
+
const writer = require('../includes/writer.js');
|
|
23
|
+
const noopEmitter = new (require('events')).EventEmitter();
|
|
24
|
+
const liner = require('../includes/liner.js');
|
|
25
|
+
|
|
26
|
+
const longTestTimeout = 3000;
|
|
27
|
+
|
|
28
|
+
// The writer expects a line-by-line stream so this utility function does that
|
|
29
|
+
// processing for the tests (which normally happens in the internal restore
|
|
30
|
+
// function).
|
|
31
|
+
function testLinestream(fixture = './test/fixtures/animaldb_expected.json') {
|
|
32
|
+
return fs.createReadStream(fixture)
|
|
33
|
+
.pipe(liner());
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
describe('#unit Check database restore writer', function() {
|
|
37
|
+
const dbUrl = 'http://localhost:5984/animaldb';
|
|
38
|
+
const db = request.client(dbUrl, { parallelism: 1 });
|
|
39
|
+
|
|
40
|
+
beforeEach('Reset nocks', function() {
|
|
41
|
+
nock.cleanAll();
|
|
42
42
|
});
|
|
43
43
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
it('should complete successfully', function(done) {
|
|
45
|
+
nock(dbUrl)
|
|
46
|
+
.post('/_bulk_docs')
|
|
47
|
+
.reply(200, []); // success
|
|
48
|
+
|
|
49
|
+
testLinestream()
|
|
50
|
+
.pipe(writer(db, 500, 1, noopEmitter))
|
|
51
|
+
.on('error', function(err) {
|
|
52
|
+
done(err);
|
|
53
|
+
})
|
|
54
|
+
.on('finished', function(data) {
|
|
55
|
+
assert.strictEqual(data.total, 15);
|
|
56
|
+
assert.ok(nock.isDone());
|
|
57
|
+
done();
|
|
58
|
+
});
|
|
47
59
|
});
|
|
48
60
|
|
|
49
|
-
|
|
50
|
-
|
|
61
|
+
it('should terminate on a fatal error', function(done) {
|
|
62
|
+
nock(dbUrl)
|
|
63
|
+
.post('/_bulk_docs')
|
|
64
|
+
.reply(401, { error: 'Unauthorized' }); // fatal error
|
|
65
|
+
|
|
66
|
+
testLinestream()
|
|
67
|
+
.pipe(writer(db, 500, 1, noopEmitter))
|
|
68
|
+
.on('error', function(err) {
|
|
69
|
+
assert.strictEqual(err.name, 'Unauthorized');
|
|
70
|
+
assert.strictEqual(err.message, 'Access is denied due to invalid credentials.');
|
|
71
|
+
assert.ok(nock.isDone());
|
|
72
|
+
done();
|
|
73
|
+
});
|
|
51
74
|
});
|
|
52
75
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
it('respects the COUCH_RESUME env variable if the --resume backup command-line parameter is missing', function(done) {
|
|
111
|
-
process.argv = ['node', 'test'];
|
|
112
|
-
const program = parser.parseBackupArgs();
|
|
113
|
-
assert.strictEqual(typeof program.resume, 'boolean');
|
|
114
|
-
assert.strictEqual(program.resume, true);
|
|
115
|
-
done();
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
it('respects the COUCH_OUTPUT env variable if the --output backup command-line parameter is missing', function(done) {
|
|
119
|
-
process.argv = ['node', 'test'];
|
|
120
|
-
const program = parser.parseBackupArgs();
|
|
121
|
-
assert.strictEqual(typeof program.output, 'string');
|
|
122
|
-
assert.strictEqual(program.output, process.env.COUCH_OUTPUT);
|
|
123
|
-
done();
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
it('respects the COUCH_MODE env variable if the --mode backup command-line parameter is missing', function(done) {
|
|
127
|
-
process.argv = ['node', 'test'];
|
|
128
|
-
const program = parser.parseBackupArgs();
|
|
129
|
-
assert.strictEqual(typeof program.mode, 'string');
|
|
130
|
-
assert.strictEqual(program.mode, process.env.COUCH_MODE);
|
|
131
|
-
done();
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
it('respects the COUCH_QUIET env variable if the --quiet backup command-line parameter is missing', function(done) {
|
|
135
|
-
process.argv = ['node', 'test'];
|
|
136
|
-
const program = parser.parseBackupArgs();
|
|
137
|
-
assert.strictEqual(typeof program.quiet, 'boolean');
|
|
138
|
-
assert.strictEqual(program.quiet, true);
|
|
139
|
-
done();
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
it('respects the backup --url command-line parameter', function(done) {
|
|
143
|
-
const url = 'http://user:pass@myurl2.com';
|
|
144
|
-
process.argv = ['node', 'test', '--url', url];
|
|
145
|
-
const program = parser.parseBackupArgs();
|
|
146
|
-
assert.strictEqual(typeof program.url, 'string');
|
|
147
|
-
assert.strictEqual(program.url, url);
|
|
148
|
-
done();
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
it('respects the backup --db command-line parameter', function(done) {
|
|
152
|
-
const db = 'mydb2';
|
|
153
|
-
process.argv = ['node', 'test', '--db', db];
|
|
154
|
-
const program = parser.parseBackupArgs();
|
|
155
|
-
assert.strictEqual(typeof program.db, 'string');
|
|
156
|
-
assert.strictEqual(program.db, db);
|
|
157
|
-
done();
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
it('respects the backup --buffer-size command-line parameter', function(done) {
|
|
161
|
-
const bufferSize = 500;
|
|
162
|
-
process.argv = ['node', 'test', '--buffer-size', bufferSize];
|
|
163
|
-
const program = parser.parseBackupArgs();
|
|
164
|
-
assert.strictEqual(typeof program.bufferSize, 'number');
|
|
165
|
-
assert.strictEqual(program.bufferSize, bufferSize);
|
|
166
|
-
done();
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
it('respects the backup --parallelism command-line parameter', function(done) {
|
|
170
|
-
const parallelism = 10;
|
|
171
|
-
process.argv = ['node', 'test', '--parallelism', parallelism];
|
|
172
|
-
const program = parser.parseBackupArgs();
|
|
173
|
-
assert.strictEqual(typeof program.parallelism, 'number');
|
|
174
|
-
assert.strictEqual(program.parallelism, parallelism);
|
|
175
|
-
done();
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
it('respects the backup --request-timeout command-line parameter', function(done) {
|
|
179
|
-
const requestTimeout = 10000;
|
|
180
|
-
process.argv = ['node', 'test', '--request-timeout', requestTimeout];
|
|
181
|
-
const program = parser.parseBackupArgs();
|
|
182
|
-
assert.strictEqual(typeof program.requestTimeout, 'number');
|
|
183
|
-
assert.strictEqual(program.requestTimeout, requestTimeout);
|
|
184
|
-
done();
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
it('respects the backup --iam-api-key command-line parameter', function(done) {
|
|
188
|
-
const key = '123abc-789zyx_CBA987-XYZ321';
|
|
189
|
-
process.argv = ['node', 'test', '--iam-api-key', key];
|
|
190
|
-
const program = parser.parseBackupArgs();
|
|
191
|
-
assert.strictEqual(typeof program.iamApiKey, 'string');
|
|
192
|
-
assert.strictEqual(program.iamApiKey, key);
|
|
193
|
-
done();
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
it('respects the backup --log command-line parameter', function(done) {
|
|
197
|
-
const filename = 'my2.log';
|
|
198
|
-
process.argv = ['node', 'test', '--log', filename];
|
|
199
|
-
const program = parser.parseBackupArgs();
|
|
200
|
-
assert.strictEqual(typeof program.log, 'string');
|
|
201
|
-
assert.strictEqual(program.log, filename);
|
|
202
|
-
done();
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
it('respects the backup --resume command-line parameter', function(done) {
|
|
206
|
-
process.argv = ['node', 'test', '--resume'];
|
|
207
|
-
const program = parser.parseBackupArgs();
|
|
208
|
-
assert.strictEqual(typeof program.resume, 'boolean');
|
|
209
|
-
assert.strictEqual(program.resume, true);
|
|
210
|
-
done();
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
it('respects the backup --output command-line parameter', function(done) {
|
|
214
|
-
const filename = 'myfile2.txt';
|
|
215
|
-
process.argv = ['node', 'test', '--output', filename];
|
|
216
|
-
const program = parser.parseBackupArgs();
|
|
217
|
-
assert.strictEqual(typeof program.output, 'string');
|
|
218
|
-
assert.strictEqual(program.output, filename);
|
|
219
|
-
done();
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
it('respects the backup --mode full command-line parameter', function(done) {
|
|
223
|
-
process.argv = ['node', 'test', '--mode', 'full'];
|
|
224
|
-
const program = parser.parseBackupArgs();
|
|
225
|
-
assert.strictEqual(typeof program.mode, 'string');
|
|
226
|
-
assert.strictEqual(program.mode, 'full');
|
|
227
|
-
done();
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
it('respects the backup --mode shallow command-line parameter', function(done) {
|
|
231
|
-
process.argv = ['node', 'test', '--mode', 'shallow'];
|
|
232
|
-
const program = parser.parseBackupArgs();
|
|
233
|
-
assert.strictEqual(typeof program.mode, 'string');
|
|
234
|
-
assert.strictEqual(program.mode, 'shallow');
|
|
235
|
-
done();
|
|
236
|
-
});
|
|
237
|
-
|
|
238
|
-
it('respects the backup --quiet command-line parameter', function(done) {
|
|
239
|
-
process.argv = ['node', 'test', '--quiet'];
|
|
240
|
-
const program = parser.parseBackupArgs();
|
|
241
|
-
assert.strictEqual(typeof program.quiet, 'boolean');
|
|
242
|
-
assert.strictEqual(program.quiet, true);
|
|
243
|
-
done();
|
|
244
|
-
});
|
|
76
|
+
it('should retry on transient errors', function(done) {
|
|
77
|
+
nock(dbUrl)
|
|
78
|
+
.post('/_bulk_docs')
|
|
79
|
+
.reply(429, { error: 'Too Many Requests' }) // transient error
|
|
80
|
+
.post('/_bulk_docs')
|
|
81
|
+
.reply(500, { error: 'Internal Server Error' }) // transient error
|
|
82
|
+
.post('/_bulk_docs')
|
|
83
|
+
.reply(200, { ok: true }); // third time lucky success
|
|
84
|
+
|
|
85
|
+
testLinestream()
|
|
86
|
+
.pipe(writer(db, 500, 1, noopEmitter))
|
|
87
|
+
.on('error', function(err) {
|
|
88
|
+
done(err);
|
|
89
|
+
})
|
|
90
|
+
.on('finished', function(data) {
|
|
91
|
+
assert.strictEqual(data.total, 15);
|
|
92
|
+
assert.ok(nock.isDone());
|
|
93
|
+
done();
|
|
94
|
+
});
|
|
95
|
+
}).timeout(longTestTimeout);
|
|
96
|
+
|
|
97
|
+
it('should fail after 3 transient errors', function(done) {
|
|
98
|
+
nock(dbUrl)
|
|
99
|
+
.post('/_bulk_docs')
|
|
100
|
+
.reply(429, { error: 'Too Many Requests' }) // transient error
|
|
101
|
+
.post('/_bulk_docs')
|
|
102
|
+
.reply(500, { error: 'Internal Server Error' }) // transient error
|
|
103
|
+
.post('/_bulk_docs')
|
|
104
|
+
.reply(503, { error: 'Service Unavailable' }); // Final transient error
|
|
105
|
+
|
|
106
|
+
testLinestream()
|
|
107
|
+
.pipe(writer(db, 500, 1, noopEmitter))
|
|
108
|
+
.on('error', function(err) {
|
|
109
|
+
assert.strictEqual(err.name, 'HTTPFatalError');
|
|
110
|
+
assert.strictEqual(err.message, `503 : post ${dbUrl}/_bulk_docs - Error: Service Unavailable`);
|
|
111
|
+
assert.ok(nock.isDone());
|
|
112
|
+
done();
|
|
113
|
+
});
|
|
114
|
+
}).timeout(longTestTimeout);
|
|
115
|
+
|
|
116
|
+
it('should restore shallow backups without rev info successfully', function(done) {
|
|
117
|
+
nock(dbUrl)
|
|
118
|
+
.post('/_bulk_docs')
|
|
119
|
+
.reply(200, [{ ok: true, id: 'foo', rev: '1-abc' }]); // success
|
|
120
|
+
|
|
121
|
+
testLinestream('./test/fixtures/animaldb_old_shallow.json')
|
|
122
|
+
.pipe(writer(db, 500, 1, noopEmitter))
|
|
123
|
+
.on('error', function(err) {
|
|
124
|
+
done(err);
|
|
125
|
+
})
|
|
126
|
+
.on('finished', function(data) {
|
|
127
|
+
assert.strictEqual(data.total, 11);
|
|
128
|
+
assert.ok(nock.isDone());
|
|
129
|
+
done();
|
|
130
|
+
});
|
|
245
131
|
});
|
|
246
132
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
assert.strictEqual(program.db, process.env.COUCH_DATABASE);
|
|
261
|
-
done();
|
|
262
|
-
});
|
|
263
|
-
|
|
264
|
-
it('respects the COUCH_BUFFER_SIZE env variable if the --buffer-size restore command-line parameter is missing', function(done) {
|
|
265
|
-
process.argv = ['node', 'test'];
|
|
266
|
-
const program = parser.parseRestoreArgs();
|
|
267
|
-
assert.strictEqual(typeof program.bufferSize, 'number');
|
|
268
|
-
assert.strictEqual(program.bufferSize, parseInt(process.env.COUCH_BUFFER_SIZE, 10));
|
|
269
|
-
done();
|
|
270
|
-
});
|
|
271
|
-
|
|
272
|
-
it('respects the COUCH_PARALLELISM env variable if the --parallelism restore command-line parameter is missing', function(done) {
|
|
273
|
-
process.argv = ['node', 'test'];
|
|
274
|
-
const program = parser.parseRestoreArgs();
|
|
275
|
-
assert.strictEqual(typeof program.parallelism, 'number');
|
|
276
|
-
assert.strictEqual(program.parallelism, parseInt(process.env.COUCH_PARALLELISM, 10));
|
|
277
|
-
done();
|
|
278
|
-
});
|
|
279
|
-
|
|
280
|
-
it('respects the COUCH_REQUEST_TIMEOUT env variable if the --request-timeout restore command-line parameter is missing', function(done) {
|
|
281
|
-
process.argv = ['node', 'test'];
|
|
282
|
-
const program = parser.parseRestoreArgs();
|
|
283
|
-
assert.strictEqual(typeof program.requestTimeout, 'number');
|
|
284
|
-
assert.strictEqual(program.requestTimeout, parseInt(process.env.COUCH_REQUEST_TIMEOUT, 10));
|
|
285
|
-
done();
|
|
286
|
-
});
|
|
287
|
-
|
|
288
|
-
it('respects the CLOUDANT_IAM_API_KEY env variable if the --iam-api-key restore command-line parameter is missing', function(done) {
|
|
289
|
-
process.argv = ['node', 'test'];
|
|
290
|
-
const program = parser.parseRestoreArgs();
|
|
291
|
-
assert.strictEqual(typeof program.iamApiKey, 'string');
|
|
292
|
-
assert.strictEqual(program.iamApiKey, process.env.CLOUDANT_IAM_API_KEY);
|
|
293
|
-
done();
|
|
294
|
-
});
|
|
295
|
-
|
|
296
|
-
it('respects the COUCH_QUIET env variable if the --quiet restorer command-line parameter is missing', function(done) {
|
|
297
|
-
process.argv = ['node', 'test'];
|
|
298
|
-
const program = parser.parseBackupArgs();
|
|
299
|
-
assert.strictEqual(typeof program.quiet, 'boolean');
|
|
300
|
-
assert.strictEqual(program.quiet, true);
|
|
301
|
-
done();
|
|
302
|
-
});
|
|
303
|
-
|
|
304
|
-
it('respects the restore --url command-line parameter', function(done) {
|
|
305
|
-
const url = 'https://a:b@myurl3.com';
|
|
306
|
-
process.argv = ['node', 'test', '--url', url];
|
|
307
|
-
const program = parser.parseRestoreArgs();
|
|
308
|
-
assert.strictEqual(typeof program.url, 'string');
|
|
309
|
-
assert.strictEqual(program.url, url);
|
|
310
|
-
done();
|
|
311
|
-
});
|
|
312
|
-
|
|
313
|
-
it('respects the restore --db command-line parameter', function(done) {
|
|
314
|
-
const db = 'mydb3';
|
|
315
|
-
process.argv = ['node', 'test', '--db', db];
|
|
316
|
-
const program = parser.parseRestoreArgs();
|
|
317
|
-
assert.strictEqual(typeof program.db, 'string');
|
|
318
|
-
assert.strictEqual(program.db, db);
|
|
319
|
-
done();
|
|
320
|
-
});
|
|
321
|
-
|
|
322
|
-
it('respects the restore --buffer-size command-line parameter', function(done) {
|
|
323
|
-
const bufferSize = 250;
|
|
324
|
-
process.argv = ['node', 'test', '--buffer-size', bufferSize];
|
|
325
|
-
const program = parser.parseRestoreArgs();
|
|
326
|
-
assert.strictEqual(typeof program.bufferSize, 'number');
|
|
327
|
-
assert.strictEqual(program.bufferSize, bufferSize);
|
|
328
|
-
done();
|
|
329
|
-
});
|
|
330
|
-
|
|
331
|
-
it('respects the restore --parallelism command-line parameter', function(done) {
|
|
332
|
-
const parallelism = 5;
|
|
333
|
-
process.argv = ['node', 'test', '--parallelism', parallelism];
|
|
334
|
-
const program = parser.parseRestoreArgs();
|
|
335
|
-
assert.strictEqual(typeof program.parallelism, 'number');
|
|
336
|
-
assert.strictEqual(program.parallelism, parallelism);
|
|
337
|
-
done();
|
|
338
|
-
});
|
|
339
|
-
|
|
340
|
-
it('respects the restore --request-timeout command-line parameter', function(done) {
|
|
341
|
-
const requestTimeout = 10000;
|
|
342
|
-
process.argv = ['node', 'test', '--request-timeout', requestTimeout];
|
|
343
|
-
const program = parser.parseRestoreArgs();
|
|
344
|
-
assert.strictEqual(typeof program.requestTimeout, 'number');
|
|
345
|
-
assert.strictEqual(program.requestTimeout, requestTimeout);
|
|
346
|
-
done();
|
|
347
|
-
});
|
|
348
|
-
|
|
349
|
-
it('respects the restore --iam-api-key command-line parameter', function(done) {
|
|
350
|
-
const key = '123abc-789zyx_CBA987-XYZ321';
|
|
351
|
-
process.argv = ['node', 'test', '--iam-api-key', key];
|
|
352
|
-
const program = parser.parseRestoreArgs();
|
|
353
|
-
assert.strictEqual(typeof program.iamApiKey, 'string');
|
|
354
|
-
assert.strictEqual(program.iamApiKey, key);
|
|
355
|
-
done();
|
|
356
|
-
});
|
|
357
|
-
|
|
358
|
-
it('respects the restore --quiet command-line parameter', function(done) {
|
|
359
|
-
process.argv = ['node', 'test', '--quiet'];
|
|
360
|
-
const program = parser.parseRestoreArgs();
|
|
361
|
-
assert.strictEqual(typeof program.quiet, 'boolean');
|
|
362
|
-
assert.strictEqual(program.quiet, true);
|
|
363
|
-
done();
|
|
364
|
-
});
|
|
133
|
+
it('should get a batch error for non-empty array response with new_edits false', function(done) {
|
|
134
|
+
nock(dbUrl)
|
|
135
|
+
.post('/_bulk_docs')
|
|
136
|
+
.reply(200, [{ id: 'foo', error: 'foo', reason: 'bar' }]);
|
|
137
|
+
|
|
138
|
+
testLinestream()
|
|
139
|
+
.pipe(writer(db, 500, 1, noopEmitter))
|
|
140
|
+
.on('error', function(err) {
|
|
141
|
+
assert.strictEqual(err.name, 'Error');
|
|
142
|
+
assert.strictEqual(err.message, 'Error writing batch with new_edits:false and 1 items');
|
|
143
|
+
assert.ok(nock.isDone());
|
|
144
|
+
done();
|
|
145
|
+
});
|
|
365
146
|
});
|
|
366
147
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Copyright © 2017 IBM Corp. All rights reserved.
|
|
1
|
+
// Copyright © 2017, 2022 IBM Corp. All rights reserved.
|
|
2
2
|
//
|
|
3
3
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
4
|
// you may not use this file except in compliance with the License.
|
|
@@ -12,25 +12,134 @@
|
|
|
12
12
|
// See the License for the specific language governing permissions and
|
|
13
13
|
// limitations under the License.
|
|
14
14
|
|
|
15
|
-
/* global describe it */
|
|
15
|
+
/* global describe it beforeEach */
|
|
16
16
|
'use strict';
|
|
17
17
|
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
18
|
+
const assert = require('assert');
|
|
19
|
+
const backup = require('../includes/shallowbackup.js');
|
|
20
|
+
const request = require('../includes/request.js');
|
|
21
|
+
const fs = require('fs');
|
|
22
|
+
const nock = require('nock');
|
|
23
|
+
|
|
24
|
+
// Function to create a DB object and call the shallow backup function
|
|
25
|
+
// This is normally done by app.js
|
|
26
|
+
function shallowBackup(dbUrl, opts) {
|
|
27
|
+
const db = request.client(dbUrl, opts);
|
|
28
|
+
// Disable compression to make body assertions easier
|
|
29
|
+
db.service.setEnableGzipCompression(false);
|
|
30
|
+
return backup(db, opts);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Note all these tests include a body parameter of include_docs and a query
|
|
34
|
+
// string of include_docs because of a quirk of nano that when using the fetch
|
|
35
|
+
// method always adds the include_docs query string.
|
|
36
|
+
describe('#unit Perform backup using shallow backup', function() {
|
|
37
|
+
const dbUrl = 'http://localhost:5984/animaldb';
|
|
38
|
+
// Query string keys are stringified by Nano
|
|
39
|
+
const badgerKey = 'badger\0';
|
|
40
|
+
const kookaburraKey = 'kookaburra\0';
|
|
41
|
+
const snipeKey = 'snipe\0';
|
|
42
|
+
|
|
43
|
+
beforeEach('Reset nocks', function() {
|
|
44
|
+
nock.cleanAll();
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('should perform a shallow backup', function(done) {
|
|
48
|
+
const couch = nock(dbUrl)
|
|
49
|
+
// batch 1
|
|
50
|
+
.post('/_all_docs', { limit: 3, include_docs: true })
|
|
51
|
+
.reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_1.json', 'utf8')))
|
|
52
|
+
// batch 2
|
|
53
|
+
.post('/_all_docs', { limit: 3, start_key: badgerKey, include_docs: true })
|
|
54
|
+
.reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_2.json', 'utf8')))
|
|
55
|
+
// batch 3
|
|
56
|
+
.post('/_all_docs', { limit: 3, start_key: kookaburraKey, include_docs: true })
|
|
57
|
+
.reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_3.json', 'utf8')))
|
|
58
|
+
// batch 4
|
|
59
|
+
.post('/_all_docs', { limit: 3, start_key: snipeKey, include_docs: true })
|
|
60
|
+
.reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_4.json', 'utf8')));
|
|
61
|
+
|
|
62
|
+
shallowBackup(dbUrl, { bufferSize: 3, parallelism: 1 })
|
|
63
|
+
.on('error', function(err) {
|
|
64
|
+
assert.fail(err);
|
|
65
|
+
})
|
|
66
|
+
.on('received', function(data) {
|
|
67
|
+
if (data.batch === 3) {
|
|
68
|
+
assert.strictEqual(data.length, 2); // smaller last batch
|
|
69
|
+
} else {
|
|
70
|
+
assert.strictEqual(data.length, 3);
|
|
71
|
+
}
|
|
72
|
+
})
|
|
73
|
+
.on('finished', function(data) {
|
|
74
|
+
assert.strictEqual(data.total, 11);
|
|
75
|
+
assert.ok(couch.isDone());
|
|
76
|
+
done();
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('should perform a shallow backup with transient error', function(done) {
|
|
81
|
+
const couch = nock(dbUrl)
|
|
82
|
+
// batch 1
|
|
83
|
+
.post('/_all_docs', { limit: 3, include_docs: true })
|
|
84
|
+
.reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_1.json', 'utf8')))
|
|
85
|
+
// batch 2
|
|
86
|
+
.post('/_all_docs', { limit: 3, start_key: badgerKey, include_docs: true })
|
|
87
|
+
.reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_2.json', 'utf8')))
|
|
88
|
+
// batch 3 - transient error
|
|
89
|
+
.post('/_all_docs', { limit: 3, start_key: kookaburraKey, include_docs: true })
|
|
90
|
+
.reply(500, { error: 'Internal Server Error' })
|
|
91
|
+
// batch 3 - retry
|
|
92
|
+
.post('/_all_docs', { limit: 3, start_key: kookaburraKey, include_docs: true })
|
|
93
|
+
.reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_3.json', 'utf8')))
|
|
94
|
+
// batch 4
|
|
95
|
+
.post('/_all_docs', { limit: 3, start_key: snipeKey, include_docs: true })
|
|
96
|
+
.reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_4.json', 'utf8')));
|
|
97
|
+
|
|
98
|
+
shallowBackup(dbUrl, { bufferSize: 3, parallelism: 1 })
|
|
99
|
+
.on('error', function(err) {
|
|
100
|
+
assert.strictEqual(err.name, 'HTTPError');
|
|
101
|
+
})
|
|
102
|
+
.on('received', function(data) {
|
|
103
|
+
if (data.batch === 3) {
|
|
104
|
+
assert.strictEqual(data.length, 2); // smaller last batch
|
|
105
|
+
} else {
|
|
106
|
+
assert.strictEqual(data.length, 3);
|
|
107
|
+
}
|
|
108
|
+
})
|
|
109
|
+
.on('finished', function(data) {
|
|
110
|
+
assert.strictEqual(data.total, 11);
|
|
111
|
+
assert.ok(couch.isDone());
|
|
112
|
+
done();
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('should fail to perform a shallow backup on fatal error', function(done) {
|
|
117
|
+
const couch = nock(dbUrl)
|
|
118
|
+
// batch 1
|
|
119
|
+
.post('/_all_docs', { limit: 3, include_docs: true })
|
|
120
|
+
.reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_1.json', 'utf8')))
|
|
121
|
+
// batch 2
|
|
122
|
+
.post('/_all_docs', { limit: 3, start_key: badgerKey, include_docs: true })
|
|
123
|
+
.reply(200, JSON.parse(fs.readFileSync('./test/fixtures/animaldb_all_docs_2.json', 'utf8')))
|
|
124
|
+
// batch 3 - fatal error
|
|
125
|
+
.post('/_all_docs', { limit: 3, start_key: kookaburraKey, include_docs: true })
|
|
126
|
+
.reply(401, { error: 'Unauthorized' });
|
|
127
|
+
|
|
128
|
+
let errCount = 0;
|
|
129
|
+
|
|
130
|
+
shallowBackup(dbUrl, { bufferSize: 3, parallelism: 1 })
|
|
131
|
+
.on('error', function(err) {
|
|
132
|
+
errCount++;
|
|
133
|
+
assert.strictEqual(err.name, 'Unauthorized');
|
|
134
|
+
})
|
|
135
|
+
.on('received', function(data) {
|
|
136
|
+
assert.strictEqual(data.length, 3);
|
|
137
|
+
})
|
|
138
|
+
.on('finished', function(data) {
|
|
139
|
+
assert.strictEqual(data.total, 6);
|
|
140
|
+
assert.ok(couch.isDone());
|
|
141
|
+
assert.strictEqual(errCount, 1);
|
|
142
|
+
done();
|
|
143
|
+
});
|
|
35
144
|
});
|
|
36
145
|
});
|