1: # 2006 June 10
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 file is the authorisation callback and virtual tables.
13: #
14: # $Id: vtab3.test,v 1.1.1.1 2012/02/21 17:04:16 misho Exp $
15:
16: set testdir [file dirname $argv0]
17: source $testdir/tester.tcl
18:
19: ifcapable !vtab||!auth {
20: finish_test
21: return
22: }
23:
24: set ::auth_fail 0
25: set ::auth_log [list]
26: set ::auth_filter [list SQLITE_READ SQLITE_UPDATE SQLITE_SELECT SQLITE_PRAGMA]
27:
28: proc auth {code arg1 arg2 arg3 arg4} {
29: if {[lsearch $::auth_filter $code]>-1} {
30: return SQLITE_OK
31: }
32: lappend ::auth_log $code $arg1 $arg2 $arg3 $arg4
33: incr ::auth_fail -1
34: if {$::auth_fail == 0} {
35: return SQLITE_DENY
36: }
37: return SQLITE_OK
38: }
39:
40: do_test vtab3-1.1 {
41: execsql {
42: CREATE TABLE elephant(
43: name VARCHAR(32),
44: color VARCHAR(16),
45: age INTEGER,
46: UNIQUE(name, color)
47: );
48: }
49: } {}
50:
51:
52: do_test vtab3-1.2 {
53: register_echo_module [sqlite3_connection_pointer db]
54: db authorizer ::auth
55: execsql {
56: CREATE VIRTUAL TABLE pachyderm USING echo(elephant);
57: }
58: set ::auth_log
59: } [list \
60: SQLITE_INSERT sqlite_master {} main {} \
61: SQLITE_CREATE_VTABLE pachyderm echo main {} \
62: ]
63:
64: do_test vtab3-1.3 {
65: set ::auth_log [list]
66: execsql {
67: DROP TABLE pachyderm;
68: }
69: set ::auth_log
70: } [list \
71: SQLITE_DELETE sqlite_master {} main {} \
72: SQLITE_DROP_VTABLE pachyderm echo main {} \
73: SQLITE_DELETE pachyderm {} main {} \
74: SQLITE_DELETE sqlite_master {} main {} \
75: ]
76:
77: do_test vtab3-1.4 {
78: set ::auth_fail 1
79: catchsql {
80: CREATE VIRTUAL TABLE pachyderm USING echo(elephant);
81: }
82: } {1 {not authorized}}
83: do_test vtab3-1.5 {
84: execsql {
85: SELECT name FROM sqlite_master WHERE type = 'table';
86: }
87: } {elephant}
88:
89: do_test vtab3-1.5 {
90: set ::auth_fail 2
91: catchsql {
92: CREATE VIRTUAL TABLE pachyderm USING echo(elephant);
93: }
94: } {1 {not authorized}}
95: do_test vtab3-1.6 {
96: execsql {
97: SELECT name FROM sqlite_master WHERE type = 'table';
98: }
99: } {elephant}
100:
101: do_test vtab3-1.5 {
102: set ::auth_fail 3
103: catchsql {
104: CREATE VIRTUAL TABLE pachyderm USING echo(elephant);
105: }
106: } {0 {}}
107: do_test vtab3-1.6 {
108: execsql {
109: SELECT name FROM sqlite_master WHERE type = 'table';
110: }
111: } {elephant pachyderm}
112:
113: foreach i [list 1 2 3 4] {
114: set ::auth_fail $i
115: do_test vtab3-1.7.$i.1 {
116: set rc [catch {
117: execsql {DROP TABLE pachyderm;}
118: } msg]
119: if {$msg eq "authorization denied"} {set msg "not authorized"}
120: list $rc $msg
121: } {1 {not authorized}}
122: do_test vtab3-1.7.$i.2 {
123: execsql {
124: SELECT name FROM sqlite_master WHERE type = 'table';
125: }
126: } {elephant pachyderm}
127: }
128: do_test vtab3-1.8.1 {
129: set ::auth_fail 0
130: catchsql {
131: DROP TABLE pachyderm;
132: }
133: } {0 {}}
134: do_test vtab3-1.8.2 {
135: execsql {
136: SELECT name FROM sqlite_master WHERE type = 'table';
137: }
138: } {elephant}
139:
140: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>