summaryrefslogtreecommitdiff
path: root/sqlite.zig
diff options
context:
space:
mode:
authorGravatar Vincent Rischmann2021-01-23 04:11:20 +0100
committerGravatar Vincent Rischmann2021-01-24 01:23:09 +0100
commitc11112972fcea3a6ac39fdfa2acb94df211b2f30 (patch)
tree9a9c96d2e09344dcf3ba38d890b63f16fa134abc /sqlite.zig
parentci: disable the bundled test on Debian (diff)
downloadzig-sqlite-c11112972fcea3a6ac39fdfa2acb94df211b2f30.tar.gz
zig-sqlite-c11112972fcea3a6ac39fdfa2acb94df211b2f30.tar.xz
zig-sqlite-c11112972fcea3a6ac39fdfa2acb94df211b2f30.zip
rework of the test database initialization
The hardcoded path we used is invalid on Windows, instead use a temp directory from std.testing.tmpDir. Need to do some refactoring too because now we compute the database file path and therefore need an allocator while the Mode is in use in Db.init.
Diffstat (limited to 'sqlite.zig')
-rw-r--r--sqlite.zig93
1 files changed, 48 insertions, 45 deletions
diff --git a/sqlite.zig b/sqlite.zig
index 2600ee2..9ded620 100644
--- a/sqlite.zig
+++ b/sqlite.zig
@@ -973,17 +973,14 @@ fn addTestData(db: *Db) !void {
973} 973}
974 974
975test "sqlite: db init" { 975test "sqlite: db init" {
976 var db: Db = undefined; 976 var db = try getTestDb();
977 try db.init(initOptions());
978 try db.init(.{});
979} 977}
980 978
981test "sqlite: db pragma" { 979test "sqlite: db pragma" {
982 var arena = std.heap.ArenaAllocator.init(testing.allocator); 980 var arena = std.heap.ArenaAllocator.init(testing.allocator);
983 defer arena.deinit(); 981 defer arena.deinit();
984 982
985 var db: Db = undefined; 983 var db = try getTestDb();
986 try db.init(initOptions());
987 984
988 const foreign_keys = try db.pragma(usize, .{}, "foreign_keys", .{}); 985 const foreign_keys = try db.pragma(usize, .{}, "foreign_keys", .{});
989 testing.expect(foreign_keys != null); 986 testing.expect(foreign_keys != null);
@@ -1019,8 +1016,7 @@ test "sqlite: db pragma" {
1019} 1016}
1020 1017
1021test "sqlite: statement exec" { 1018test "sqlite: statement exec" {
1022 var db: Db = undefined; 1019 var db = try getTestDb();
1023 try db.init(initOptions());
1024 try addTestData(&db); 1020 try addTestData(&db);
1025 1021
1026 // Test with a Blob struct 1022 // Test with a Blob struct
@@ -1046,8 +1042,7 @@ test "sqlite: read a single user into a struct" {
1046 var arena = std.heap.ArenaAllocator.init(testing.allocator); 1042 var arena = std.heap.ArenaAllocator.init(testing.allocator);
1047 defer arena.deinit(); 1043 defer arena.deinit();
1048 1044
1049 var db: Db = undefined; 1045 var db = try getTestDb();
1050 try db.init(initOptions());
1051 try addTestData(&db); 1046 try addTestData(&db);
1052 1047
1053 var stmt = try db.prepare("SELECT name, id, age, weight FROM user WHERE id = ?{usize}"); 1048 var stmt = try db.prepare("SELECT name, id, age, weight FROM user WHERE id = ?{usize}");
@@ -1108,8 +1103,7 @@ test "sqlite: read all users into a struct" {
1108 var arena = std.heap.ArenaAllocator.init(testing.allocator); 1103 var arena = std.heap.ArenaAllocator.init(testing.allocator);
1109 defer arena.deinit(); 1104 defer arena.deinit();
1110 1105
1111 var db: Db = undefined; 1106 var db = try getTestDb();
1112 try db.init(initOptions());
1113 try addTestData(&db); 1107 try addTestData(&db);
1114 1108
1115 var stmt = try db.prepare("SELECT name, id, age, weight FROM user"); 1109 var stmt = try db.prepare("SELECT name, id, age, weight FROM user");
@@ -1130,8 +1124,7 @@ test "sqlite: read in an anonymous struct" {
1130 var arena = std.heap.ArenaAllocator.init(testing.allocator); 1124 var arena = std.heap.ArenaAllocator.init(testing.allocator);
1131 defer arena.deinit(); 1125 defer arena.deinit();
1132 1126
1133 var db: Db = undefined; 1127 var db = try getTestDb();
1134 try db.init(initOptions());
1135 try addTestData(&db); 1128 try addTestData(&db);
1136 1129
1137 var stmt = try db.prepare("SELECT name, id, name, age, id, weight FROM user WHERE id = ?{usize}"); 1130 var stmt = try db.prepare("SELECT name, id, name, age, id, weight FROM user WHERE id = ?{usize}");
@@ -1165,8 +1158,7 @@ test "sqlite: read in a Text struct" {
1165 var arena = std.heap.ArenaAllocator.init(testing.allocator); 1158 var arena = std.heap.ArenaAllocator.init(testing.allocator);
1166 defer arena.deinit(); 1159 defer arena.deinit();
1167 1160
1168 var db: Db = undefined; 1161 var db = try getTestDb();
1169 try db.init(initOptions());
1170 try addTestData(&db); 1162 try addTestData(&db);
1171 1163
1172 var stmt = try db.prepare("SELECT name, id, age FROM user WHERE id = ?{usize}"); 1164 var stmt = try db.prepare("SELECT name, id, age FROM user WHERE id = ?{usize}");
@@ -1194,8 +1186,7 @@ test "sqlite: read a single text value" {
1194 var arena = std.heap.ArenaAllocator.init(testing.allocator); 1186 var arena = std.heap.ArenaAllocator.init(testing.allocator);
1195 defer arena.deinit(); 1187 defer arena.deinit();
1196 1188
1197 var db: Db = undefined; 1189 var db = try getTestDb();
1198 try db.init(initOptions());
1199 try addTestData(&db); 1190 try addTestData(&db);
1200 1191
1201 const types = &[_]type{ 1192 const types = &[_]type{
@@ -1245,8 +1236,7 @@ test "sqlite: read a single text value" {
1245} 1236}
1246 1237
1247test "sqlite: read a single integer value" { 1238test "sqlite: read a single integer value" {
1248 var db: Db = undefined; 1239 var db = try getTestDb();
1249 try db.init(initOptions());
1250 try addTestData(&db); 1240 try addTestData(&db);
1251 1241
1252 const types = &[_]type{ 1242 const types = &[_]type{
@@ -1279,8 +1269,7 @@ test "sqlite: read a single integer value" {
1279} 1269}
1280 1270
1281test "sqlite: read a single value into void" { 1271test "sqlite: read a single value into void" {
1282 var db: Db = undefined; 1272 var db = try getTestDb();
1283 try db.init(initOptions());
1284 try addTestData(&db); 1273 try addTestData(&db);
1285 1274
1286 const query = "SELECT age FROM user WHERE id = ?{usize}"; 1275 const query = "SELECT age FROM user WHERE id = ?{usize}";
@@ -1294,8 +1283,7 @@ test "sqlite: read a single value into void" {
1294} 1283}
1295 1284
1296test "sqlite: read a single value into bool" { 1285test "sqlite: read a single value into bool" {
1297 var db: Db = undefined; 1286 var db = try getTestDb();
1298 try db.init(initOptions());
1299 try addTestData(&db); 1287 try addTestData(&db);
1300 1288
1301 const query = "SELECT id FROM user WHERE id = ?{usize}"; 1289 const query = "SELECT id FROM user WHERE id = ?{usize}";
@@ -1311,8 +1299,7 @@ test "sqlite: read a single value into bool" {
1311} 1299}
1312 1300
1313test "sqlite: insert bool and bind bool" { 1301test "sqlite: insert bool and bind bool" {
1314 var db: Db = undefined; 1302 var db = try getTestDb();
1315 try db.init(initOptions());
1316 try addTestData(&db); 1303 try addTestData(&db);
1317 1304
1318 try db.exec("INSERT INTO article(id, author_id, is_published) VALUES(?{usize}, ?{usize}, ?{bool})", .{ 1305 try db.exec("INSERT INTO article(id, author_id, is_published) VALUES(?{usize}, ?{usize}, ?{bool})", .{
@@ -1334,8 +1321,7 @@ test "sqlite: insert bool and bind bool" {
1334} 1321}
1335 1322
1336test "sqlite: bind string literal" { 1323test "sqlite: bind string literal" {
1337 var db: Db = undefined; 1324 var db = try getTestDb();
1338 try db.init(initOptions());
1339 try addTestData(&db); 1325 try addTestData(&db);
1340 1326
1341 try db.exec("INSERT INTO article(id, data) VALUES(?, ?)", .{ 1327 try db.exec("INSERT INTO article(id, data) VALUES(?, ?)", .{
@@ -1357,8 +1343,7 @@ test "sqlite: bind pointer" {
1357 var arena = std.heap.ArenaAllocator.init(testing.allocator); 1343 var arena = std.heap.ArenaAllocator.init(testing.allocator);
1358 defer arena.deinit(); 1344 defer arena.deinit();
1359 1345
1360 var db: Db = undefined; 1346 var db = try getTestDb();
1361 try db.init(initOptions());
1362 try addTestData(&db); 1347 try addTestData(&db);
1363 1348
1364 const query = "SELECT name FROM user WHERE id = ?"; 1349 const query = "SELECT name FROM user WHERE id = ?";
@@ -1379,8 +1364,7 @@ test "sqlite: read pointers" {
1379 var arena = std.heap.ArenaAllocator.init(testing.allocator); 1364 var arena = std.heap.ArenaAllocator.init(testing.allocator);
1380 defer arena.deinit(); 1365 defer arena.deinit();
1381 1366
1382 var db: Db = undefined; 1367 var db = try getTestDb();
1383 try db.init(initOptions());
1384 try addTestData(&db); 1368 try addTestData(&db);
1385 1369
1386 const query = "SELECT id, name, age, weight FROM user"; 1370 const query = "SELECT id, name, age, weight FROM user";
@@ -1414,8 +1398,7 @@ test "sqlite: optional" {
1414 var arena = std.heap.ArenaAllocator.init(testing.allocator); 1398 var arena = std.heap.ArenaAllocator.init(testing.allocator);
1415 defer arena.deinit(); 1399 defer arena.deinit();
1416 1400
1417 var db: Db = undefined; 1401 var db = try getTestDb();
1418 try db.init(initOptions());
1419 try addTestData(&db); 1402 try addTestData(&db);
1420 1403
1421 try db.exec("INSERT INTO article(author_id, data, is_published) VALUES(?, ?, ?)", .{ 1, null, true }); 1404 try db.exec("INSERT INTO article(author_id, data, is_published) VALUES(?, ?, ?)", .{ 1, null, true });
@@ -1438,8 +1421,7 @@ test "sqlite: optional" {
1438} 1421}
1439 1422
1440test "sqlite: statement reset" { 1423test "sqlite: statement reset" {
1441 var db: Db = undefined; 1424 var db = try getTestDb();
1442 try db.init(initOptions());
1443 try addTestData(&db); 1425 try addTestData(&db);
1444 1426
1445 // Add data 1427 // Add data
@@ -1467,8 +1449,7 @@ test "sqlite: statement iterator" {
1467 defer arena.deinit(); 1449 defer arena.deinit();
1468 var allocator = &arena.allocator; 1450 var allocator = &arena.allocator;
1469 1451
1470 var db: Db = undefined; 1452 var db = try getTestDb();
1471 try db.init(initOptions());
1472 try addTestData(&db); 1453 try addTestData(&db);
1473 1454
1474 // Cleanup first 1455 // Cleanup first
@@ -1560,8 +1541,7 @@ test "sqlite: failing open" {
1560} 1541}
1561 1542
1562test "sqlite: failing prepare statement" { 1543test "sqlite: failing prepare statement" {
1563 var db: Db = undefined; 1544 var db = try getTestDb();
1564 try db.init(initOptions());
1565 1545
1566 const result = db.prepare("SELECT id FROM foobar"); 1546 const result = db.prepare("SELECT id FROM foobar");
1567 testing.expectError(error.SQLiteError, result); 1547 testing.expectError(error.SQLiteError, result);
@@ -1571,21 +1551,44 @@ test "sqlite: failing prepare statement" {
1571 testing.expectEqualStrings("no such table: foobar", detailed_err.message); 1551 testing.expectEqualStrings("no such table: foobar", detailed_err.message);
1572} 1552}
1573 1553
1574fn initOptions() InitOptions { 1554fn getTestDb() !Db {
1575 return .{ 1555 var buf: [1024]u8 = undefined;
1556 var fba = std.heap.FixedBufferAllocator.init(&buf);
1557
1558 var mode = dbMode(&fba.allocator);
1559
1560 var db: Db = undefined;
1561 try db.init(.{
1576 .open_flags = .{ 1562 .open_flags = .{
1577 .write = true, 1563 .write = true,
1578 .create = true, 1564 .create = true,
1579 }, 1565 },
1580 .mode = dbMode(), 1566 .mode = mode,
1581 }; 1567 });
1568
1569 return db;
1570}
1571
1572fn tmpDbPath(allocator: *mem.Allocator) ![:0]const u8 {
1573 const tmp_dir = testing.tmpDir(.{});
1574
1575 const path = try std.fs.path.join(allocator, &[_][]const u8{
1576 "zig-cache",
1577 "tmp",
1578 &tmp_dir.sub_path,
1579 "zig-sqlite.db",
1580 });
1581 defer allocator.free(path);
1582
1583 return allocator.dupeZ(u8, path);
1582} 1584}
1583 1585
1584fn dbMode() Db.Mode { 1586fn dbMode(allocator: *mem.Allocator) Db.Mode {
1585 return if (build_options.in_memory) blk: { 1587 return if (build_options.in_memory) blk: {
1586 break :blk .{ .Memory = {} }; 1588 break :blk .{ .Memory = {} };
1587 } else blk: { 1589 } else blk: {
1588 const path = "/tmp/zig-sqlite.db"; 1590 const path = tmpDbPath(allocator) catch unreachable;
1591
1589 std.fs.cwd().deleteFile(path) catch {}; 1592 std.fs.cwd().deleteFile(path) catch {};
1590 break :blk .{ .File = path }; 1593 break :blk .{ .File = path };
1591 }; 1594 };