const { test } = require('tap');
const cluster = require('cluster');
const log4js = require('../../lib/log4js');
const recorder = require('../../lib/appenders/recording');

cluster.removeAllListeners();

log4js.configure({
  appenders: {
    vcr: { type: 'recording' },
  },
  categories: { default: { appenders: ['vcr'], level: 'debug' } },
  disableClustering: true,
});

if (cluster.isMaster) {
  cluster.fork();

  const masterLogger = log4js.getLogger('master');
  const masterPid = process.pid;
  masterLogger.info('this is master');

  cluster.on('exit', () => {
    const logEvents = recorder.replay();

    test('cluster master', (batch) => {
      batch.test('only master events should be logged', (t) => {
        t.equal(logEvents.length, 1);
        t.equal(logEvents[0].categoryName, 'master');
        t.equal(logEvents[0].pid, masterPid);
        t.equal(logEvents[0].data[0], 'this is master');
        t.end();
      });

      batch.end();
    });
  });
} else {
  const workerLogger = log4js.getLogger('worker');
  workerLogger.info('this is worker', new Error('oh dear'));

  const workerEvents = recorder.replay();
  test('cluster worker', (batch) => {
    batch.test('should send events to its own appender', (t) => {
      t.equal(workerEvents.length, 1);
      t.equal(workerEvents[0].categoryName, 'worker');
      t.equal(workerEvents[0].data[0], 'this is worker');
      t.type(workerEvents[0].data[1], 'Error');
      t.match(workerEvents[0].data[1].stack, 'Error: oh dear');
      t.end();
    });
    batch.end();
  });
  // test sending a cluster-style log message
  process.send({ topic: 'log4js:message', data: { cheese: 'gouda' } });
  cluster.worker.disconnect();
}
