|
|
- /*
- * node-rdkafka - Node.js wrapper for RdKafka C/C++ library
- *
- * Copyright (c) 2016 Blizzard Entertainment
- *
- * This software may be modified and distributed under the terms
- * of the MIT license. See the LICENSE.txt file for details.
- */
-
- var Kafka = require('../');
- var t = require('assert');
- var crypto = require('crypto');
-
- var eventListener = require('./listener');
-
- var kafkaBrokerList = process.env.KAFKA_HOST || 'localhost:9092';
-
- var serviceStopped = false;
-
- describe('Producer', function() {
-
- var producer;
-
- describe('with dr_cb', function() {
- beforeEach(function(done) {
- producer = new Kafka.Producer({
- 'client.id': 'kafka-test',
- 'metadata.broker.list': kafkaBrokerList,
- 'dr_cb': true,
- 'debug': 'all'
- });
- producer.connect({}, function(err) {
- t.ifError(err);
- done();
- });
-
- eventListener(producer);
- });
-
- afterEach(function(done) {
- producer.disconnect(function() {
- done();
- });
- });
-
- it('should connect to Kafka', function(done) {
- producer.getMetadata({}, function(err, metadata) {
- t.ifError(err);
- t.ok(metadata);
-
- // Ensure it is in the correct format
- t.ok(metadata.orig_broker_name, 'Broker name is not set');
- t.notStrictEqual(metadata.orig_broker_id, undefined, 'Broker id is not set');
- t.equal(Array.isArray(metadata.brokers), true);
- t.equal(Array.isArray(metadata.topics), true);
-
- done();
- });
- });
-
- it('should produce a message with a null payload and null key', function(done) {
- this.timeout(3000);
-
- var tt = setInterval(function() {
- producer.poll();
- }, 200);
-
- producer.once('delivery-report', function(err, report) {
- clearInterval(tt);
- t.ifError(err);
- t.notStrictEqual(report, undefined);
- t.strictEqual(typeof report.topic, 'string');
- t.strictEqual(typeof report.partition, 'number');
- t.strictEqual(typeof report.offset, 'number');
- t.strictEqual( report.key, null);
- done();
- });
-
- producer.produce('test', null, null, null);
- });
-
- it('should produce a message with a payload and key', function(done) {
- this.timeout(3000);
-
- var tt = setInterval(function() {
- producer.poll();
- }, 200);
-
- producer.once('delivery-report', function(err, report) {
- clearInterval(tt);
- t.ifError(err);
- t.notStrictEqual(report, undefined);
- t.strictEqual(report.value, undefined);
- t.strictEqual(typeof report.topic, 'string');
- t.strictEqual(typeof report.partition, 'number');
- t.strictEqual(typeof report.offset, 'number');
- t.equal(report.key, 'key');
- done();
- });
-
- producer.produce('test', null, Buffer.from('value'), 'key');
- });
-
- it('should produce a message with a payload and key buffer', function(done) {
- this.timeout(3000);
-
- var tt = setInterval(function() {
- producer.poll();
- }, 200);
-
- producer.once('delivery-report', function(err, report) {
- clearInterval(tt);
- t.ifError(err);
- t.notStrictEqual(report, undefined);
- t.strictEqual(report.value, undefined);
- t.strictEqual(typeof report.topic, 'string');
- t.strictEqual(typeof report.partition, 'number');
- t.strictEqual(typeof report.offset, 'number');
- t.equal(report.key.length > 3, true);
- done();
- });
-
- producer.produce('test', null, Buffer.from('value'), Buffer.from('key\0s'));
- });
-
- it('should produce a message with an opaque', function(done) {
- this.timeout(3000);
-
- var tt = setInterval(function() {
- producer.poll();
- }, 200);
-
- producer.once('delivery-report', function(err, report) {
- clearInterval(tt);
- t.ifError(err);
- t.notStrictEqual(report, undefined);
- t.strictEqual(typeof report.topic, 'string');
- t.strictEqual(typeof report.partition, 'number');
- t.strictEqual(typeof report.offset, 'number');
- t.equal(report.opaque, 'opaque');
- done();
- });
-
- producer.produce('test', null, Buffer.from('value'), null, null, 'opaque');
- });
-
-
- it('should get 100% deliverability', function(done) {
- this.timeout(3000);
-
- var total = 0;
- var max = 10000;
- var verified_received = 0;
-
- var tt = setInterval(function() {
- producer.poll();
- }, 200);
-
- producer
- .on('delivery-report', function(err, report) {
- t.ifError(err);
- t.notStrictEqual(report, undefined);
- t.strictEqual(typeof report.topic, 'string');
- t.strictEqual(typeof report.partition, 'number');
- t.strictEqual(typeof report.offset, 'number');
- verified_received++;
- if (verified_received === max) {
- clearInterval(tt);
- done();
- }
- });
-
- // Produce
- for (total = 0; total <= max; total++) {
- producer.produce('test', null, Buffer.from('message ' + total), null);
- }
-
- });
-
- });
-
- describe('with_dr_msg_cb', function() {
- beforeEach(function(done) {
- producer = new Kafka.Producer({
- 'client.id': 'kafka-test',
- 'metadata.broker.list': kafkaBrokerList,
- 'dr_msg_cb': true,
- 'debug': 'all'
- });
- producer.connect({}, function(err) {
- t.ifError(err);
- done();
- });
-
- eventListener(producer);
- });
-
- afterEach(function(done) {
- producer.disconnect(function() {
- done();
- });
- });
-
- it('should produce a message with a payload and key', function(done) {
- this.timeout(3000);
-
- var tt = setInterval(function() {
- producer.poll();
- }, 200);
-
- producer.once('delivery-report', function(err, report) {
- clearInterval(tt);
- t.ifError(err);
- t.notStrictEqual(report, undefined);
- t.strictEqual(typeof report.topic, 'string');
- t.strictEqual(typeof report.partition, 'number');
- t.strictEqual(typeof report.offset, 'number');
- t.ok(report.key.toString(), 'key');
- t.equal(report.value.toString(), 'hai');
- done();
- });
-
- producer.produce('test', null, Buffer.from('hai'), 'key');
- });
-
- it('should produce a message with an empty payload and empty key (https://github.com/Blizzard/node-rdkafka/issues/117)', function(done) {
- this.timeout(3000);
-
- var tt = setInterval(function() {
- producer.poll();
- }, 200);
-
- producer.once('delivery-report', function(err, report) {
- clearInterval(tt);
- t.ifError(err);
- t.notStrictEqual(report, undefined);
-
- t.strictEqual(typeof report.topic, 'string');
- t.strictEqual(typeof report.partition, 'number');
- t.strictEqual(typeof report.offset, 'number');
- t.equal(report.key.toString(), '', 'key should be an empty string');
- t.strictEqual(report.value.toString(), '', 'payload should be an empty string');
- done();
- });
-
- producer.produce('test', null, Buffer.from(''), '');
- });
-
- it('should produce a message with a null payload and null key (https://github.com/Blizzard/node-rdkafka/issues/117)', function(done) {
- this.timeout(3000);
-
- producer.setPollInterval(10);
-
- producer.once('delivery-report', function(err, report) {
- t.ifError(err);
- t.notStrictEqual(report, undefined);
-
- t.strictEqual(typeof report.topic, 'string');
- t.strictEqual(typeof report.partition, 'number');
- t.strictEqual(typeof report.offset, 'number');
- t.strictEqual(report.key, null, 'key should be null');
- t.strictEqual(report.value, null, 'payload should be null');
- done();
- });
-
- producer.produce('test', null, null, null);
- });
-
- it('should produce an int64 key (https://github.com/Blizzard/node-rdkafka/issues/208)', function(done) {
-
- var v1 = 0x0000000000000084;
- var arr = new Uint8Array(8);
- arr[0] = 0x00;
- arr[1] = 0x00;
- arr[2] = 0x00;
- arr[3] = 0x00;
- arr[4] = 0x00;
- arr[5] = 0x00;
- arr[6] = 0x00;
- arr[7] = 84;
- var buf = Buffer.from(arr.buffer);
-
- producer.setPollInterval(10);
-
- producer.once('delivery-report', function(err, report) {
- t.ifError(err);
- t.notStrictEqual(report, undefined);
-
- t.deepEqual(buf, report.key);
- done();
- });
-
- producer.produce('test', null, null, Buffer.from(arr.buffer));
-
- this.timeout(3000);
- });
-
- });
-
- });
|