Home | History | Annotate | Download | only in test
      1 # 2008 June 17
      2 #
      3 # The author disclaims copyright to this source code.  In place of
      4 # a legal notice, here is a blessing:
      5 #
      6 #    May you do good and not evil.
      7 #    May you find forgiveness for yourself and forgive others.
      8 #    May you share freely, never taking more than you give.
      9 #
     10 #***********************************************************************
     11 #
     12 # $Id: mutex1.test,v 1.20 2009/04/23 14:58:40 danielk1977 Exp $
     13 
     14 set testdir [file dirname $argv0]
     15 source $testdir/tester.tcl
     16 
     17 ifcapable !mutex {
     18   finish_test
     19   return
     20 }
     21 if {[info exists tester_do_binarylog]} {
     22   finish_test
     23   return
     24 }
     25 
     26 sqlite3_reset_auto_extension
     27 clear_mutex_counters
     28 
     29 proc mutex_counters {varname} {
     30   upvar $varname var
     31   set var(total) 0
     32   foreach {name value} [read_mutex_counters] {
     33     set var($name) $value
     34     incr var(total) $value
     35   }
     36 }
     37 
     38 #-------------------------------------------------------------------------
     39 # Tests mutex1-1.* test that sqlite3_config() returns SQLITE_MISUSE if
     40 # is called at the wrong time. And that the first time sqlite3_initialize 
     41 # is called it obtains the 'static_master' mutex 3 times and a recursive
     42 # mutex (sqlite3Config.pInitMutex) twice. Subsequent calls are no-ops 
     43 # that do not require any mutexes.
     44 #
     45 do_test mutex1-1.0 {
     46   install_mutex_counters 1
     47 } {SQLITE_MISUSE}
     48 
     49 do_test mutex1-1.1 {
     50   db close
     51   install_mutex_counters 1
     52 } {SQLITE_MISUSE}
     53 
     54 do_test mutex1-1.2 {
     55   sqlite3_shutdown
     56   install_mutex_counters 1
     57 } {SQLITE_OK}
     58 
     59 do_test mutex1-1.3 {
     60   install_mutex_counters 0
     61 } {SQLITE_OK}
     62 
     63 do_test mutex1-1.4 {
     64   install_mutex_counters 1
     65 } {SQLITE_OK}
     66 
     67 do_test mutex1-1.5 {
     68   mutex_counters counters
     69   set counters(total)
     70 } {0}
     71 
     72 do_test mutex1-1.6 {
     73   sqlite3_initialize
     74 } {SQLITE_OK}
     75 
     76 do_test mutex1-1.7 {
     77   mutex_counters counters
     78   # list $counters(total) $counters(static_master)
     79   expr {$counters(total)>0}
     80 } {1}
     81 
     82 do_test mutex1-1.8 {
     83   clear_mutex_counters
     84   sqlite3_initialize
     85 } {SQLITE_OK}
     86 
     87 do_test mutex1-1.9 {
     88   mutex_counters counters
     89   list $counters(total) $counters(static_master)
     90 } {0 0}
     91 
     92 #-------------------------------------------------------------------------
     93 # Tests mutex1-2.* test the three thread-safety related modes that
     94 # can be selected using sqlite3_config:
     95 #
     96 #   * Serialized mode,
     97 #   * Multi-threaded mode,
     98 #   * Single-threaded mode.
     99 #
    100 ifcapable threadsafe&&shared_cache {
    101   set enable_shared_cache [sqlite3_enable_shared_cache 1]
    102   foreach {mode mutexes} {
    103     singlethread {}
    104     multithread  {
    105       fast static_lru static_master static_mem static_open static_prng 
    106       static_pmem
    107     }
    108     serialized  {
    109       fast recursive static_lru static_master static_mem static_open 
    110       static_prng static_pmem
    111     }
    112   } {
    113 
    114     do_test mutex1.2.$mode.1 {
    115       catch {db close}
    116       sqlite3_shutdown
    117       sqlite3_config $mode
    118     } SQLITE_OK
    119 
    120     do_test mutex1.2.$mode.2 {
    121       sqlite3_initialize
    122       clear_mutex_counters
    123       sqlite3 db test.db -nomutex 0 -fullmutex 0
    124       catchsql { CREATE TABLE abc(a, b, c) }
    125       db eval {
    126         INSERT INTO abc VALUES(1, 2, 3);
    127       }
    128     } {}
    129     ifcapable !memorymanage {
    130       regsub { static_lru} $mutexes {} mutexes
    131     }
    132     do_test mutex1.2.$mode.3 {
    133       mutex_counters counters
    134   
    135       set res [list]
    136       foreach {key value} [array get counters] {
    137         if {$key ne "total" && $value > 0} {
    138           lappend res $key
    139         }
    140       }
    141       lsort $res
    142     } [lsort $mutexes]
    143   }
    144   sqlite3_enable_shared_cache $enable_shared_cache
    145 
    146   # Open and use a connection in "nomutex" mode. Test that no recursive
    147   # mutexes are obtained.
    148   do_test mutex1.3.1 {
    149     catch {db close}
    150     clear_mutex_counters
    151     sqlite3 db test.db -nomutex 1
    152     execsql { SELECT * FROM abc }
    153   } {1 2 3 1 2 3 1 2 3}
    154   do_test mutex1.3.2 {
    155     mutex_counters counters
    156     set counters(recursive)
    157   } {0}
    158 }
    159 
    160 # Test the sqlite3_db_mutex() function.
    161 #
    162 do_test mutex1.4.1 {
    163   catch {db close}
    164   sqlite3 db test.db
    165   enter_db_mutex db
    166   db eval {SELECT 1, 2, 3}
    167 } {1 2 3}
    168 do_test mutex1.4.2 {
    169   leave_db_mutex db
    170   db eval {SELECT 1, 2, 3}
    171 } {1 2 3}
    172 do_test mutex1.4.3 {
    173   catch {db close}
    174   sqlite3 db test.db -nomutex 1
    175   enter_db_mutex db
    176   db eval {SELECT 1, 2, 3}
    177 } {1 2 3}
    178 do_test mutex1.4.4 {
    179   leave_db_mutex db
    180   db eval {SELECT 1, 2, 3}
    181 } {1 2 3}
    182 
    183 do_test mutex1-X {
    184   catch {db close}
    185   sqlite3_shutdown
    186   clear_mutex_counters
    187   install_mutex_counters 0
    188   sqlite3_initialize
    189 } {SQLITE_OK}
    190 
    191 autoinstall_test_functions
    192 finish_test
    193