@ -1,26 +1,16 @@
'use strict' ;
'use strict' ;
// Tests of multiple domains happening at once.
// Tests of multiple domains happening at once.
require ( '../common' ) ;
const common = require ( '../common' ) ;
const assert = require ( 'assert' ) ;
const domain = require ( 'domain' ) ;
const domain = require ( 'domain' ) ;
const http = require ( 'http' ) ;
let caughtA = false ;
let caughtB = false ;
let caughtC = false ;
const a = domain . create ( ) ;
const a = domain . create ( ) ;
a . enter ( ) ; // this will be our "root" domain
a . enter ( ) ; // this will be our "root" domain
a . on ( 'error' , function ( er ) {
caughtA = true ;
console . log ( 'This should not happen' ) ;
throw er ;
} ) ;
a . on ( 'error' , common . fail ) ;
const http = require ( 'http' ) ;
const server = http . createServer ( ( req , res ) => {
const server = http . createServer ( function ( req , res ) {
// child domain of a.
// child domain of a.
const b = domain . create ( ) ;
const b = domain . create ( ) ;
a . add ( b ) ;
a . add ( b ) ;
@ -31,47 +21,34 @@ const server = http.createServer(function(req, res) {
b . add ( req ) ;
b . add ( req ) ;
b . add ( res ) ;
b . add ( res ) ;
b . on ( 'error' , function ( er ) {
b . on ( 'error' , common . mustCall ( ( er ) => {
caughtB = true ;
console . error ( 'Error encountered' , er ) ;
if ( res ) {
if ( res ) {
res . writeHead ( 500 ) ;
res . writeHead ( 500 ) ;
res . end ( 'An error occurred' ) ;
res . end ( 'An error occurred' ) ;
}
}
// res.writeHead(500), res.destroy, etc.
// res.writeHead(500), res.destroy, etc.
server . close ( ) ;
server . close ( ) ;
} ) ;
} ) ) ;
// XXX this bind should not be necessary.
// XXX this bind should not be necessary.
// the write cb behavior in http/net should use an
// the write cb behavior in http/net should use an
// event so that it picks up the domain handling.
// event so that it picks up the domain handling.
res . write ( 'HELLO\n' , b . bind ( function ( ) {
res . write ( 'HELLO\n' , b . bind ( ( ) => {
throw new Error ( 'this kills domain B, not A' ) ;
throw new Error ( 'this kills domain B, not A' ) ;
} ) ) ;
} ) ) ;
} ) . listen ( 0 , function ( ) {
} ) . listen ( 0 , ( ) => {
const c = domain . create ( ) ;
const c = domain . create ( ) ;
const req = http . get ( { host : 'localhost' , port : this . address ( ) . port } ) ;
const req = http . get ( { host : 'localhost' , port : server . address ( ) . port } ) ;
// add the request to the C domain
// add the request to the C domain
c . add ( req ) ;
c . add ( req ) ;
req . on ( 'response' , function ( res ) {
req . on ( 'response' , ( res ) => {
console . error ( 'got response' ) ;
// add the response object to the C domain
// add the response object to the C domain
c . add ( res ) ;
c . add ( res ) ;
res . pipe ( process . stdout ) ;
res . pipe ( process . stdout ) ;
} ) ;
} ) ;
c . on ( 'error' , function ( er ) {
c . on ( 'error' , common . mustCall ( ( er ) => { } ) ) ;
caughtC = true ;
console . error ( 'Error on c' , er . message ) ;
} ) ;
} ) ;
process . on ( 'exit' , function ( ) {
assert . strictEqual ( caughtA , false ) ;
assert . strictEqual ( caughtB , true ) ;
assert . strictEqual ( caughtC , true ) ;
console . log ( 'ok - Errors went where they were supposed to go' ) ;
} ) ;
} ) ;