Annotation of embedaddon/sqlite3/test/quota.test, revision 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>