diff options
Diffstat (limited to 'akregator/src/mk4storage/metakit/tests/textend.cpp')
-rw-r--r-- | akregator/src/mk4storage/metakit/tests/textend.cpp | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/akregator/src/mk4storage/metakit/tests/textend.cpp b/akregator/src/mk4storage/metakit/tests/textend.cpp new file mode 100644 index 000000000..98331f1af --- /dev/null +++ b/akregator/src/mk4storage/metakit/tests/textend.cpp @@ -0,0 +1,195 @@ +// textend.cpp -- Regression test program, commit extend tests +// $Id$ +// This is part of Metakit, the homepage is http://www.equi4.com/metakit/ + +#include "regress.h" + +const int kSize1 = 41; +const int kSize2 = 85; + +void TestExtend() +{ + B(e01, Extend new file, 0) W(e01a); + { + c4_IntProp p1 ("p1"); + c4_Storage s1 ("e01a", 2); + A(s1.Strategy().FileSize() == 0); + c4_View v1 = s1.GetAs("a[p1:I]"); + v1.Add(p1 [123]); + s1.Commit(); + A(s1.Strategy().FileSize() == kSize1); + v1.Add(p1 [456]); + s1.Commit(); + A(s1.Strategy().FileSize() == kSize2); + } D(e01a); R(e01a); E; + + B(e02, Extend committing twice, 0) W(e02a); + { + c4_IntProp p1 ("p1"); + c4_Storage s1 ("e02a", 2); + A(s1.Strategy().FileSize() == 0); + c4_View v1 = s1.GetAs("a[p1:I]"); + v1.Add(p1 [123]); + s1.Commit(); + A(s1.Strategy().FileSize() == kSize1); + s1.Commit(); + A(s1.Strategy().FileSize() == kSize1); + v1.Add(p1 [456]); + s1.Commit(); + A(s1.Strategy().FileSize() == kSize2); + } D(e02a); R(e02a); E; + + B(e03, Read during extend, 0) W(e03a); + { + c4_IntProp p1 ("p1"); + c4_Storage s1 ("e03a", 2); + A(s1.Strategy().FileSize() == 0); + c4_View v1 = s1.GetAs("a[p1:I]"); + v1.Add(p1 [123]); + s1.Commit(); + A(s1.Strategy().FileSize() == kSize1); + + { + c4_Storage s2 ("e03a", 0); + c4_View v2 = s2.View("a"); + A(v2.GetSize() == 1); + A(p1 (v2[0]) == 123); + } + + v1.Add(p1 [456]); + s1.Commit(); + A(s1.Strategy().FileSize() == kSize2); + + { + c4_Storage s3 ("e03a", 0); + c4_View v3 = s3.View("a"); + A(v3.GetSize() == 2); + A(p1 (v3[0]) == 123); + A(p1 (v3[1]) == 456); + } + } D(e03a); R(e03a); E; + + B(e04, Extend during read, 0) W(e04a); + { + c4_IntProp p1 ("p1"); + + { + c4_Storage s1 ("e04a", 2); + A(s1.Strategy().FileSize() == 0); + c4_View v1 = s1.GetAs("a[p1:I]"); + v1.Add(p1 [123]); + s1.Commit(); + A(s1.Strategy().FileSize() == kSize1); + } + + c4_Storage s2 ("e04a", 0); + c4_View v2 = s2.View("a"); + A(v2.GetSize() == 1); + A(p1 (v2[0]) == 123); + + c4_Storage s3 ("e04a", 0); // open, don't load + + { + c4_Storage s4 ("e04a", 2); + A(s4.Strategy().FileSize() == kSize1); + c4_View v4 = s4.View("a"); + v4.Add(p1 [123]); + s4.Commit(); + A(s4.Strategy().FileSize() > kSize1); // == kSize2); + } + + c4_View v2a = s2.View("a"); + A(v2a.GetSize() == 1); + A(p1 (v2a[0]) == 123); + + c4_View v3 = s3.View("a"); + A(v3.GetSize() == 1); + A(p1 (v3[0]) == 123); + + } D(e04a); R(e04a); E; + + B(e05, Test memory mapping, 0) W(e05a); + { + // this is not a test of MK, but of the underlying system code + + { + c4_FileStrategy fs; + bool f1 = fs.DataOpen("e05a", 1); + A(!f1); + fs.DataWrite(0, "hi!", 3); + A(fs._failure == 0); + A(fs.FileSize() == 3); + fs.DataCommit(0); + A(fs.FileSize() == 3); + fs.ResetFileMapping(); + if (fs._mapStart != 0) + { + A(fs._dataSize == 3); + c4_String s ((char*) fs._mapStart, 3); + A(s == "hi!"); + } + fs.DataWrite(3, "hello", 5); + A(fs._failure == 0); + A(fs.FileSize() == 8); + fs.DataCommit(0); + A(fs.FileSize() == 8); + if (fs._mapStart != 0) + { + A(fs._dataSize == 3); + c4_String s ((char*) fs._mapStart, 8); + A(s == "hi!hello"); + } + fs.DataWrite(100, "wow!", 4); + A(fs._failure == 0); + A(fs.FileSize() == 104); + fs.DataCommit(0); + A(fs.FileSize() == 104); + fs.ResetFileMapping(); + if (fs._mapStart != 0) + { + A(fs._dataSize == 104); + c4_String s ((char*) fs._mapStart + 100, 4); + A(s == "wow!"); + } + } + + // clear the file, so dump doesn't choke on it + FILE* fp = fopen("e05a", "w"); + A(fp != 0); + fclose(fp); + + } D(e05a); R(e05a); E; + + B(e06, Rollback during extend, 0) W(e06a); + { + c4_IntProp p1 ("p1"); + c4_Storage s1 ("e06a", 2); + A(s1.Strategy().FileSize() == 0); + c4_View v1 = s1.GetAs("a[p1:I]"); + v1.Add(p1 [123]); + s1.Commit(); + A(s1.Strategy().FileSize() == kSize1); + + c4_Storage s2 ("e06a", 0); + c4_View v2 = s2.View("a"); + A(v2.GetSize() == 1); + A(p1 (v2[0]) == 123); + + v1.Add(p1 [456]); + s1.Commit(); + A(s1.Strategy().FileSize() == kSize2); +#if 0 +/* fails on NT + Samba, though it works fine with mmap'ing disabled */ + s2.Rollback(); + + c4_View v2a = s2.View("a"); + A(v2a.GetSize() == 2); + A(p1 (v2a[0]) == 123); + A(p1 (v2a[1]) == 456); +#else + c4_View v2a = s2.View("a"); + A(v2a.GetSize() == 1); + A(p1 (v2a[0]) == 123); +#endif + } D(e06a); R(e06a); E; +} |