wrapped.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. 'use strict';
  2. var test = require('tape');
  3. var net = require('net');
  4. var WrappedError = require('../wrapped.js');
  5. test('can create a wrapped error', function t(assert) {
  6. var ServerListenError = WrappedError({
  7. name: 'SomeError',
  8. message: 'server: {causeMessage}',
  9. type: 'server.listen-failed',
  10. requestedPort: null,
  11. host: null
  12. });
  13. var err = new Error('listen EADDRINUSE');
  14. err.code = 'EADDRINUSE';
  15. var err2 = ServerListenError(err, {
  16. requestedPort: 3426,
  17. host: 'localhost'
  18. });
  19. assert.equal(ServerListenError.type, 'server.listen-failed');
  20. assert.equal(err2.message, 'server: listen EADDRINUSE');
  21. assert.equal(err2.requestedPort, 3426);
  22. assert.equal(err2.host, 'localhost');
  23. assert.equal(err2.code, 'EADDRINUSE');
  24. assert.equal(err2.cause, err);
  25. assert.equal(err2.toString(),
  26. 'ServerListenFailedError: server: listen EADDRINUSE');
  27. assert.equal(JSON.stringify(err2), JSON.stringify({
  28. type: 'server.listen-failed',
  29. name: 'ServerListenFailedError',
  30. message: 'server: listen EADDRINUSE',
  31. requestedPort: 3426,
  32. host: 'localhost',
  33. causeMessage: 'listen EADDRINUSE',
  34. origMessage: 'listen EADDRINUSE',
  35. code: 'EADDRINUSE',
  36. fullType: 'server.listen-failed~!~error.wrapped-unknown'
  37. }));
  38. assert.end();
  39. });
  40. test('can create wrapped error with syscall', function t(assert) {
  41. var SysCallError = WrappedError({
  42. 'message': 'tchannel socket error ({code} from ' +
  43. '{syscall}): {origMessage}',
  44. type: 'syscall.error'
  45. });
  46. var err = new Error('listen EADDRINUSE');
  47. err.code = 'EADDRINUSE';
  48. err.syscall = 'listen';
  49. var err2 = SysCallError(err);
  50. assert.equal(err2.message, 'tchannel socket error ' +
  51. '(EADDRINUSE from listen): listen EADDRINUSE');
  52. assert.equal(err2.syscall, 'listen');
  53. assert.equal(err2.code, 'EADDRINUSE');
  54. assert.equal(err2.type, 'syscall.error');
  55. assert.end();
  56. });
  57. test('wrapping twice', function t(assert) {
  58. var ReadError = WrappedError({
  59. type: 'my.read-error',
  60. message: 'read: {causeMessage}'
  61. });
  62. var DatabaseError = WrappedError({
  63. type: 'my.database-error',
  64. message: 'db: {causeMessage}'
  65. });
  66. var BusinessError = WrappedError({
  67. type: 'my.business-error',
  68. message: 'business: {causeMessage}'
  69. });
  70. var err = BusinessError(
  71. DatabaseError(
  72. ReadError(
  73. new Error('oops')
  74. )
  75. )
  76. );
  77. assert.ok(err);
  78. assert.equal(err.message, 'business: db: read: oops');
  79. assert.equal(err.type, 'my.business-error');
  80. assert.equal(err.fullType, 'my.business-error~!~' +
  81. 'my.database-error~!~' +
  82. 'my.read-error~!~' +
  83. 'error.wrapped-unknown');
  84. assert.end();
  85. });
  86. test('handles bad recursive strings', function t(assert) {
  87. var ReadError = WrappedError({
  88. type: 'wat.wat',
  89. message: 'read: {causeMessage}'
  90. });
  91. var err2 = ReadError(new Error('hi {causeMessage}'));
  92. assert.ok(err2);
  93. assert.equal(err2.message,
  94. 'read: hi $INVALID_CAUSE_MESSAGE_LITERAL');
  95. assert.end();
  96. });
  97. test('can wrap real IO errors', function t(assert) {
  98. var ServerListenError = WrappedError({
  99. message: 'server: {causeMessage}',
  100. type: 'server.listen-failed',
  101. requestedPort: null,
  102. host: null
  103. });
  104. var otherServer = net.createServer();
  105. otherServer.once('listening', onPortAllocated);
  106. otherServer.listen(0);
  107. function onPortAllocated() {
  108. var port = otherServer.address().port;
  109. var server = net.createServer();
  110. server.on('error', onError);
  111. server.listen(port);
  112. function onError(cause) {
  113. var err = ServerListenError(cause, {
  114. host: 'localhost',
  115. requestedPort: port
  116. });
  117. otherServer.close();
  118. assertOnError(err, cause, port);
  119. }
  120. }
  121. function assertOnError(err, cause, port) {
  122. assert.ok(err.message.indexOf('server: ') >= 0)
  123. assert.ok(err.message.indexOf('listen EADDRINUSE') >= 0)
  124. assert.equal(err.requestedPort, port);
  125. assert.equal(err.host, 'localhost');
  126. assert.equal(err.code, 'EADDRINUSE');
  127. assert.equal(err.cause, cause);
  128. assert.ok(err.toString().indexOf('ServerListenFailedError: ') >= 0)
  129. assert.ok(err.toString().indexOf('server: ') >= 0)
  130. assert.ok(err.toString().indexOf('listen EADDRINUSE') >= 0)
  131. var expectedMessage = err.message
  132. var expectedOrigMessage = err.origMessage
  133. assert.ok(err.origMessage.indexOf('listen EADDRINUSE') >= 0)
  134. assert.ok(err.origMessage.indexOf('server: ') === -1)
  135. assert.equal(JSON.stringify(err), JSON.stringify({
  136. type: 'server.listen-failed',
  137. name: 'ServerListenFailedError',
  138. message: expectedMessage,
  139. requestedPort: port,
  140. host: 'localhost',
  141. causeMessage: expectedOrigMessage,
  142. origMessage: expectedOrigMessage,
  143. code: 'EADDRINUSE',
  144. errno: 'EADDRINUSE',
  145. syscall: 'listen',
  146. fullType: 'server.listen-failed~!~' +
  147. 'error.wrapped-io.listen.EADDRINUSE'
  148. }));
  149. assert.end();
  150. }
  151. });
  152. test('can wrap assert errors', function t(assert) {
  153. var TestError = WrappedError({
  154. message: 'error: {origMessage}',
  155. type: 'error'
  156. });
  157. var assertError;
  158. try { require('assert').equal('a', 'b'); }
  159. catch (_err) { assertError = _err; }
  160. var err = TestError(assertError);
  161. assert.equal(err.cause.actual, 'a');
  162. assert.end();
  163. })