persistentstorage/sqlite3api/TEST/TclScript/safety.test
changeset 0 08ec8eefde2f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/sqlite3api/TEST/TclScript/safety.test	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,93 @@
+# 2005 January 11
+#
+# 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.
+#
+#***********************************************************************
+# This file implements regression tests for SQLite library.  The
+# focus of this file is testing the sqlite3SafetyOn and sqlite3SafetyOff
+# functions.  Those routines are not strictly necessary - they are
+# designed to detect misuse of the library.
+#
+# $Id: safety.test,v 1.4 2008/03/18 13:46:53 drh Exp $
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+
+ifcapable !debug {
+  puts "Skipping safety tests since SQLITE_DEBUG is off"
+  finish_test
+  return
+}
+
+# Return the UTF-8 representation of the supplied UTF-16 string $str. 
+proc utf8 {str} {
+  # If $str ends in two 0x00 0x00 bytes, knock these off before
+  # converting to UTF-8 using TCL.
+  binary scan $str \c* vals
+  if {[lindex $vals end]==0 && [lindex $vals end-1]==0} {
+    set str [binary format \c* [lrange $vals 0 end-2]]
+  }
+
+  set r [encoding convertfrom unicode $str]
+  return $r
+}
+
+
+do_test safety-1.1 {
+  set DB [sqlite3_connection_pointer db]
+  db eval {CREATE TABLE t1(a)}
+  sqlite_set_magic $DB SQLITE_MAGIC_BUSY
+  catchsql {
+    SELECT name FROM sqlite_master;
+  }
+} {1 {library routine called out of sequence}}
+do_test safety-1.2 {
+  sqlite_set_magic $DB SQLITE_MAGIC_OPEN
+  catchsql {
+    SELECT name FROM sqlite_master
+  }
+} {0 t1}
+
+do_test safety-2.1 {
+  proc safety_on {} "sqlite_set_magic $DB SQLITE_MAGIC_BUSY"
+  db function safety_on safety_on
+  catchsql {
+    SELECT safety_on(), name FROM sqlite_master
+  }
+} {1 {library routine called out of sequence}}
+ifcapable {utf16} {
+  do_test safety-2.1.1 {
+    utf8 [sqlite3_errmsg16 db]
+  } {library routine called out of sequence}
+}
+do_test safety-2.2 {
+  catchsql {
+    SELECT 'hello'
+  }
+} {1 {library routine called out of sequence}}
+do_test safety-2.3 {
+  sqlite3_close $DB
+} {SQLITE_MISUSE}
+do_test safety-2.4 {
+  sqlite_set_magic $DB SQLITE_MAGIC_OPEN
+  execsql {
+    SELECT name FROM sqlite_master
+  }
+} {t1}
+
+do_test safety-3.1 {
+  set rc [catch {
+    db eval {SELECT name FROM sqlite_master} {
+      sqlite_set_magic $DB SQLITE_MAGIC_BUSY
+    }
+  } msg]
+  lappend rc $msg
+} {1 {library routine called out of sequence}}
+sqlite_set_magic $DB SQLITE_MAGIC_OPEN
+
+finish_test