mirror of https://gitee.com/bigwinds/arangodb
299 lines
8.1 KiB
JavaScript
299 lines
8.1 KiB
JavaScript
/*jshint globalstrict:false, strict:false, unused : false */
|
|
/*global fail, assertTrue, assertFalse, assertEqual, assertMatch */
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief test the server-side database interface
|
|
///
|
|
/// @file
|
|
///
|
|
/// DISCLAIMER
|
|
///
|
|
/// Copyright 2010-2012 triagens GmbH, Cologne, Germany
|
|
///
|
|
/// Licensed under the Apache License, Version 2.0 (the "License");
|
|
/// you may not use this file except in compliance with the License.
|
|
/// You may obtain a copy of the License at
|
|
///
|
|
/// http://www.apache.org/licenses/LICENSE-2.0
|
|
///
|
|
/// Unless required by applicable law or agreed to in writing, software
|
|
/// distributed under the License is distributed on an "AS IS" BASIS,
|
|
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
/// See the License for the specific language governing permissions and
|
|
/// limitations under the License.
|
|
///
|
|
/// Copyright holder is triAGENS GmbH, Cologne, Germany
|
|
///
|
|
/// @author Jan Steemann
|
|
/// @author Copyright 2012, triAGENS GmbH, Cologne, Germany
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
var jsunity = require("jsunity");
|
|
var internal = require("internal");
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief test suite: dropping databases while holding references
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
var logLevel;
|
|
function DatabaseSuite () {
|
|
'use strict';
|
|
return {
|
|
|
|
setUp : function () {
|
|
logLevel = require("internal").logLevel();
|
|
internal.db._useDatabase("_system");
|
|
},
|
|
|
|
tearDown : function () {
|
|
require("internal").logLevel(logLevel);
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief test whether the expected keys are present in db._version(true)
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testVersionDetails : function () {
|
|
let result = internal.db._version(true);
|
|
|
|
let keys = [
|
|
"architecture",
|
|
"asan",
|
|
"asm-crc32",
|
|
"assertions",
|
|
"boost-version",
|
|
"build-date",
|
|
"compiler",
|
|
"cplusplus",
|
|
"debug",
|
|
"endianness",
|
|
"failure-tests",
|
|
"full-version-string",
|
|
"icu-version",
|
|
"jemalloc",
|
|
"maintainer-mode",
|
|
"openssl-version-run-time",
|
|
"openssl-version-compile-time",
|
|
"platform",
|
|
"reactor-type",
|
|
"rocksdb-version",
|
|
"server-version",
|
|
"sse42",
|
|
"unaligned-access",
|
|
"v8-version",
|
|
"vpack-version",
|
|
"zlib-version"
|
|
];
|
|
|
|
keys.forEach(function(k) {
|
|
assertTrue(result.hasOwnProperty(k));
|
|
});
|
|
},
|
|
|
|
testVersionBooleans : function () {
|
|
let result = internal.db._version(true);
|
|
|
|
let keys = [
|
|
"asan",
|
|
"asm-crc32",
|
|
"assertions",
|
|
"debug",
|
|
"failure-tests",
|
|
"jemalloc",
|
|
"maintainer-mode",
|
|
"sse42",
|
|
"unaligned-access"
|
|
];
|
|
|
|
keys.forEach(function(k) {
|
|
assertTrue(result[k] === "true" || result[k] === "false");
|
|
});
|
|
},
|
|
|
|
testVersionNumbers : function () {
|
|
let result = internal.db._version(true);
|
|
|
|
let keys = [
|
|
"boost-version",
|
|
"icu-version",
|
|
"rocksdb-version",
|
|
"server-version",
|
|
"v8-version",
|
|
"vpack-version",
|
|
"zlib-version"
|
|
];
|
|
|
|
keys.forEach(function(k) {
|
|
assertMatch(/^\d+(\.\d+)*([\-]([a-z]|\d)+(\.?\d*)?)?$/, result[k]);
|
|
});
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief test references helt on dropped database collections
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testDropDatabaseCollectionReferences : function () {
|
|
assertEqual("_system", internal.db._name());
|
|
|
|
try {
|
|
internal.db._dropDatabase("UnitTestsDatabase0");
|
|
}
|
|
catch (err) {
|
|
}
|
|
|
|
assertTrue(internal.db._createDatabase("UnitTestsDatabase0"));
|
|
|
|
internal.db._useDatabase("UnitTestsDatabase0");
|
|
assertEqual("UnitTestsDatabase0", internal.db._name());
|
|
|
|
// insert 1000 docs and hold a reference on the data
|
|
var c = internal.db._create("test");
|
|
for (var i = 0; i < 1000; ++i) {
|
|
c.save({ "_key": "test" + i, "value" : i });
|
|
}
|
|
assertEqual(1000, c.count());
|
|
|
|
internal.db._useDatabase("_system");
|
|
assertEqual(1000, c.count());
|
|
|
|
// drop the database
|
|
internal.db._dropDatabase("UnitTestsDatabase0");
|
|
// should be dropped
|
|
internal.db._databases().forEach(function (d) {
|
|
if (d === "UnitTestsDatabase0") {
|
|
fail();
|
|
}
|
|
});
|
|
|
|
// collection should still be there
|
|
assertEqual(1000, c.count());
|
|
assertEqual("test", c.name());
|
|
|
|
internal.wait(5, false);
|
|
// still...
|
|
assertEqual(1000, c.count());
|
|
|
|
c = null;
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief test references helt on documents of dropped databases
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testDropDatabaseDocumentReferences : function () {
|
|
assertEqual("_system", internal.db._name());
|
|
|
|
try {
|
|
internal.db._dropDatabase("UnitTestsDatabase0");
|
|
}
|
|
catch (err) {
|
|
}
|
|
|
|
assertTrue(internal.db._createDatabase("UnitTestsDatabase0"));
|
|
|
|
internal.db._useDatabase("UnitTestsDatabase0");
|
|
assertEqual("UnitTestsDatabase0", internal.db._name());
|
|
|
|
// insert docs and hold a reference on the data
|
|
var c = internal.db._create("test");
|
|
for (var i = 0; i < 10; ++i) {
|
|
c.save({ "_key": "test" + i, "value" : i });
|
|
}
|
|
|
|
var d0 = c.document("test0");
|
|
var d4 = c.document("test4");
|
|
var d9 = c.document("test9");
|
|
|
|
c = null;
|
|
|
|
internal.db._useDatabase("_system");
|
|
|
|
// drop the database
|
|
internal.db._dropDatabase("UnitTestsDatabase0");
|
|
// should be dropped
|
|
internal.db._databases().forEach(function (d) {
|
|
if (d === "UnitTestsDatabase0") {
|
|
fail();
|
|
}
|
|
});
|
|
|
|
assertEqual(0, d0.value);
|
|
assertEqual(4, d4.value);
|
|
assertEqual(9, d9.value);
|
|
|
|
internal.wait(5, false);
|
|
|
|
assertEqual(0, d0.value);
|
|
assertEqual(4, d4.value);
|
|
assertEqual(9, d9.value);
|
|
|
|
d0 = null;
|
|
d4 = null;
|
|
|
|
internal.wait(3, false);
|
|
assertEqual(9, d9.value);
|
|
|
|
d9 = null;
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief test removal of database directory
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testDropDatabaseDirectory : function () {
|
|
assertEqual("_system", internal.db._name());
|
|
|
|
try {
|
|
internal.db._dropDatabase("UnitTestsDatabase0");
|
|
}
|
|
catch (err) {
|
|
}
|
|
|
|
assertTrue(internal.db._createDatabase("UnitTestsDatabase0"));
|
|
assertTrue(internal.db._useDatabase("UnitTestsDatabase0"));
|
|
|
|
var fs = require("fs");
|
|
|
|
// get path
|
|
var path = internal.db._path();
|
|
assertTrue(fs.exists(path));
|
|
var files = fs.listTree(path);
|
|
|
|
// assert some files
|
|
assertTrue(files.length > 10);
|
|
|
|
assertTrue(internal.db._useDatabase("_system"));
|
|
|
|
// drop db, and check path again
|
|
assertTrue(internal.db._dropDatabase("UnitTestsDatabase0"));
|
|
|
|
var tries = 0;
|
|
while (tries++ < 150) {
|
|
if (fs.exists(path)) {
|
|
internal.wait(2, false);
|
|
continue;
|
|
}
|
|
else {
|
|
break;
|
|
}
|
|
}
|
|
if (tries > 15) {
|
|
require("internal").printf("[WARNING] waited " + tries * 2 + " seconds for " + path + " to disappear");
|
|
}
|
|
// yes, we know this test fails in windows now and then.
|
|
assertFalse(fs.exists(path));
|
|
}
|
|
|
|
};
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief executes the test suite
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
jsunity.run(DatabaseSuite);
|
|
|
|
return jsunity.done();
|
|
|