Back to home page

Enduro/X

 
 

    


0001 /**
0002  * @brief Test abort rules, includes standard tpcall() and tpenqueue/tpdequeue()
0003  *  Support #634
0004  * @file abortrules.c
0005  */
0006 /* -----------------------------------------------------------------------------
0007  * Enduro/X Middleware Platform for Distributed Transaction Processing
0008  * Copyright (C) 2009-2016, ATR Baltic, Ltd. All Rights Reserved.
0009  * Copyright (C) 2017-2023, Mavimax, Ltd. All Rights Reserved.
0010  * This software is released under one of the following licenses:
0011  * AGPL (with Java and Go exceptions) or Mavimax's license for commercial use.
0012  * See LICENSE file for full text.
0013  * -----------------------------------------------------------------------------
0014  * AGPL license:
0015  *
0016  * This program is free software; you can redistribute it and/or modify it under
0017  * the terms of the GNU Affero General Public License, version 3 as published
0018  * by the Free Software Foundation;
0019  *
0020  * This program is distributed in the hope that it will be useful, but WITHOUT ANY
0021  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
0022  * PARTICULAR PURPOSE. See the GNU Affero General Public License, version 3
0023  * for more details.
0024  *
0025  * You should have received a copy of the GNU Affero General Public License along 
0026  * with this program; if not, write to the Free Software Foundation, Inc.,
0027  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
0028  *
0029  * -----------------------------------------------------------------------------
0030  * A commercial use license is available from Mavimax, Ltd
0031  * contact@mavimax.com
0032  * -----------------------------------------------------------------------------
0033  */
0034 #include <string.h>
0035 #include <stdio.h>
0036 #include <stdlib.h>
0037 #include <memory.h>
0038 #include <unistd.h>
0039 
0040 #include <atmi.h>
0041 #include <ubf.h>
0042 #include <ndebug.h>
0043 #include <test.fd.h>
0044 #include <ndrstandard.h>
0045 #include <ubfutil.h>
0046 #include <nstopwatch.h>
0047 #include <nstdutil.h>
0048 #include <exassert.h>
0049 /*---------------------------Externs------------------------------------*/
0050 /*---------------------------Macros-------------------------------------*/
0051 /*---------------------------Enums--------------------------------------*/
0052 /*---------------------------Typedefs-----------------------------------*/
0053 /*---------------------------Globals------------------------------------*/
0054 /*---------------------------Statics------------------------------------*/
0055 /*---------------------------Prototypes---------------------------------*/
0056 
0057 /**
0058  * Perform checks on abort rules
0059  * i.e. when transaction is marked for abort, and when not
0060  * @param maxmsg
0061  * @return 
0062  */
0063 expublic int basic_abort_rules(int maxmsg)
0064 {
0065     int ret = EXSUCCEED;
0066     TPQCTL qc;
0067     int i;
0068     long olen;
0069     int cd=99;
0070     char *buf=NULL;
0071     
0072     NDRX_LOG(log_error, "case basic_abort_rules");
0073     
0074     /* no abort: */
0075     NDRX_LOG(log_error, "Test tpcall + TPENOENT");
0076     NDRX_ASSERT_TP_OUT(EXSUCCEED==tpbegin(60, 0), "failed to start tran");
0077     NDRX_ASSERT_TP_OUT( 
0078                 (EXFAIL==tpcall("NO_SUCH_SERVICE", NULL, 0, &buf, &olen, 0) 
0079                     && TPENOENT==tperrno), "NOENT call failed");
0080     NDRX_ASSERT_TP_OUT(EXSUCCEED==tpcommit(0), "failed to commit");
0081     
0082     /* no abort: */
0083     NDRX_LOG(log_error, "Test tpcall + TPEINVAL");
0084     NDRX_ASSERT_TP_OUT(EXSUCCEED==tpbegin(60, 0), "failed to start tran");
0085     NDRX_ASSERT_TP_OUT( 
0086                 (EXFAIL==tpcall("NO_SUCH_SERVICE", NULL, 0, NULL, NULL, 0) 
0087                     && TPEINVAL==tperrno), "NOENT call failed");
0088     NDRX_ASSERT_TP_OUT(EXSUCCEED==tpcommit(0), "failed to commit");
0089     
0090     /* no abort tpgetreply on invalid cd */
0091     NDRX_LOG(log_error, "Test tpcall + TPEBADDESC");
0092     NDRX_ASSERT_TP_OUT(EXSUCCEED==tpbegin(60, 0), "failed to start tran");
0093     NDRX_ASSERT_TP_OUT( 
0094                 (EXFAIL==tpgetrply(&cd, &buf, &olen,0) 
0095                     && TPEBADDESC==tperrno), "TPEBADDESC notmatched");
0096     NDRX_ASSERT_TP_OUT(EXSUCCEED==tpcommit(0), "failed to commit");
0097     
0098     /* standard abort: */
0099     NDRX_LOG(log_error, "Test @TM-1 junk msg");
0100     NDRX_ASSERT_TP_OUT(EXSUCCEED==tpbegin(60, 0), "failed to start tran");
0101     NDRX_ASSERT_TP_OUT( 
0102                 (EXFAIL==tpcall("@TM-1", NULL, 0, &buf, &olen, 0) 
0103                     && TPESVCFAIL==tperrno), "NOENT call failed");
0104     NDRX_ASSERT_TP_OUT( (EXSUCCEED!=tpcommit(0) && TPEABORT==tperrno), "commit + TPEABORT failed");
0105     
0106     /* QMENOMSG -> no abort tpdeq */
0107     NDRX_ASSERT_TP_OUT(EXSUCCEED==tpbegin(60, 0), "failed to start tran");
0108     memset(&qc, 0, sizeof(qc));
0109     NDRX_ASSERT_TP_OUT(
0110             (   EXFAIL==tpdequeue("MYSPACE", "TEST1", &qc, (char **)&buf, &olen, 0) 
0111                 && TPEDIAGNOSTIC==tperrno 
0112                 && QMENOMSG==qc.diagnostic
0113             ),
0114             "Failed to dequeue: %ld", qc.diagnostic
0115             );
0116     NDRX_ASSERT_TP_OUT(EXSUCCEED==tpcommit(0), "failed to commit");
0117     
0118     /* QMENOMSG -> no abort tpdeq | PEEK */
0119     NDRX_ASSERT_TP_OUT(EXSUCCEED==tpbegin(60, 0), "failed to start tran");
0120     memset(&qc, 0, sizeof(qc));
0121     qc.flags|=TPQPEEK;
0122     NDRX_ASSERT_TP_OUT(
0123             (   EXFAIL==tpdequeue("MYSPACE", "TEST1", &qc, (char **)&buf, &olen, 0) 
0124                 && TPEDIAGNOSTIC==tperrno 
0125                 && QMENOMSG==qc.diagnostic
0126             ),
0127             "Failed to dequeue: %ld", qc.diagnostic
0128             );
0129     NDRX_ASSERT_TP_OUT(EXSUCCEED==tpcommit(0), "failed to commit");
0130     
0131     /* QMEBADQUEUE -> no abort tpdeq */
0132     NDRX_ASSERT_TP_OUT(EXSUCCEED==tpbegin(60, 0), "failed to start tran");
0133     memset(&qc, 0, sizeof(qc));
0134     NDRX_ASSERT_TP_OUT(
0135             (   EXFAIL==tpdequeue("MYSPACE", "NO_SUCH_QUEUE", &qc, (char **)&buf, &olen, 0) 
0136                 && TPEDIAGNOSTIC==tperrno 
0137                 && QMEBADQUEUE==qc.diagnostic
0138             ),
0139             "Failed to dequeue: %ld", qc.diagnostic
0140             );
0141     NDRX_ASSERT_TP_OUT(EXSUCCEED==tpcommit(0), "failed to commit");
0142     
0143     /* TPEINVAL -> no abort tpdeq */
0144     NDRX_ASSERT_TP_OUT(EXSUCCEED==tpbegin(60, 0), "failed to start tran");
0145     memset(&qc, 0, sizeof(qc));
0146     NDRX_ASSERT_TP_OUT(
0147             (   EXFAIL==tpdequeue(NULL, NULL, &qc, (char **)&buf, &olen, 0) 
0148                 && TPEINVAL==tperrno 
0149             ),
0150             "Failed to dequeue: %ld", qc.diagnostic
0151             );
0152     NDRX_ASSERT_TP_OUT(EXSUCCEED==tpcommit(0), "failed to commit");
0153     
0154     /* QMEBADQUEUE -> no abort tpenq */
0155     NDRX_ASSERT_TP_OUT(EXSUCCEED==tpbegin(60, 0), "failed to start tran");
0156     memset(&qc, 0, sizeof(qc));
0157     NDRX_ASSERT_TP_OUT(
0158             (   EXFAIL==tpenqueue("MYSPACE", "NO_SUCH_QUEUE", &qc, NULL, 0, 0) 
0159                 && TPEDIAGNOSTIC==tperrno 
0160                 && QMEBADQUEUE==qc.diagnostic
0161             ),
0162             "Failed to enqueue: %ld", qc.diagnostic
0163             );
0164     NDRX_ASSERT_TP_OUT(EXSUCCEED==tpcommit(0), "failed to commit");
0165     
0166     /* TPEINVAL -> no abort tpenq */
0167     NDRX_ASSERT_TP_OUT(EXSUCCEED==tpbegin(60, 0), "failed to start tran");
0168     memset(&qc, 0, sizeof(qc));
0169     NDRX_ASSERT_TP_OUT(
0170             (   EXFAIL==tpenqueue(NULL, NULL, &qc, NULL, 0, 0) 
0171                 && TPEINVAL==tperrno 
0172             ),
0173             "Failed to enqueue: %ld", qc.diagnostic
0174             );
0175     NDRX_ASSERT_TP_OUT(EXSUCCEED==tpcommit(0), "failed to commit");
0176     
0177     
0178     /* enqueue Norm message, for deq test */
0179     
0180     NDRX_ASSERT_TP_OUT(EXSUCCEED==tpbegin(60, 0), "failed to start tran");
0181     memset(&qc, 0, sizeof(qc));
0182     NDRX_ASSERT_TP_OUT(
0183             (EXSUCCEED==tpenqueue("MYSPACE", "TEST1", &qc, NULL, 0, 0)),
0184             "Failed to enqueue: %ld", qc.diagnostic
0185             );
0186     NDRX_ASSERT_TP_OUT(EXSUCCEED==tpcommit(0), "failed to commit");
0187     
0188     /* enable write error */
0189     if (EXSUCCEED!=system("xadmin lcf qwriterr -A 1 -a"))
0190     {
0191         NDRX_LOG(log_error, "TESTERROR: xadmin lcf qwriterr -A 1 -a failed");
0192         EXFAIL_OUT(ret);
0193     }
0194     
0195     /* TPEOS -> deq abort (disk) */
0196     NDRX_ASSERT_TP_OUT(EXSUCCEED==tpbegin(60, 0), "failed to start tran");
0197     memset(&qc, 0, sizeof(qc));
0198     NDRX_ASSERT_TP_OUT(
0199             (   EXFAIL==tpdequeue("MYSPACE", "TEST1", &qc, (char **)&buf, &olen, 0) 
0200                 && TPEDIAGNOSTIC==tperrno 
0201                 && QMEOS==qc.diagnostic
0202             ),
0203             "Dequeue shall fail with QMEOS, but got: %ld", qc.diagnostic
0204             );
0205     NDRX_ASSERT_TP_OUT( (EXSUCCEED!=tpcommit(0) && TPEABORT==tperrno), "commit must fail");
0206     
0207     
0208     /* QMESYSTEM -> enq abort (disk) */
0209     NDRX_ASSERT_TP_OUT(EXSUCCEED==tpbegin(60, 0), "failed to start tran");
0210     memset(&qc, 0, sizeof(qc));
0211     NDRX_ASSERT_TP_OUT(
0212             (   EXFAIL==tpenqueue("MYSPACE", "TEST1", &qc, NULL, 0, 0) 
0213                 && TPEDIAGNOSTIC==tperrno 
0214                 && QMEOS==qc.diagnostic
0215             ),
0216             "Enqueue shall fail with QMEOS, but got: %ld", qc.diagnostic
0217             );
0218     NDRX_ASSERT_TP_OUT( (EXSUCCEED!=tpcommit(0) && TPEABORT==tperrno), "commit must fail");
0219     
0220     
0221     /* unset error... */
0222     if (EXSUCCEED!=system("xadmin lcf qwriterr -A 0 -a"))
0223     {
0224             NDRX_LOG(log_error, "TESTERROR: xadmin lcf qwriterr -A 0 -a failed");
0225             EXFAIL_OUT(ret);
0226     }
0227     
0228     /* fetch 1 msg */
0229     NDRX_ASSERT_TP_OUT(EXSUCCEED==tpbegin(60, 0), "failed to start tran");
0230     memset(&qc, 0, sizeof(qc));
0231     NDRX_ASSERT_TP_OUT(
0232             (   EXSUCCEED==tpdequeue("MYSPACE", "TEST1", &qc, (char **)&buf, &olen, 0) 
0233             ),
0234             "Dequeue must not fail but got: %ld", qc.diagnostic
0235             );
0236     NDRX_ASSERT_TP_OUT( (EXSUCCEED==tpcommit(0)), "commit must not fail");
0237     
0238 out:
0239 
0240     if (EXSUCCEED!=tpterm())
0241     {
0242         NDRX_LOG(log_error, "tpterm failed with: %s", tpstrerror(tperrno));
0243         ret=EXFAIL;
0244         goto out;
0245     }
0246 
0247     return ret;
0248 }
0249 
0250 /* vim: set ts=4 sw=4 et smartindent: */