xref: /sqlite-3.40.0/src/test_tclsh.c (revision 73b09b87)
1 /*
2 ** 2017-10-13
3 **
4 ** The author disclaims copyright to this source code.  In place of
5 ** a legal notice, here is a blessing:
6 **
7 **    May you do good and not evil.
8 **    May you find forgiveness for yourself and forgive others.
9 **    May you share freely, never taking more than you give.
10 **
11 *************************************************************************
12 **
13 ** This file contains extensions to the the "tclsqlite.c" module used for
14 ** testing.  Basically, all of the other "test_*.c" modules are linked
15 ** into the enhanced tclsh used for testing (and named "testfixture" or
16 ** "testfixture.exe") using logic encoded by this file.
17 **
18 ** The code in this file used to be found in tclsqlite3.c, contained within
19 ** #if SQLITE_TEST ... #endif.  It is factored out into this separate module
20 ** in an effort to keep the tclsqlite.c file pure.
21 */
22 #include "sqlite3.h"
23 #if defined(INCLUDE_SQLITE_TCL_H)
24 # include "sqlite_tcl.h"
25 #else
26 # include "tcl.h"
27 # ifndef SQLITE_TCLAPI
28 #  define SQLITE_TCLAPI
29 # endif
30 #endif
31 
32 /* Needed for the setrlimit() system call on unix */
33 #if defined(unix)
34 #include <sys/resource.h>
35 #endif
36 
37 /* Forward declaration */
38 static int SQLITE_TCLAPI load_testfixture_extensions(
39   ClientData cd,
40   Tcl_Interp *interp,
41   int objc,
42   Tcl_Obj *CONST objv[]
43 );
44 
45 /*
46 ** This routine is the primary export of this file.
47 **
48 ** Configure the interpreter passed as the first argument to have access
49 ** to the commands and linked variables that make up:
50 **
51 **   * the [sqlite3] extension itself,
52 **
53 **   * If SQLITE_TCLMD5 or SQLITE_TEST is defined, the Md5 commands, and
54 **
55 **   * If SQLITE_TEST is set, the various test interfaces used by the Tcl
56 **     test suite.
57 */
sqlite3TestInit(Tcl_Interp * interp)58 const char *sqlite3TestInit(Tcl_Interp *interp){
59   extern int Sqlite3_Init(Tcl_Interp*);
60   extern int Sqliteconfig_Init(Tcl_Interp*);
61   extern int Sqlitetest1_Init(Tcl_Interp*);
62   extern int Sqlitetest2_Init(Tcl_Interp*);
63   extern int Sqlitetest3_Init(Tcl_Interp*);
64   extern int Sqlitetest4_Init(Tcl_Interp*);
65   extern int Sqlitetest5_Init(Tcl_Interp*);
66   extern int Sqlitetest6_Init(Tcl_Interp*);
67   extern int Sqlitetest7_Init(Tcl_Interp*);
68   extern int Sqlitetest8_Init(Tcl_Interp*);
69   extern int Sqlitetest9_Init(Tcl_Interp*);
70   extern int Sqlitetestasync_Init(Tcl_Interp*);
71   extern int Sqlitetest_autoext_Init(Tcl_Interp*);
72   extern int Sqlitetest_blob_Init(Tcl_Interp*);
73   extern int Sqlitetest_demovfs_Init(Tcl_Interp *);
74   extern int Sqlitetest_func_Init(Tcl_Interp*);
75   extern int Sqlitetest_hexio_Init(Tcl_Interp*);
76   extern int Sqlitetest_init_Init(Tcl_Interp*);
77   extern int Sqlitetest_malloc_Init(Tcl_Interp*);
78   extern int Sqlitetest_mutex_Init(Tcl_Interp*);
79   extern int Sqlitetestschema_Init(Tcl_Interp*);
80   extern int Sqlitetestsse_Init(Tcl_Interp*);
81   extern int Sqlitetesttclvar_Init(Tcl_Interp*);
82   extern int Sqlitetestfs_Init(Tcl_Interp*);
83   extern int SqlitetestThread_Init(Tcl_Interp*);
84   extern int SqlitetestOnefile_Init();
85   extern int SqlitetestOsinst_Init(Tcl_Interp*);
86   extern int Sqlitetestbackup_Init(Tcl_Interp*);
87   extern int Sqlitetestintarray_Init(Tcl_Interp*);
88   extern int Sqlitetestvfs_Init(Tcl_Interp *);
89   extern int Sqlitetestrtree_Init(Tcl_Interp*);
90   extern int Sqlitetestrtreedoc_Init(Tcl_Interp*);
91   extern int Sqlitequota_Init(Tcl_Interp*);
92   extern int Sqlitemultiplex_Init(Tcl_Interp*);
93   extern int SqliteSuperlock_Init(Tcl_Interp*);
94   extern int SqlitetestSyscall_Init(Tcl_Interp*);
95 #if defined(SQLITE_ENABLE_SESSION) && defined(SQLITE_ENABLE_PREUPDATE_HOOK)
96   extern int TestSession_Init(Tcl_Interp*);
97 #endif
98   extern int Md5_Init(Tcl_Interp*);
99   extern int Fts5tcl_Init(Tcl_Interp *);
100   extern int SqliteRbu_Init(Tcl_Interp*);
101   extern int Sqlitetesttcl_Init(Tcl_Interp*);
102 #if defined(SQLITE_ENABLE_FTS3) || defined(SQLITE_ENABLE_FTS4)
103   extern int Sqlitetestfts3_Init(Tcl_Interp *interp);
104 #endif
105 #ifdef SQLITE_ENABLE_ZIPVFS
106   extern int Zipvfs_Init(Tcl_Interp*);
107 #endif
108   extern int TestExpert_Init(Tcl_Interp*);
109   extern int Sqlitetest_window_Init(Tcl_Interp *);
110   extern int Sqlitetestvdbecov_Init(Tcl_Interp *);
111   extern int TestRecover_Init(Tcl_Interp*);
112 
113   Tcl_CmdInfo cmdInfo;
114 
115   /* Since the primary use case for this binary is testing of SQLite,
116   ** be sure to generate core files if we crash */
117 #if defined(unix)
118   { struct rlimit x;
119     getrlimit(RLIMIT_CORE, &x);
120     x.rlim_cur = x.rlim_max;
121     setrlimit(RLIMIT_CORE, &x);
122   }
123 #endif /* unix */
124 
125   if( Tcl_GetCommandInfo(interp, "sqlite3", &cmdInfo)==0 ){
126     Sqlite3_Init(interp);
127   }
128 #ifdef SQLITE_ENABLE_ZIPVFS
129   Zipvfs_Init(interp);
130 #endif
131   Md5_Init(interp);
132   Sqliteconfig_Init(interp);
133   Sqlitetest1_Init(interp);
134   Sqlitetest2_Init(interp);
135   Sqlitetest3_Init(interp);
136   Sqlitetest4_Init(interp);
137   Sqlitetest5_Init(interp);
138   Sqlitetest6_Init(interp);
139   Sqlitetest7_Init(interp);
140   Sqlitetest8_Init(interp);
141   Sqlitetest9_Init(interp);
142   Sqlitetestasync_Init(interp);
143   Sqlitetest_autoext_Init(interp);
144   Sqlitetest_blob_Init(interp);
145   Sqlitetest_demovfs_Init(interp);
146   Sqlitetest_func_Init(interp);
147   Sqlitetest_hexio_Init(interp);
148   Sqlitetest_init_Init(interp);
149   Sqlitetest_malloc_Init(interp);
150   Sqlitetest_mutex_Init(interp);
151   Sqlitetestschema_Init(interp);
152   Sqlitetesttclvar_Init(interp);
153   Sqlitetestfs_Init(interp);
154   SqlitetestThread_Init(interp);
155   SqlitetestOnefile_Init();
156   SqlitetestOsinst_Init(interp);
157   Sqlitetestbackup_Init(interp);
158   Sqlitetestintarray_Init(interp);
159   Sqlitetestvfs_Init(interp);
160   Sqlitetestrtree_Init(interp);
161   Sqlitetestrtreedoc_Init(interp);
162   Sqlitequota_Init(interp);
163   Sqlitemultiplex_Init(interp);
164   SqliteSuperlock_Init(interp);
165   SqlitetestSyscall_Init(interp);
166 #if defined(SQLITE_ENABLE_SESSION) && defined(SQLITE_ENABLE_PREUPDATE_HOOK)
167   TestSession_Init(interp);
168 #endif
169   Fts5tcl_Init(interp);
170   SqliteRbu_Init(interp);
171   Sqlitetesttcl_Init(interp);
172 
173 #if defined(SQLITE_ENABLE_FTS3) || defined(SQLITE_ENABLE_FTS4)
174   Sqlitetestfts3_Init(interp);
175 #endif
176   TestExpert_Init(interp);
177   Sqlitetest_window_Init(interp);
178   Sqlitetestvdbecov_Init(interp);
179   TestRecover_Init(interp);
180 
181   Tcl_CreateObjCommand(
182       interp, "load_testfixture_extensions", load_testfixture_extensions,0,0
183   );
184   return 0;
185 }
186 
187 /* tclcmd:   load_testfixture_extensions
188 */
load_testfixture_extensions(ClientData cd,Tcl_Interp * interp,int objc,Tcl_Obj * CONST objv[])189 static int SQLITE_TCLAPI load_testfixture_extensions(
190   ClientData cd,
191   Tcl_Interp *interp,
192   int objc,
193   Tcl_Obj *CONST objv[]
194 ){
195 
196   Tcl_Interp *slave;
197   if( objc!=2 ){
198     Tcl_WrongNumArgs(interp, 1, objv, "SLAVE");
199     return TCL_ERROR;
200   }
201 
202   slave = Tcl_GetSlave(interp, Tcl_GetString(objv[1]));
203   if( !slave ){
204     return TCL_ERROR;
205   }
206 
207   (void)sqlite3TestInit(slave);
208   return TCL_OK;
209 }
210