LCOV - code coverage report
Current view: top level - src/dblib/unittests - t0019.c (source / functions) Hit Total Coverage
Test: FreeTDS coverage Lines: 49 52 94.2 %
Date: 2025-04-21 03:58:01 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /* 
       2             :  * Purpose: Test Some conversion, check trimming error and results
       3             :  * Functions: dbconvert dberrhandle dbmsghandle dbinit dbexit
       4             :  */
       5             : 
       6             : #include "common.h"
       7             : #include <ctype.h>
       8             : 
       9             : #include <freetds/bool.h>
      10             : 
      11             : static bool failed = false;
      12             : 
      13             : static const char *cur_result = "";
      14             : static const char *cur_test = "";
      15             : static int cur_line = 0;
      16             : 
      17             : static int
      18          20 : err_handler(DBPROCESS * dbproc TDS_UNUSED, int severity, int dberr, int oserr, char *dberrstr, char *oserrstr)
      19             : {
      20             :         /*
      21             :          * For server messages, cancel the query and rely on the
      22             :          * message handler to spew the appropriate error messages out.
      23             :          */
      24          20 :         if (dberr == SYBESMSG)
      25             :                 return INT_CANCEL;
      26             : 
      27          20 :         if (dberr == 20049) {
      28          20 :                 fprintf(stderr, "OK: anticipated error %d (%s) arrived\n", dberr, dberrstr);
      29             :         } else {
      30           0 :         fprintf(stderr,
      31             :                 "DB-LIBRARY error (severity %d, dberr %d, oserr %d, dberrstr %s, oserrstr %s):\n",
      32             :                 severity, dberr, oserr, dberrstr ? dberrstr : "(null)", oserrstr ? oserrstr : "(null)");
      33             :         }
      34          20 :         fflush(stderr);
      35             : 
      36          20 :         return INT_CANCEL;
      37             : }
      38             : 
      39             : static int
      40         210 : test(int srctype, const void *srcdata, int srclen, int dsttype, int dstlen)
      41             : {
      42             :         DBCHAR buf[10];
      43             :         char s[20], *p;
      44             :         int i, len, correct;
      45             :         char out[256];
      46             : 
      47         210 :         memset(buf, '*', sizeof(buf));
      48         210 :         len = dbconvert(NULL, srctype, (const BYTE*) srcdata, srclen, dsttype, (BYTE*) buf, dstlen);
      49             : 
      50             :         /* build result string */
      51         210 :         sprintf(out, "len=%d", len);
      52         210 :         p = s;
      53        2310 :         for (i = 0; i < sizeof(buf); ++i) {
      54        2100 :                 *p++ = isprint((unsigned char) buf[i]) ? buf[i] : '.';
      55        2100 :                 sprintf(strchr(out, 0), " %02X", (unsigned char) buf[i]);
      56             :         }
      57         210 :         *p = 0;
      58             : 
      59         210 :         correct = 0;
      60         210 :         if (len == -1) {
      61          20 :                 if (strcmp(cur_result, "error") == 0)
      62             :                         correct = 1;
      63             :         } else {
      64         190 :                 if (strcmp(cur_result, out) == 0)
      65             :                         correct = 1;
      66             :         }
      67             :         if (!correct) {
      68           0 :                 failed = true;
      69           0 :                 printf("\nline: %d test: %s\n" "%s\n%s\n" "failed :( should be '%s'\n", cur_line, cur_test, s, out, cur_result);
      70             :         }
      71         210 :         return 0;
      72             : }
      73             : 
      74             : #define TEST(s,out) \
      75             :         { cur_result = out; cur_line = __LINE__; cur_test = #s; test s; }
      76             : 
      77          10 : TEST_MAIN()
      78             : {
      79          10 :         if (dbinit() == FAIL)
      80             :                 return 1;
      81             : 
      82          10 :         dberrhandle(err_handler);
      83          10 :         dbmsghandle(syb_msg_handler);
      84             : 
      85          10 :         TEST((SYBBINARY, "ciao\0\0", 6, SYBBINARY, -2), "len=6 63 69 61 6F 00 00 2A 2A 2A 2A");
      86          10 :         TEST((SYBCHAR, "ciao  ", 6, SYBCHAR, -2), "len=6 63 69 61 6F 20 20 00 2A 2A 2A");
      87          10 :         TEST((SYBCHAR, "ciao\0\0", 6, SYBCHAR, -2), "len=6 63 69 61 6F 00 00 00 2A 2A 2A");
      88          10 :         TEST((SYBCHAR, "ciao  ", 6, SYBCHAR, -1), "len=4 63 69 61 6F 00 2A 2A 2A 2A 2A");
      89          10 :         TEST((SYBCHAR, "ciao\0\0", 6, SYBCHAR, -1), "len=6 63 69 61 6F 00 00 00 2A 2A 2A");
      90          10 :         TEST((SYBCHAR, "ciao  ", 6, SYBCHAR, 8), "len=6 63 69 61 6F 20 20 20 20 2A 2A");
      91          10 :         TEST((SYBCHAR, "ciao\0\0", 6, SYBCHAR, 8), "len=6 63 69 61 6F 00 00 20 20 2A 2A");
      92          10 :         TEST((SYBCHAR, "ciao  ", 6, SYBCHAR, 4), "error");
      93          10 :         TEST((SYBCHAR, "ciao\0\0", 6, SYBCHAR, 4), "error");
      94          10 :         TEST((SYBCHAR, "ciao  ", 6, SYBCHAR, 6), "len=6 63 69 61 6F 20 20 2A 2A 2A 2A");
      95          10 :         TEST((SYBCHAR, "ciao\0\0", 6, SYBCHAR, 6), "len=6 63 69 61 6F 00 00 2A 2A 2A 2A");
      96             : 
      97             :         /* convert from NULL to BINARY */
      98          10 :         TEST((SYBBINARY,    "", 0, SYBBINARY, 6), "len=6 00 00 00 00 00 00 2A 2A 2A 2A");
      99          10 :         TEST((SYBVARBINARY, "", 0, SYBBINARY, 6), "len=6 00 00 00 00 00 00 2A 2A 2A 2A");
     100          10 :         TEST((SYBIMAGE,     "", 0, SYBBINARY, 6), "len=6 00 00 00 00 00 00 2A 2A 2A 2A");
     101          10 :         TEST((SYBBINARY,    "", 0, SYBVARBINARY, 6), "len=6 00 00 00 00 00 00 2A 2A 2A 2A");
     102          10 :         TEST((SYBVARBINARY, "", 0, SYBVARBINARY, 6), "len=6 00 00 00 00 00 00 2A 2A 2A 2A");
     103          10 :         TEST((SYBIMAGE,     "", 0, SYBVARBINARY, 6), "len=6 00 00 00 00 00 00 2A 2A 2A 2A");
     104          10 :         TEST((SYBBINARY,    "", 0, SYBIMAGE, 6), "len=6 00 00 00 00 00 00 2A 2A 2A 2A");
     105          10 :         TEST((SYBVARBINARY, "", 0, SYBIMAGE, 6), "len=6 00 00 00 00 00 00 2A 2A 2A 2A");
     106          10 :         TEST((SYBIMAGE,     "", 0, SYBIMAGE, 6), "len=6 00 00 00 00 00 00 2A 2A 2A 2A");
     107             : 
     108          10 :         TEST((SYBBINARY, "", 0, SYBBINARY, -1), "len=0 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A");
     109             : 
     110          10 :         dbexit();
     111          10 :         if (!failed)
     112          10 :                 printf("All tests passed!\n");
     113          10 :         return failed ? 1 : 0;
     114             : }

Generated by: LCOV version 1.13