Home | History | Annotate | Download | only in test
      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.3 2008/07/12 14:52:21 drh 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
    141