11import * as zmq from "../../src"
22
33import { assert } from "chai"
4- import { testProtos , uniqAddress } from "./helpers"
4+ import { captureEvent , captureEventsUntil , testProtos , uniqAddress } from "./helpers"
55
66for ( const proto of testProtos ( "tcp" , "ipc" , "inproc" ) ) {
77 describe ( `socket with ${ proto } events` , function ( ) {
@@ -21,18 +21,10 @@ for (const proto of testProtos("tcp", "ipc", "inproc")) {
2121
2222 describe ( "when not connected" , function ( ) {
2323 it ( "should receive events" , async function ( ) {
24- const events : zmq . Event [ ] = [ ]
25-
26- const read = async ( ) => {
27- for await ( const event of sockA . events ) {
28- events . push ( event )
29- }
30- }
31-
32- const done = read ( )
33- await sockA . close ( )
34- await done
24+ const done = captureEventsUntil ( sockA , "end" )
25+ sockA . close ( )
3526
27+ const events = await done
3628 assert . deepEqual ( events , [ { type : "end" } ] )
3729 } )
3830 } )
@@ -42,110 +34,50 @@ for (const proto of testProtos("tcp", "ipc", "inproc")) {
4234 assert . equal ( sockA . events , sockA . events )
4335 } )
4436
45- it ( "should receive bind events" , async function ( ) {
46- const address = uniqAddress ( proto )
47- const events : zmq . Event [ ] = [ ]
48-
49- const read = async ( ) => {
50- for await ( const event of sockA . events ) {
51- events . push ( event )
52- }
53- }
54-
55- const done = read ( )
37+ if ( proto !== "inproc" ) {
38+ it ( "should receive bind events" , async function ( ) {
39+ const address = uniqAddress ( proto )
5640
57- await sockA . bind ( address )
58- await sockB . connect ( address )
59- await new Promise ( ( resolve ) => setTimeout ( resolve , 15 ) )
60- sockA . close ( )
61- sockB . close ( )
62- await done
63- await new Promise ( ( resolve ) => setTimeout ( resolve , 15 ) )
41+ const [ event ] = await Promise . all ( [
42+ captureEvent ( sockA , "bind" ) ,
43+ sockA . bind ( address ) ,
44+ sockB . connect ( address ) ,
45+ ] )
6446
65- if ( proto === "inproc" ) {
66- assert . deepEqual ( events , [ { type : "end" } ] )
67- } else {
68- assert . deepInclude ( events , { type : "bind" , address} )
69- assert . deepInclude ( events , { type : "accept" , address} )
70- assert . deepInclude ( events , { type : "close" , address} )
71- assert . deepInclude ( events , { type : "end" } )
72- }
73- } )
74-
75- it ( "should receive connect events" , async function ( ) {
76- const address = uniqAddress ( proto )
77- const events : zmq . Event [ ] = [ ]
78-
79- const read = async ( ) => {
80- for await ( const event of sockB . events ) {
81- events . push ( event )
82- }
83- }
84-
85- const done = read ( )
86-
87- await sockA . bind ( address )
88- await sockB . connect ( address )
89- await new Promise ( ( resolve ) => setTimeout ( resolve , 15 ) )
90- sockA . close ( )
91- sockB . close ( )
92- await done
93- await new Promise ( ( resolve ) => setTimeout ( resolve , 15 ) )
94-
95- if ( proto === "inproc" ) {
96- assert . deepEqual ( events , [ { type : "end" } ] )
97- } else {
98- if ( proto === "tcp" ) {
99- assert . deepInclude ( events , { type : "connect:delay" , address} )
100- }
101-
102- assert . deepInclude ( events , { type : "connect" , address} )
103- assert . deepInclude ( events , { type : "end" } )
104- }
105- } )
106-
107- it ( "should receive error events" , async function ( ) {
108- const address = uniqAddress ( proto )
109- const events : zmq . Event [ ] = [ ]
110-
111- const read = async ( ) => {
112- for await ( const event of sockB . events ) {
113- events . push ( event )
114- }
115- }
116-
117- const done = read ( )
47+ assert . deepEqual ( event , { type : "bind" , address} )
48+ } )
11849
119- await sockA . bind ( address )
120- try {
121- await sockB . bind ( address )
122- } catch ( err ) {
123- /* Ignore error here */
124- }
50+ it ( "should receive connect events" , async function ( ) {
51+ this . slow ( 250 )
52+ const address = uniqAddress ( proto )
12553
126- await new Promise ( ( resolve ) => setTimeout ( resolve , 15 ) )
127- sockA . close ( )
128- sockB . close ( )
129- await done
54+ const [ event ] = await Promise . all ( [
55+ captureEvent ( sockB , "connect" ) ,
56+ sockA . bind ( address ) ,
57+ sockB . connect ( address ) ,
58+ ] )
13059
131- if ( proto === "tcp" ) {
132- let bindError = false
133- for ( const event of events ) {
134- if ( event . type === "bind:error" ) {
135- bindError = true
136- assert . equal ( "tcp://" + event . address , address )
137- assert . instanceOf ( event . error , Error )
138- assert . equal ( event . error . message , "Address already in use" )
139- assert . equal ( event . error . code , "EADDRINUSE" )
140- assert . typeOf ( event . error . errno , "number" )
141- }
142- }
143-
144- assert . equal ( true , bindError )
145- }
146-
147- assert . deepInclude ( events , { type : "end" } )
148- } )
60+ assert . deepEqual ( event , { type : "connect" , address} )
61+ } )
62+ }
63+
64+ if ( proto === "tcp" ) {
65+ it ( "should receive error events" , async function ( ) {
66+ const address = uniqAddress ( proto )
67+
68+ await sockA . bind ( address )
69+ const [ event ] = await Promise . all ( [
70+ captureEvent ( sockB , "bind:error" ) ,
71+ sockB . bind ( address ) . catch ( ( ) => { /* Ignore */ } ) ,
72+ ] )
73+
74+ assert . equal ( "tcp://" + event . address , address )
75+ assert . instanceOf ( event . error , Error )
76+ assert . equal ( event . error . message , "Address already in use" )
77+ assert . equal ( event . error . code , "EADDRINUSE" )
78+ assert . typeOf ( event . error . errno , "number" )
79+ } )
80+ }
14981
15082 it ( "should receive events with emitter" , async function ( ) {
15183 const address = uniqAddress ( proto )
@@ -174,13 +106,18 @@ for (const proto of testProtos("tcp", "ipc", "inproc")) {
174106 "is not possible to read events with events.receive()." ,
175107 )
176108
177- await sockA . bind ( address )
178- await sockB . connect ( address )
179- await new Promise ( ( resolve ) => setTimeout ( resolve , 15 ) )
109+ const connected = captureEvent ( sockB , "connect" )
110+ const done = Promise . all ( [
111+ captureEvent ( sockA , "end" ) ,
112+ sockA . bind ( address ) ,
113+ sockB . connect ( address ) ,
114+ ] )
115+
116+ if ( proto !== "inproc" ) await connected
180117 sockA . close ( )
181118 sockB . close ( )
182- await new Promise ( ( resolve ) => setTimeout ( resolve , 15 ) )
183119
120+ await done
184121 if ( proto === "inproc" ) {
185122 assert . deepEqual ( events , [ { type : "end" } ] )
186123 } else {
0 commit comments