33const range = require ( 'lodash.range' )
44const map = require ( 'async/map' )
55const each = require ( 'async/each' )
6- const parallel = require ( 'async/parallel ' )
6+ const whilst = require ( 'async/whilst ' )
77const series = require ( 'async/series' )
88const waterfall = require ( 'async/waterfall' )
99const chai = require ( 'chai' )
1010chai . use ( require ( 'dirty-chai' ) )
1111const expect = chai . expect
12+ const EventEmitter = require ( 'events' )
1213
1314const createBitswap = require ( './create-bitswap' )
1415const makeBlock = require ( './make-block' )
1516const connectAll = require ( './connect-all' )
1617
17- module . exports = ( instanceCount , blockCount , callback ) => {
18+ module . exports = ( instanceCount , blockCount , repeats , callback ) => {
19+ let pendingRepeats = repeats
1820 let nodes
19- let blocks
21+ const events = new EventEmitter ( )
2022
2123 waterfall ( [
22- ( cb ) => parallel (
23- {
24- nodes : ( cb ) => map ( range ( instanceCount ) , ( _ , cb ) => createBitswap ( cb ) , cb ) ,
25- blocks : ( cb ) => map ( range ( blockCount ) , ( _ , cb ) => makeBlock ( cb ) , cb )
26- } ,
27- cb ) ,
28- ( results , cb ) => {
29- nodes = results . nodes
30- blocks = results . blocks
31- const first = nodes [ 0 ]
32-
33- parallel ( [
34- ( cb ) => connectAll ( results . nodes , cb ) ,
35- ( cb ) => each ( results . blocks , first . bitswap . put . bind ( first . bitswap ) , cb )
36- ] , cb )
24+ ( cb ) => map ( range ( instanceCount ) , ( _ , cb ) => createBitswap ( cb ) , cb ) ,
25+ ( _nodes , cb ) => {
26+ nodes = _nodes
27+ events . emit ( 'start' )
28+ cb ( )
3729 } ,
38- ( results , cb ) => {
39- const cids = blocks . map ( ( block ) => block . cid )
40- map ( nodes , ( node , cb ) => node . bitswap . getMany ( cids , cb ) , cb )
30+ ( cb ) => {
31+ connectAll ( nodes , cb )
4132 } ,
42- ( results , cb ) => {
43- try {
44- expect ( results ) . have . lengthOf ( instanceCount )
45- results . forEach ( ( nodeBlocks ) => {
46- expect ( nodeBlocks ) . to . have . lengthOf ( blocks . length )
47- nodeBlocks . forEach ( ( block , i ) => {
48- expect ( block . data ) . to . deep . equal ( blocks [ i ] . data )
49- } )
50- } )
51- } catch ( err ) {
52- return cb ( err )
53- }
54- cb ( )
33+ ( cb ) => {
34+ events . emit ( 'all connected' )
35+ whilst ( ( ) => pendingRepeats > 0 , ( cb ) => {
36+ const first = nodes [ 0 ]
37+ let blocks
38+ waterfall ( [
39+ ( cb ) => map ( range ( blockCount ) , ( _ , cb ) => makeBlock ( cb ) , cb ) ,
40+ ( _blocks , cb ) => {
41+ blocks = _blocks
42+ cb ( )
43+ } ,
44+ ( cb ) => each ( blocks , first . bitswap . put . bind ( first . bitswap ) , ( err ) => {
45+ events . emit ( 'first put' )
46+ cb ( err )
47+ } ) ,
48+ ( cb ) => map ( nodes , ( node , cb ) => {
49+ events . emit ( 'getting many' )
50+ const cids = blocks . map ( ( block ) => block . cid )
51+ const start = Date . now ( )
52+ node . bitswap . getMany ( cids , ( err , result ) => {
53+ if ( err ) {
54+ cb ( err )
55+ } else {
56+ const elapsed = Date . now ( ) - start
57+ events . emit ( 'got block' , elapsed )
58+ cb ( null , result )
59+ }
60+ } )
61+ } , cb ) ,
62+ ( results , cb ) => {
63+ try {
64+ expect ( results ) . have . lengthOf ( instanceCount )
65+ results . forEach ( ( nodeBlocks ) => {
66+ expect ( nodeBlocks ) . to . have . lengthOf ( blocks . length )
67+ nodeBlocks . forEach ( ( block , i ) => {
68+ expect ( block . data ) . to . deep . equal ( blocks [ i ] . data )
69+ } )
70+ } )
71+ } catch ( err ) {
72+ return cb ( err )
73+ }
74+ cb ( )
75+ } ,
76+ ( cb ) => {
77+ pendingRepeats --
78+ cb ( )
79+ }
80+ ] , cb )
81+ } , cb )
5582 }
5683 ] ,
5784 ( err ) => {
85+ events . emit ( 'stop' )
5886 each (
5987 nodes ,
6088 ( node , cb ) => {
@@ -64,12 +92,14 @@ module.exports = (instanceCount, blockCount, callback) => {
6492 ( cb ) => node . libp2pNode . stop ( cb ) ,
6593 ( cb ) => node . repo . teardown ( cb )
6694 ] ,
67- cb
68- )
95+ cb )
6996 } ,
7097 ( err2 ) => {
98+ events . emit ( 'stopped' )
7199 callback ( err )
72100 }
73101 )
74102 } )
103+
104+ return events
75105}
0 commit comments