Files
n8n/packages/@n8n/syslog-client/test/tcp.test.ts
alighasami 3d5eaf9445
Some checks failed
Security: Sync from Public / sync-from-public (push) Has been cancelled
Test: Benchmark Nightly / build (push) Has been cancelled
Test: Benchmark Nightly / Notify Cats on failure (push) Has been cancelled
CI: Python / Checks (push) Has been cancelled
Test: Evals Python / Workflow Comparison Python (push) Has been cancelled
Util: Check Docs URLs / check-docs-urls (push) Has been cancelled
Test: Visual Storybook / Cloudflare Pages (push) Has been cancelled
Test: E2E Performance / build-and-test-performance (push) Has been cancelled
Test: Workflows Nightly / Run Workflow Tests (push) Has been cancelled
Util: Cleanup CI Docker Images / Delete stale CI images (push) Has been cancelled
Test: Benchmark Destroy Env / build (push) Has been cancelled
Util: Update Node Popularity / update-popularity (push) Has been cancelled
Test: E2E Coverage Weekly / Coverage Tests (push) Has been cancelled
first commit
2026-03-17 16:22:57 +03:30

220 lines
5.4 KiB
TypeScript

import { Facility, Severity, SyslogClient, Transport } from '../src';
import {
awaitTcpMsg,
constructSyslogRegex,
startTestServers,
stopTestServers,
SYSLOG_TCP_PORT,
} from './setup';
beforeAll(async () => {
await startTestServers();
});
afterAll(() => {
stopTestServers();
});
describe('SyslogClient - TCP Transport', () => {
describe('Basic functionality', () => {
it('should connect and send log messages', async () => {
const hostname = 'testhostname';
const client = new SyslogClient('127.0.0.1', {
port: SYSLOG_TCP_PORT,
syslogHostname: hostname,
transport: Transport.Tcp,
});
await client.log('This is a test');
const msg1 = await awaitTcpMsg();
expect(msg1).toMatch(constructSyslogRegex(134, hostname, 'This is a test'));
await client.log('This is a second test');
const msg2 = await awaitTcpMsg();
expect(msg2).toMatch(constructSyslogRegex(134, hostname, 'This is a second test'));
client.close();
});
it('should work with promise API', async () => {
const hostname = 'testhostname';
const client = new SyslogClient('127.0.0.1', {
port: SYSLOG_TCP_PORT,
syslogHostname: hostname,
transport: Transport.Tcp,
});
await client.log('Promise test');
const msg = await awaitTcpMsg();
expect(msg).toMatch(constructSyslogRegex(134, hostname, 'Promise test'));
client.close();
});
it('should work with callback API', async () => {
const hostname = 'testhostname';
const client = new SyslogClient('127.0.0.1', {
port: SYSLOG_TCP_PORT,
syslogHostname: hostname,
transport: Transport.Tcp,
});
const callbackPromise = new Promise<void>((resolve) => {
void client.log('Callback test', (error) => {
expect(error).toBeUndefined();
resolve();
});
});
const msg = await awaitTcpMsg();
expect(msg).toMatch(constructSyslogRegex(134, hostname, 'Callback test'));
await callbackPromise;
client.close();
});
});
describe('Transport reuse', () => {
it('should reuse TCP transport for multiple messages', async () => {
const hostname = 'testhostname';
const client = new SyslogClient('127.0.0.1', {
port: SYSLOG_TCP_PORT,
syslogHostname: hostname,
transport: Transport.Tcp,
});
await client.log('Transport reuse test');
await awaitTcpMsg();
const transport1 = client['transport_'];
expect(transport1).toBeDefined();
await client.log('Transport reuse test 2');
await awaitTcpMsg();
const transport2 = client['transport_'];
expect(transport2).toBe(transport1);
client.close();
});
});
describe('Close and reconnect', () => {
it('should emit close event', async () => {
const client = new SyslogClient('127.0.0.1', {
port: SYSLOG_TCP_PORT,
transport: Transport.Tcp,
});
const closePromise = new Promise<void>((resolve) => {
client.once('close', resolve);
});
await client.log('Test');
await awaitTcpMsg();
client.close();
await closePromise;
expect(client['transport_']).toBeUndefined();
});
it('should reconnect after close', async () => {
const hostname = 'testhostname';
const client = new SyslogClient('127.0.0.1', {
port: SYSLOG_TCP_PORT,
syslogHostname: hostname,
transport: Transport.Tcp,
});
await client.log('Before close');
await awaitTcpMsg();
const closePromise = new Promise<void>((resolve) => {
client.once('close', resolve);
});
client.close();
await closePromise;
await client.log('After reconnect');
const msg = await awaitTcpMsg();
expect(msg).toMatch(constructSyslogRegex(134, hostname, 'After reconnect'));
client.close();
});
});
describe('Log options', () => {
it('should accept options with callback', async () => {
const hostname = 'testhostname';
const client = new SyslogClient('127.0.0.1', {
port: SYSLOG_TCP_PORT,
syslogHostname: hostname,
transport: Transport.Tcp,
});
const callbackPromise = new Promise<void>((resolve) => {
void client.log(
'With options',
{
facility: Facility.System,
severity: Severity.Notice,
},
(error) => {
expect(error).toBeUndefined();
resolve();
},
);
});
const msg = await awaitTcpMsg();
expect(msg).toMatch(constructSyslogRegex(29, hostname, 'With options'));
await callbackPromise;
client.close();
});
it('should calculate correct PRI value', async () => {
const hostname = 'testhostname';
const client = new SyslogClient('127.0.0.1', {
port: SYSLOG_TCP_PORT,
syslogHostname: hostname,
transport: Transport.Tcp,
});
await client.log('Test', {
facility: Facility.Local0,
severity: Severity.Emergency,
});
const msg = await awaitTcpMsg();
expect(msg).toMatch(constructSyslogRegex(128, hostname, 'Test'));
client.close();
});
});
describe('Error handling', () => {
it('should handle connection timeout', async () => {
const client = new SyslogClient('203.0.113.1', {
port: SYSLOG_TCP_PORT,
tcpTimeout: 500,
transport: Transport.Tcp,
});
const errorPromise = new Promise<Error>((resolve) => {
client.on('error', resolve);
});
await expect(client.log("Shouldn't work")).rejects.toThrow();
const error = await errorPromise;
expect(error).toBeInstanceOf(Error);
});
it('should handle invalid port', () => {
expect(() => {
new SyslogClient('127.0.0.1', {
port: 502342323,
tcpTimeout: 2000,
transport: Transport.Tcp,
});
}).toThrow();
});
});
});