1 | var tape = require('tape')
|
2 | var create = require('./helpers/create')
|
3 | var { runAll } = require('./helpers/util')
|
4 | var collect = require('stream-collector')
|
5 |
|
6 | tape('simple diff stream', async function (t) {
|
7 | let drive = create()
|
8 |
|
9 | var v1, v2, v3
|
10 |
|
11 |
|
12 | let v3Diff = ['del-hello', 'put-other']
|
13 |
|
14 | let v2Diff = ['put-other', 'del-hello']
|
15 |
|
16 | let v1Diff = ['put-other']
|
17 |
|
18 | await writeVersions()
|
19 | await verifyDiffStream(t, drive, [v1], v1Diff)
|
20 | await verifyDiffStream(t, drive, [v2], v2Diff)
|
21 | await verifyDiffStream(t, drive, [v3], v3Diff)
|
22 | t.end()
|
23 |
|
24 | function writeVersions () {
|
25 | return new Promise(resolve => {
|
26 | drive.ready(err => {
|
27 | t.error(err, 'no error')
|
28 | v1 = drive.version
|
29 | drive.writeFile('/hello', 'world', err => {
|
30 | t.error(err, 'no error')
|
31 | v2 = drive.version
|
32 | drive.writeFile('/other', 'file', err => {
|
33 | t.error(err, 'no error')
|
34 | v3 = drive.version
|
35 | drive.unlink('/hello', err => {
|
36 | t.error(err, 'no error')
|
37 | return resolve()
|
38 | })
|
39 | })
|
40 | })
|
41 | })
|
42 | })
|
43 | }
|
44 | })
|
45 |
|
46 | tape.skip('diff stream with mounts', async function (t) {
|
47 | let drive1 = create()
|
48 | let drive2 = create()
|
49 | let drive3 = create()
|
50 |
|
51 | var v1, v2, v3
|
52 |
|
53 | let v3Diff = ['unmount-hello', 'mount-goodbye']
|
54 | let v2Diff = ['mount-hello', 'put-other']
|
55 | let v1Diff = ['mount-goodbye', 'put-other']
|
56 |
|
57 | await ready()
|
58 | await writeVersions()
|
59 | await verifyDiffStream(t, drive1, [v1], v1Diff)
|
60 | await verifyDiffStream(t, drive1, [v1, v2], v2Diff)
|
61 | await verifyDiffStream(t, drive1, [v2, v3], v3Diff)
|
62 | t.end()
|
63 |
|
64 | function ready () {
|
65 | return new Promise(resolve => {
|
66 | drive1.ready(err => {
|
67 | t.error(err, 'no error')
|
68 | drive2.ready(err => {
|
69 | t.error(err, 'no error')
|
70 | drive3.ready(err => {
|
71 | t.error(err, 'no error')
|
72 | return resolve()
|
73 | })
|
74 | })
|
75 | })
|
76 | })
|
77 | }
|
78 |
|
79 | function writeVersions () {
|
80 | return new Promise(resolve => {
|
81 | v1 = drive1.version
|
82 | drive1.mount('/hello', drive2.key, err => {
|
83 | t.error(err, 'no error')
|
84 | drive1.writeFile('/other', 'file', err => {
|
85 | t.error(err, 'no error')
|
86 | v2 = drive1.version
|
87 | drive1.mount('/goodbye', drive3.key, err => {
|
88 | t.error(err, 'no error')
|
89 | drive1.unmount('/hello', err => {
|
90 | t.error(err, 'no error')
|
91 | v3 = drive1.version
|
92 | return resolve()
|
93 | })
|
94 | })
|
95 | })
|
96 | })
|
97 | })
|
98 | }
|
99 | })
|
100 |
|
101 | tape('diff stream returns seqs', t => {
|
102 | const drive = create()
|
103 | runAll([
|
104 | cb => drive.writeFile('one', Buffer.from('one'), cb),
|
105 | cb => drive.writeFile('two', Buffer.from('two'), cb),
|
106 | cb => drive.writeFile('one', Buffer.from('mod'), cb),
|
107 | cb => {
|
108 | const diff = drive.createDiffStream(0)
|
109 | collect(diff, (err, res) => {
|
110 | t.error(err)
|
111 | res = res.map(map)
|
112 | t.deepEqual(res, [
|
113 | 'put one 3 x',
|
114 | 'put two 2 x'
|
115 | ], 'seqs are correct')
|
116 | cb()
|
117 | })
|
118 | },
|
119 | cb => drive.writeFile('three', Buffer.from('three'), cb),
|
120 | cb => drive.unlink('one', cb),
|
121 | cb => {
|
122 | const diff = drive.createDiffStream(4)
|
123 | collect(diff, (err, res) => {
|
124 | t.error(err)
|
125 | res = res.map(map)
|
126 | t.deepEqual(res, [
|
127 | 'del one x 3',
|
128 | 'put three 5 x'
|
129 | ], 'seqs are correct')
|
130 | t.end()
|
131 | })
|
132 | }
|
133 | ])
|
134 |
|
135 | function map (row) {
|
136 | return `${row.type} ${row.name} ${row.seq || 'x'} ${row.previous ? row.previous.seq : 'x'}`
|
137 | }
|
138 | })
|
139 |
|
140 | async function verifyDiffStream (t, drive, [from, to], diffList) {
|
141 | let diffSet = new Set(diffList)
|
142 |
|
143 | const fromDrive = from ? drive.checkout(from) : drive
|
144 | const toDrive = to ? drive.checkout(to) : drive
|
145 | let diffStream = toDrive.createDiffStream(fromDrive)
|
146 |
|
147 | return new Promise(resolve => {
|
148 | diffStream.on('data', ({ type, name }) => {
|
149 | let key = `${type}-${name}`
|
150 | if (!diffSet.has(key)) {
|
151 | return t.fail('an incorrect diff was streamed')
|
152 | }
|
153 | diffSet.delete(key)
|
154 | })
|
155 | diffStream.on('end', () => {
|
156 | t.same(diffSet.size, 0)
|
157 | return resolve()
|
158 | })
|
159 | })
|
160 | }
|