1
0
Fork 0
arangodb/tests/js/server/aql/aql-stresstest-nightly.js

247 lines
5.7 KiB
JavaScript

/*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",
"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":".",
"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;
// 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();