1
0
Fork 0
forked from dlang/cdcdb
cdcdb/test/unittest.d

72 lines
2.1 KiB
D

import cdcdb;
import std.file : read, write, remove, exists;
import std.path : buildPath;
import std.digest.sha : digest, SHA256;
import std.exception : assertThrown, assertNotThrown;
import std.datetime : DateTime;
import core.thread : Thread;
import core.time : msecs, seconds;
unittest
{
const string dbPath = "./bin/test_cdcdb.db";
if (exists(dbPath)) {
remove(dbPath);
}
// Тест конструктора Storage
auto storage = new Storage(dbPath, true, 22);
// Тест настройки CDC
storage.setupCDC(128, 256, 512, 0xFF, 0x0F);
// Тест создания снимка
ubyte[] data1 = cast(ubyte[]) "Hello, World!".dup;
auto snap1 = storage.newSnapshot("test_label", data1, "First snapshot");
assert(snap1 !is null);
assert(snap1.label == "test_label");
assert(snap1.length == data1.length);
assert(snap1.sha256 == digest!SHA256(data1));
assert(snap1.status == "ready");
assert(snap1.description == "First snapshot");
// Тест дубликата (не должен создать новый)
auto snapDup = storage.newSnapshot("test_label", data1);
assert(snapDup is null);
// Тест изменения данных
ubyte[] data2 = cast(ubyte[]) "Hello, Changed World!".dup;
auto snap2 = storage.newSnapshot("test_label", data2);
assert(snap2 !is null);
assert(snap2.sha256 == digest!SHA256(data2));
// Тест восстановления данных
auto restored = snap1.data();
assert(restored == data1);
bool streamedOk = false;
snap2.data((const(ubyte)[] chunk) {
assert(chunk == data2); // Поскольку маленький файл — один фрагмент
streamedOk = true;
});
assert(streamedOk);
// Тест getSnapshots
auto snaps = storage.getSnapshots("test_label");
assert(snaps.length == 2);
assert(snaps[0].id == snap1.id);
assert(snaps[1].id == snap2.id);
auto allSnaps = storage.getSnapshots();
assert(allSnaps.length == 2);
// Тест удаления
assert(snap1.remove());
snaps = storage.getSnapshots("test_label");
assert(snaps.length == 1);
assert(snaps[0].id == snap2.id);
// Тест пустых данных
assertThrown!Exception(storage.newSnapshot("empty", []));
}