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 : }
|