diff --git a/js/common/tests/shell-cap-constraint.js b/js/common/tests/shell-cap-constraint.js index c11f2650b2..319c81dc14 100644 --- a/js/common/tests/shell-cap-constraint.js +++ b/js/common/tests/shell-cap-constraint.js @@ -591,7 +591,29 @@ function CapConstraintSuite() { /// @brief test: too large document //////////////////////////////////////////////////////////////////////////////// - testDocumentTooLarge : function () { + testDocumentTooLarge1 : function () { + collection.ensureCapConstraint(1, 16384); + var doc = { }; + + for (var i = 0; i < 1000; ++i) { + doc["test" + i] = "this is a test for the too large document"; + } + + try { + collection.save(doc); + fail(); + } + catch (err) { + assertTrue(err.errorNum === ERRORS.ERROR_ARANGO_DOCUMENT_TOO_LARGE.code || + err.errorNum === ERRORS.ERROR_INTERNAL.code); + } + }, + +//////////////////////////////////////////////////////////////////////////////// +/// @brief test: too large document +//////////////////////////////////////////////////////////////////////////////// + + testDocumentTooLarge2 : function () { collection.ensureCapConstraint(1000, 16384); var doc = { }; @@ -607,6 +629,130 @@ function CapConstraintSuite() { assertTrue(err.errorNum === ERRORS.ERROR_ARANGO_DOCUMENT_TOO_LARGE.code || err.errorNum === ERRORS.ERROR_INTERNAL.code); } + }, + +//////////////////////////////////////////////////////////////////////////////// +/// @brief test: modification of collection size via updates +//////////////////////////////////////////////////////////////////////////////// + + testSizeModificationSimple : function () { + collection.ensureCapConstraint(1000, 16384); + + var doc = collection.save({ a : 1 }); + + // cap should not be triggered here, but we want to see whether assertions fail + doc = collection.replace(doc, { a : 2, b : 2 }); + assertEqual(1, collection.count()); + collection.truncate(); + assertEqual(0, collection.count()); + }, + +//////////////////////////////////////////////////////////////////////////////// +/// @brief test: modification of collection size via updates +//////////////////////////////////////////////////////////////////////////////// + + testSizeModificationsMulti : function () { + collection.ensureCapConstraint(1000, 16384); + + var doc = collection.save({ }); + var data = { }; + + for (var i = 0; i < 100; ++i) { + data["a" + i] = i; + + // cap should not be triggered here, but we want to see whether assertions fail + doc = collection.replace(doc, data); + } + + assertEqual(1, collection.count()); + + collection.truncate(); + doc = null; + collection.unload(); + internal.wait(5); + + assertEqual(0, collection.count()); + }, + +//////////////////////////////////////////////////////////////////////////////// +/// @brief test: modification of collection size via updates +//////////////////////////////////////////////////////////////////////////////// + + testSizeModifications : function () { + collection.ensureCapConstraint(2, 16384); + + var doc = collection.save({ _key: "test", a: 1 }); + var rev = doc._rev; + collection.save({ a : 2 }); + + data = { }; + for (var i = 0; i < 1000; ++i) { + data["b" + i] = "this document will really get too big..."; + } + + try { + collection.update(doc, data); + fail(); + } + catch (err) { + assertTrue(err.errorNum === ERRORS.ERROR_ARANGO_DOCUMENT_TOO_LARGE.code || + err.errorNum === ERRORS.ERROR_INTERNAL.code); + } + + doc = null; + collection.unload(); + internal.wait(5); + + assertEqual(2, collection.count()); + assertEqual(1, collection.document("test").a); + assertEqual(rev, collection.document("test")._rev); + + collection.truncate(); + }, + +//////////////////////////////////////////////////////////////////////////////// +/// @brief test: modification of collection size via updates +//////////////////////////////////////////////////////////////////////////////// + + testSizeModificationsViolations : function () { + collection.ensureCapConstraint(1, 16384); + + var doc = collection.save({ }); + var data = { }; + + for (var i = 0; i < 10; ++i) { + data["a" + i] = i; + + doc = collection.replace(doc, data); + } + + assertEqual(1, collection.count()); + assertEqual(collection.toArray()[0].a9, 9); + + for (i = 0; i < 1000; ++i) { + data["b" + i] = "this document will really get too big..."; + } + + try { + collection.save(data); + fail(); + } + catch (err) { + assertTrue(err.errorNum === ERRORS.ERROR_ARANGO_DOCUMENT_TOO_LARGE.code || + err.errorNum === ERRORS.ERROR_INTERNAL.code); + } + + assertEqual(collection.toArray()[0].a9, 9); + assertEqual(1, collection.count()); + + doc = null; + collection.unload(); + internal.wait(5); + assertEqual(collection.toArray()[0].a9, 9); + assertEqual(1, collection.count()); + + collection.truncate(); + assertEqual(0, collection.count()); } };