1: # 2001 September 15
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: # This file implements regression tests for SQLite library. The
12: # focus of this script is database locks between competing processes.
13: #
14: # $Id: lock2.test,v 1.1.1.1 2012/02/21 17:04:16 misho Exp $
15:
16:
17: set testdir [file dirname $argv0]
18: source $testdir/tester.tcl
19: source $testdir/lock_common.tcl
20:
21:
22: # Simple locking test case:
23: #
24: # lock2-1.1: Connect a second process to the database.
25: # lock2-1.2: Establish a RESERVED lock with this process.
26: # lock2-1.3: Get a SHARED lock with the second process.
27: # lock2-1.4: Try for a RESERVED lock with process 2. This fails.
28: # lock2-1.5: Try to upgrade the first process to EXCLUSIVE, this fails so
29: # it gets PENDING.
30: # lock2-1.6: Release the SHARED lock held by the second process.
31: # lock2-1.7: Attempt to reaquire a SHARED lock with the second process.
32: # this fails due to the PENDING lock.
33: # lock2-1.8: Ensure the first process can now upgrade to EXCLUSIVE.
34: #
35: do_test lock2-1.1 {
36: set ::tf1 [launch_testfixture]
37: testfixture $::tf1 {
38: sqlite3 db test.db -key xyzzy
39: db eval {select * from sqlite_master}
40: }
41: } {}
42: do_test lock2-1.1.1 {
43: execsql {pragma lock_status}
44: } {main unlocked temp closed}
45: sqlite3_soft_heap_limit 0
46: do_test lock2-1.2 {
47: execsql {
48: BEGIN;
49: CREATE TABLE abc(a, b, c);
50: }
51: } {}
52: do_test lock2-1.3 {
53: testfixture $::tf1 {
54: db eval {
55: BEGIN;
56: SELECT * FROM sqlite_master;
57: }
58: }
59: } {}
60: do_test lock2-1.4 {
61: testfixture $::tf1 {
62: catch { db eval { CREATE TABLE def(d, e, f) } } msg
63: set msg
64: }
65: } {database is locked}
66: do_test lock2-1.5 {
67: catchsql {
68: COMMIT;
69: }
70: } {1 {database is locked}}
71: do_test lock2-1.6 {
72: testfixture $::tf1 {
73: db eval {
74: SELECT * FROM sqlite_master;
75: COMMIT;
76: }
77: }
78: } {}
79: do_test lock2-1.7 {
80: testfixture $::tf1 {
81: catch { db eval {
82: BEGIN;
83: SELECT * FROM sqlite_master;
84: } } msg
85: set msg
86: }
87: } {database is locked}
88: do_test lock2-1.8 {
89: catchsql {
90: COMMIT;
91: }
92: } {0 {}}
93: do_test lock2-1.9 {
94: execsql {
95: SELECT * FROM sqlite_master;
96: }
97: } "table abc abc [expr $AUTOVACUUM?3:2] {CREATE TABLE abc(a, b, c)}"
98: catch flush_async_queue
99: do_test lock2-1.10 {
100: testfixture $::tf1 {
101: db eval {
102: SELECT * FROM sqlite_master;
103: }
104: }
105: } "table abc abc [expr $AUTOVACUUM?3:2] {CREATE TABLE abc(a, b, c)}"
106:
107: catch {testfixture $::tf1 {db close}}
108: catch {close $::tf1}
109: sqlite3_soft_heap_limit $cmdlinearg(soft-heap-limit)
110:
111: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>