1+ /* Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. */
2+
3+ /******************************************************************************
4+ *
5+ * You may not use the identified files except in compliance with the Apache
6+ * License, Version 2.0 (the "License.")
7+ *
8+ * You may obtain a copy of the License at
9+ * http://www.apache.org/licenses/LICENSE-2.0.
10+ *
11+ * Unless required by applicable law or agreed to in writing, software
12+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+ *
15+ * See the License for the specific language governing permissions and
16+ * limitations under the License.
17+ *
18+ * NAME
19+ * 217. aq1.js
20+ *
21+ * DESCRIPTION
22+ * Test Oracle Advanced Queueing (AQ).
23+ * The test version of examples/aqraw.js and examples/aqoptions.js.
24+ *
25+ *****************************************************************************/
26+ 'use strict' ;
27+
28+ const oracledb = require ( 'oracledb' ) ;
29+ const should = require ( 'should' ) ;
30+ const dbconfig = require ( './dbconfig.js' ) ;
31+ const testsUtil = require ( './testsUtil.js' ) ;
32+
33+ describe ( '217. aq1.js' , function ( ) {
34+
35+ let isRunnable = true ;
36+ let conn ;
37+ const AQ_USER = 'NODB_SCHEMA_AQTEST1' ;
38+ const AQ_USER_PWD = testsUtil . generateRandomPassword ( ) ;
39+
40+ const rawQueueName = "NODB_RAW_QUEUE" ;
41+ const RAW_TABLE = 'NODB_RAW_QUEUE_TAB' ;
42+
43+ before ( async function ( ) {
44+ if ( ! dbconfig . test . DBA_PRIVILEGE ) {
45+ isRunnable = false ;
46+ }
47+
48+ if ( ! isRunnable ) {
49+ this . skip ( ) ;
50+ return ;
51+ } else {
52+ try {
53+ await testsUtil . createAQtestUser ( AQ_USER , AQ_USER_PWD ) ;
54+
55+ let credential = {
56+ user : AQ_USER ,
57+ password : AQ_USER_PWD ,
58+ connectString : dbconfig . connectString
59+ } ;
60+ conn = await oracledb . getConnection ( credential ) ;
61+
62+ let plsql = `
63+ BEGIN
64+ DBMS_AQADM.CREATE_QUEUE_TABLE(
65+ QUEUE_TABLE => '${ AQ_USER } .${ RAW_TABLE } ',
66+ QUEUE_PAYLOAD_TYPE => 'RAW'
67+ );
68+ DBMS_AQADM.CREATE_QUEUE(
69+ QUEUE_NAME => '${ AQ_USER } .${ rawQueueName } ',
70+ QUEUE_TABLE => '${ AQ_USER } .${ RAW_TABLE } '
71+ );
72+ DBMS_AQADM.START_QUEUE(
73+ QUEUE_NAME => '${ AQ_USER } .${ rawQueueName } '
74+ );
75+ END;
76+ ` ;
77+ await conn . execute ( plsql ) ;
78+
79+ } catch ( err ) {
80+ should . not . exist ( err ) ;
81+ }
82+ }
83+
84+ } ) ; // before()
85+
86+ after ( async function ( ) {
87+ if ( ! isRunnable ) {
88+ return ;
89+ } else {
90+ try {
91+ await conn . close ( ) ;
92+ await testsUtil . dropAQtestUser ( AQ_USER ) ;
93+ } catch ( err ) {
94+ should . not . exist ( err ) ;
95+ }
96+ }
97+ } ) ; // after()
98+
99+ it ( '217.1 examples/aqraw.js' , async ( ) => {
100+
101+ try {
102+ // Enqueue
103+ const queue1 = await conn . getQueue ( rawQueueName ) ;
104+ const messageString = 'This is my message' ;
105+ await queue1 . enqOne ( messageString ) ;
106+ await conn . commit ( ) ;
107+
108+ // Dequeue
109+ const queue2 = await conn . getQueue ( rawQueueName ) ;
110+ const msg = await queue2 . deqOne ( ) ;
111+ await conn . commit ( ) ;
112+
113+ should . exist ( msg ) ;
114+ should . strictEqual ( msg . payload . toString ( ) , messageString ) ;
115+
116+ } catch ( err ) {
117+ should . not . exist ( err ) ;
118+ }
119+
120+ } ) ; // 217.1
121+
122+ it ( '217.2 examples/aqoptions.js' , async ( ) => {
123+ try {
124+ /* Enqueue */
125+ let queue1 = await conn . getQueue ( rawQueueName ) ;
126+
127+ // Send a message immediately without requiring a commit
128+ queue1 . enqOptions . visibility = oracledb . AQ_VISIBILITY_IMMEDIATE ;
129+
130+ const messageString = 'This is my other message' ;
131+ const message = {
132+ payload : messageString , // the message itself
133+ expiration : 10 // seconds the message will remain in the queue if not dequeued
134+ } ;
135+ await queue1 . enqOne ( message ) ;
136+
137+ /* Dequeue */
138+ let queue2 = await conn . getQueue ( rawQueueName ) ;
139+ Object . assign (
140+ queue2 . deqOptions ,
141+ {
142+ visibility : oracledb . AQ_VISIBILITY_IMMEDIATE , // Change the visibility so no explicit commit is required
143+ wait : 25 // seconds it will wait if there are no messages
144+ }
145+ ) ;
146+ const msg = await queue2 . deqOne ( ) ;
147+ if ( msg ) {
148+ should . strictEqual ( msg . payload . toString ( ) , messageString ) ;
149+ }
150+
151+ } catch ( err ) {
152+ should . not . exist ( err ) ;
153+ }
154+ } ) ; // 217.2
155+
156+ it ( '217.3 examples/aqmulti.js' , async ( ) => {
157+ try {
158+ /* Enqueue */
159+ let queue1 = await conn . getQueue ( rawQueueName ) ;
160+ queue1 . enqOptions . visibility = oracledb . AQ_VISIBILITY_IMMEDIATE ;
161+
162+ const messages1 = [
163+ "Message 1" ,
164+ "Message 2" ,
165+ {
166+ expiration : 10 ,
167+ payload : "Message 3"
168+ } ,
169+ "Message 4"
170+ ] ;
171+ await queue1 . enqMany ( messages1 ) ;
172+
173+ /* Dequeue */
174+ const queue2 = await conn . getQueue ( rawQueueName ) ;
175+ queue2 . enqOptions . visibility = oracledb . AQ_VISIBILITY_IMMEDIATE ;
176+
177+ const messages2 = await queue2 . deqMany ( 5 ) ; // get at most 5 messages
178+ if ( messages2 ) {
179+ should . strictEqual ( messages2 . length , messages1 . length ) ;
180+ should . strictEqual ( messages2 [ 0 ] . payload . toString ( ) , messages1 [ 0 ] ) ;
181+ should . strictEqual ( messages2 [ 3 ] . payload . toString ( ) , messages1 [ 3 ] ) ;
182+ should . strictEqual ( messages2 [ 2 ] . expiration , 10 ) ;
183+ }
184+
185+ } catch ( err ) {
186+ should . not . exist ( err ) ;
187+ }
188+ } ) ; // 217.3
189+ } ) ;
0 commit comments