From 8a5b0c697a6fdb3169afe82391368c26bec86978 Mon Sep 17 00:00:00 2001 From: Jan Lehnardt Date: Wed, 25 Feb 2009 16:39:55 +0000 Subject: add js test suite for stats, enable access for a previously internal metric git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@747852 13f79535-47bb-0310-9956-ffa450edef68 --- share/www/script/couch.js | 17 +- share/www/script/couch_tests.js | 1 + share/www/script/test/stats.js | 463 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 469 insertions(+), 12 deletions(-) create mode 100644 share/www/script/test/stats.js (limited to 'share/www') diff --git a/share/www/script/couch.js b/share/www/script/couch.js index 7bec5e32..8a0d3d23 100644 --- a/share/www/script/couch.js +++ b/share/www/script/couch.js @@ -312,20 +312,13 @@ CouchDB.request = function(method, uri, options) { return req; } -CouchDB.requestStats = function(module, key, aggregate, options) { - var options, optionsOrLast = Array.prototype.pop.apply(arguments); - if (typeof optionsOrLast == "string") { - options = null; - Array.prototype.push.apply(arguments, [optionsOrLast]); - } else { - options = optionsOrLast; +CouchDB.requestStats = function(module, key, test) { + var query_arg = ""; + if(test !== null) { + query_arg = "?flush=true"; } - var request_options = {}; - request_options.headers = {"Content-Type": "application/json"}; - - var stat = CouchDB.request("GET", "/_stats/" + Array.prototype.join.apply(arguments,["/"]) + (options ? - ("?" + CouchDB.params(options)) : ""), request_options).responseText; + var stat = CouchDB.request("GET", "/_stats/" + module + "/" + key + query_arg).responseText; return JSON.parse(stat)[module][key]; } diff --git a/share/www/script/couch_tests.js b/share/www/script/couch_tests.js index a6195cf0..67c3baed 100644 --- a/share/www/script/couch_tests.js +++ b/share/www/script/couch_tests.js @@ -66,6 +66,7 @@ loadTest("compact.js"); loadTest("purge.js"); loadTest("config.js"); loadTest("security_validation.js"); +loadTest("stats.js"); function makeDocs(start, end, templateDoc) { var templateDocSrc = templateDoc ? JSON.stringify(templateDoc) : "{}" diff --git a/share/www/script/test/stats.js b/share/www/script/test/stats.js new file mode 100644 index 00000000..db0c6573 --- /dev/null +++ b/share/www/script/test/stats.js @@ -0,0 +1,463 @@ +// 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. + +couchTests.stats = function(debug) { + if (debug) debugger; + + var open_databases_tests = { + 'should increment the number of open databases when creating a db': function(name) { + var db = new CouchDB("test_suite_db"); + db.deleteDb(); + var open_databases = requestStatsTest("couchdb", "open_databases").current; + db.createDb(); + + var new_open_databases = requestStatsTest("couchdb", "open_databases").current; + TEquals(open_databases + 1, new_open_databases, name); + }, + 'should increment the number of open databases when opening a db': function(name) { + var db = new CouchDB("test_suite_db"); + db.deleteDb(); + db.createDb(); + + restartServer(); + + var open_databases = requestStatsTest("couchdb", "open_databases").current; + + db.open("123"); + + var new_open_databases = requestStatsTest("couchdb", "open_databases").current; + TEquals(open_databases + 1, new_open_databases, name); + }, + 'should decrement the number of open databases when deleting': function(name) { + var db = new CouchDB("test_suite_db"); + db.deleteDb(); + db.createDb(); + var open_databases = requestStatsTest("couchdb", "open_databases").current; + + db.deleteDb(); + var new_open_databases = requestStatsTest("couchdb", "open_databases").current; + TEquals(open_databases - 1, new_open_databases, name); + }, + 'should keep the same number of open databases when reaching the max_dbs_open limit': function(name) { + restartServer(); + var max = 5; + run_on_modified_server( + [{section: "couchdb", + key: "max_dbs_open", + value: max.toString()}], + + function () { + for(var i=0; i= open_databases, name); + + // not needed for the test but cleanup is nice + for(var i=0; i= 0, name); + }, + 'should return the maximum': function(name) { + CouchDB.request("GET", "/"); + + var maximum = requestStatsTest("httpd", "requests").max; + + T(maximum >= 0, name); + }, + 'should return the minimum': function(name) { + CouchDB.request("GET", "/"); + + var minimum = requestStatsTest("httpd", "requests", "min").min; + + T(minimum >= 0, name); + }, + 'should return the stddev': function(name) { + CouchDB.request("GET", "/"); + + var stddev = requestStatsTest("httpd", "stddev_requests").current; + + T(stddev >= 0, name); + } + }; + + var summary_tests = { + 'should show a summary of all counters with aggregated values': function(name) { + var options = {}; + options.headers = {"Accept": "application/json"}; + var summary = JSON.parse(CouchDB.request("GET", "/_stats", options).responseText); + var aggregates = ["mean", "min", "max", "stddev", + "current", "resolution"]; + + for(var i in aggregates) { + T(summary.httpd.requests[aggregates[i]] >= 0, aggregates[i] + " >= 0", name); + } + } + }; + + var tests = [ + open_databases_tests, + request_count_tests, + document_read_count_tests, + view_read_count_tests, + http_requests_by_method_tests, + document_write_count_tests, + response_codes_tests, + aggregation_tests, + summary_tests + ]; + + for(var testGroup in tests) { + for(var test in tests[testGroup]) { + tests[testGroup][test](test); + } + }; + + function createAndRequestView(db) { + var designDoc = { + _id:"_design/test", // turn off couch.js id escaping? + language: "javascript", + views: { + all_docs_twice: {map: "function(doc) { emit(doc.integer, null); emit(doc.integer, null) }"}, + } + }; + db.save(designDoc); + + db.view("test/all_docs_twice"); + } + + function requestStatsTest(module, key) { + return CouchDB.requestStats(module, key, true); + } +} + \ No newline at end of file -- cgit v1.2.3