Annotation of embedaddon/sqlite3/test/quota.test, revision 1.1.1.1

1.1       misho       1: # 2010 September 1
                      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: #
                     12: 
                     13: set testdir [file dirname $argv0]
                     14: source $testdir/tester.tcl
                     15: source $testdir/malloc_common.tcl
                     16: 
                     17: unset -nocomplain defaultVfs
                     18: set defaultVfs [file_control_vfsname db]
                     19: db close
                     20: 
                     21: do_test quota-1.1 { sqlite3_quota_initialize nosuchvfs 1 } {SQLITE_ERROR}
                     22: do_test quota-1.2 { sqlite3_quota_initialize "" 1 }        {SQLITE_OK}
                     23: do_test quota-1.3 { sqlite3_quota_initialize "" 1 }        {SQLITE_MISUSE}
                     24: do_test quota-1.4 { sqlite3_quota_shutdown }               {SQLITE_OK}
                     25: 
                     26: do_test quota-1.5 { sqlite3_quota_initialize "" 0 }        {SQLITE_OK}
                     27: do_test quota-1.6 { sqlite3_quota_shutdown }               {SQLITE_OK}
                     28: do_test quota-1.7 { sqlite3_quota_initialize "" 1 }        {SQLITE_OK}
                     29: do_test quota-1.8 { sqlite3_quota_shutdown }               {SQLITE_OK}
                     30: 
                     31: 
                     32: #-------------------------------------------------------------------------
                     33: # Some simple warm-body tests with a single database file in rollback 
                     34: # mode:
                     35: #
                     36: #   quota-2.1.*: Test that SQLITE_FULL is returned if the database would
                     37: #                exceed the configured quota.
                     38: #
                     39: #   quota-2.2.*: Test that SQLITE_FULL is not returned and the database
                     40: #                grows if the callback extends the quota when the database
                     41: #                attempts to grow beyond the configured quota.
                     42: #
                     43: #   quota-2.3.*: Open and close a db that is not part of any quota group. At
                     44: #                one point this was causing mutex refs to be leaked.
                     45: #
                     46: #   quota-2.4.*: Try to shutdown the quota system before closing the db
                     47: #                file. Check that this fails and the quota system still works
                     48: #                afterwards. Then close the database and successfully shut
                     49: #                down the quota system.
                     50: #   
                     51: sqlite3_quota_initialize "" 1
                     52: 
                     53: unset -nocomplain quota_request_ok
                     54: proc quota_check {filename limitvar size} {
                     55:   upvar $limitvar limit
                     56: 
                     57:   lappend ::quota [set limit] $size
                     58:   if {[info exists ::quota_request_ok]} { set limit $size }
                     59: }
                     60: 
                     61: do_test quota-2.1.1 {
                     62:   sqlite3_quota_set *test.db 4096 quota_check
                     63: } {SQLITE_OK}
                     64: do_test quota-2.1.2 {
                     65:   sqlite3 db test.db
                     66:   execsql {
                     67:     PRAGMA page_size=1024;
                     68:     PRAGMA auto_vacuum=OFF;
                     69:     PRAGMA journal_mode=DELETE;
                     70:   }
                     71:   set ::quota [list]
                     72:   execsql {
                     73:     CREATE TABLE t1(a, b);
                     74:     INSERT INTO t1 VALUES(1, randomblob(1100));
                     75:     INSERT INTO t1 VALUES(2, randomblob(1100));
                     76:   }
                     77:   set ::quota
                     78: } {}
                     79: do_test quota-2.1.2.1 {
                     80:   file_control_vfsname db
                     81: } quota/$defaultVfs
                     82: do_test quota-2.1.3 { file size test.db } {4096}
                     83: do_test quota-2.1.4 {
                     84:   catchsql { INSERT INTO t1 VALUES(3, randomblob(1100)) }
                     85: } {1 {database or disk is full}}
                     86: do_test quota-2.1.5 { set ::quota } {4096 5120}
                     87: 
                     88: set ::quota_request_ok 1
                     89: set ::quota [list]
                     90: do_test quota-2.2.1 {
                     91:   execsql { INSERT INTO t1 VALUES(3, randomblob(1100)) }
                     92: } {}
                     93: do_test quota-2.2.2 { set ::quota } {4096 5120}
                     94: do_test quota-2.2.3 { file size test.db } {5120}
                     95: unset ::quota_request_ok
                     96: 
                     97: do_test quota-2.3.1 {
                     98:   sqlite3 db2 bak.db
                     99:   db2 close
                    100: } {}
                    101: 
                    102: do_test quota-2.4.1 {
                    103:   sqlite3_quota_shutdown
                    104: } {SQLITE_MISUSE}
                    105: set ::quota [list]
                    106: do_test quota-2.4.2 {
                    107:   catchsql { INSERT INTO t1 VALUES(3, randomblob(1100)) }
                    108: } {1 {database or disk is full}}
                    109: do_test quota-2.4.3 { set ::quota } {5120 6144}
                    110: do_test quota-2.4.4 { file size test.db } {5120}
                    111: do_test quota-2.4.99 {
                    112:   db close
                    113:   sqlite3_quota_shutdown
                    114: } {SQLITE_OK}
                    115: 
                    116: #-------------------------------------------------------------------------
                    117: # Try some tests with more than one connection to a database file. Still
                    118: # in rollback mode.
                    119: #
                    120: #   quota-3.1.*: Two connections to a single database file.
                    121: #
                    122: #   quota-3.2.*: Two connections to each of several database files (that
                    123: #                are in the same quota group).
                    124: #
                    125: proc quota_check {filename limitvar size} {
                    126:   upvar $limitvar limit
                    127:   lappend ::quota [set limit] $size
                    128:   if {[info exists ::quota_request_ok]} { set limit $size }
                    129: }
                    130: 
                    131: do_test quota-3.1.1 {
                    132:   forcedelete test.db
                    133:   sqlite3_quota_initialize "" 1
                    134:   sqlite3_quota_set *test.db 4096 quota_check
                    135: } {SQLITE_OK}
                    136: do_test quota-3.1.2 {
                    137:   sqlite3 db test.db
                    138:   execsql {
                    139:     PRAGMA page_size = 1024;
                    140:     PRAGMA journal_mode = delete;
                    141:     PRAGMA auto_vacuum = off;
                    142:     CREATE TABLE t1(a PRIMARY KEY, b);
                    143:     INSERT INTO t1 VALUES(1, 'one');
                    144:   }
                    145:   file size test.db
                    146: } {3072}
                    147: do_test quota-3.1.3 {
                    148:   sqlite3 db2 test.db
                    149:   set ::quota [list]
                    150:   execsql { CREATE TABLE t2(a, b) } db2
                    151:   set ::quota
                    152: } {}
                    153: do_test quota-3.1.4 {
                    154:   catchsql { CREATE TABLE t3(a, b) }
                    155: } {1 {database or disk is full}}
                    156: do_test quota-3.1.5 {
                    157:   set ::quota_request_ok 1
                    158:   execsql { CREATE TABLE t3(a, b) }
                    159: } {}
                    160: do_test quota-3.1.6 {
                    161:   db close
                    162:   db2 close
                    163:   sqlite3_quota_set *test.db 0 {}
                    164: } {SQLITE_OK}
                    165: 
                    166: do_test quota-3.2.1 {
                    167:   delete_file force test.db test2.db 
                    168: 
                    169:   sqlite3_quota_set * 4096 {}
                    170:   sqlite3 db1a test.db
                    171:   sqlite3 db2a test2.db
                    172: 
                    173:   foreach db {db1a db2a} {
                    174:     execsql {
                    175:       PRAGMA page_size = 1024;
                    176:       PRAGMA journal_mode = delete;
                    177:       PRAGMA auto_vacuum = off;
                    178:       CREATE TABLE t1(a, b);
                    179:     } $db
                    180:   }
                    181: 
                    182:   sqlite3 db1b test.db
                    183:   sqlite3 db2b test2.db
                    184: 
                    185:   list [file size test.db] [file size test2.db]
                    186: } {2048 2048}
                    187: 
                    188: catch { unset ::quota_request_ok }
                    189: 
                    190: do_test quota-3.2.2 { execsql { INSERT INTO t1 VALUES('x', 'y') } db1a } {}
                    191: do_test quota-3.2.3 { execsql { INSERT INTO t1 VALUES('v', 'w') } db1b } {}
                    192: do_test quota-3.2.4 { execsql { INSERT INTO t1 VALUES('t', 'u') } db2a } {}
                    193: do_test quota-3.2.5 { execsql { INSERT INTO t1 VALUES('r', 's') } db2b } {}
                    194: 
                    195: do_test quota-3.2.6 { 
                    196:   catchsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db1a
                    197: } {1 {database or disk is full}}
                    198: do_test quota-3.2.7 { 
                    199:   catchsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db1b
                    200: } {1 {database or disk is full}}
                    201: do_test quota-3.2.8 { 
                    202:   catchsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db2a
                    203: } {1 {database or disk is full}}
                    204: do_test quota-3.2.9 { 
                    205:   catchsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db2b
                    206: } {1 {database or disk is full}}
                    207: 
                    208: set ::quota [list]
                    209: proc quota_callback {file limitvar size} {
                    210:   upvar $limitvar limit
                    211:   if {$::tcl_platform(platform)=="windows"} {
                    212:     set file [ lindex [string map {\\ \/} $file] 0 ]
                    213:   }
                    214:   lappend ::quota $file $size
                    215:   set limit 0
                    216: }
                    217: sqlite3_quota_set * 4096 quota_callback
                    218: do_test quota-3.3.1 { 
                    219:   execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db1a
                    220:   execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db1b
                    221:   execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db2a
                    222:   execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db2b
                    223:   set ::quota
                    224: } [list [file join [pwd] test.db] 5120]
                    225: 
                    226: do_test quota-3.2.X {
                    227:   foreach db {db1a db2a db2b db1b} { catch { $db close } }
                    228:   sqlite3_quota_set * 0 {}
                    229: } {SQLITE_OK}
                    230: 
                    231: #-------------------------------------------------------------------------
                    232: # Quotas are deleted when unused and when their limit is set to zero
                    233: #
                    234: 
                    235: # Return a list of all currently defined quotas.  Each quota is identified
                    236: # by its pattern.
                    237: proc quota_list {} {
                    238:   set allq {}
                    239:   foreach q [sqlite3_quota_dump] {
                    240:     lappend allq [lindex $q 0]
                    241:   }
                    242:   return [lsort $allq]
                    243: }
                    244: proc quota_size {name} {
                    245:   set allq {}
                    246:   foreach q [sqlite3_quota_dump] {
                    247:     if {[lindex $q 0]==$name} {return [lindex $q 2]}
                    248:   }
                    249:   return 0
                    250: }
                    251: 
                    252: do_test quota-4.1.1 {
                    253:   sqlite3_quota_set *test.db 0 {}
                    254:   quota_list
                    255: } {}
                    256: do_test quota-4.1.2 {
                    257:   sqlite3_quota_set *test.db 4096 {}
                    258:   quota_list
                    259: } {*test.db}
                    260: do_test quota-4.1.3 {
                    261:   sqlite3_quota_set *test2.db 0 {}
                    262:   quota_list
                    263: } {*test.db}
                    264: do_test quota-4.1.4 {
                    265:   sqlite3_quota_set *test2.db 100000 {}
                    266:   quota_list
                    267: } {*test.db *test2.db}
                    268: do_test quota-4.1.5 {
                    269:   sqlite3_quota_set *test.db 0 {}
                    270:   quota_list
                    271: } {*test2.db}
                    272: do_test quota-4.1.6 {
                    273:   forcedelete test2.db test2.db-journal test2.db-wal
                    274:   sqlite3 db test2.db
                    275:   db eval {CREATE TABLE t2(x); INSERT INTO t2 VALUES('tab-t2');}
                    276:   quota_list
                    277: } {*test2.db}
                    278: do_test quota-4.1.7 {
                    279:   catchsql {INSERT INTO t2 VALUES(zeroblob(200000))}
                    280: } {1 {database or disk is full}}
                    281: do_test quota-4.1.8 {
                    282:   sqlite3 db2 test2.db
                    283:   db2 eval {SELECT * FROM t2}
                    284: } {tab-t2}
                    285: do_test quota-4.1.9 {
                    286:   sqlite3_quota_set *test2.db 0 {}
                    287:   catchsql {INSERT INTO t2 VALUES(zeroblob(200000))}
                    288: } {0 {}}
                    289: do_test quota-4.1.10 {
                    290:   quota_list
                    291: } {*test2.db}
                    292: do_test quota-4.1.11 {
                    293:   db2 close
                    294:   quota_list
                    295: } {*test2.db}
                    296: do_test quota-4.1.12 {
                    297:   db close
                    298:   quota_list
                    299: } {}
                    300: 
                    301: do_test quota-4.2.1 {
                    302:   sqlite3_quota_set A 1000 {}
                    303:   sqlite3_quota_set B 1000 {}
                    304:   sqlite3_quota_set C 1000 {}
                    305:   sqlite3_quota_set D 1000 {}
                    306:   quota_list
                    307: } {A B C D}
                    308: do_test quota-4.2.2 {
                    309:   sqlite3_quota_set C 0 {}
                    310:   sqlite3_quota_set B 0 {}
                    311:   quota_list
                    312: } {A D}
                    313: do_test quota-4.2.3 {
                    314:   sqlite3_quota_set A 0 {}
                    315:   sqlite3_quota_set D 0 {}
                    316:   quota_list
                    317: } {}
                    318: do_test quota-4.2.4 {
                    319:   sqlite3_quota_set A 1000 {}
                    320:   sqlite3_quota_set B 1000 {}
                    321:   sqlite3_quota_set C 1000 {}
                    322:   sqlite3_quota_set A 0 {}
                    323:   sqlite3_quota_set B 0 {}
                    324:   sqlite3_quota_set C 0 {}
                    325:   quota_list
                    326: } {}
                    327: do_test quota-4.2.5 {
                    328:   sqlite3_quota_set A 1000 {}
                    329:   sqlite3_quota_set B 1000 {}
                    330:   sqlite3_quota_set C 1000 {}
                    331:   sqlite3_quota_set C 0 {}
                    332:   sqlite3_quota_set B 0 {}
                    333:   sqlite3_quota_set A 0 {}
                    334:   quota_list
                    335: } {}
                    336: 
                    337: do_test quota-4.3.1 {
                    338:   sqlite3_quota_set A 1000 quota_callback
                    339:   sqlite3 db A
                    340:   sqlite3_quota_set A 0 quota_callback
                    341:   db close
                    342:   quota_list
                    343: } {}
                    344: 
                    345: unset -nocomplain quotagroup
                    346: if {$tcl_platform(platform)=="windows"} {
                    347:   set quotagroup *\\quota-test-A?.db
                    348: } else {
                    349:   set quotagroup */quota-test-A?.db
                    350: } 
                    351: foreach file [glob -nocomplain quota-test-A*] {
                    352:   forcedelete $file
                    353: }
                    354: do_test quota-4.4.1 {
                    355:   set ::quota {}
                    356:   sqlite3_quota_set $::quotagroup 10000 quota_callback
                    357:   file delete -force ./quota-test-A1.db ./quota-test-A2.db
                    358:   sqlite3 db ./quota-test-A1.db
                    359:   db eval {
                    360:      CREATE TABLE t1(x);
                    361:      INSERT INTO t1 VALUES(randomblob(5000));
                    362:   }
                    363:   quota_list
                    364: } [list $quotagroup]
                    365: do_test quota-4.4.2 {
                    366:   expr {$::quota==""}
                    367: } {1}
                    368: do_test quota-4.4.3 {
                    369:   db close
                    370:   sqlite3 db ./quota-test-A2.db
                    371:   db eval {
                    372:      CREATE TABLE t1(x);
                    373:      INSERT INTO t1 VALUES(randomblob(5000));
                    374:   }
                    375:   quota_list
                    376: } [list $quotagroup]
                    377: do_test quota-4.4.4 {
                    378:   expr {$::quota!=""}
                    379: } {1}
                    380: do_test quota-4.4.5 {
                    381:   db close
                    382:   sqlite3_quota_set $::quotagroup 0 {}
                    383:   sqlite3_quota_dump
                    384: } {}
                    385: do_test quota-4.4.6 {
                    386:   sqlite3_quota_set $quotagroup 10000 quota_callback
                    387:   sqlite3 db quota-test-A1.db
                    388:   db eval {SELECT count(*) FROM sqlite_master}
                    389:   quota_size $quotagroup
                    390: } [file size quota-test-A1.db]
                    391: do_test quota-4.4.7 {
                    392:   sqlite3_quota_file quota-test-A2.db
                    393:   quota_size $::quotagroup
                    394: } [expr {[file size quota-test-A1.db]+[file size quota-test-A2.db]}]
                    395: 
                    396: unset -nocomplain quotagroup
                    397: if {$tcl_platform(platform)=="windows"} {
                    398:   set quotagroup *\\quota-test-B*
                    399: } else {
                    400:   set quotagroup */quota-test-B*
                    401: } 
                    402: foreach file [glob -nocomplain quota-test-B*] {
                    403:   forcedelete $file
                    404: }
                    405: do_test quota-4.5.1 {
                    406:   sqlite3_quota_set $::quotagroup 100000 quota_callback
                    407:   quota_size $::quotagroup
                    408: } {0}
                    409: do_test quota-4.5.2 {
                    410:   sqlite3_quota_file quota-test-B1.txt
                    411:   quota_size $::quotagroup
                    412: } {0}
                    413: proc add_to_file {name n} {
                    414:   set out [open $name a]
                    415:   fconfigure $out -translation binary
                    416:   puts -nonewline $out [string repeat x $n]
                    417:   close $out
                    418: }
                    419: do_test quota-4.5.3 {
                    420:   add_to_file quota-test-B1.txt 123
                    421:   sqlite3_quota_file quota-test-B1.txt
                    422:   quota_size $::quotagroup
                    423: } {123}
                    424: do_test quota-4.5.4 {
                    425:   add_to_file quota-test-B2.txt 234
                    426:   sqlite3_quota_file quota-test-B2.txt
                    427:   quota_size $::quotagroup
                    428: } {357}
                    429: do_test quota-4.5.5 {
                    430:   add_to_file quota-test-B1.txt 2000
                    431:   sqlite3_quota_file quota-test-B1.txt
                    432:   quota_size $::quotagroup
                    433: } {2357}
                    434: do_test quota-4.5.6 {
                    435:   forcedelete quota-test-B1.txt
                    436:   sqlite3_quota_file quota-test-B1.txt
                    437:   quota_size $::quotagroup
                    438: } {234}
                    439: do_test quota-4.5.7 {
                    440:   forcedelete quota-test-B2.txt
                    441:   sqlite3_quota_file quota-test-B2.txt
                    442:   quota_size $::quotagroup
                    443: } {0}
                    444: do_test quota-4.5.8 {
                    445:   add_to_file quota-test-B3.txt 1234
                    446:   sqlite3_quota_file quota-test-B3.txt
                    447:   quota_size $::quotagroup
                    448: } {1234}
                    449: do_test quota-4.5.9 {
                    450:   sqlite3_quota_set $quotagroup 0 {}
                    451:   quota_size $::quotagroup
                    452: } {0}
                    453: 
                    454: do_test quota-4.9.1 {
                    455:   db close
                    456:   sqlite3_quota_set A 1000 quota_callback
                    457:   sqlite3_quota_shutdown
                    458: } {SQLITE_OK}
                    459: do_test quota-4.9.2 {
                    460:   quota_list
                    461: } {}
                    462: 
                    463: #-------------------------------------------------------------------------
                    464: # The following tests test that the quota VFS handles malloc and IO 
                    465: # errors.
                    466: #
                    467: 
                    468: sqlite3_quota_initialize "" 1
                    469: sqlite3_quota_set *test.db 4096 {}
                    470: 
                    471: do_faultsim_test quota-5.1 -prep {
                    472:   catch {db close}
                    473: } -body {
                    474:   sqlite3 db test2.db
                    475: }
                    476: do_faultsim_test quota-5.2 -prep {
                    477:   catch {db close}
                    478: } -body {
                    479:   sqlite3 db test.db
                    480: }
                    481: 
                    482: catch { db close }
                    483: forcedelete test.db
                    484: 
                    485: do_test quota-5.3.prep {
                    486:   sqlite3 db test.db
                    487:   execsql {
                    488:     PRAGMA auto_vacuum = 1;
                    489:     PRAGMA page_size = 1024;
                    490:     CREATE TABLE t1(a, b);
                    491:     INSERT INTO t1 VALUES(10, zeroblob(1200));
                    492:   }
                    493:   faultsim_save_and_close
                    494: } {}
                    495: do_faultsim_test quota-5.3 -prep {
                    496:   faultsim_restore_and_reopen
                    497: } -body {
                    498:   execsql { DELETE FROM t1 }
                    499: }
                    500: 
                    501: do_test quota-5.4.1 {
                    502:   catch { db close }
                    503:   forcedelete test.db
                    504:   file mkdir test.db
                    505:   list [catch { sqlite3 db test.db } msg] $msg
                    506: } {1 {unable to open database file}}
                    507: 
                    508: do_faultsim_test quota-5.5 -prep {
                    509:   catch { sqlite3_quota_shutdown }
                    510: } -body {
                    511:   sqlite3_quota_initialize "" 1
                    512: }
                    513: 
                    514: do_faultsim_test quota-5.6 -prep {
                    515:   catch { sqlite3_quota_shutdown }
                    516:   sqlite3_quota_initialize "" 1
                    517: } -body {
                    518:   sqlite3_quota_set * 4096 {}
                    519: }
                    520: 
                    521: catch { sqlite3_quota_shutdown }
                    522: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>