diff options
| author | 2024-12-08 12:28:13 +0100 | |
|---|---|---|
| committer | 2024-12-08 12:28:13 +0100 | |
| commit | 2a2d19c356cf8f4530b9a8368e8696255c722e70 (patch) | |
| tree | 6bf02399af8f1d976e4e7ebc0b3eb8b5d0e7b00e | |
| parent | build: remove adhoc fuzzing (diff) | |
| download | zig-sqlite-2a2d19c356cf8f4530b9a8368e8696255c722e70.tar.gz zig-sqlite-2a2d19c356cf8f4530b9a8368e8696255c722e70.tar.xz zig-sqlite-2a2d19c356cf8f4530b9a8368e8696255c722e70.zip | |
add a fuzz test
| -rw-r--r-- | sqlite.zig | 67 |
1 files changed, 67 insertions, 0 deletions
| @@ -4068,3 +4068,70 @@ test "reuse same field twice in query string" { | |||
| 4068 | defer testing.allocator.free(name.?); | 4068 | defer testing.allocator.free(name.?); |
| 4069 | try testing.expectEqualStrings(name.?, update_name); | 4069 | try testing.expectEqualStrings(name.?, update_name); |
| 4070 | } | 4070 | } |
| 4071 | |||
| 4072 | test "fuzzing" { | ||
| 4073 | const global = struct { | ||
| 4074 | fn testOne(input: []const u8) anyerror!void { | ||
| 4075 | var db = try Db.init(.{ | ||
| 4076 | .mode = .Memory, | ||
| 4077 | .open_flags = .{ | ||
| 4078 | .write = true, | ||
| 4079 | .create = true, | ||
| 4080 | }, | ||
| 4081 | }); | ||
| 4082 | defer db.deinit(); | ||
| 4083 | |||
| 4084 | try db.exec("CREATE TABLE test(id integer primary key, name text, data blob)", .{}, .{}); | ||
| 4085 | |||
| 4086 | db.execDynamic(input, .{}, .{}) catch |err| switch (err) { | ||
| 4087 | error.SQLiteError => return, | ||
| 4088 | error.ExecReturnedData => return, | ||
| 4089 | error.EmptyQuery => return, | ||
| 4090 | else => return err, | ||
| 4091 | }; | ||
| 4092 | |||
| 4093 | db.execDynamic( | ||
| 4094 | "INSERT INTO test(name, data) VALUES($name, $data)", | ||
| 4095 | .{}, | ||
| 4096 | .{ | ||
| 4097 | .name = "foo", | ||
| 4098 | .data = input, | ||
| 4099 | }, | ||
| 4100 | ) catch |err| switch (err) { | ||
| 4101 | error.SQLiteError => return, | ||
| 4102 | else => return err, | ||
| 4103 | }; | ||
| 4104 | |||
| 4105 | var stmt = db.prepareDynamic("SELECT name, data FROM test") catch |err| switch (err) { | ||
| 4106 | error.SQLiteError => return, | ||
| 4107 | else => return err, | ||
| 4108 | }; | ||
| 4109 | defer stmt.deinit(); | ||
| 4110 | |||
| 4111 | var rows_memory: [4096]u8 = undefined; | ||
| 4112 | var rows_fba = std.heap.FixedBufferAllocator.init(&rows_memory); | ||
| 4113 | |||
| 4114 | const row_opt = stmt.oneAlloc( | ||
| 4115 | struct { | ||
| 4116 | name: Text, | ||
| 4117 | data: Blob, | ||
| 4118 | }, | ||
| 4119 | rows_fba.allocator(), | ||
| 4120 | .{}, | ||
| 4121 | .{}, | ||
| 4122 | ) catch |err| switch (err) { | ||
| 4123 | error.SQLiteError => return, | ||
| 4124 | else => return err, | ||
| 4125 | }; | ||
| 4126 | |||
| 4127 | if (row_opt) |row| { | ||
| 4128 | if (!std.mem.eql(u8, row.name.data, "foo")) return error.InvalidNameField; | ||
| 4129 | if (!std.mem.eql(u8, row.data.data, input)) return error.InvalidDataField; | ||
| 4130 | } else { | ||
| 4131 | return error.NoRowsFound; | ||
| 4132 | } | ||
| 4133 | } | ||
| 4134 | }; | ||
| 4135 | |||
| 4136 | try testing.fuzz(global.testOne, .{}); | ||
| 4137 | } | ||