forked from dlang/cdcdb
72 lines
2.1 KiB
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", []));
|
|
}
|