]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add tests to verify correct behavior when mutex initialization fails. (CVS 5359)
authordrh <drh@noemail.net>
Tue, 8 Jul 2008 02:12:37 +0000 (02:12 +0000)
committerdrh <drh@noemail.net>
Tue, 8 Jul 2008 02:12:37 +0000 (02:12 +0000)
FossilOrigin-Name: 65875005ac8bc7988d7d7d8e8b999857449568fd

manifest
manifest.uuid
src/test1.c
src/test_autoext.c
src/test_mutex.c
test/date.test
test/mutex1.test
test/mutex2.test [new file with mode: 0644]

index 708031cd70a79ab30366dabc615ce611124be030..317483bab59881cc246c730d511027591366ab6a 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Testing\scoverage\senhancements.\s(CVS\s5358)
-D 2008-07-08T00:06:50
+C Add\stests\sto\sverify\scorrect\sbehavior\swhen\smutex\sinitialization\sfails.\s(CVS\s5359)
+D 2008-07-08T02:12:37
 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
 F Makefile.in 325dfac0a0dd1cb4d975f1ace6453157892e6042
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -149,7 +149,7 @@ F src/sqliteLimit.h f435e728c6b620ef7312814d660a81f9356eb5c8
 F src/status.c 6cb10377992505bd69f1ca1d75c1240a65f25a58
 F src/table.c 1fa8f8113ac9cbc09ae4801c6d2a7f0af82c5822
 F src/tclsqlite.c 4dd9ee4cb44846ad9bcc4d0da8088c1e7d4b33d9
-F src/test1.c 92fcc114c60ea9c1c41437db43cfc5a920e7402a
+F src/test1.c 6baa867e394e55b5dbb0a2e605ba52a20fb671ce
 F src/test2.c c46d146019ab6e37474e66b3c789e5237d9ea7b7
 F src/test3.c 01ff03164cf6a2bededa3b44ecd481603e2644fc
 F src/test4.c ff4ecde3cafc71337b04e8cb7da5bb88e85d70e7
@@ -159,7 +159,7 @@ F src/test7.c 19474b1802858cd2017493c907f70ac2d57ab092
 F src/test8.c 3b85c05b15ccfc6844093791e83d5c8a1e0354ca
 F src/test9.c 4615ef08750245a2d96aaa7cbe2fb4aff2b57acc
 F src/test_async.c da9f58f49faccd3a26ba89f58de125862351b6e2
-F src/test_autoext.c 5e892ab84aece3f0428920bf46923f16ac83962a
+F src/test_autoext.c f53b0cdf7bf5f08100009572a5d65cdb540bd0ad
 F src/test_btree.c c1308ba0b88ab577fa56c9e493a09829dfcded9c
 F src/test_config.c e893a7195e975f133c4481d679089531c2970c73
 F src/test_devsym.c 6012cb8e3acf812513511025a4fa5d626e0ba19b
@@ -168,7 +168,7 @@ F src/test_hexio.c 2f1122aa3f012fa0142ee3c36ce5c902a70cd12f
 F src/test_loadext.c df8ab3a6481ddebbdf0d28ebac5d9e0790f7860f
 F src/test_malloc.c 62296810d3ee914fc3e05f2a8a69d8f8f42c32e1
 F src/test_md5.c 28209a4e2068711b5443c33104fe41f21d160071
-F src/test_mutex.c 0a515271d8ee480b7929b8b2ba20a7bc2224ae9f
+F src/test_mutex.c 64c88ef9fed47c896fe470af03bffcd0f6f058f2
 F src/test_onefile.c 243157b10275251c5dc2d6619aee2ff9ae22379c
 F src/test_osinst.c 867f1317bd135f942a63eab5a78da40fc70d1493
 F src/test_schema.c 4b4bf7bb329326458c491b0e6facd4c8c4c5b479
@@ -258,7 +258,7 @@ F test/crash7.test e20a7b9ee1d16eaef7c94a4cb7ed2191b4d05970
 F test/crashtest1.c 09c1c7d728ccf4feb9e481671e29dda5669bbcc2
 F test/createtab.test 199cf68f44e5d9e87a0b8afc7130fdeb4def3272
 F test/cse.test 4b8a49decaefccb835ecc67249277be491713f6c
