Skip to content

Commit 7ecfcf2

Browse files
committed
Add tests
1 parent 8038126 commit 7ecfcf2

19 files changed

+1252
-164
lines changed

test/aq1.js

Lines changed: 142 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* Copyright (c) 2019, 2024, Oracle and/or its affiliates. */
1+
/* Copyright (c) 2019, 2025, Oracle and/or its affiliates. */
22

33
/******************************************************************************
44
*
@@ -351,4 +351,145 @@ describe('217. aq1.js', function() {
351351
msg = await queue2.deqOne();
352352
assert.strictEqual(msg.numAttempts, 1); // should be 1
353353
}); // 217.11
354+
355+
it('217.12 test priority attribute in enqueue', async () => {
356+
const q = await conn.getQueue(rawQueueName);
357+
q.deqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
358+
q.deqOptions.wait = 0; // Don't wait if queue is empty
359+
q.deqOptions.mode = oracledb.AQ_DEQ_MODE_REMOVE;
360+
361+
// Dequeue all remaining messages
362+
let msg;
363+
do {
364+
msg = await q.deqOne();
365+
} while (msg);
366+
367+
await conn.commit();
368+
369+
const queue = await conn.getQueue(rawQueueName);
370+
queue.enqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
371+
372+
const messages = [
373+
{
374+
payload: "High Priority Message",
375+
priority: 7
376+
},
377+
{
378+
payload: "Low Priority Message",
379+
priority: 1
380+
}
381+
];
382+
383+
await queue.enqMany(messages);
384+
385+
// Dequeue should return high priority message first
386+
const deqQueue = await conn.getQueue(rawQueueName);
387+
deqQueue.deqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
388+
389+
const msg1 = await deqQueue.deqOne();
390+
const msg2 = await deqQueue.deqOne();
391+
392+
assert.strictEqual(msg1.payload.toString(), "High Priority Message");
393+
assert.strictEqual(msg2.payload.toString(), "Low Priority Message");
394+
}); // 217.12
395+
396+
it('217.13 test correlation', async () => {
397+
const queue = await conn.getQueue(rawQueueName);
398+
queue.enqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
399+
400+
const correlationId = "TEST_CORR_001";
401+
const message = {
402+
payload: "Correlated Message",
403+
correlation: correlationId
404+
};
405+
406+
await queue.enqOne(message);
407+
408+
const deqQueue = await conn.getQueue(rawQueueName);
409+
deqQueue.deqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
410+
deqQueue.deqOptions.correlation = correlationId;
411+
412+
const msg = await deqQueue.deqOne();
413+
414+
// Access correlationId directly from the dequeued message object
415+
assert.strictEqual(msg.correlation, correlationId);
416+
assert.strictEqual(msg.payload.toString(), "Correlated Message");
417+
}); // 217.13
418+
419+
it('217.14 test message ordering in transaction group', async () => {
420+
const queue = await conn.getQueue(rawQueueName);
421+
queue.enqOptions.visibility = oracledb.AQ_VISIBILITY_ON_COMMIT;
422+
423+
// Enqueue messages in a single transaction
424+
const messages = [
425+
"First Message",
426+
"Second Message",
427+
"Third Message"
428+
];
429+
430+
await queue.enqMany(messages);
431+
await conn.commit();
432+
433+
// Dequeue messages - they should come in the same order
434+
const deqQueue = await conn.getQueue(rawQueueName);
435+
deqQueue.deqOptions.visibility = oracledb.AQ_VISIBILITY_ON_COMMIT;
436+
437+
const msg1 = await deqQueue.deqOne();
438+
const msg2 = await deqQueue.deqOne();
439+
const msg3 = await deqQueue.deqOne();
440+
await conn.commit();
441+
442+
assert.strictEqual(msg1.payload.toString(), "First Message");
443+
assert.strictEqual(msg2.payload.toString(), "Second Message");
444+
assert.strictEqual(msg3.payload.toString(), "Third Message");
445+
}); // 217.14
446+
447+
it('217.15 test dequeue with wait timeout', async () => {
448+
const queue = await conn.getQueue(rawQueueName);
449+
queue.deqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
450+
queue.deqOptions.wait = 2; // 2 second timeout
451+
452+
const startTime = Date.now();
453+
const msg = await queue.deqOne();
454+
const endTime = Date.now();
455+
456+
assert.strictEqual(msg, undefined);
457+
assert(endTime - startTime >= 2000, "Dequeue should wait for at least 2 seconds");
458+
}); // 217.15
459+
460+
it('217.16 test buffer message payload - 32KB', async () => {
461+
const queue = await conn.getQueue(rawQueueName);
462+
queue.enqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
463+
464+
// Create a medium-sized message (32KB)
465+
const largeMessage = Buffer.alloc(32 * 1024, 'x');
466+
await queue.enqOne(largeMessage);
467+
468+
const deqQueue = await conn.getQueue(rawQueueName);
469+
deqQueue.deqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
470+
471+
const msg = await deqQueue.deqOne();
472+
assert.strictEqual(msg.payload.length, largeMessage.length);
473+
assert.strictEqual(msg.payload.toString(), largeMessage.toString());
474+
}); // 217.16
475+
476+
it('217.17 test large buffer message payload - 1MB', async function() {
477+
// 1 MB message does not work in Oracle Databases 19c or earlier
478+
if (await conn.oracleServerVersion < 2304000000)
479+
this.skip();
480+
481+
const queue = await conn.getQueue(rawQueueName);
482+
queue.enqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
483+
484+
// Create a large message (1MB)
485+
const largeMessage = Buffer.alloc(1024 * 1024, 'x');
486+
await queue.enqOne(largeMessage);
487+
488+
const deqQueue = await conn.getQueue(rawQueueName);
489+
deqQueue.deqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
490+
491+
const msg = await deqQueue.deqOne();
492+
assert.strictEqual(msg.payload.length, largeMessage.length);
493+
assert.strictEqual(msg.payload.toString(), largeMessage.toString());
494+
}); // 217.17
354495
});

test/aq2.js

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,4 +354,90 @@ describe('218. aq2.js', function() {
354354
assert.strictEqual(addrArray[3].ADDRESS, messages[3].payload.ADDRESS);
355355
}
356356
}); // 218.10
357+
358+
it('218.11 Negative - enqOne with empty payload', async () => {
359+
const queue = await conn.getQueue(objQueueName, { payloadType: objType });
360+
await assert.rejects(
361+
async () => {
362+
await queue.enqOne();
363+
},
364+
/NJS-009:/ // NJS-009: invalid number of parameters
365+
);
366+
}); // 218.11
367+
368+
it('218.12 Enqueue and Dequeue with non-ASCII characters', async () => {
369+
const addrData = {
370+
NAME: "Jörg",
371+
ADDRESS: "Grüner Weg 5, 12345 München, Germany"
372+
};
373+
374+
// Enqueue
375+
const queue1 = await conn.getQueue(objQueueName, { payloadType: objType });
376+
const message = new queue1.payloadTypeClass(addrData);
377+
await queue1.enqOne(message);
378+
await conn.commit();
379+
380+
// Dequeue
381+
const queue2 = await conn.getQueue(objQueueName, { payloadType: objType });
382+
const msg = await queue2.deqOne();
383+
await conn.commit();
384+
385+
assert(msg);
386+
assert.strictEqual(msg.payload.NAME, addrData.NAME);
387+
assert.strictEqual(msg.payload.ADDRESS, addrData.ADDRESS);
388+
}); // 218.12
389+
390+
it('218.13 Enqueue and Dequeue with large payloads', async () => {
391+
const largeAddress = "A".repeat(50); // 50 characters
392+
const addrData = {
393+
NAME: "LargeData",
394+
ADDRESS: largeAddress
395+
};
396+
397+
// Enqueue
398+
const queue1 = await conn.getQueue(objQueueName, { payloadType: objType });
399+
const message = new queue1.payloadTypeClass(addrData);
400+
await queue1.enqOne(message);
401+
await conn.commit();
402+
403+
// Dequeue
404+
const queue2 = await conn.getQueue(objQueueName, { payloadType: objType });
405+
const msg = await queue2.deqOne();
406+
await conn.commit();
407+
408+
assert(msg);
409+
assert.strictEqual(msg.payload.NAME, addrData.NAME);
410+
assert.strictEqual(msg.payload.ADDRESS, addrData.ADDRESS);
411+
}); // 218.13
412+
413+
it('218.14 Negative - Dequeue from an unstarted queue', async () => {
414+
// Create but do not start a new queue
415+
const unstartedQueueName = "NODB_UNSTARTED_QUEUE";
416+
await conn.execute(`
417+
BEGIN
418+
DBMS_AQADM.CREATE_QUEUE(
419+
QUEUE_NAME => '${AQ_USER}.${unstartedQueueName}',
420+
QUEUE_TABLE => '${AQ_USER}.${objTable}'
421+
);
422+
END;
423+
`);
424+
425+
const queue = await conn.getQueue(unstartedQueueName, { payloadType: objType });
426+
427+
await assert.rejects(
428+
async () => {
429+
await queue.deqOne();
430+
},
431+
/ORA-25226:/ // ORA-25226: dequeue failed, queue NODB_SCHEMA_AQTEST2.NODB_UNSTARTED_QUEUE is not enabled for dequeue
432+
);
433+
434+
// Cleanup
435+
await conn.execute(`
436+
BEGIN
437+
DBMS_AQADM.DROP_QUEUE(
438+
QUEUE_NAME => '${AQ_USER}.${unstartedQueueName}'
439+
);
440+
END;
441+
`);
442+
}); // 218.14
357443
});

test/aq4.js

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* Copyright (c) 2022, 2024, Oracle and/or its affiliates. */
1+
/* Copyright (c) 2022, 2025, Oracle and/or its affiliates. */
22

