// 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 () { var dbs_open = requestStatsTest("couchdb", "open_databases").current; var files_open = requestStatsTest("couchdb", "open_os_files").current; for(var i=0; i 0 && max >= open_databases, name); 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"]; for(var i in aggregates) { T(summary.httpd.requests[aggregates[i]] >= 0, aggregates[i] + " >= 0", name); } } }; var tests = [ open_databases_tests, request_count_tests, database_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); } }