mirror of https://gitee.com/bigwinds/arangodb
Add stresstest to devel
This commit is contained in:
parent
6e24f5e016
commit
a9b7c0ed83
|
@ -0,0 +1,262 @@
|
|||
/*global assertTrue */
|
||||
|
||||
"use strict";
|
||||
|
||||
var jsunity = require("jsunity");
|
||||
|
||||
var aqlFuncs = {
|
||||
"IS_NULL":".",
|
||||
"IS_BOOL":".",
|
||||
"IS_NUMBER":".",
|
||||
"IS_STRING":".",
|
||||
"IS_ARRAY":".",
|
||||
"IS_LIST":".",
|
||||
"IS_OBJECT":".",
|
||||
"IS_DOCUMENT":".",
|
||||
"IS_DATESTRING":".",
|
||||
"TO_NUMBER":".",
|
||||
"TO_STRING":".",
|
||||
"TO_BOOL":".",
|
||||
"TO_ARRAY":".",
|
||||
"TO_LIST":".",
|
||||
"CONCAT":"szl|+",
|
||||
"CHAR_LENGTH":"s",
|
||||
"LOWER":"s",
|
||||
"UPPER":"s",
|
||||
"SUBSTRING":"s,n|n",
|
||||
"CONTAINS":"s,s|b",
|
||||
"LIKE":"s,r|b",
|
||||
"LEFT":"s,n",
|
||||
"RIGHT":"s,n",
|
||||
"TRIM":"s|ns",
|
||||
"LTRIM":"s|s",
|
||||
"RTRIM":"s|s",
|
||||
"FIND_FIRST":"s,s|zn,zn",
|
||||
"FIND_LAST":"s,s|zn,zn",
|
||||
"SPLIT":"s|sl,n",
|
||||
"SUBSTITUTE":"s,las|lsn,n",
|
||||
"MD5":"s",
|
||||
"SHA1":"s",
|
||||
"RANDOM_TOKEN":"n",
|
||||
"FLOOR":"n",
|
||||
"CEIL":"n",
|
||||
"ROUND":"n",
|
||||
"ABS":"n",
|
||||
"RAND":"",
|
||||
"SQRT":"n",
|
||||
"POW":"n,n",
|
||||
"RANGE":"n,n|n",
|
||||
"UNION":"l,l|+",
|
||||
"UNION_DISTINCT":"l,l|+",
|
||||
"MINUS":"l,l|+",
|
||||
"INTERSECTION":"l,l|+",
|
||||
"FLATTEN":"l|n",
|
||||
"LENGTH":"las",
|
||||
"COUNT":"las",
|
||||
"MIN":"l",
|
||||
"MAX":"l",
|
||||
"SUM":"l",
|
||||
"MEDIAN":"l",
|
||||
"PERCENTILE":"l,n|s",
|
||||
"AVERAGE":"l",
|
||||
"AVG":"l",
|
||||
"VARIANCE_SAMPLE":"l",
|
||||
"VARIANCE_POPULATION":"l",
|
||||
"VARIANCE":"l",
|
||||
"STDDEV_SAMPLE":"l",
|
||||
"STDDEV_POPULATION":"l",
|
||||
"STDDEV":"l",
|
||||
"UNIQUE":"l",
|
||||
"SORTED_UNIQUE":"l",
|
||||
"SLICE":"l,n|n",
|
||||
"REVERSE":"ls",
|
||||
"FIRST":"l",
|
||||
"LAST":"l",
|
||||
"NTH":"l,n",
|
||||
"POSITION":"l,.|b",
|
||||
"CALL":"s|.+",
|
||||
"APPLY":"s|l",
|
||||
"PUSH":"l,.|b",
|
||||
"APPEND":"l,lz|b",
|
||||
"POP":"l",
|
||||
"SHIFT":"l",
|
||||
"UNSHIFT":"l,.|b",
|
||||
"REMOVE_VALUE":"l,.|n",
|
||||
"REMOVE_VALUES":"l,lz",
|
||||
"REMOVE_NTH":"l,n",
|
||||
"HAS":"az,s",
|
||||
"ATTRIBUTES":"a|b,b",
|
||||
"VALUES":"a|b",
|
||||
"MERGE":"la|+",
|
||||
"MERGE_RECURSIVE":"a,a|+",
|
||||
"DOCUMENT":"h.|.",
|
||||
"MATCHES":".,l|b",
|
||||
"UNSET":"a,sl|+",
|
||||
"UNSET_RECURSIVE":"a,sl|+",
|
||||
"KEEP":"a,sl|+",
|
||||
"TRANSLATE":".,a|.",
|
||||
"ZIP":"l,l",
|
||||
"NEAR":"hs,n,n|nz,s",
|
||||
"WITHIN":"hs,n,n,n|s",
|
||||
"WITHIN_RECTANGLE":"hs,d,d,d,d",
|
||||
"IS_IN_POLYGON":"l,ln|nb",
|
||||
"FULLTEXT":"hs,s,s|n",
|
||||
"PATHS":"c,h|s,ba",
|
||||
"GRAPH_PATHS":"s|a",
|
||||
"GRAPH_SHORTEST_PATH":"s,als,als|a",
|
||||
"GRAPH_DISTANCE_TO":"s,als,als|a",
|
||||
"TRAVERSAL":"hs,hs,s,s|a",
|
||||
"GRAPH_TRAVERSAL":"s,als,s|a",
|
||||
"TRAVERSAL_TREE":"hs,hs,s,s,s|a",
|
||||
"GRAPH_TRAVERSAL_TREE":"s,als,s,s|a",
|
||||
"EDGES":"hs,s,s|l,o",
|
||||
"GRAPH_EDGES":"s,als|a",
|
||||
"NEIGHBORS":"hs,hs,s,s|l,a",
|
||||
"GRAPH_ECCENTRICITY":"s|a",
|
||||
"GRAPH_DIAMETER":"s|a",
|
||||
"GRAPH_RADIUS":"s|a",
|
||||
"DATE_NOW":"",
|
||||
"DATE_TIMESTAMP":"ns|ns,ns,ns,ns,ns,ns",
|
||||
"DATE_ISO8601":"ns|ns,ns,ns,ns,ns,ns",
|
||||
"DATE_DAYOFWEEK":"ns",
|
||||
"DATE_YEAR":"ns",
|
||||
"DATE_MONTH":"ns",
|
||||
"DATE_DAY":"ns",
|
||||
"DATE_HOUR":"ns",
|
||||
"DATE_MINUTE":"ns",
|
||||
"DATE_SECOND":"ns",
|
||||
"DATE_DAYOFYEAR":"ns",
|
||||
"DATE_ISOWEEK":"ns",
|
||||
"DATE_LEAPYEAR":"ns",
|
||||
"DATE_QUARTER":"ns",
|
||||
"DATE_DAYS_IN_MONTH":"ns",
|
||||
"DATE_ADD":"ns,ns|n",
|
||||
"DATE_SUBTRACT":"ns,ns|n",
|
||||
"DATE_DIFF":"ns,ns,s|b",
|
||||
"DATE_COMPARE":"ns,ns,s|s",
|
||||
"DATE_FORMAT":"ns,s",
|
||||
"FAIL":"|s",
|
||||
"PASSTHRU":".",
|
||||
"NOOPT":".",
|
||||
"V8":".",
|
||||
"TEST_INTERNAL":"s,.",
|
||||
"SLEEP":"n",
|
||||
"COLLECTIONS":"",
|
||||
"NOT_NULL":".|+",
|
||||
"FIRST_LIST":".|+",
|
||||
"FIRST_DOCUMENT":".|+",
|
||||
"PARSE_IDENTIFIER":".",
|
||||
"CURRENT_USER":"",
|
||||
"CURRENT_DATABASE":"",
|
||||
"COLLECTION_COUNT":"chs",
|
||||
};
|
||||
|
||||
let args = {
|
||||
"null": null,
|
||||
"usmallint" : 1,
|
||||
"smallint": -1,
|
||||
"double": Math.PI,
|
||||
"emptyobj": {},
|
||||
"flatobj": {"hans": null, "kanns": 8, "nicht": "..,-"},
|
||||
"nan": NaN,
|
||||
"inf": Infinity,
|
||||
"emptyarr": [],
|
||||
"arr": ["hund", 1, 0.9, null, "\0jaja"],
|
||||
"hihi": "😂",
|
||||
"regex": /haha/,
|
||||
"complexobject": {
|
||||
"hans": 17,
|
||||
"wurst": {
|
||||
"lala": 19001,
|
||||
"hund": null,
|
||||
"0byte": "\0hahah",
|
||||
"BATMAN": NaN,
|
||||
"inf": Infinity,
|
||||
"mett": [1,2, "POLIZEI", null, null, {}]
|
||||
},
|
||||
"SYM": Symbol("unicodekatze"),
|
||||
"HIHI": "😂",
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
var db = require("@arangodb").db;
|
||||
|
||||
function stressTestSuite() {
|
||||
return {
|
||||
testMatrix: function() {
|
||||
var numSuccessful = 0;
|
||||
var keys = Object.keys(args);
|
||||
|
||||
var generateAqlArgument = function(keyIndex, index) {
|
||||
return "@a" + index;
|
||||
};
|
||||
|
||||
var argumentReducer = function(current, keyIndex, index) {
|
||||
current['a' + index] = args[keys[keyIndex]];
|
||||
return current;
|
||||
};
|
||||
|
||||
Object.keys(aqlFuncs).forEach(function(aqlFunc) {
|
||||
var funcArguments = aqlFuncs[aqlFunc];
|
||||
var funcParts = funcArguments.split('|');
|
||||
|
||||
var funcMinArguments = funcParts[0].length > 0 ? funcParts[0].split(',').length : 0;
|
||||
var funcMaxArguments = funcParts.length > 1
|
||||
? funcMinArguments + funcParts[1].split(',').length
|
||||
: funcMinArguments;
|
||||
|
||||
// test one off for every function
|
||||
var testMinArguments = funcMinArguments - 1;
|
||||
if (testMinArguments < 0) {
|
||||
testMinArguments = 0;
|
||||
}
|
||||
var testMaxArguments = funcMaxArguments + 1;
|
||||
console.log(aqlFunc, testMinArguments, testMaxArguments);
|
||||
|
||||
// try up to 5 arguments for every query
|
||||
for (var i=testMinArguments;i<=testMaxArguments;i++) {
|
||||
// and brute force every combination :D
|
||||
// generate a matrix with indices pointing to our possible values
|
||||
// start with 0 in every cell
|
||||
var keyIndices = [];
|
||||
for (var j=1;j<=i;j++) {
|
||||
keyIndices.push(0);
|
||||
}
|
||||
|
||||
// mop: generate query for this argument count run
|
||||
var query = "RETURN " + aqlFunc + "(" + keyIndices.map(generateAqlArgument).join(",") + ")";
|
||||
|
||||
// mop: start at the end, increment during loop and overflow to the front
|
||||
var lastIndex = keyIndices.length - 1;
|
||||
while (true) {
|
||||
var queryArgs = keyIndices.reduce(argumentReducer, {});
|
||||
//console.log(query, queryArgs);
|
||||
try {
|
||||
db._query({"query": query, "bindVars": queryArgs});
|
||||
numSuccessful++;
|
||||
} catch (e) {
|
||||
}
|
||||
|
||||
var index = lastIndex;
|
||||
while (++keyIndices[index] >= keys.length) {
|
||||
keyIndices[index] = 0;
|
||||
index--;
|
||||
if (index < 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (index < 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
assertTrue(numSuccessful, "Not a single test has been successful. Something is broken :S");
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
jsunity.run(stressTestSuite);
|
||||
|
||||
return jsunity.done();
|
Loading…
Reference in New Issue