33
/******************************************************************************
44
*
@@ -327,7 +327,6 @@ describe('267. aq4.js', function() {
327327
assert.strictEqual(queue2.deqOptions.consumerName, "sub1");
328328
}); // 267.9
329329

330-
331330
it('267.10 recipient list with enqMany non-existent in dequeue', async () => {
332331
const msgList = [];
333332

@@ -371,4 +370,32 @@ describe('267. aq4.js', function() {
371370
/NJS-007:/
372371
);
373372
}); // 267.11
373+
374+
it('267.12 Enqueue with duplicate recipients', async () => {
375+
const queue1 = await conn.getQueue(objQueueName, { payloadType: objType });
376+
const message = new queue1.payloadTypeClass(addrData);
377+
378+
await assert.rejects(
379+
async () => await queue1.enqOne({
380+
payload: message,
381+
recipients: ["sub1", "sub1", "sub2"]
382+
}),
383+
/ORA-25232:/ // ORA-25232: duplicate recipients specified for message
384+
);
385+
}); // 267.12
386+
387+
it('267.13 Enqueue with special characters in recipient name', async () => {
388+
const queue1 = await conn.getQueue(objQueueName, { payloadType: objType });
389+
const message = new queue1.payloadTypeClass(addrData);
390+
391+
await assert.rejects(
392+
async () => {
393+
await queue1.enqOne({
394+
payload: message,
395+
recipients: ["sub@#1"]
396+
});
397+
},
398+
/ORA-24047:/ // ORA-24047: invalid agent name sub@#1, agent name should be of the form NAME
399+
);
400+
}); // 267.13
374401
});

0 commit comments

Comments
 (0)