test(sstable): add build, lookup, and cursor tests
This commit is contained in:
1 parent
9616e1c3c6
commit
c94bc91946
1 file changed
+115
+115
@@ -533,3 +533,118 @@ fn decodeRecord(block: []const u8, pos: usize) Decoded {
|
||||
.next = valStart + valLen,
|
||||
};
|
||||
}
|
||||
|
||||
fn buildFixture(allocator: Allocator, dir: std.fs.Dir, name: []const u8, count: usize) !void {
|
||||
var builder = try Builder.init(allocator, dir, name, count);
|
||||
defer builder.deinit();
|
||||
var buf: [16]u8 = undefined;
|
||||
var i: usize = 0;
|
||||
while (i < count) : (i += 1) {
|
||||
const key = try std.fmt.bufPrint(&buf, "k{d:0>6}", .{i});
|
||||
try builder.add(.{ .key = key, .value = "payload-value", .seq = i + 1, .kind = .value });
|
||||
}
|
||||
try builder.finish();
|
||||
}
|
||||
|
||||
test "sstable build find" {
|
||||
const allocator = std.testing.allocator;
|
||||
var tmp = std.testing.tmpDir(.{});
|
||||
defer tmp.cleanup();
|
||||
|
||||
try buildFixture(allocator, tmp.dir, "test.sst", 500);
|
||||
var reader = try Reader.open(allocator, tmp.dir, "test.sst", 1);
|
||||
defer reader.deinit();
|
||||
|
||||
try std.testing.expectEqual(@as(u64, 500), reader.numEntries);
|
||||
try std.testing.expect(reader.index.len > 1);
|
||||
|
||||
try std.testing.expectEqualStrings("payload-value", reader.find("k000000").?.value);
|
||||
try std.testing.expectEqualStrings("payload-value", reader.find("k000499").?.value);
|
||||
try std.testing.expectEqualStrings("payload-value", reader.find("k000250").?.value);
|
||||
try std.testing.expectEqual(@as(?Record, null), reader.find("k000500"));
|
||||
try std.testing.expectEqual(@as(?Record, null), reader.find("zzz"));
|
||||
try std.testing.expectEqual(@as(?Record, null), reader.find("aaa"));
|
||||
}
|
||||
|
||||
test "sstable cursor ordered scan" {
|
||||
const allocator = std.testing.allocator;
|
||||
var tmp = std.testing.tmpDir(.{});
|
||||
defer tmp.cleanup();
|
||||
|
||||
try buildFixture(allocator, tmp.dir, "test.sst", 500);
|
||||
var reader = try Reader.open(allocator, tmp.dir, "test.sst", 1);
|
||||
defer reader.deinit();
|
||||
|
||||
var cur = reader.cursor(null);
|
||||
var expected: usize = 0;
|
||||
var buf: [16]u8 = undefined;
|
||||
while (cur.valid()) : (cur.advance()) {
|
||||
const key = try std.fmt.bufPrint(&buf, "k{d:0>6}", .{expected});
|
||||
try std.testing.expectEqualStrings(key, cur.record().key);
|
||||
expected += 1;
|
||||
}
|
||||
try std.testing.expectEqual(@as(usize, 500), expected);
|
||||
}
|
||||
|
||||
test "sstable cursor seek" {
|
||||
const allocator = std.testing.allocator;
|
||||
var tmp = std.testing.tmpDir(.{});
|
||||
defer tmp.cleanup();
|
||||
|
||||
try buildFixture(allocator, tmp.dir, "test.sst", 500);
|
||||
var reader = try Reader.open(allocator, tmp.dir, "test.sst", 1);
|
||||
defer reader.deinit();
|
||||
|
||||
var cur = reader.cursor("k000123");
|
||||
try std.testing.expectEqualStrings("k000123", cur.record().key);
|
||||
cur.advance();
|
||||
try std.testing.expectEqualStrings("k000124", cur.record().key);
|
||||
|
||||
var beyond = reader.cursor("k000600");
|
||||
try std.testing.expect(!beyond.valid());
|
||||
}
|
||||
|
||||
test "sstable reverse cursor descends fully" {
|
||||
const allocator = std.testing.allocator;
|
||||
var tmp = std.testing.tmpDir(.{});
|
||||
defer tmp.cleanup();
|
||||
|
||||
try buildFixture(allocator, tmp.dir, "test.sst", 500);
|
||||
var reader = try Reader.open(allocator, tmp.dir, "test.sst", 1);
|
||||
defer reader.deinit();
|
||||
|
||||
var cur = try reader.reverseCursor(allocator, null, false);
|
||||
defer cur.deinit();
|
||||
var expected: usize = 500;
|
||||
var buf: [16]u8 = undefined;
|
||||
while (cur.valid()) : (cur.advance()) {
|
||||
expected -= 1;
|
||||
const key = try std.fmt.bufPrint(&buf, "k{d:0>6}", .{expected});
|
||||
try std.testing.expectEqualStrings(key, cur.record().key);
|
||||
}
|
||||
try std.testing.expectEqual(@as(usize, 0), expected);
|
||||
}
|
||||
|
||||
test "sstable reverse cursor honors upper bound" {
|
||||
const allocator = std.testing.allocator;
|
||||
var tmp = std.testing.tmpDir(.{});
|
||||
defer tmp.cleanup();
|
||||
|
||||
try buildFixture(allocator, tmp.dir, "test.sst", 500);
|
||||
var reader = try Reader.open(allocator, tmp.dir, "test.sst", 1);
|
||||
defer reader.deinit();
|
||||
|
||||
var cur = try reader.reverseCursor(allocator, "k000100", false);
|
||||
defer cur.deinit();
|
||||
try std.testing.expectEqualStrings("k000099", cur.record().key);
|
||||
cur.advance();
|
||||
try std.testing.expectEqualStrings("k000098", cur.record().key);
|
||||
|
||||
var inclusive = try reader.reverseCursor(allocator, "k000100", true);
|
||||
defer inclusive.deinit();
|
||||
try std.testing.expectEqualStrings("k000100", inclusive.record().key);
|
||||
|
||||
var below = try reader.reverseCursor(allocator, "k000000", false);
|
||||
defer below.deinit();
|
||||
try std.testing.expect(!below.valid());
|
||||
}
|
||||
Reference in new issue
Block a user