-F test/date.test 1413c8a73d281f09afb8ac444c57958f5fbed3fc
+F test/date.test 4ea54e26feea7c24dfc7fad1b2b87da21ff12380
 F test/default.test 252298e42a680146b1dd64f563b95bdf088d94fb
 F test/delete.test f171c1011395a8dd63169438fe1d8cc625eb7442
 F test/delete2.test c06be3806ba804bc8c6f134476816080280b40e3
@@ -414,7 +414,8 @@ F test/misc5.test 0b68dcb630d44af2dbcdca94dd2b17c8d580f6fa
 F test/misc6.test 953cc693924d88e6117aeba16f46f0bf5abede91
 F test/misc7.test 26e0d948a413bca61ed031159907a03d64647409
 F test/misuse.test 30b3a458e5a70c31e74c291937b6c82204c59f33
-F test/mutex1.test 1c98e4d236444c6a1a912b9c48b4004eeba0d9a6
+F test/mutex1.test 77719e9da234ba23f50e89e9fb19be8c116ad27a
+F test/mutex2.test a006d753714ea7e00b90b6f9c061bdde5be16435
 F test/nan.test 14c41572ff52dbc740b1c3303dd313a90dc6084c
 F test/notnull.test 44d600f916b770def8b095a9962dbe3be5a70d82
 F test/null.test a8b09b8ed87852742343b33441a9240022108993
@@ -599,7 +600,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81
 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 1dbced29de5f59ba2ebf877edcadf171540374d1
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
-P 28f8b6bfcc3e169f8a54a6681395f2c85bf99cab
-R 45fa0fc8c38b488b294ddeb46f1ccc23
+P fe80aa58a4ac12db5a92d25d28165f5159f04533
+R f30d395fe0e995ac76915a06c1dd7771
 U drh
-Z 80facad624be60e0509d94f9ed839a1b
+Z 4be64c0a5d2f09e2efc62714a2157dfd
index f3d5af5d03e6a194441f3e93d44e37f18e1a45aa..d12291df6a5cef9d50759d7195ac308f8dc552a5 100644 (file)
@@ -1 +1 @@
-fe80aa58a4ac12db5a92d25d28165f5159f04533
\ No newline at end of file
+65875005ac8bc7988d7d7d8e8b999857449568fd
\ No newline at end of file
index 1baa8073fd2f803d2ca70fc7f219fa2855aa6323..2b98179fe960ce145270a8053e072167747d3a0f 100644 (file)
@@ -13,7 +13,7 @@
 ** is not included in the SQLite library.  It is used for automated
 ** testing of the SQLite library.
 **
-** $Id: test1.c,v 1.311 2008/07/07 17:53:08 drh Exp $
+** $Id: test1.c,v 1.312 2008/07/08 02:12:37 drh Exp $
 */
 #include "sqliteInt.h"
 #include "tcl.h"
@@ -4425,6 +4425,29 @@ static int vfs_unlink_test(
   return TCL_OK;
 }
 
+/*
+** tclcmd:   vfs_initfail_test
+**
+** This TCL command attempts to vfs_find and vfs_register when the
+** sqlite3_initialize() interface is failing.  All calls should fail.
+*/
+static int vfs_initfail_test(
+  ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
+  Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
+  int objc,              /* Number of arguments */
+  Tcl_Obj *CONST objv[]  /* Command arguments */
+){
+  sqlite3_vfs one;
+  one.zName = "__one";
+
+  if( sqlite3_vfs_find(0) ) return TCL_ERROR;
+  sqlite3_vfs_register(&one, 0);
+  if( sqlite3_vfs_find(0) ) return TCL_ERROR;
+  sqlite3_vfs_register(&one, 1);
+  if( sqlite3_vfs_find(0) ) return TCL_ERROR;
+  return TCL_OK;
+}
+
 /*
 ** Saved VFSes
 */
