summaryrefslogtreecommitdiffstats
path: root/akregator/src/mk4storage/metakit/tests/tstore5.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'akregator/src/mk4storage/metakit/tests/tstore5.cpp')
-rw-r--r--akregator/src/mk4storage/metakit/tests/tstore5.cpp286
1 files changed, 286 insertions, 0 deletions
diff --git a/akregator/src/mk4storage/metakit/tests/tstore5.cpp b/akregator/src/mk4storage/metakit/tests/tstore5.cpp
new file mode 100644
index 00000000..1e50b91f
--- /dev/null
+++ b/akregator/src/mk4storage/metakit/tests/tstore5.cpp
@@ -0,0 +1,286 @@
+// tstore5.cpp -- Regression test program, storage tests, part 5
+// $Id$
+// This is part of Metakit, see http://www.equi4.com/metakit/
+
+#include "regress.h"
+
+void TestStores5()
+{
+ B(s40, LoadFrom after commit, 0) W(s40a);
+ {
+ c4_IntProp p1 ("p1");
+
+ { // create datafile by streaming out
+ c4_Storage s1;
+ s1.SetStructure("a[p1:I]");
+
+ c4_View v1 = s1.View("a");
+ v1.Add(p1 [123]);
+ A(p1 (v1[0]) == 123);
+ A(v1.GetSize() == 1);
+
+ c4_FileStream fs1 (fopen("s40a", "wb"), true);
+ s1.SaveTo(fs1);
+ }
+ { // it should load just fine
+ c4_Storage s2;
+ c4_FileStream fs1 (fopen("s40a", "rb"), true);
+ bool ok = s2.LoadFrom(fs1);
+ A(ok);
+
+ c4_View v1 = s2.View("a");
+ A(p1 (v1[0]) == 123);
+ A(v1.GetSize() == 1);
+ }
+ { // open the datafile and commit a change
+ c4_Storage s3 ("s40a", true);
+
+ c4_View v1 = s3.View("a");
+ A(p1 (v1[0]) == 123);
+ A(v1.GetSize() == 1);
+ p1 (v1[0]) = 456;
+ s3.Commit();
+ A(p1 (v1[0]) == 456);
+ A(v1.GetSize() == 1);
+ }
+ { // it should load fine and show the last changes
+ c4_Storage s4;
+ c4_FileStream fs1 (fopen("s40a", "rb"), true);
+ bool ok = s4.LoadFrom(fs1);
+ A(ok);
+
+ c4_View v1 = s4.View("a");
+ A(p1 (v1[0]) == 456);
+ A(v1.GetSize() == 1);
+ }
+ { // it should open just fine in the normal way as well
+ c4_Storage s5 ("s40a", false);
+ c4_View v1 = s5.View("a");
+ A(p1 (v1[0]) == 456);
+ A(v1.GetSize() == 1);
+ }
+ } D(s40a); R(s40a); E;
+
+ // 2002-03-13: failure on Win32, Modify calls base class GetNthMemoCol
+ B(s41, Partial modify blocked, 0) W(s41a);
+ {
+ c4_BytesProp p1 ("p1");
+ c4_Storage s1 ("s41a", true);
+ c4_View v1 = s1.GetAs("a[_B[p1:B]]");
+
+ // custom viewers did not support partial access in 2.4.3
+ c4_View v2 = v1.Blocked();
+ s1.Commit();
+
+ v2.SetSize(1);
+
+ c4_BytesRef m = p1 (v2[0]);
+ m.Modify(c4_Bytes ("abcdefgh", 8), 0);
+
+ s1.Commit();
+
+ } D(s41a); R(s41a); E;
+
+ B(s42, Get descriptions, 0)
+ {
+ c4_Storage s1;
+ s1.SetStructure("a[p1:I],b[p2:S]");
+
+ c4_String x1 = s1.Description();
+ A(x1 == "a[p1:I],b[p2:S]");
+
+ c4_String x2 = s1.Description("b");
+ A(x2 == "p2:S");
+
+ const char* cp = s1.Description("c");
+ A(cp == 0);
+ } E;
+
+ // 2002-04-24: VPI subview ints clobbered
+ B(s43, View reuse after sub-byte ints, 0) W(s43a);
+ {
+ c4_IntProp p1 ("p1");
+ c4_Storage s1 ("s43a", true);
+ c4_View v1 = s1.GetAs("a[p1:I]");
+
+ v1.Add(p1 [0]);
+ v1.Add(p1 [1]);
+ s1.Commit();
+
+ v1.SetSize(1); // 1 is an even trickier bug than 0
+ s1.Commit();
+
+ // adding the following two lines works around the 2.4.4 bug
+ //s1.Rollback();
+ //v1 = s1.GetAs("a[p1:I]");
+
+ v1.Add(p1 [12345]);
+ s1.Commit();
+
+ //int n = p1 (v1[1]);
+ A(p1 (v1[1]) == 12345);
+
+ } D(s43a); R(s43a); E;
+
+ B(s44, Bad memo free space, 0) W(s44a);
+ {
+ c4_IntProp p1 ("p1");
+ c4_BytesProp p2 ("p2");
+ c4_Storage s1 ("s44a", true);
+ c4_View v1 = s1.GetAs("a[p1:I,p2:B]");
+
+ c4_Bytes data;
+ t4_byte* p = data.SetBuffer(12345);
+ for (int i = 0; i < data.Size(); ++i)
+ p[i] = (t4_byte) i;
+
+ v1.Add(p2 [data]);
+ s1.Commit();
+
+ p1 (v1[0]) = 1;
+ s1.Commit();
+
+ p1 (v1[0]) = 0;
+ s1.Commit();
+
+ c4_Bytes temp = p2 (v1[0]);
+ A(temp == data); // this failed in 2.4.5
+
+ } D(s44a); R(s44a); E;
+
+ B(s45, Bad subview memo free space, 0) W(s45a);
+ {
+ c4_IntProp p1 ("p1");
+ c4_ViewProp p2 ("p2");
+ c4_BytesProp p3 ("p3");
+ c4_Storage s1 ("s45a", true);
+ c4_View v1 = s1.GetAs("a[p1:I,p2[p3:B]]");
+
+ c4_Bytes data;
+ t4_byte* p = data.SetBuffer(12345);
+ for (int i = 0; i < data.Size(); ++i)
+ p[i] = (t4_byte) i;
+
+ v1.SetSize(1);
+ c4_View v2 = p2 (v1[0]);
+ v2.Add(p3 [data]);
+ s1.Commit();
+
+ p1 (v1[0]) = 1;
+ s1.Commit();
+
+ p1 (v1[0]) = 0;
+ s1.Commit();
+
+ c4_View v3 = p2 (v1[0]);
+ c4_Bytes temp = p3 (v3[0]);
+ A(temp == data); // this failed in 2.4.5
+
+ } D(s45a); R(s45a); E;
+
+ B(s46, LoadFrom after commit, 0) W(s46a);
+ {
+ c4_IntProp p1 ("p1");
+
+ {
+ c4_Storage s1 ("s46a", true);
+ s1.SetStructure("a[p1:I]");
+ c4_View v1 = s1.View("a");
+
+ v1.Add(p1 [11]);
+ v1.Add(p1 [22]);
+ v1.Add(p1 [33]);
+ v1.Add(p1 [44]);
+ v1.Add(p1 [55]);
+ v1.Add(p1 [66]);
+ v1.Add(p1 [77]);
+ v1.Add(p1 [88]);
+ v1.Add(p1 [99]);
+
+ s1.Commit();
+ }
+ {
+ c4_Storage s2 ("s46a", true);
+ c4_View v2 = s2.View("a");
+
+ v2.Add(p1 [1000]); // force 1->2 byte ints
+ v2.InsertAt(7, c4_Row ());
+ v2.InsertAt(4, c4_Row ());
+
+ //for (int i = 6; i <= 9; ++i) printf("%d\n", (int) p1 (v2[i]));
+
+ A(p1 (v2[6]) == 66);
+ A(p1 (v2[8]) == 0);
+ A(p1 (v2[9]) == 88);
+ A(p1 (v2[7]) == 77); // this failed in 2.4.6
+
+ s2.Commit();
+ }
+ } D(s46a); R(s46a); E;
+
+ // 2004-01-16 bad property type crashes MK 2.4.9.2 and before
+ // this hits an assertion in debug mode, so then it has to be disabled
+ B(s47, Defining bad property type, 0)
+ {
+ c4_IntProp p1 ("p2");
+
+ c4_Storage s1;
+#if defined(NDEBUG)
+ c4_View v1 = s1.GetAs("v1[p1:A]");
+#else
+ // assertions are enabled, turn this into a dummy test instead
+ c4_View v1 = s1.GetAs("v1[p1:I]");
+#endif
+ v1.Add(p1 [123]);
+
+ A(v1.GetSize() == 1);
+ A(p1 (v1 [0]) == 123);
+ } E;
+
+ // 2004-01-18 file damaging bug, when resizing a comitted subview
+ // to empty, committing, and then resizing back to containing data.
+ // Fortunately this usage pattern never happened in blocked views!
+ B(s48, Resize subview to zero and back, 0) W(s48a); W(s48b);
+ {
+ {
+ c4_Storage s1 ("s48a", true);
+ c4_View v1 = s1.GetAs("v1[v2[p1:I]]");
+ v1.SetSize(1);
+ s1.Commit();
+ }
+ {
+ c4_Storage s1 ("s48a", true);
+ c4_View v1 = s1.View("v1");
+ v1.SetSize(0);
+ s1.Commit();
+ // the problem is that the in-memory copy has forgotten that it
+ // has nothing left on disk, and a comparison is done later on to
+ // avoid saving unmodified data - the bad decision is that data has
+ // not changed, but actually it has and must be reallocated!
+ // (fixes are in c4_FormatV::Insert and c4_FormatV::Remove)
+ v1.SetSize(1);
+ s1.Commit();
+ // at this point, the 2.4.9.2 file is corrupt!
+ c4_FileStream fs1 (fopen("s48b", "wb"), true);
+ s1.SaveTo(fs1);
+ }
+ {
+ // using this damaged datafile will then crash
+ c4_Storage s1 ("s48a", false);
+ c4_View v1 = s1.View("v1");
+ v1.SetSize(2);
+ }
+ } D(s48a); D(s48b); R(s48a); R(s48b); E;
+
+ // 2004-01-20 better handling of bad input: ignore repeated props
+ B(s49, Specify conflicting properties, 0) W(s49a);
+ {
+ c4_Storage s1 ("s49a", true);
+ c4_View v1 = s1.GetAs("v1[p1:I,p1:S]");
+ c4_View v2 = s1.GetAs("v2[p1:I,P1:S]");
+ c4_View v3 = s1.GetAs("v3[v3[^]]");
+ c4_String x1 = s1.Description();
+ A(x1 == "v1[p1:I],v2[p1:I],v3[v3[^]]");
+ s1.Commit();
+ } D(s49a); E;
+}