modernc.org/cc@v1.0.1/v2/testdata/_sqlite/ext/session/sessionfault2.test (about) 1 # 2016 March 31 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 # The focus of this file is testing the session module. 13 # 14 15 if {![info exists testdir]} { 16 set testdir [file join [file dirname [info script]] .. .. test] 17 } 18 source [file join [file dirname [info script]] session_common.tcl] 19 source $testdir/tester.tcl 20 ifcapable !session {finish_test; return} 21 set testprefix sessionfault2 22 23 do_execsql_test 1.0.0 { 24 CREATE TABLE t1(a PRIMARY KEY, b UNIQUE); 25 INSERT INTO t1 VALUES(1, 1); 26 INSERT INTO t1 VALUES(2, 2); 27 INSERT INTO t1 VALUES(3, 3); 28 29 CREATE TABLE t2(a PRIMARY KEY, b UNIQUE); 30 INSERT INTO t2 VALUES(1, 1); 31 INSERT INTO t2 VALUES(2, 2); 32 INSERT INTO t2 VALUES(3, 3); 33 } 34 faultsim_save_and_close 35 36 faultsim_restore_and_reopen 37 do_test 1.0.1 { 38 set ::C [changeset_from_sql { 39 UPDATE t1 SET b=4 WHERE a=3; 40 UPDATE t1 SET b=3 WHERE a=2; 41 UPDATE t1 SET b=2 WHERE a=1; 42 UPDATE t2 SET b=0 WHERE a=1; 43 UPDATE t2 SET b=1 WHERE a=2; 44 UPDATE t2 SET b=2 WHERE a=3; 45 }] 46 set {} {} 47 } {} 48 49 proc xConflict args { return "OMIT" } 50 51 do_faultsim_test 1 -faults oom-p* -prep { 52 faultsim_restore_and_reopen 53 } -body { 54 sqlite3changeset_apply db $::C xConflict 55 } -test { 56 faultsim_test_result {0 {}} {1 SQLITE_NOMEM} 57 faultsim_integrity_check 58 59 catch { db eval ROLLBACK } 60 set res [db eval { 61 SELECT * FROM t1; 62 SELECT * FROM t2; 63 }] 64 65 if {$testrc==0} { 66 if {$res != "1 2 2 3 3 4 1 0 2 1 3 2"} { error "data error" } 67 } else { 68 if { 69 $res != "1 2 2 3 3 4 1 0 2 1 3 2" 70 && $res != "1 1 2 2 3 3 1 1 2 2 3 3" 71 } { error "data error!! $res" } 72 } 73 } 74 75 #------------------------------------------------------------------------- 76 # OOM when applying a changeset for which one of the tables has a name 77 # 99 bytes in size. This happens to cause an extra malloc in within the 78 # sessions_strm permutation. 79 # 80 reset_db 81 set nm [string repeat t 99] 82 do_execsql_test 2.0.0 [string map "%TBL% $nm" { 83 CREATE TABLE %TBL%(a PRIMARY KEY, b UNIQUE); 84 }] 85 faultsim_save_and_close 86 87 faultsim_restore_and_reopen 88 do_test 1.0.1 { 89 set ::C [changeset_from_sql [string map "%TBL% $nm" { 90 INSERT INTO %TBL% VALUES(1, 2); 91 INSERT INTO %TBL% VALUES(3, 4); 92 }]] 93 set {} {} 94 } {} 95 96 proc xConflict args { return "OMIT" } 97 do_faultsim_test 2 -faults oom-p* -prep { 98 faultsim_restore_and_reopen 99 } -body { 100 sqlite3changeset_apply db $::C xConflict 101 } -test { 102 faultsim_test_result {0 {}} {1 SQLITE_NOMEM} 103 faultsim_integrity_check 104 } 105 106 finish_test 107