diff --git a/e2eTest/README.md b/e2eTest/README.md new file mode 100644 index 0000000..8e2375c --- /dev/null +++ b/e2eTest/README.md @@ -0,0 +1,12 @@ +To run these tests, you need a logstash server. You can set one up with: + + docker run -it --rm -p 9997:9997 -v "$PWD"/logstash:/logstashcfg logstash -f /logstashcfg/logstash.conf + +Then run individual tests and follow the instructions: + + node ./disconnectTest.js + +If you need to regenerate the certificates for some reason: + + openssl req -x509 -newkey rsa:4096 -keyout logstash/key.pem -out logstash/cert.pem \ + -days 365 -nodes -subj "/C=CA/ST=Ontario/L=Ottawa/O=Logstash/CN=logstash.local" diff --git a/e2eTest/disconnectTest.js b/e2eTest/disconnectTest.js new file mode 100644 index 0000000..9c5e2f5 --- /dev/null +++ b/e2eTest/disconnectTest.js @@ -0,0 +1,41 @@ +"use strict"; + +const lumberjack = require('..'); +const fs = require('fs'); + +const connectionOptions = { + host: "localhost", + port: 9997, + ca: [fs.readFileSync('./logstash/cert.pem', {encoding: 'utf-8'})], + rejectUnauthorized: false +}; + +let state = 0; + +let client = lumberjack.client(connectionOptions, {maxQueueSize: 500}); + +client.on("connect", () => { + client.writeDataFrame({"line": "Connect!"}); + if(state === 0) { + state++; + console.log("Connect! Please kill your logstash server."); + } else if(state === 2) { + console.log("Test passed!"); + process.exit(0); + } else { + console.log("Test failed - unexpected connect.") + process.exit(1); + } +}); +client.on("disconnect", err => { + if(state === 1) { + state++; + console.log("Disconnected. Please restart your logstash server."); + } else if(state === 2) { + // We can get lots of disconnects while we're waiting for the logstash server to restart. + } else { + console.log("Test failed - unexpected disconnect.") + process.exit(1); + } +}); +client.on("dropped", count => console.log(`Dropped ${count}`)); diff --git a/e2eTest/logstash/cert.pem b/e2eTest/logstash/cert.pem new file mode 100644 index 0000000..e9ce358 --- /dev/null +++ b/e2eTest/logstash/cert.pem @@ -0,0 +1,35 @@ +-----BEGIN CERTIFICATE----- +MIIF/TCCA+WgAwIBAgIJAP0SlLCIEHAoMA0GCSqGSIb3DQEBBQUAMFwxCzAJBgNV +BAYTAkNBMRAwDgYDVQQIEwdPbnRhcmlvMQ8wDQYDVQQHEwZPdHRhd2ExETAPBgNV +BAoTCExvZ3N0YXNoMRcwFQYDVQQDEw5sb2dzdGFzaC5sb2NhbDAeFw0xNjEyMTQx +NTAzMzhaFw0xNzEyMTQxNTAzMzhaMFwxCzAJBgNVBAYTAkNBMRAwDgYDVQQIEwdP +bnRhcmlvMQ8wDQYDVQQHEwZPdHRhd2ExETAPBgNVBAoTCExvZ3N0YXNoMRcwFQYD +VQQDEw5sb2dzdGFzaC5sb2NhbDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBALtBu3E1bZE8EuymgEdF0FCMBYUZj6FWUF6yFVon0n3dhsUFhn2kAwgmL51F +U+pBv2HxiRg3quYJ5rx9FUcdm8pG2KBUHBIkZ+umskM3dBfFIr2pPOU9GAFXdkk7 +kMknEqUvzKODcpsjm7s12xzkGdiAwjAZnm/F+PVjCKK+M3RrdqHuX/Z/bw8iAGw1 +9Z2roLbIi2A/tzAFObfwwp07B8WQEZWfYRsFiV7E9OE+60dybVr8UuD8w0P14n/O +cmI957blE4hkXp33LO+Otg48+45u7c2wKWmetATMj2F85sje9b0VS2D86R2b5+Jm +Sx8G/fMz7VSb8PqAI1DATjhAGnKp94jJbYCcHrkv5UIA9tozqwem0QcEAjcL3rNm +ttWEc92fyTiXuClXTdI6MIkKvhbILtLFV32zvr3A90wchvwbKbUDousM/tPRWbfQ +KU/+eGk2Eqc4y7eNQ0RMy7PvQxlA+YRKFGuSkr/Op8lu+4kHr6UocgHoXP57ePiB +yaSIydzpz12PFB3yeV4ZR4zAmT87zU0roq5THsLLjiG3SPCnw+dqI7SAREMLWUK8 +izL8qNiFWGbnL3l6vrLRdYFOOEvjLQPH6S4u23KYEeZn/h93gKfS7Fs01Nr43B3w +FgkGWSCjQOojt7NaEuoXeH6ZlU9TFfwhKq+ycw/9X6R67rFnAgMBAAGjgcEwgb4w +HQYDVR0OBBYEFM79eHUKmC8oH4ZpaSKZyQ/6D81jMIGOBgNVHSMEgYYwgYOAFM79 +eHUKmC8oH4ZpaSKZyQ/6D81joWCkXjBcMQswCQYDVQQGEwJDQTEQMA4GA1UECBMH +T250YXJpbzEPMA0GA1UEBxMGT3R0YXdhMREwDwYDVQQKEwhMb2dzdGFzaDEXMBUG +A1UEAxMObG9nc3Rhc2gubG9jYWyCCQD9EpSwiBBwKDAMBgNVHRMEBTADAQH/MA0G +CSqGSIb3DQEBBQUAA4ICAQCMbIsqPzJ9fHbUto5XckRrfbhlvDZARSwT7xeq14vd +M9h6t7sYgEr/cUWuqAmHdwdSkSWXMk6R4iOhf9E8vIxj1g/td3FZTxc7jJ+0IjJO +oJtPyZT98o2VYFGTwyxsaFAW++QFBJ/9Arkg7V0R9EupZR6AC6GarznD93oUEKTk +9BYix/qaYW7zLUau12uSA/ze5h1PzJXvRQAJPeqczjNiV0nqEC9qiCyJLwOS4ise +69PyyQL0e35/HuKksIryidiRA22TXU8LSgj2Dx3EMvyVfroTrFpmu2KdUa5rHxVW +UBNYAltWtMfO5mu03HlDhVjJzHGNgeEidtRZ0A5D1CIcwPsyVA6y1z97xxdkx4T9 +MoOl44QlF2qrDmj6ne+adaB3HsaNIZZvSygRykWlTGpJw/ir8/7ReLzS4luoTNb9 +1bd0mkLeXv5BQ+cD7gH403osNXuOXuhA1kvUjEgI8ppgRzhafd3kLQWBkcBSbKrt +TBbLW9noma/P7alkM0/71aCDr3WJQ5IKStSQCUS02IQruVKiU6MHqtog4IzFBGDV +sKVIi1p7CCew3irago89nq6fG5w0vn7jJ94CdFyqlsg8udd1OUvxymXmM/dLaDXj +j+dMs+zl1lmwfXaylRTnJWMdpqlyOaA74ZLwCvUE4dl7c7Gba6nlle3pjeM9q76v +5A== +-----END CERTIFICATE----- diff --git a/e2eTest/logstash/key.pem b/e2eTest/logstash/key.pem new file mode 100644 index 0000000..c5112c1 --- /dev/null +++ b/e2eTest/logstash/key.pem @@ -0,0 +1,51 @@ +-----BEGIN RSA PRIVATE KEY----- +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 +-----END RSA PRIVATE KEY----- diff --git a/e2eTest/logstash/logstash.conf b/e2eTest/logstash/logstash.conf new file mode 100644 index 0000000..3a7bda9 --- /dev/null +++ b/e2eTest/logstash/logstash.conf @@ -0,0 +1,10 @@ +input { + lumberjack { + port => 9997 + ssl_certificate => "/logstashcfg/cert.pem" + ssl_key => "/logstashcfg/key.pem" + } +} +output { + stdout { } +} diff --git a/src/ClientSocket.coffee b/src/ClientSocket.coffee index 4163fc8..6e64d15 100644 --- a/src/ClientSocket.coffee +++ b/src/ClientSocket.coffee @@ -69,7 +69,7 @@ class ClientSocket extends EventEmitter @_socket.on 'error', @_disconnect - @_socket.on 'end', => @_disconnect() + @_socket.on 'end', @_disconnect @_socket.pipe @_parser @@ -85,6 +85,8 @@ class ClientSocket extends EventEmitter @connected = false @_socket?.removeAllListeners() + # Issue #8: Add a dummy error handler here, so if the socket keeps spewing errors, we'll ignore them. + @_socket.on "error", -> @_socket = null # Since we're not going to send any more events...