xref: /sqlite-3.40.0/test/fuzz_malloc.test (revision 7751940d)
1#
2# 2007 May 10
3#
4# The author disclaims copyright to this source code.  In place of
5# a legal notice, here is a blessing:
6#
7#    May you do good and not evil.
8#    May you find forgiveness for yourself and forgive others.
9#    May you share freely, never taking more than you give.
10#
11#***********************************************************************
12#
13# This file tests malloc failures in concert with fuzzy SQL generation.
14#
15# $Id: fuzz_malloc.test,v 1.8 2007/08/30 11:48:32 danielk1977 Exp $
16
17set testdir [file dirname $argv0]
18source $testdir/tester.tcl
19
20source $testdir/malloc_common.tcl
21source $testdir/fuzz_common.tcl
22
23if {[info exists ISQUICK]} {
24  set ::REPEATS 20
25} elseif {[info exists SOAKTEST]} {
26  set ::REPEATS 100
27} else {
28  set ::REPEATS 40
29}
30
31#
32# Usage: do_fuzzy_malloc_test <testname> ?<options>?
33#
34#     -template
35#     -sqlprep
36#     -repeats
37#
38proc do_fuzzy_malloc_test {testname args} {
39  set ::fuzzyopts(-repeats) $::REPEATS
40  set ::fuzzyopts(-sqlprep) {}
41  array set ::fuzzyopts $args
42
43  sqlite3_memdebug_fail -1
44  db close
45  file delete test.db test.db-journal
46  sqlite3 db test.db
47  set ::prep $::fuzzyopts(-sqlprep)
48  execsql $::prep
49  set jj 0
50  for {set ii 0} {$ii < $::fuzzyopts(-repeats)} {incr ii} {
51    expr srand($jj)
52    incr jj
53    set ::sql [subst $::fuzzyopts(-template)]
54    foreach {rc res} [catchsql "$::sql"] {}
55    if {$rc==0} {
56      do_malloc_test $testname-$ii -sqlbody $::sql -sqlprep $::prep
57    } else {
58      incr ii -1
59    }
60  }
61}
62
63#----------------------------------------------------------------
64# Test malloc failure during parsing (and execution) of a fuzzily
65# generated expressions.
66#
67do_fuzzy_malloc_test fuzzy_malloc-1 -template {Select [Expr]}
68do_fuzzy_malloc_test fuzzy_malloc-2 -template {[Select]}
69
70set ::SQLPREP {
71  BEGIN;
72    CREATE TABLE abc(a, b, c);
73    CREATE TABLE def(a, b, c);
74    CREATE TABLE ghi(a, b, c);
75    INSERT INTO abc VALUES(1.5, 3, 'a short string');
76    INSERT INTO def VALUES(NULL, X'ABCDEF',
77        'a longer string. Long enough that it doesn''t fit in Mem.zShort');
78    INSERT INTO ghi VALUES(zeroblob(1000), 'hello world', -1257900987654321);
79  COMMIT;
80}
81set ::TableList  [list abc def ghi]
82set ::ColumnList [list a b c]
83
84do_fuzzy_malloc_test fuzzy_malloc-3 \
85  -template {[Select]}              \
86  -sqlprep $::SQLPREP
87
88finish_test
89