UNPKG

4.42 kBJavaScriptView Raw
1var tape = require('tape')
2var create = require('./helpers/create')
3var { runAll } = require('./helpers/util')
4var collect = require('stream-collector')
5
6tape('simple diff stream', async function (t) {
7 let drive = create()
8
9 var v1, v2, v3
10
11 // TODO: The v3 diff currently has a false-positive for put-other.
12 let v3Diff = ['del-hello', 'put-other']
13 // Since hello was already written in v2, its corresponding delete should be recorded in v2diff.
14 let v2Diff = ['put-other', 'del-hello']
15 // Since hello has been put/deleted, it does not appear in the complete diff.
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
46tape.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
101tape('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
140async 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}