@@ -4778,6 +4801,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){
      { "sqlite3_global_recover",     test_global_recover, 0   },
      { "working_64bit_int",          working_64bit_int,   0   },
      { "vfs_unlink_test",            vfs_unlink_test,     0   },
+     { "vfs_initfail_test",          vfs_initfail_test,   0   },
      { "vfs_unregister_all",         vfs_unregister_all,  0   },
      { "vfs_reregister_all",         vfs_reregister_all,  0   },
      { "file_control_test",          file_control_test,   0   },
index 6c5b98370ddc837d3daa284dfce9e066602e7b7f..11f541360d356aeb8e6c5feaba2ee7723f10f6d2 100644 (file)
@@ -11,7 +11,7 @@
 *************************************************************************
 ** Test extension for testing the sqlite3_auto_extension() function.
 **
-** $Id: test_autoext.c,v 1.4 2008/03/19 23:52:35 mlcreech Exp $
+** $Id: test_autoext.c,v 1.5 2008/07/08 02:12:37 drh Exp $
 */
 #include "tcl.h"
 #include "sqlite3ext.h"
@@ -95,7 +95,8 @@ static int autoExtSqrObjCmd(
   int objc,
   Tcl_Obj *CONST objv[]
 ){
-  sqlite3_auto_extension((void*)sqr_init);
+  int rc = sqlite3_auto_extension((void*)sqr_init);
+  Tcl_SetObjResult(interp, Tcl_NewIntObj(rc));
   return SQLITE_OK;
 }
 
@@ -110,7 +111,8 @@ static int autoExtCubeObjCmd(
   int objc,
   Tcl_Obj *CONST objv[]
 ){
-  sqlite3_auto_extension((void*)cube_init);
+  int rc = sqlite3_auto_extension((void*)cube_init);
+  Tcl_SetObjResult(interp, Tcl_NewIntObj(rc));
   return SQLITE_OK;
 }
 
@@ -125,7 +127,8 @@ static int autoExtBrokenObjCmd(
   int objc,
   Tcl_Obj *CONST objv[]
 ){
-  sqlite3_auto_extension((void*)broken_init);
+  int rc = sqlite3_auto_extension((void*)broken_init);
+  Tcl_SetObjResult(interp, Tcl_NewIntObj(rc));
   return SQLITE_OK;
 }
 
index c2df5563aae22fb54fda4b3e0d0fb301bc2f961a..817de93ac4165e2dcfa46e7e75985a8d34bfc301 100644 (file)
@@ -10,7 +10,7 @@
 **
 *************************************************************************
 ** 
-** $Id: test_mutex.c,v 1.5 2008/07/08 00:06:50 drh Exp $
+** $Id: test_mutex.c,v 1.6 2008/07/08 02:12:37 drh Exp $
 */
 
 #include "tcl.h"
@@ -65,7 +65,6 @@ static int counterMutexInit(void){
 ** Uninitialize the mutex subsystem
 */
 static int counterMutexEnd(void){ 
-  assert( g.isInit );
   g.isInit = 0;
   return g.m.xMutexEnd();
 }
@@ -83,7 +82,7 @@ static sqlite3_mutex *counterMutexAlloc(int eType){
   pReal = g.m.xMutexAlloc(eType);
   if( !pReal ) return 0;
 
-  if( eType==0 || eType==1 ){
+  if( eType==SQLITE_MUTEX_FAST || eType==SQLITE_MUTEX_RECURSIVE ){
     pRet = (sqlite3_mutex *)malloc(sizeof(sqlite3_mutex));
   }else{
     pRet = &g.aStatic[eType-2];
@@ -100,7 +99,7 @@ static sqlite3_mutex *counterMutexAlloc(int eType){
 static void counterMutexFree(sqlite3_mutex *p){
   assert( g.isInit );
   g.m.xMutexFree(p->pReal);
-  if( p->eType==0 || p->eType==1 ){
+  if( p->eType==SQLITE_MUTEX_FAST || p->eType==SQLITE_MUTEX_RECURSIVE ){
     free(p);
   }
 }
@@ -287,6 +286,25 @@ static int test_clear_mutex_counters(
   return TCL_OK;
 }
 
+/*
+** Create and free a mutex.  Return the mutex pointer.  The pointer
+** will be invalid since the mutex has already been freed.  The
+** return pointer just checks to see if the mutex really was allocated.
+*/
+static int test_alloc_mutex(
+  void * clientData,
+  Tcl_Interp *interp,
+  int objc,
+  Tcl_Obj *CONST objv[]
+){
+  sqlite3_mutex *p = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST);
+  char zBuf[100];
+  sqlite3_mutex_free(p);
+  sqlite3_snprintf(sizeof(zBuf), zBuf, "%p", p);
+  Tcl_AppendResult(interp, zBuf, (char*)0);
+  return TCL_OK;
+}
+
 /*
 ** sqlite3_config OPTION
 */
@@ -332,6 +350,7 @@ int Sqlitetest_mutex_Init(Tcl_Interp *interp){
     { "sqlite3_initialize",      (Tcl_ObjCmdProc*)test_initialize },
     { "sqlite3_config",          (Tcl_ObjCmdProc*)test_config },
 
+    { "alloc_dealloc_mutex",     (Tcl_ObjCmdProc*)test_alloc_mutex },
     { "install_mutex_counters",  (Tcl_ObjCmdProc*)test_install_mutex_counters },
     { "read_mutex_counters",     (Tcl_ObjCmdProc*)test_read_mutex_counters },
     { "clear_mutex_counters",    (Tcl_ObjCmdProc*)test_clear_mutex_counters },
index 9b3c4782161b3071105fb28bec78427b71ace06a..466fb6516f9358d5d86f0f96f23c1ca287472bc8 100644 (file)
@@ -11,7 +11,7 @@
 # This file implements regression tests for SQLite library.  The
 # focus of this file is testing date and time functions.
 #
-# $Id: date.test,v 1.30 2008/06/12 18:05:40 drh Exp $
+# $Id: date.test,v 1.31 2008/07/08 02:12:37 drh Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -57,6 +57,7 @@ datetest 1.20 {julianday('2000-01-01 12:00:00.01')}  2451545.00000012
 datetest 1.21 {julianday('2000-01-01 12:00:00.001')} 2451545.00000001
 datetest 1.22 {julianday('2000-01-01 12:00:00.')} NULL
 datetest 1.23 julianday(12345.6) 12345.6
+datetest 1.23b julianday('12345.6') 12345.6
 datetest 1.24 {julianday('2001-01-01 12:00:00 bogus')} NULL
 datetest 1.25 {julianday('2001-01-01 bogus')} NULL
 datetest 1.26 {julianday('2001-01-01 12:60:00')} NULL
@@ -69,6 +70,7 @@ datetest 2.1b datetime(0,'unixepoc') NULL
 datetest 2.1c datetime(0,'unixepochx') NULL
 datetest 2.1d datetime('2003-10-22','unixepoch') NULL
 datetest 2.2 datetime(946684800,'unixepoch') {2000-01-01 00:00:00}
+datetest 2.2b datetime('946684800','unixepoch') {2000-01-01 00:00:00}
 datetest 2.3 {date('2003-10-22','weekday 0')} 2003-10-26
 datetest 2.4 {date('2003-10-22','weekday 1')} 2003-10-27
 datetest 2.4a {date('2003-10-22','weekday  1')} 2003-10-27
@@ -167,9 +169,10 @@ datetest 3.11.19 {strftime('%W %j',2454109.04140974)} {02 008}
 datetest 3.11.20 {strftime('%W %j',2454109.04140975)} {02 008}
 datetest 3.11.21 {strftime('%W %j',2454109.04140976)} {02 008}
 datetest 3.11.22 {strftime('%W %j',2454109.04140977)} {02 008}
-datetest 3.11.22 {strftime('%W %j',2454109.04140978)} {02 008}
-datetest 3.11.22 {strftime('%W %j',2454109.04140979)} {02 008}
-datetest 3.11.22 {strftime('%W %j',2454109.04140980)} {02 008}
+datetest 3.11.23 {strftime('%W %j',2454109.04140978)} {02 008}
+datetest 3.11.24 {strftime('%W %j',2454109.04140979)} {02 008}
+datetest 3.11.25 {strftime('%W %j',2454109.04140980)} {02 008}
+datetest 3.11.99 {strftime('%W %j','2454109.04140970')} {02 008}
 datetest 3.12 {strftime('%Y','2003-10-31 12:34:56.432')} 2003
 datetest 3.13 {strftime('%%','2003-10-31 12:34:56.432')} %
 datetest 3.14 {strftime('%_','2003-10-31 12:34:56.432')} NULL
index ad71b8f47ba5a453e56597166b29d6a17f02cb4e..38c4a3ef3dedcd7a0aaa402d21e28dd900455cb0 100644 (file)
@@ -9,7 +9,7 @@
 #
 #***********************************************************************
 #
-# $Id: mutex1.test,v 1.6 2008/06/28 11:23:00 danielk1977 Exp $
+# $Id: mutex1.test,v 1.7 2008/07/08 02:12:37 drh Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -86,7 +86,7 @@ do_test mutex1-1.9 {
 #   * Multi-threaded mode,
 #   * Single-threaded mode.
 #
-
+set enable_shared_cache [sqlite3_enable_shared_cache 1]
 ifcapable threadsafe {
   foreach {mode mutexes} {
     singlethread {}
@@ -96,9 +96,9 @@ ifcapable threadsafe {
     ifcapable memorymanage {
       if {$mode ne "singlethread"} {
         lappend mutexes static_lru static_lru2 static_mem2
-        set mutexes [lsort $mutexes]
       }
     }
+
     do_test mutex1.2.$mode.1 {
       catch {db close}
       sqlite3_shutdown
@@ -125,9 +125,10 @@ ifcapable threadsafe {
         }
       }
       lsort $res
-    } $mutexes
+    } [lsort $mutexes]
   }
 }
+sqlite3_enable_shared_cache $enable_shared_cache
 
 do_test mutex1-X {
   catch {db close}
diff --git a/test/mutex2.test b/test/mutex2.test
new file mode 100644 (file)
index 0000000..6a0dbd0
--- /dev/null
@@ -0,0 +1,87 @@
+# 2008 July 7
+#
+# The author disclaims copyright to this source code.  In place of
+# a legal notice, here is a blessing:
+#
+#    May you do good and not evil.
+#    May you find forgiveness for yourself and forgive others.
+#    May you share freely, never taking more than you give.
+#
+#***********************************************************************
+#
+# Test scripts for deliberate failures of mutex routines.
+#
+# $Id: mutex2.test,v 1.3 2008/07/08 02:12:37 drh Exp $
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+
+# deinitialize
+#
+catch {db close}
+sqlite3_reset_auto_extension
+sqlite3_shutdown
+install_mutex_counters 1
+
+# Fix the mutex subsystem so that it will not initialize.  In other words,
+# make it so that sqlite3_initialize() always fails.  
+#
+do_test mutex2-1.1 {
+  set ::disable_mutex_init 10
+  sqlite3_initialize
+} {SQLITE_IOERR}
+do_test mutex2-1.1 {
+  set ::disable_mutex_init 7
+  sqlite3_initialize
+} {SQLITE_NOMEM}
+
+proc utf16 {str} {
+  set r [encoding convertto unicode $str]
+  append r "\x00\x00"
+  return $r
+}
+
+# Now that sqlite3_initialize() is failing, try to run various APIs that
+# require that SQLite be initialized.  Verify that they fail.
+#
+do_test mutex2-2.1 {
+  set ::disable_mutex_init 7
+  set rc [catch {sqlite db test.db} msg]
+  lappend rc $msg
+} {1 {out of memory}}
+ifcapable utf16 {
+  do_test mutex2-2.2 {
+    set db2 [sqlite3_open16 [utf16 test.db] {}]
+  } {0}
+  do_test mutex2-2.3 {
+    sqlite3_complete16 [utf16 {SELECT * FROM t1;}]
+  } {7}
+}
+do_test mutex2-2.4 {
+  sqlite3_mprintf_int {This is a test %d,%d,%d} 1 2 3
+} {This is a test 1,2,3}
+do_test mutex2-2.5 {
+  sqlite3_auto_extension_sqr
+} {7}
+do_test mutex2-2.6 {
+  sqlite3_reset_auto_extension
+} {}
+do_test mutex2-2.7 {
+  sqlite3_malloc 10000
+} {00000000}
+do_test mutex2-2.8 {
+  sqlite3_realloc 0 10000
+} {00000000}
+do_test mutex2-2.9 {
+  alloc_dealloc_mutex
+} {0}
+do_test mutex2-2.10 {
+  vfs_initfail_test
+} {}
+
+# Restore the system to a functional state
+#
+install_mutex_counters 0
+set disable_mutex_init 0
+autoinstall_test_functions
+finish_test