# 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.9 2008/10/07 15:25:49 drh Exp $

set testdir [file dirname $argv0]
source $testdir/tester.tcl
ifcapable !mutex {
  finish_test
  return
}

# deinitialize
#
catch {db close}
sqlite4_reset_auto_extension
sqlite4_shutdown
install_mutex_counters 1

# Fix the mutex subsystem so that it will not initialize.  In other words,
# make it so that sqlite4_initialize() always fails.  
#
do_test mutex2-1.1 {
  set ::disable_mutex_init 10
  sqlite4_initialize
} {SQLITE4_IOERR}
do_test mutex2-1.1 {
  set ::disable_mutex_init 7
  sqlite4_initialize
} {SQLITE4_NOMEM}

proc utf16 {str} {
  set r [encoding convertto unicode $str]
  append r "\x00\x00"
  return $r
}

# Now that sqlite4_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 {}}
ifcapable utf16 {
  do_test mutex2-2.2 {
    set db2 [sqlite4_open16 [utf16 test.db] {}]
  } {0}
  do_test mutex2-2.3 {
    sqlite4_complete16 [utf16 {SELECT * FROM t1;}]
  } {7}
}
do_test mutex2-2.4 {
  sqlite4_mprintf_int {This is a test %d,%d,%d} 1 2 3
} {}
ifcapable load_ext {
  do_test mutex2-2.5 {
    sqlite4_auto_extension_sqr
  } {7}
}
do_test mutex2-2.6 {
  sqlite4_reset_auto_extension
} {}
do_test mutex2-2.7 {
  sqlite4_malloc 10000
} {0}
do_test mutex2-2.8 {
  sqlite4_realloc 0 10000
} {0}
ifcapable threadsafe {
  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

# Mutex allocation works now.
#

do_test mutex2-3.1 {
  set ptr [alloc_dealloc_mutex]
  expr {$ptr!=0}
} {1}


finish_test
