1 | const debug = require('debug')('ssb-blobs')
|
2 | var tape = require('tape')
|
3 | var Blobs = require('../inject')
|
4 | var pull = require('pull-stream')
|
5 | var bitflipper = require('pull-bitflipper')
|
6 | var assert = require('assert')
|
7 |
|
8 | var u = require('./util')
|
9 | var Fake = u.fake
|
10 | var hash = u.hash
|
11 |
|
12 | module.exports = function (createBlobs, createAsync) {
|
13 |
|
14 |
|
15 | function log (name) {
|
16 | if(LOGGING)
|
17 | return pull.through(function (e) {
|
18 | debug(name, e)
|
19 | })
|
20 | else
|
21 | return pull.through()
|
22 | }
|
23 |
|
24 | tape('want - has', function (t) {
|
25 | createAsync(function (async) {
|
26 | var alice = createBlobs('alice', async)
|
27 | var bob = createBlobs('bob', async)
|
28 | var blob = Fake('foobar', 64)
|
29 | var h = hash(blob)
|
30 |
|
31 | u.peers('alice', alice, 'bob', bob)
|
32 |
|
33 | alice.want(h, function (err, has) {
|
34 | if(err) throw err
|
35 | debug('ALICE has?', h, has)
|
36 | alice.has(h, function (err, has) {
|
37 | debug('ALICE has!', h, has)
|
38 | if(err) throw err
|
39 | assert.ok(has)
|
40 | async.done()
|
41 | })
|
42 | })
|
43 |
|
44 | pull(pull.once(blob), bob.add())
|
45 | }, function (err) {
|
46 | if(err) throw err
|
47 | t.end()
|
48 | })
|
49 | })
|
50 |
|
51 | tape('want - has 2', function (t) {
|
52 | createAsync(function (async) {
|
53 | var alice = createBlobs('alice', async)
|
54 | var bob = createBlobs('bob', async)
|
55 | var blob = Fake('foobar', 64)
|
56 | var h = hash(blob)
|
57 |
|
58 | u.peers('bob', bob, 'alice', alice)
|
59 | pull(pull.once(blob), bob.add())
|
60 |
|
61 | alice.want(h, function (err, has) {
|
62 | if(err) throw err
|
63 | alice.has(h, function (err, has) {
|
64 | if(err) throw err
|
65 | assert.ok(has)
|
66 | async.done()
|
67 | })
|
68 | })
|
69 | }, function (err) {
|
70 | if(err) throw err
|
71 | t.end()
|
72 | })
|
73 | })
|
74 |
|
75 | tape('want - want -has', function (t) {
|
76 | createAsync(function (async) {
|
77 | var alice = createBlobs('alice', async)
|
78 | var bob = createBlobs('bob', async)
|
79 | var carol = createBlobs('carol', async)
|
80 |
|
81 | var blob = Fake('baz', 64)
|
82 | var h = hash(blob)
|
83 |
|
84 | u.peers('alice', alice, 'bob', bob)
|
85 | u.peers('bob', bob, 'carol', carol)
|
86 |
|
87 | alice.want(h, function (err, has) {
|
88 | if(err) throw err
|
89 | alice.has(h, function (err, has) {
|
90 | if(err) throw err
|
91 | assert.ok(has)
|
92 | async.done()
|
93 | })
|
94 | })
|
95 |
|
96 | pull(pull.once(blob), carol.add())
|
97 | }, function (err) {
|
98 | if(err) throw err
|
99 | t.end()
|
100 | })
|
101 | })
|
102 |
|
103 |
|
104 | tape('peers want what you have', function (t) {
|
105 | createAsync(function (async) {
|
106 | if(Array.isArray(process._events['exit']))
|
107 | debug(process._events['exit'].reverse())
|
108 | var alice = createBlobs('alice', async)
|
109 | var bob = createBlobs('bob', async)
|
110 | var carol = createBlobs('carol', async)
|
111 |
|
112 | var blob = Fake('baz', 64)
|
113 | var h = hash(blob)
|
114 |
|
115 | u.peers('alice', alice, 'bob', bob)
|
116 | u.peers('bob', bob, 'carol', carol)
|
117 |
|
118 | pull(
|
119 | carol.changes(),
|
120 | pull.drain(function (_h) {
|
121 | assert.equal(_h, h)
|
122 | async.done()
|
123 | })
|
124 | )
|
125 |
|
126 | alice.want(h, function () {})
|
127 | pull(pull.once(blob), alice.add())
|
128 | }, function (err) {
|
129 | if(err) throw err
|
130 | t.end()
|
131 | })
|
132 | })
|
133 |
|
134 |
|
135 | tape('triangle', function (t) {
|
136 | createAsync(function (async) {
|
137 | var n = 0
|
138 | var alice = createBlobs('alice', async)
|
139 | var bob = createBlobs('bob', async)
|
140 | var carol = createBlobs('carol', async)
|
141 |
|
142 | var blob = Fake('baz', 64)
|
143 | var h = hash(blob)
|
144 |
|
145 | u.peers('alice', alice, 'bob', bob)
|
146 | u.peers('bob', bob, 'carol', carol)
|
147 |
|
148 | pull(
|
149 | bob.changes(),
|
150 | pull.drain(function (_h) {
|
151 | assert.equal(_h, h)
|
152 | async.done()
|
153 | })
|
154 | )
|
155 |
|
156 | pull(pull.once(blob), alice.add())
|
157 | pull(pull.once(blob), carol.add())
|
158 |
|
159 | bob.want(h, function () {})
|
160 | }, function (err) {
|
161 | if(err) throw err
|
162 | t.end()
|
163 | })
|
164 | })
|
165 |
|
166 | tape('corrupt', function (t) {
|
167 | createAsync(function (async) {
|
168 | var n = 0
|
169 | var alice = createBlobs('alice', async)
|
170 | var bob = createBlobs('bob', async)
|
171 | var carol = createBlobs('carol', async)
|
172 |
|
173 |
|
174 | var get = alice.get
|
175 | alice.get = function (id) {
|
176 | return pull(get(id), bitflipper(1))
|
177 | }
|
178 |
|
179 | var blob = Fake('baz', 64)
|
180 | var h = hash(blob)
|
181 |
|
182 | u.peers('alice', alice, 'bob', bob)
|
183 | u.peers('bob', bob, 'carol', carol)
|
184 |
|
185 | pull(
|
186 | bob.changes(),
|
187 | pull.drain(function (_h) {
|
188 | debug('HAS', _h)
|
189 | assert.equal(_h, h)
|
190 | async.done()
|
191 | })
|
192 | )
|
193 |
|
194 | bob.want(h, function () {})
|
195 | pull(pull.once(blob), alice.add())
|
196 | pull(pull.once(blob), carol.add())
|
197 | }, function (err) {
|
198 | if(err) throw err
|
199 | t.end()
|
200 | })
|
201 | })
|
202 |
|
203 | tape('cycle', function (t) {
|
204 | createAsync(function (async) {
|
205 | var n = 0
|
206 | var alice = createBlobs('alice', async)
|
207 | var bob = createBlobs('bob', async)
|
208 | var carol = createBlobs('carol', async)
|
209 | var dan = createBlobs('dan', async)
|
210 | u.peers('alice', alice, 'bob', bob)
|
211 | u.peers('bob', bob, 'carol', carol)
|
212 | u.peers('carol', carol, 'dan', dan)
|
213 | u.peers('dan', dan, 'alice', alice)
|
214 |
|
215 | var blob = Fake('gurg', 64)
|
216 | var h = hash(blob)
|
217 | alice.want(h, function (err, has) {
|
218 | async.done()
|
219 | })
|
220 |
|
221 | pull(pull.once(blob), dan.add(h))
|
222 | }, function (err) {
|
223 | if(err) throw err
|
224 | t.end()
|
225 | })
|
226 |
|
227 | })
|
228 | }
|
229 |
|
230 | if(!module.parent)
|
231 | u.tests(module.exports)
|
232 |
|
233 |
|
234 |
|