You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by da...@apache.org on 2019/12/19 17:51:00 UTC

[couchdb] branch speedup-test-suite created (now 6bee9b5)

This is an automated email from the ASF dual-hosted git repository.

davisp pushed a change to branch speedup-test-suite
in repository https://gitbox.apache.org/repos/asf/couchdb.git.


      at 6bee9b5  Optimize couch_multidb_changes tests

This branch includes the following new commits:

     new 736f1ea  Avoid sleeping for skipped tests
     new 37690df  Wrap tests in ?_test() macros
     new 47b7b5a  Speed up couch_peruser tests
     new 6bee9b5  Optimize couch_multidb_changes tests

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[couchdb] 04/04: Optimize couch_multidb_changes tests

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davisp pushed a commit to branch speedup-test-suite
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit 6bee9b5145026ced078d3a3dddf58de086d16cdf
Author: Paul J. Davis <pa...@gmail.com>
AuthorDate: Thu Dec 19 11:50:05 2019 -0600

    Optimize couch_multidb_changes tests
    
    This moves all of the mock work to a single setup function and then just
    resets all of the mocked modules before each test run.
---
 src/couch/src/couch_multidb_changes.erl | 131 ++++++++++++++++++--------------
 1 file changed, 75 insertions(+), 56 deletions(-)

diff --git a/src/couch/src/couch_multidb_changes.erl b/src/couch/src/couch_multidb_changes.erl
index ccdc0f9..e2bbda3 100644
--- a/src/couch/src/couch_multidb_changes.erl
+++ b/src/couch/src/couch_multidb_changes.erl
@@ -342,41 +342,46 @@ is_design_doc_id(_) ->
 
 couch_multidb_changes_test_() ->
     {
-        foreach,
-        fun setup/0,
-        fun teardown/1,
-        [
-            t_handle_call_change(),
-            t_handle_call_change_filter_design_docs(),
-            t_handle_call_checkpoint_new(),
-            t_handle_call_checkpoint_existing(),
-            t_handle_info_created(),
-            t_handle_info_deleted(),
-            t_handle_info_updated(),
-            t_handle_info_other_event(),
-            t_handle_info_created_other_db(),
-            t_handle_info_scanner_exit_normal(),
-            t_handle_info_scanner_crashed(),
-            t_handle_info_event_server_exited(),
-            t_handle_info_unknown_pid_exited(),
-            t_handle_info_change_feed_exited(),
-            t_handle_info_change_feed_exited_and_need_rescan(),
-            t_spawn_changes_reader(),
-            t_changes_reader_cb_change(),
-            t_changes_reader_cb_stop(),
-            t_changes_reader_cb_other(),
-            t_handle_call_resume_scan_no_chfeed_no_ets_entry(),
-            t_handle_call_resume_scan_chfeed_no_ets_entry(),
-            t_handle_call_resume_scan_chfeed_ets_entry(),
-            t_handle_call_resume_scan_no_chfeed_ets_entry(),
-            t_start_link(),
-            t_start_link_no_ddocs(),
-            t_misc_gen_server_callbacks()
-        ]
+        setup,
+        fun setup_all/0,
+        fun teardown_all/1,
+        {
+            foreach,
+            fun setup/0,
+            fun teardown/1,
+            [
+                t_handle_call_change(),
+                t_handle_call_change_filter_design_docs(),
+                t_handle_call_checkpoint_new(),
+                t_handle_call_checkpoint_existing(),
+                t_handle_info_created(),
+                t_handle_info_deleted(),
+                t_handle_info_updated(),
+                t_handle_info_other_event(),
+                t_handle_info_created_other_db(),
+                t_handle_info_scanner_exit_normal(),
+                t_handle_info_scanner_crashed(),
+                t_handle_info_event_server_exited(),
+                t_handle_info_unknown_pid_exited(),
+                t_handle_info_change_feed_exited(),
+                t_handle_info_change_feed_exited_and_need_rescan(),
+                t_spawn_changes_reader(),
+                t_changes_reader_cb_change(),
+                t_changes_reader_cb_stop(),
+                t_changes_reader_cb_other(),
+                t_handle_call_resume_scan_no_chfeed_no_ets_entry(),
+                t_handle_call_resume_scan_chfeed_no_ets_entry(),
+                t_handle_call_resume_scan_chfeed_ets_entry(),
+                t_handle_call_resume_scan_no_chfeed_ets_entry(),
+                t_start_link(),
+                t_start_link_no_ddocs(),
+                t_misc_gen_server_callbacks()
+            ]
+        }
     }.
 
 
-setup() ->
+setup_all() ->
     mock_logs(),
     mock_callback_mod(),
     meck:expect(couch_event, register_all, 1, ok),
@@ -397,12 +402,26 @@ setup() ->
     EvtPid.
 
 
-teardown(EvtPid) ->
+teardown_all(EvtPid) ->
     unlink(EvtPid),
     exit(EvtPid, kill),
     meck:unload().
 
 
+setup() ->
+    meck:reset([
+        ?MOD,
+        couch_changes,
+        couch_db,
+        couch_event,
+        couch_log
+    ]).
+
+
+teardown(_) ->
+    ok.
+
+
 t_handle_call_change() ->
     ?_test(begin
         State = mock_state(),
@@ -728,38 +747,41 @@ t_misc_gen_server_callbacks() ->
 
 scan_dbs_test_() ->
 {
-    foreach,
-    fun() -> test_util:start_couch([mem3, fabric]) end,
-    fun(Ctx) -> test_util:stop_couch(Ctx) end,
-    [
-        t_find_shard(),
-        t_shard_not_found(),
-        t_pass_local(),
-        t_fail_local()
-    ]
+    setup,
+    fun() ->
+        Ctx = test_util:start_couch([mem3, fabric]),
+        GlobalDb = ?tempdb(),
+        ok = fabric:create_db(GlobalDb, [?CTX]),
+        #shard{name = LocalDb} = hd(mem3:local_shards(GlobalDb)),
+        {Ctx, GlobalDb, LocalDb}
+    end,
+    fun({Ctx, GlobalDb, _LocalDb}) ->
+        fabric:delete_db(GlobalDb, [?CTX]),
+        test_util:stop_couch(Ctx)
+    end,
+    {with, [
+        fun t_find_shard/1,
+        fun t_shard_not_found/1,
+        fun t_pass_local/1,
+        fun t_fail_local/1
+    ]}
 }.
 
 
-t_find_shard() ->
+t_find_shard({_, DbName, _}) ->
     ?_test(begin
-        DbName = ?tempdb(),
-        ok = fabric:create_db(DbName, [?CTX]),
-        ?assertEqual(2, length(local_shards(DbName))),
-        fabric:delete_db(DbName, [?CTX])
+        ?assertEqual(2, length(local_shards(DbName)))
     end).
 
 
-t_shard_not_found() ->
+t_shard_not_found(_) ->
     ?_test(begin
         ?assertEqual([], local_shards(?tempdb()))
     end).
 
 
-t_pass_local() ->
+t_pass_local({_, _, LocalDb}) ->
     ?_test(begin
-        LocalDb = ?tempdb(),
-        {ok, Db} = couch_db:create(LocalDb, [?CTX]),
-        ok = couch_db:close(Db),
         scan_local_db(self(), LocalDb),
         receive
             {'$gen_cast', Msg} ->
@@ -770,11 +792,8 @@ t_pass_local() ->
     end).
 
 
-t_fail_local() ->
+t_fail_local({_, _, LocalDb}) ->
     ?_test(begin
-        LocalDb = ?tempdb(),
-        {ok, Db} = couch_db:create(LocalDb, [?CTX]),
-        ok = couch_db:close(Db),
         scan_local_db(self(), <<"some_other_db">>),
         receive
             {'$gen_cast', Msg} ->


[couchdb] 02/04: Wrap tests in ?_test() macros

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davisp pushed a commit to branch speedup-test-suite
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit 37690df343850928577452ddc08a8f4c39d57216
Author: Paul J. Davis <pa...@gmail.com>
AuthorDate: Thu Dec 19 11:11:06 2019 -0600

    Wrap tests in ?_test() macros
    
    Without this the timing information is allocated to fixtures which is
    incorrect.
---
 .../test/eunit/couch_peruser_test.erl              | 527 +++++++++++----------
 1 file changed, 273 insertions(+), 254 deletions(-)

diff --git a/src/couch_peruser/test/eunit/couch_peruser_test.erl b/src/couch_peruser/test/eunit/couch_peruser_test.erl
index 8501cc3..e128d31 100644
--- a/src/couch_peruser/test/eunit/couch_peruser_test.erl
+++ b/src/couch_peruser/test/eunit/couch_peruser_test.erl
@@ -145,297 +145,316 @@ get_cluster_base_url() ->
 
 
 should_create_user_db_with_default(TestAuthDb) ->
-    create_user(TestAuthDb, "foo"),
-    wait_for_db_create(<<"userdb-666f6f">>),
-    {ok, DbInfo} = fabric:get_db_info(<<"userdb-666f6f">>),
-    {ClusterInfo} = couch_util:get_value(cluster, DbInfo),
-    [
-        ?_assert(lists:member(<<"userdb-666f6f">>, all_dbs())),
-        ?_assertEqual(1, couch_util:get_value(q, ClusterInfo))
-    ].
+    ?_test(begin
+        create_user(TestAuthDb, "foo"),
+        wait_for_db_create(<<"userdb-666f6f">>),
+        {ok, DbInfo} = fabric:get_db_info(<<"userdb-666f6f">>),
+        {ClusterInfo} = couch_util:get_value(cluster, DbInfo),
+        ?assert(lists:member(<<"userdb-666f6f">>, all_dbs())),
+        ?assertEqual(1, couch_util:get_value(q, ClusterInfo))
+    end).
 
 should_create_user_db_with_custom_prefix(TestAuthDb) ->
-    set_config("couch_peruser", "database_prefix", "newuserdb-"),
-    create_user(TestAuthDb, "fooo"),
-    wait_for_db_create(<<"newuserdb-666f6f6f">>),
-    delete_config("couch_peruser", "database_prefix"),
-    ?_assert(lists:member(<<"newuserdb-666f6f6f">>, all_dbs())).
+    ?_test(begin
+        set_config("couch_peruser", "database_prefix", "newuserdb-"),
+        create_user(TestAuthDb, "fooo"),
+        wait_for_db_create(<<"newuserdb-666f6f6f">>),
+        delete_config("couch_peruser", "database_prefix"),
+        ?assert(lists:member(<<"newuserdb-666f6f6f">>, all_dbs()))
+    end).
 
 should_create_user_db_with_custom_special_prefix(TestAuthDb) ->
-    set_config("couch_peruser", "database_prefix", "userdb_$()+--/"),
-    create_user(TestAuthDb, "fooo"),
-    wait_for_db_create(<<"userdb_$()+--/666f6f6f">>),
-    delete_config("couch_peruser", "database_prefix"),
-    ?_assert(lists:member(<<"userdb_$()+--/666f6f6f">>, all_dbs())).
+    ?_test(begin
+        set_config("couch_peruser", "database_prefix", "userdb_$()+--/"),
+        create_user(TestAuthDb, "fooo"),
+        wait_for_db_create(<<"userdb_$()+--/666f6f6f">>),
+        delete_config("couch_peruser", "database_prefix"),
+        ?assert(lists:member(<<"userdb_$()+--/666f6f6f">>, all_dbs()))
+    end).
 
 should_create_anon_user_db_with_default(TestAuthDb) ->
-    create_anon_user(TestAuthDb, "fooo"),
-    wait_for_db_create(<<"userdb-666f6f6f">>),
-    {ok, DbInfo} = fabric:get_db_info(<<"userdb-666f6f6f">>),
-    {ClusterInfo} = couch_util:get_value(cluster, DbInfo),
-    [
-        ?_assert(lists:member(<<"userdb-666f6f6f">>, all_dbs())),
-        ?_assertEqual(1, couch_util:get_value(q, ClusterInfo))
-    ].
+    ?_test(begin
+        create_anon_user(TestAuthDb, "fooo"),
+        wait_for_db_create(<<"userdb-666f6f6f">>),
+        {ok, DbInfo} = fabric:get_db_info(<<"userdb-666f6f6f">>),
+        {ClusterInfo} = couch_util:get_value(cluster, DbInfo),
+        ?assert(lists:member(<<"userdb-666f6f6f">>, all_dbs())),
+        ?assertEqual(1, couch_util:get_value(q, ClusterInfo))
+    end).
 
 should_create_anon_user_db_with_custom_prefix(TestAuthDb) ->
-    set_config("couch_peruser", "database_prefix", "newuserdb-"),
-    create_anon_user(TestAuthDb, "fooo"),
-    wait_for_db_create(<<"newuserdb-666f6f6f">>),
-    delete_config("couch_peruser", "database_prefix"),
-    ?_assert(lists:member(<<"newuserdb-666f6f6f">>, all_dbs())).
+    ?_test(begin
+        set_config("couch_peruser", "database_prefix", "newuserdb-"),
+        create_anon_user(TestAuthDb, "fooo"),
+        wait_for_db_create(<<"newuserdb-666f6f6f">>),
+        delete_config("couch_peruser", "database_prefix"),
+        ?assert(lists:member(<<"newuserdb-666f6f6f">>, all_dbs()))
+    end).
 
 should_create_anon_user_db_with_custom_special_prefix(TestAuthDb) ->
-    set_config("couch_peruser", "database_prefix", "userdb_$()+--/"),
-    create_anon_user(TestAuthDb, "fooo"),
-    wait_for_db_create(<<"userdb_$()+--/666f6f6f">>),
-    delete_config("couch_peruser", "database_prefix"),
-    ?_assert(lists:member(<<"userdb_$()+--/666f6f6f">>, all_dbs())).
+    ?_test(begin
+        set_config("couch_peruser", "database_prefix", "userdb_$()+--/"),
+        create_anon_user(TestAuthDb, "fooo"),
+        wait_for_db_create(<<"userdb_$()+--/666f6f6f">>),
+        delete_config("couch_peruser", "database_prefix"),
+        ?assert(lists:member(<<"userdb_$()+--/666f6f6f">>, all_dbs()))
+    end).
 
 should_create_user_db_with_q4(TestAuthDb) ->
-    set_config("couch_peruser", "q", "4"),
-    create_user(TestAuthDb, "foo"),
-    wait_for_db_create(<<"userdb-666f6f">>),
-    {ok, DbInfo} = fabric:get_db_info(<<"userdb-666f6f">>),
-    {ClusterInfo} = couch_util:get_value(cluster, DbInfo),
-    delete_config("couch_peruser", "q"),
-    [
-        ?_assert(lists:member(<<"userdb-666f6f">>, all_dbs())),
-        ?_assertEqual(4, couch_util:get_value(q, ClusterInfo))
-    ].
+    ?_test(begin
+        set_config("couch_peruser", "q", "4"),
+        create_user(TestAuthDb, "foo"),
+        wait_for_db_create(<<"userdb-666f6f">>),
+        {ok, DbInfo} = fabric:get_db_info(<<"userdb-666f6f">>),
+        {ClusterInfo} = couch_util:get_value(cluster, DbInfo),
+        delete_config("couch_peruser", "q"),
+        ?assert(lists:member(<<"userdb-666f6f">>, all_dbs())),
+        ?assertEqual(4, couch_util:get_value(q, ClusterInfo))
+    end).
 
 should_create_anon_user_db_with_q4(TestAuthDb) ->
-    set_config("couch_peruser", "q", "4"),
-    create_anon_user(TestAuthDb, "fooo"),
-    wait_for_db_create(<<"userdb-666f6f6f">>),
-    {ok, TargetInfo} = fabric:get_db_info(<<"userdb-666f6f6f">>),
-    {ClusterInfo} = couch_util:get_value(cluster, TargetInfo),
-    delete_config("couch_peruser", "q"),
-    [
-        ?_assert(lists:member(<<"userdb-666f6f6f">>, all_dbs())),
-        ?_assertEqual(4, couch_util:get_value(q, ClusterInfo))
-    ].
+    ?_test(begin
+        set_config("couch_peruser", "q", "4"),
+        create_anon_user(TestAuthDb, "fooo"),
+        wait_for_db_create(<<"userdb-666f6f6f">>),
+        {ok, TargetInfo} = fabric:get_db_info(<<"userdb-666f6f6f">>),
+        {ClusterInfo} = couch_util:get_value(cluster, TargetInfo),
+        delete_config("couch_peruser", "q"),
+        ?assert(lists:member(<<"userdb-666f6f6f">>, all_dbs())),
+        ?assertEqual(4, couch_util:get_value(q, ClusterInfo))
+    end).
 
 should_not_delete_user_db(TestAuthDb) ->
-    User = "foo",
-    UserDbName = <<"userdb-666f6f">>,
-    create_user(TestAuthDb, User),
-    wait_for_db_create(<<"userdb-666f6f">>),
-    AfterCreate = lists:member(UserDbName, all_dbs()),
-    delete_user(TestAuthDb, User),
-    timer:sleep(?WAIT_FOR_USER_DELETE_TIMEOUT),
-    AfterDelete = lists:member(UserDbName, all_dbs()),
-    [?_assert(AfterCreate), ?_assert(AfterDelete)].
+    ?_test(begin
+        User = "foo",
+        UserDbName = <<"userdb-666f6f">>,
+        create_user(TestAuthDb, User),
+        wait_for_db_create(<<"userdb-666f6f">>),
+        AfterCreate = lists:member(UserDbName, all_dbs()),
+        delete_user(TestAuthDb, User),
+        timer:sleep(?WAIT_FOR_USER_DELETE_TIMEOUT),
+        AfterDelete = lists:member(UserDbName, all_dbs()),
+        ?assert(AfterCreate),
+        ?assert(AfterDelete)
+    end).
 
 should_delete_user_db(TestAuthDb) ->
-    User = "bar",
-    UserDbName = <<"userdb-626172">>,
-    set_config("couch_peruser", "delete_dbs", "true"),
-    create_user(TestAuthDb, User),
-    wait_for_db_create(UserDbName),
-    AfterCreate = lists:member(UserDbName, all_dbs()),
-    delete_user(TestAuthDb, User),
-    wait_for_db_delete(UserDbName),
-    AfterDelete = lists:member(UserDbName, all_dbs()),
-    [?_assert(AfterCreate), ?_assertNot(AfterDelete)].
+    ?_test(begin
+        User = "bar",
+        UserDbName = <<"userdb-626172">>,
+        set_config("couch_peruser", "delete_dbs", "true"),
+        create_user(TestAuthDb, User),
+        wait_for_db_create(UserDbName),
+        AfterCreate = lists:member(UserDbName, all_dbs()),
+        delete_user(TestAuthDb, User),
+        wait_for_db_delete(UserDbName),
+        AfterDelete = lists:member(UserDbName, all_dbs()),
+        ?assert(AfterCreate),
+        ?assertNot(AfterDelete)
+    end).
 
 should_delete_user_db_with_custom_prefix(TestAuthDb) ->
-    User = "bar",
-    UserDbName = <<"newuserdb-626172">>,
-    set_config("couch_peruser", "delete_dbs", "true"),
-    set_config("couch_peruser", "database_prefix", "newuserdb-"),
-    create_user(TestAuthDb, User),
-    wait_for_db_create(UserDbName),
-    AfterCreate = lists:member(UserDbName, all_dbs()),
-    delete_user(TestAuthDb, User),
-    wait_for_db_delete(UserDbName),
-    delete_config("couch_peruser", "database_prefix"),
-    AfterDelete = lists:member(UserDbName, all_dbs()),
-    [
-        ?_assert(AfterCreate),
-        ?_assertNot(AfterDelete)
-    ].
+    ?_test(begin
+        User = "bar",
+        UserDbName = <<"newuserdb-626172">>,
+        set_config("couch_peruser", "delete_dbs", "true"),
+        set_config("couch_peruser", "database_prefix", "newuserdb-"),
+        create_user(TestAuthDb, User),
+        wait_for_db_create(UserDbName),
+        AfterCreate = lists:member(UserDbName, all_dbs()),
+        delete_user(TestAuthDb, User),
+        wait_for_db_delete(UserDbName),
+        delete_config("couch_peruser", "database_prefix"),
+        AfterDelete = lists:member(UserDbName, all_dbs()),
+        ?assert(AfterCreate),
+        ?assertNot(AfterDelete)
+    end).
 
 should_delete_user_db_with_custom_special_prefix(TestAuthDb) ->
-    User = "bar",
-    UserDbName = <<"userdb_$()+--/626172">>,
-    set_config("couch_peruser", "delete_dbs", "true"),
-    set_config("couch_peruser", "database_prefix", "userdb_$()+--/"),
-    create_user(TestAuthDb, User),
-    wait_for_db_create(UserDbName),
-    AfterCreate = lists:member(UserDbName, all_dbs()),
-    delete_user(TestAuthDb, User),
-    wait_for_db_delete(UserDbName),
-    delete_config("couch_peruser", "database_prefix"),
-    AfterDelete = lists:member(UserDbName, all_dbs()),
-    [
-        ?_assert(AfterCreate),
-        ?_assertNot(AfterDelete)
-    ].
+    ?_test(begin
+        User = "bar",
+        UserDbName = <<"userdb_$()+--/626172">>,
+        set_config("couch_peruser", "delete_dbs", "true"),
+        set_config("couch_peruser", "database_prefix", "userdb_$()+--/"),
+        create_user(TestAuthDb, User),
+        wait_for_db_create(UserDbName),
+        AfterCreate = lists:member(UserDbName, all_dbs()),
+        delete_user(TestAuthDb, User),
+        wait_for_db_delete(UserDbName),
+        delete_config("couch_peruser", "database_prefix"),
+        AfterDelete = lists:member(UserDbName, all_dbs()),
+        ?assert(AfterCreate),
+        ?assertNot(AfterDelete)
+    end).
 
 should_reflect_config_changes(TestAuthDb) ->
-    User = "baz",
-    UserDbName = <<"userdb-62617a">>,
-    set_config("couch_peruser", "delete_dbs", "true"),
-    create_user(TestAuthDb, User),
-    wait_for_db_create(UserDbName),
-    AfterCreate1 = lists:member(UserDbName, all_dbs()),
-    delete_user(TestAuthDb, User),
-    timer:sleep(?WAIT_FOR_USER_DELETE_TIMEOUT),
-    wait_for_db_delete(UserDbName),
-    AfterDelete1 = lists:member(UserDbName, all_dbs()),
-    create_user(TestAuthDb, User),
-    wait_for_db_create(UserDbName),
-    AfterCreate2 = lists:member(UserDbName, all_dbs()),
-    set_config("couch_peruser", "delete_dbs", "false"),
-    delete_user(TestAuthDb, User),
-    timer:sleep(?WAIT_FOR_USER_DELETE_TIMEOUT),
-    AfterDelete2 = lists:member(UserDbName, all_dbs()),
-    create_user(TestAuthDb, User),
-    wait_for_db_create(UserDbName),
-    set_config("couch_peruser", "delete_dbs", "true"),
-    delete_user(TestAuthDb, User),
-    wait_for_db_delete(UserDbName),
-    AfterDelete3 = lists:member(UserDbName, all_dbs()),
-    set_config("couch_peruser", "enable", "false"),
-    create_user(TestAuthDb, User),
-    timer:sleep(?WAIT_FOR_USER_DELETE_TIMEOUT),
-    AfterCreate3 = lists:member(UserDbName, all_dbs()),
-    [
-        ?_assert(AfterCreate1),
-        ?_assertNot(AfterDelete1),
-        ?_assert(AfterCreate2),
-        ?_assert(AfterDelete2),
-        ?_assertNot(AfterDelete3),
-        ?_assertNot(AfterCreate3)
-    ].
+    {timeout, 10000, ?_test(begin
+        User = "baz",
+        UserDbName = <<"userdb-62617a">>,
+        set_config("couch_peruser", "delete_dbs", "true"),
+        create_user(TestAuthDb, User),
+        wait_for_db_create(UserDbName),
+        AfterCreate1 = lists:member(UserDbName, all_dbs()),
+        delete_user(TestAuthDb, User),
+        timer:sleep(?WAIT_FOR_USER_DELETE_TIMEOUT),
+        wait_for_db_delete(UserDbName),
+        AfterDelete1 = lists:member(UserDbName, all_dbs()),
+        create_user(TestAuthDb, User),
+        wait_for_db_create(UserDbName),
+        AfterCreate2 = lists:member(UserDbName, all_dbs()),
+        set_config("couch_peruser", "delete_dbs", "false"),
+        delete_user(TestAuthDb, User),
+        timer:sleep(?WAIT_FOR_USER_DELETE_TIMEOUT),
+        AfterDelete2 = lists:member(UserDbName, all_dbs()),
+        create_user(TestAuthDb, User),
+        wait_for_db_create(UserDbName),
+        set_config("couch_peruser", "delete_dbs", "true"),
+        delete_user(TestAuthDb, User),
+        wait_for_db_delete(UserDbName),
+        AfterDelete3 = lists:member(UserDbName, all_dbs()),
+        set_config("couch_peruser", "enable", "false"),
+        create_user(TestAuthDb, User),
+        timer:sleep(?WAIT_FOR_USER_DELETE_TIMEOUT),
+        AfterCreate3 = lists:member(UserDbName, all_dbs()),
+        ?assert(AfterCreate1),
+        ?assertNot(AfterDelete1),
+        ?assert(AfterCreate2),
+        ?assert(AfterDelete2),
+        ?assertNot(AfterDelete3),
+        ?assertNot(AfterCreate3)
+    end)}.
 
 
 should_add_user_to_db_admins(TestAuthDb) ->
-    User = "qux",
-    UserDbName = <<"userdb-717578">>,
-    create_user(TestAuthDb, User),
-    wait_for_db_create(UserDbName),
-    ?_assertEqual(
-        {[{<<"names">>,[<<"qux">>]}]},
-        proplists:get_value(<<"admins">>, get_security(UserDbName))).
+    ?_test(begin
+        User = "qux",
+        UserDbName = <<"userdb-717578">>,
+        create_user(TestAuthDb, User),
+        wait_for_db_create(UserDbName),
+        ?assertEqual(
+            {[{<<"names">>,[<<"qux">>]}]},
+            proplists:get_value(<<"admins">>, get_security(UserDbName)))
+    end).
 
 should_add_user_to_db_members(TestAuthDb) ->
-    User = "qux",
-    UserDbName = <<"userdb-717578">>,
-    create_user(TestAuthDb, User),
-    wait_for_db_create(UserDbName),
-    ?_assertEqual(
-        {[{<<"names">>,[<<"qux">>]}]},
-        proplists:get_value(<<"members">>, get_security(UserDbName))).
+    ?_test(begin
+        User = "qux",
+        UserDbName = <<"userdb-717578">>,
+        create_user(TestAuthDb, User),
+        wait_for_db_create(UserDbName),
+        ?assertEqual(
+            {[{<<"names">>,[<<"qux">>]}]},
+            proplists:get_value(<<"members">>, get_security(UserDbName)))
+    end).
 
 should_not_remove_existing_db_admins(TestAuthDb) ->
-    User = "qux",
-    UserDbName = <<"userdb-717578">>,
-    SecurityProperties = [
-        {<<"admins">>,{[{<<"names">>,[<<"foo">>,<<"bar">>]}]}},
-        {<<"members">>,{[{<<"names">>,[<<"baz">>,<<"pow">>]}]}}
-    ],
-    create_db(UserDbName),
-    set_security(UserDbName, SecurityProperties),
-    create_user(TestAuthDb, User),
-    wait_for_security_create(<<"admins">>, User, UserDbName),
-    {AdminProperties} = proplists:get_value(<<"admins">>,
-        get_security(UserDbName)),
-    AdminNames = proplists:get_value(<<"names">>, AdminProperties),
-    [
-      ?_assert(lists:member(<<"foo">>, AdminNames)),
-      ?_assert(lists:member(<<"bar">>, AdminNames)),
-      ?_assert(lists:member(<<"qux">>, AdminNames))
-    ].
+    ?_test(begin
+        User = "qux",
+        UserDbName = <<"userdb-717578">>,
+        SecurityProperties = [
+            {<<"admins">>,{[{<<"names">>,[<<"foo">>,<<"bar">>]}]}},
+            {<<"members">>,{[{<<"names">>,[<<"baz">>,<<"pow">>]}]}}
+        ],
+        create_db(UserDbName),
+        set_security(UserDbName, SecurityProperties),
+        create_user(TestAuthDb, User),
+        wait_for_security_create(<<"admins">>, User, UserDbName),
+        {AdminProperties} = proplists:get_value(<<"admins">>,
+            get_security(UserDbName)),
+        AdminNames = proplists:get_value(<<"names">>, AdminProperties),
+        ?assert(lists:member(<<"foo">>, AdminNames)),
+        ?assert(lists:member(<<"bar">>, AdminNames)),
+        ?assert(lists:member(<<"qux">>, AdminNames))
+    end).
 
 should_not_remove_existing_db_members(TestAuthDb) ->
-    User = "qux",
-    UserDbName = <<"userdb-717578">>,
-    SecurityProperties = [
-        {<<"admins">>,{[{<<"names">>,[<<"pow">>,<<"wow">>]}]}},
-        {<<"members">>,{[{<<"names">>,[<<"pow">>,<<"wow">>]}]}}
-    ],
-    create_db(UserDbName),
-    set_security(UserDbName, SecurityProperties),
-    create_user(TestAuthDb, User),
-    wait_for_security_create(<<"members">>, User, UserDbName),
-    {MemberProperties} = proplists:get_value(<<"members">>,
-        get_security(UserDbName)),
-    MemberNames = proplists:get_value(<<"names">>, MemberProperties),
-    [
-      ?_assert(lists:member(<<"pow">>, MemberNames)),
-      ?_assert(lists:member(<<"wow">>, MemberNames)),
-      ?_assert(lists:member(<<"qux">>, MemberNames))
-    ].
+    ?_test(begin
+        User = "qux",
+        UserDbName = <<"userdb-717578">>,
+        SecurityProperties = [
+            {<<"admins">>,{[{<<"names">>,[<<"pow">>,<<"wow">>]}]}},
+            {<<"members">>,{[{<<"names">>,[<<"pow">>,<<"wow">>]}]}}
+        ],
+        create_db(UserDbName),
+        set_security(UserDbName, SecurityProperties),
+        create_user(TestAuthDb, User),
+        wait_for_security_create(<<"members">>, User, UserDbName),
+        {MemberProperties} = proplists:get_value(<<"members">>,
+            get_security(UserDbName)),
+        MemberNames = proplists:get_value(<<"names">>, MemberProperties),
+        ?assert(lists:member(<<"pow">>, MemberNames)),
+        ?assert(lists:member(<<"wow">>, MemberNames)),
+        ?assert(lists:member(<<"qux">>, MemberNames))
+    end).
 
 should_remove_user_from_db_admins(TestAuthDb) ->
-    User = "qux",
-    UserDbName = <<"userdb-717578">>,
-    SecurityProperties = [
-        {<<"admins">>,{[{<<"names">>,[<<"foo">>,<<"bar">>]}]}},
-        {<<"members">>,{[{<<"names">>,[<<"baz">>,<<"pow">>]}]}}
-    ],
-    create_db(UserDbName),
-    set_security(UserDbName, SecurityProperties),
-    create_user(TestAuthDb, User),
-    wait_for_security_create(<<"admins">>, User, UserDbName),
-    {AdminProperties} = proplists:get_value(<<"admins">>,
-        get_security(UserDbName)),
-    AdminNames = proplists:get_value(<<"names">>, AdminProperties),
-    FooBefore = lists:member(<<"foo">>, AdminNames),
-    BarBefore = lists:member(<<"bar">>, AdminNames),
-    QuxBefore = lists:member(<<"qux">>, AdminNames),
-    delete_user(TestAuthDb, User),
-    wait_for_security_delete(<<"admins">>, User, UserDbName),
-    {NewAdminProperties} = proplists:get_value(<<"admins">>,
-        get_security(UserDbName)),
-    NewAdminNames = proplists:get_value(<<"names">>, NewAdminProperties),
-    FooAfter = lists:member(<<"foo">>, NewAdminNames),
-    BarAfter = lists:member(<<"bar">>, NewAdminNames),
-    QuxAfter = lists:member(<<"qux">>, NewAdminNames),
-    [
-      ?_assert(FooBefore),
-      ?_assert(BarBefore),
-      ?_assert(QuxBefore),
-      ?_assert(FooAfter),
-      ?_assert(BarAfter),
-      ?_assertNot(QuxAfter)
-    ].
+    ?_test(begin
+        User = "qux",
+        UserDbName = <<"userdb-717578">>,
+        SecurityProperties = [
+            {<<"admins">>,{[{<<"names">>,[<<"foo">>,<<"bar">>]}]}},
+            {<<"members">>,{[{<<"names">>,[<<"baz">>,<<"pow">>]}]}}
+        ],
+        create_db(UserDbName),
+        set_security(UserDbName, SecurityProperties),
+        create_user(TestAuthDb, User),
+        wait_for_security_create(<<"admins">>, User, UserDbName),
+        {AdminProperties} = proplists:get_value(<<"admins">>,
+            get_security(UserDbName)),
+        AdminNames = proplists:get_value(<<"names">>, AdminProperties),
+        FooBefore = lists:member(<<"foo">>, AdminNames),
+        BarBefore = lists:member(<<"bar">>, AdminNames),
+        QuxBefore = lists:member(<<"qux">>, AdminNames),
+        delete_user(TestAuthDb, User),
+        wait_for_security_delete(<<"admins">>, User, UserDbName),
+        {NewAdminProperties} = proplists:get_value(<<"admins">>,
+            get_security(UserDbName)),
+        NewAdminNames = proplists:get_value(<<"names">>, NewAdminProperties),
+        FooAfter = lists:member(<<"foo">>, NewAdminNames),
+        BarAfter = lists:member(<<"bar">>, NewAdminNames),
+        QuxAfter = lists:member(<<"qux">>, NewAdminNames),
+        ?assert(FooBefore),
+        ?assert(BarBefore),
+        ?assert(QuxBefore),
+        ?assert(FooAfter),
+        ?assert(BarAfter),
+        ?assertNot(QuxAfter)
+    end).
 
 should_remove_user_from_db_members(TestAuthDb) ->
-    User = "qux",
-    UserDbName = <<"userdb-717578">>,
-    SecurityProperties = [
-        {<<"admins">>,{[{<<"names">>,[<<"pow">>,<<"wow">>]}]}},
-        {<<"members">>,{[{<<"names">>,[<<"pow">>,<<"wow">>]}]}}
-    ],
-    create_db(UserDbName),
-    set_security(UserDbName, SecurityProperties),
-    create_user(TestAuthDb, User),
-    wait_for_security_create(<<"members">>, User, UserDbName),
-    {MemberProperties} = proplists:get_value(<<"members">>,
-        get_security(UserDbName)),
-    MemberNames = proplists:get_value(<<"names">>, MemberProperties),
-    PowBefore = lists:member(<<"pow">>, MemberNames),
-    WowBefore = lists:member(<<"wow">>, MemberNames),
-    QuxBefore = lists:member(<<"qux">>, MemberNames),
-    delete_user(TestAuthDb, User),
-    wait_for_security_delete(<<"members">>, User, UserDbName),
-    {NewMemberProperties} = proplists:get_value(<<"members">>,
-        get_security(UserDbName)),
-    NewMemberNames = proplists:get_value(<<"names">>, NewMemberProperties),
-    PowAfter = lists:member(<<"pow">>, NewMemberNames),
-    WowAfter = lists:member(<<"wow">>, NewMemberNames),
-    QuxAfter = lists:member(<<"qux">>, NewMemberNames),
-    [
-      ?_assert(PowBefore),
-      ?_assert(WowBefore),
-      ?_assert(QuxBefore),
-      ?_assert(PowAfter),
-      ?_assert(WowAfter),
-      ?_assertNot(QuxAfter)
-    ].
+    ?_test(begin
+        User = "qux",
+        UserDbName = <<"userdb-717578">>,
+        SecurityProperties = [
+            {<<"admins">>,{[{<<"names">>,[<<"pow">>,<<"wow">>]}]}},
+            {<<"members">>,{[{<<"names">>,[<<"pow">>,<<"wow">>]}]}}
+        ],
+        create_db(UserDbName),
+        set_security(UserDbName, SecurityProperties),
+        create_user(TestAuthDb, User),
+        wait_for_security_create(<<"members">>, User, UserDbName),
+        {MemberProperties} = proplists:get_value(<<"members">>,
+            get_security(UserDbName)),
+        MemberNames = proplists:get_value(<<"names">>, MemberProperties),
+        PowBefore = lists:member(<<"pow">>, MemberNames),
+        WowBefore = lists:member(<<"wow">>, MemberNames),
+        QuxBefore = lists:member(<<"qux">>, MemberNames),
+        delete_user(TestAuthDb, User),
+        wait_for_security_delete(<<"members">>, User, UserDbName),
+        {NewMemberProperties} = proplists:get_value(<<"members">>,
+            get_security(UserDbName)),
+        NewMemberNames = proplists:get_value(<<"names">>, NewMemberProperties),
+        PowAfter = lists:member(<<"pow">>, NewMemberNames),
+        WowAfter = lists:member(<<"wow">>, NewMemberNames),
+        QuxAfter = lists:member(<<"qux">>, NewMemberNames),
+        ?assert(PowBefore),
+        ?assert(WowBefore),
+        ?assert(QuxBefore),
+        ?assert(PowAfter),
+        ?assert(WowAfter),
+        ?assertNot(QuxAfter)
+    end).
+
 
 
 wait_for_db_create(UserDbName) ->


[couchdb] 03/04: Speed up couch_peruser tests

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davisp pushed a commit to branch speedup-test-suite
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit 47b7b5adae35d35edb3d8ec2b659497954728215
Author: Paul J. Davis <pa...@gmail.com>
AuthorDate: Thu Dec 19 11:11:52 2019 -0600

    Speed up couch_peruser tests
    
    The quiet and start periods of a second were costing quite a bit of
    time. Setting them to zero shaves off about 26 seconds.
---
 src/couch_peruser/test/eunit/couch_peruser_test.erl | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/couch_peruser/test/eunit/couch_peruser_test.erl b/src/couch_peruser/test/eunit/couch_peruser_test.erl
index e128d31..5ddbe7a 100644
--- a/src/couch_peruser/test/eunit/couch_peruser_test.erl
+++ b/src/couch_peruser/test/eunit/couch_peruser_test.erl
@@ -18,7 +18,7 @@
 -define(ADMIN_USERNAME, "admin").
 -define(ADMIN_PASSWORD, "secret").
 
--define(WAIT_FOR_USER_DELETE_TIMEOUT, 3000).
+-define(WAIT_FOR_USER_DELETE_TIMEOUT, 1000).
 
 setup_all() ->
     TestCtx = test_util:start_couch([chttpd]),
@@ -37,8 +37,8 @@ setup() ->
     do_request(put, get_base_url() ++ "/" ++ ?b2l(TestAuthDb)),
     do_request(put, get_cluster_base_url() ++ "/" ++ ?b2l(TestAuthDb)),
     set_config("couch_httpd_auth", "authentication_db", ?b2l(TestAuthDb)),
-    set_config("couch_peruser", "cluster_quiet_period", "1"),
-    set_config("couch_peruser", "cluster_start_period", "1"),
+    set_config("couch_peruser", "cluster_quiet_period", "0"),
+    set_config("couch_peruser", "cluster_start_period", "0"),
     set_config("couch_peruser", "enable", "true"),
     set_config("cluster", "n", "1"),
     TestAuthDb.


[couchdb] 01/04: Avoid sleeping for skipped tests

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davisp pushed a commit to branch speedup-test-suite
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit 736f1eac46836adf0d36643a45016b7c8e446867
Author: Paul J. Davis <pa...@gmail.com>
AuthorDate: Thu Dec 19 10:23:27 2019 -0600

    Avoid sleeping for skipped tests
    
    We sleep for a bit more than a second for each test. Rather than using
    return to skip a test we just mark the test as skipped so we don't
    have to waste time. This saves about 25s on the test suite.
---
 test/javascript/cli_runner.js                      |  4 ++
 test/javascript/run                                | 15 +++--
 .../attachments_delete_overridden_quorum.js        |  3 +-
 .../with-quorum/attachments_overridden_quorum.js   |  3 +-
 .../with-quorum/db_creation_overridden_quorum.js   |  3 +-
 .../with-quorum/doc_copy_overridden_quorum.js      |  3 +-
 .../without-quorum/attachments_delete.js           |  3 +-
 .../attachments_delete_overridden_quorum.js        |  3 +-
 .../db_creation_overridden_quorum.js               |  3 +-
 .../without-quorum/doc_copy_overridden_quorum.js   |  3 +-
 test/javascript/tests/etags_views.js               | 27 ++++-----
 .../tests/replicator_db_compact_rep_db.js          |  3 +-
 test/javascript/tests/replicator_db_continuous.js  |  3 +-
 .../tests/replicator_db_credential_delegation.js   |  3 +-
 .../tests/replicator_db_field_validation.js        |  3 +-
 test/javascript/tests/replicator_db_filtered.js    |  3 +-
 test/javascript/tests/replicator_db_identical.js   |  3 +-
 .../tests/replicator_db_identical_continuous.js    |  3 +-
 .../tests/replicator_db_invalid_filter.js          |  3 +-
 test/javascript/tests/replicator_db_security.js    |  5 +-
 test/javascript/tests/replicator_db_simple.js      |  3 +-
 test/javascript/tests/replicator_db_successive.js  |  3 +-
 test/javascript/tests/replicator_db_survives.js    |  3 +-
 test/javascript/tests/replicator_db_swap_rep_db.js |  3 +-
 .../tests/replicator_db_update_security.js         |  3 +-
 test/javascript/tests/replicator_db_user_ctx.js    |  3 +-
 test/javascript/tests/replicator_db_write_auth.js  |  3 +-
 test/javascript/tests/stats.js                     | 65 +++++++++++-----------
 28 files changed, 92 insertions(+), 93 deletions(-)

diff --git a/test/javascript/cli_runner.js b/test/javascript/cli_runner.js
index dbaf1c2..5d7a980 100644
--- a/test/javascript/cli_runner.js
+++ b/test/javascript/cli_runner.js
@@ -22,6 +22,10 @@ function runTest() {
   var count = 0;
   var start = new Date().getTime();
 
+  if(couchTests.skip) {
+      quit(2);
+  }
+
   for(var name in couchTests) {
       count++;
   }
diff --git a/test/javascript/run b/test/javascript/run
index 1fa605d..ebcdef9 100755
--- a/test/javascript/run
+++ b/test/javascript/run
@@ -44,14 +44,17 @@ RUNNER = "test/javascript/cli_runner.js"
 def mkformatter(tests):
     longest = max([len(x) for x in tests])
     green = "\033[32m"
+    orange = "\033[33m"
     red = "\033[31m"
     clear = "\033[0m"
     if not sys.stderr.isatty():
-        green, read, clear = "", "", ""
+        green, orange, red, clear = "", "", "", ""
 
-    def _colorized(passed):
-        if passed:
+    def _colorized(rval):
+        if rval == 0:
             return green + "pass" + clear
+        elif rval == 2:
+            return orange + "skipped" + clear
         else:
             return red + "fail" + clear
 
@@ -60,7 +63,7 @@ def mkformatter(tests):
             padding = (longest - len(test)) * " "
             sys.stderr.write(test + "   " + padding)
             sys.stderr.flush()
-        elif isinstance(test, bool):
+        elif isinstance(test, int):
             if test:
                 sys.stderr.write(_colorized(test) + os.linesep)
             else:
@@ -86,7 +89,7 @@ def run_couchjs(test, fmt):
         line = line.decode()
         sys.stderr.write(line)
     p.wait()
-    fmt(p.returncode == 0)
+    fmt(p.returncode)
     return p.returncode
 
 
@@ -163,7 +166,7 @@ def main():
         fmt = mkformatter(tests)
         for test in tests:
             result = run_couchjs(test, fmt)
-            if result == 0:
+            if result == 0 or result == 2:
                 passed += 1
             else:
                 failed += 1
diff --git a/test/javascript/tests-cluster/with-quorum/attachments_delete_overridden_quorum.js b/test/javascript/tests-cluster/with-quorum/attachments_delete_overridden_quorum.js
index 1994a0a..79c070e 100644
--- a/test/javascript/tests-cluster/with-quorum/attachments_delete_overridden_quorum.js
+++ b/test/javascript/tests-cluster/with-quorum/attachments_delete_overridden_quorum.js
@@ -10,6 +10,7 @@
 // License for the specific language governing permissions and limitations under
 // the License.
 
+couchTests.skip = true;
 couchTests.attachments_delete_overridden_quorum= function(debug) {
   var db_name = get_random_db_name();
   var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"},{"w":3});
@@ -25,7 +26,7 @@ couchTests.attachments_delete_overridden_quorum= function(debug) {
   var rev = JSON.parse(xhr.responseText).rev;
 
   xhr = CouchDB.request("DELETE", "/" + db_name + "/dummy/foo.txt?rev=" + rev);
-  console.log("Skipped-TODO: Clarify correct behaviour. Is not considering overridden quorum. 202->"+xhr.status);
+  console.log("TODO: Clarify correct behaviour. Is not considering overridden quorum. 202->"+xhr.status);
   // TODO: Define correct behaviour
   //T(xhr.status == 202,"Should return 202 but returns "+xhr.status);
 
diff --git a/test/javascript/tests-cluster/with-quorum/attachments_overridden_quorum.js b/test/javascript/tests-cluster/with-quorum/attachments_overridden_quorum.js
index 22c8a4c..f9deb15 100644
--- a/test/javascript/tests-cluster/with-quorum/attachments_overridden_quorum.js
+++ b/test/javascript/tests-cluster/with-quorum/attachments_overridden_quorum.js
@@ -11,6 +11,7 @@
 // the License.
 
 //Test attachments operations with an overridden quorum parameter
+couchTests.skip = true;
 couchTests.attachments_overriden_quorum= function(debug) {
   var db_name = get_random_db_name();
   var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"},{"w":3});
@@ -32,7 +33,7 @@ couchTests.attachments_overriden_quorum= function(debug) {
     body:"This is no base64 encoded text-2",
     headers:{"Content-Type": "text/plain;charset=utf-8"}
   });
-  console.log("Skipped-TODO: Clarify correct behaviour. Is not considering overridden quorum. 202->"+xhr.status);
+  console.log("TODO: Clarify correct behaviour. Is not considering overridden quorum. 202->"+xhr.status);
   //TODO: Define correct behaviour
   //T(xhr.status == 202,"Should return 202");
 
diff --git a/test/javascript/tests-cluster/with-quorum/db_creation_overridden_quorum.js b/test/javascript/tests-cluster/with-quorum/db_creation_overridden_quorum.js
index 14d319c..1e69cd8 100644
--- a/test/javascript/tests-cluster/with-quorum/db_creation_overridden_quorum.js
+++ b/test/javascript/tests-cluster/with-quorum/db_creation_overridden_quorum.js
@@ -11,6 +11,7 @@
 // the License.
 
 // Do DB creation under cluster with quorum conditions but overriding write quorum.
+couchTests.skip = true;
 couchTests.db_creation_overridden_quorum = function(debug) {
 
   if (debug) debugger;
@@ -20,7 +21,7 @@ couchTests.db_creation_overridden_quorum = function(debug) {
 
   // DB Creation should return 202 - Accepted
   xhr = CouchDB.request("PUT", "/" + db_name + "/");
-  console.log("Skipped-TODO: Clarify correct behaviour. Is not considering overridden quorum. 202->"+xhr.status)
+  console.log("TODO: Clarify correct behaviour. Is not considering overridden quorum. 202->"+xhr.status)
   //T(xhr.status == 202,"Should return 202");
 
   // cleanup
diff --git a/test/javascript/tests-cluster/with-quorum/doc_copy_overridden_quorum.js b/test/javascript/tests-cluster/with-quorum/doc_copy_overridden_quorum.js
index 23fbc97..1ceef97 100644
--- a/test/javascript/tests-cluster/with-quorum/doc_copy_overridden_quorum.js
+++ b/test/javascript/tests-cluster/with-quorum/doc_copy_overridden_quorum.js
@@ -10,6 +10,7 @@
 // License for the specific language governing permissions and limitations under
 // the License.
 
+couchTests.skip = true;
 couchTests.doc_copy_overriden_quorum = function(debug) {
   var db_name = get_random_db_name();
   var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"},{"w":3});
@@ -23,7 +24,7 @@ couchTests.doc_copy_overriden_quorum = function(debug) {
   });
   //TODO: Define correct behaviour
   //T(xhr.status=="202","Should return 202");
-  console.log("Skipped-TODO: Clarify correct behaviour. Is not considering overridden quorum. 202->"+xhr.status);
+  console.log("TODO: Clarify correct behaviour. Is not considering overridden quorum. 202->"+xhr.status);
 
   db.deleteDb();
 
diff --git a/test/javascript/tests-cluster/without-quorum/attachments_delete.js b/test/javascript/tests-cluster/without-quorum/attachments_delete.js
index d05fcaf..48a33d2 100644
--- a/test/javascript/tests-cluster/without-quorum/attachments_delete.js
+++ b/test/javascript/tests-cluster/without-quorum/attachments_delete.js
@@ -10,6 +10,7 @@
 // License for the specific language governing permissions and limitations under
 // the License.
 
+couchTests.skip = true;
 couchTests.attachments_delete= function(debug) {
   var db_name = get_random_db_name();
   var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
@@ -26,7 +27,7 @@ couchTests.attachments_delete= function(debug) {
   var rev = JSON.parse(xhr.responseText).rev;
 
   xhr = CouchDB.request("DELETE", "/" + db_name + "/dummy/foo.txt?rev=" + rev);
-  console.log("Skipped-TODO: Clarify correct behaviour. Is not considering quorum. 202->"+xhr.status);
+  console.log("TODO: Clarify correct behaviour. Is not considering quorum. 202->"+xhr.status);
   //TODO: Define correct behaviour
   //T(xhr.status == 202,"Should return 202 Accepted but returns "+xhr.status);
 
diff --git a/test/javascript/tests-cluster/without-quorum/attachments_delete_overridden_quorum.js b/test/javascript/tests-cluster/without-quorum/attachments_delete_overridden_quorum.js
index 906391a..c3b95f8 100644
--- a/test/javascript/tests-cluster/without-quorum/attachments_delete_overridden_quorum.js
+++ b/test/javascript/tests-cluster/without-quorum/attachments_delete_overridden_quorum.js
@@ -10,6 +10,7 @@
 // License for the specific language governing permissions and limitations under
 // the License.
 
+couchTests.skip = true;
 couchTests.attachments_delete_overridden_quorum= function(debug) {
   var db_name = get_random_db_name();
   var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"},{"w":1});
@@ -25,7 +26,7 @@ couchTests.attachments_delete_overridden_quorum= function(debug) {
   var rev = JSON.parse(xhr.responseText).rev;
 
   xhr = CouchDB.request("DELETE", "/" + db_name + "/dummy/foo.txt?rev=" + rev);
-  console.log("Skipped-TODO: Clarify correct behaviour. Is not considering quorum. 202->"+xhr.status);
+  console.log("TODO: Clarify correct behaviour. Is not considering quorum. 202->"+xhr.status);
   //TODO: Define correct behaviour
   //T(xhr.status == 200,"Should return 200 but returns "+xhr.status);
 
diff --git a/test/javascript/tests-cluster/without-quorum/db_creation_overridden_quorum.js b/test/javascript/tests-cluster/without-quorum/db_creation_overridden_quorum.js
index 6d5d798..7cee52e 100644
--- a/test/javascript/tests-cluster/without-quorum/db_creation_overridden_quorum.js
+++ b/test/javascript/tests-cluster/without-quorum/db_creation_overridden_quorum.js
@@ -11,6 +11,7 @@
 // the License.
 
 // Do DB creation under cluster with quorum conditions but overriding write quorum.
+couchTests.skip = true;
 couchTests.db_creation_overridden_quorum = function(debug) {
 
   if (debug) debugger;
@@ -20,7 +21,7 @@ couchTests.db_creation_overridden_quorum = function(debug) {
 
   // DB Creation should return 201 - Created
   xhr = CouchDB.request("PUT", "/" + db_name + "/");
-  console.log("Skipped-TODO: Clarify correct behaviour. Is not considering overridden quorum. 201->"+xhr.status)
+  console.log("TODO: Clarify correct behaviour. Is not considering overridden quorum. 201->"+xhr.status)
   //T(xhr.status == 201,"Should return 201");
 
   //db.deleteDb();
diff --git a/test/javascript/tests-cluster/without-quorum/doc_copy_overridden_quorum.js b/test/javascript/tests-cluster/without-quorum/doc_copy_overridden_quorum.js
index e72425d..bf372ca 100644
--- a/test/javascript/tests-cluster/without-quorum/doc_copy_overridden_quorum.js
+++ b/test/javascript/tests-cluster/without-quorum/doc_copy_overridden_quorum.js
@@ -10,6 +10,7 @@
 // License for the specific language governing permissions and limitations under
 // the License.
 
+couchTests.skip = true;
 couchTests.doc_copy_overriden_quorum = function(debug) {
   var db_name = get_random_db_name();
   var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"},{"w":1});
@@ -21,7 +22,7 @@ couchTests.doc_copy_overriden_quorum = function(debug) {
   var xhr = CouchDB.request("COPY", "/" + db_name + "/dummy", {
     headers: {"Destination":"dummy2"}
   });
-  console.log("Skipped-TODO: Clarify correct behaviour. Is not considering overridden quorum. 201->"+xhr.status);
+  console.log("TODO: Clarify correct behaviour. Is not considering overridden quorum. 201->"+xhr.status);
   //TODO Defie correct behaviour
   //T(xhr.status=="201","Should return 201");
 
diff --git a/test/javascript/tests/etags_views.js b/test/javascript/tests/etags_views.js
index 6c110f8..555fe66 100644
--- a/test/javascript/tests/etags_views.js
+++ b/test/javascript/tests/etags_views.js
@@ -10,8 +10,9 @@
 // License for the specific language governing permissions and limitations under
 // the License.
 
+// TODO: https://issues.apache.org/jira/browse/COUCHDB-2859
+couchTests.skip = true;
 couchTests.etags_views = function(debug) {
-  return console.log('TODO: see https://issues.apache.org/jira/browse/COUCHDB-2859');
   var db_name = get_random_db_name();
   var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"true"});
   db.createDb();
@@ -79,7 +80,7 @@ couchTests.etags_views = function(debug) {
   xhr = CouchDB.request("GET", "/" + db_name + "/_design/etags/_view/basicView?include_docs=true");
   var etag2 = xhr.getResponseHeader("etag");
   T(etag1 != etag2);
- 
+
   // Verify that purges affect etags
   xhr = CouchDB.request("GET", "/" + db_name + "/_design/etags/_view/fooView");
   var foo_etag = xhr.getResponseHeader("etag");
@@ -180,7 +181,7 @@ couchTests.etags_views = function(debug) {
   );
   etag2 = xhr.getResponseHeader("etag");
   T(etag1 != etag2, "POST to reduce view generates key-depdendent ETags");
-  
+
   // all docs
   xhr = CouchDB.request("GET", "/" + db_name + "/_all_docs");
   T(xhr.status == 200);
@@ -201,21 +202,21 @@ couchTests.etags_views = function(debug) {
 
   // list etag
   // in the list test for now
-  
-  // A new database should have unique _all_docs etags. 
-  db.deleteDb(); 
+
+  // A new database should have unique _all_docs etags.
+  db.deleteDb();
   db.createDb(); // TODO: when re-activating try having a new DB name
-  db.save({a: 1}); 
-  xhr = CouchDB.request("GET", "/" + db_name + "/_all_docs"); 
-  var etag = xhr.getResponseHeader("etag"); 
-  db.deleteDb(); 
+  db.save({a: 1});
+  xhr = CouchDB.request("GET", "/" + db_name + "/_all_docs");
+  var etag = xhr.getResponseHeader("etag");
+  db.deleteDb();
   db.createDb(); // TODO: when re-activating try having a new DB name
-  db.save({a: 2}); 
-  xhr = CouchDB.request("GET", "/" + db_name + "/_all_docs"); 
+  db.save({a: 2});
+  xhr = CouchDB.request("GET", "/" + db_name + "/_all_docs");
   var new_etag = xhr.getResponseHeader("etag");
   T(etag != new_etag);
   // but still be cacheable
-  xhr = CouchDB.request("GET", "/" + db_name + "/_all_docs"); 
+  xhr = CouchDB.request("GET", "/" + db_name + "/_all_docs");
   T(new_etag == xhr.getResponseHeader("etag"));
 
   // cleanup
diff --git a/test/javascript/tests/replicator_db_compact_rep_db.js b/test/javascript/tests/replicator_db_compact_rep_db.js
index 8bd45f9..e8ba326 100644
--- a/test/javascript/tests/replicator_db_compact_rep_db.js
+++ b/test/javascript/tests/replicator_db_compact_rep_db.js
@@ -10,9 +10,8 @@
 // License for the specific language governing permissions and limitations under
 // the License.
 
+couchTests.skip = true;
 couchTests.replicator_db_compact_rep_db = function(debug) {
-  return console.log('TODO');
-
   if (debug) debugger;
 
   var populate_db = replicator_db.populate_db;
diff --git a/test/javascript/tests/replicator_db_continuous.js b/test/javascript/tests/replicator_db_continuous.js
index 63174e9..6d37149 100644
--- a/test/javascript/tests/replicator_db_continuous.js
+++ b/test/javascript/tests/replicator_db_continuous.js
@@ -10,9 +10,8 @@
 // License for the specific language governing permissions and limitations under
 // the License.
 
+couchTests.skip = true;
 couchTests.replicator_db_continuous = function(debug) {
-  return console.log('TODO');
-
   if (debug) debugger;
 
   var populate_db = replicator_db.populate_db;
diff --git a/test/javascript/tests/replicator_db_credential_delegation.js b/test/javascript/tests/replicator_db_credential_delegation.js
index 6401819..7ec7711 100644
--- a/test/javascript/tests/replicator_db_credential_delegation.js
+++ b/test/javascript/tests/replicator_db_credential_delegation.js
@@ -10,9 +10,8 @@
 // License for the specific language governing permissions and limitations under
 // the License.
 
+couchTests.skip = true;
 couchTests.replicator_db_credential_delegation = function(debug) {
-  return console.log('TODO');
-
   if (debug) debugger;
 
   var populate_db = replicator_db.populate_db;
diff --git a/test/javascript/tests/replicator_db_field_validation.js b/test/javascript/tests/replicator_db_field_validation.js
index 9e7bb89..4442c88 100644
--- a/test/javascript/tests/replicator_db_field_validation.js
+++ b/test/javascript/tests/replicator_db_field_validation.js
@@ -10,9 +10,8 @@
 // License for the specific language governing permissions and limitations under
 // the License.
 
+couchTests.skip = true;
 couchTests.replicator_db_field_validation = function(debug) {
-  return console.log('TODO');
-
   if (debug) debugger;
 
   var populate_db = replicator_db.populate_db;
diff --git a/test/javascript/tests/replicator_db_filtered.js b/test/javascript/tests/replicator_db_filtered.js
index 7675b41..4c1cfb3 100644
--- a/test/javascript/tests/replicator_db_filtered.js
+++ b/test/javascript/tests/replicator_db_filtered.js
@@ -10,9 +10,8 @@
 // License for the specific language governing permissions and limitations under
 // the License.
 
+couchTests.skip = true;
 couchTests.replicator_db_filtered = function(debug) {
-  return console.log('TODO');
-
   if (debug) debugger;
 
   var populate_db = replicator_db.populate_db;
diff --git a/test/javascript/tests/replicator_db_identical.js b/test/javascript/tests/replicator_db_identical.js
index 15bedc6..a51fb67 100644
--- a/test/javascript/tests/replicator_db_identical.js
+++ b/test/javascript/tests/replicator_db_identical.js
@@ -10,9 +10,8 @@
 // License for the specific language governing permissions and limitations under
 // the License.
 
+couchTests.skip = true;
 couchTests.replicator_db_identical = function(debug) {
-  return console.log('TODO');
-
   if (debug) debugger;
 
   var populate_db = replicator_db.populate_db;
diff --git a/test/javascript/tests/replicator_db_identical_continuous.js b/test/javascript/tests/replicator_db_identical_continuous.js
index bafa19c..37495ec 100644
--- a/test/javascript/tests/replicator_db_identical_continuous.js
+++ b/test/javascript/tests/replicator_db_identical_continuous.js
@@ -10,9 +10,8 @@
 // License for the specific language governing permissions and limitations under
 // the License.
 
+couchTests.skip = true;
 couchTests.replicator_db_identical_continuous = function(debug) {
-  return console.log('TODO');
-
   if (debug) debugger;
 
   var populate_db = replicator_db.populate_db;
diff --git a/test/javascript/tests/replicator_db_invalid_filter.js b/test/javascript/tests/replicator_db_invalid_filter.js
index 38c7469..a974ad2 100644
--- a/test/javascript/tests/replicator_db_invalid_filter.js
+++ b/test/javascript/tests/replicator_db_invalid_filter.js
@@ -10,9 +10,8 @@
 // License for the specific language governing permissions and limitations under
 // the License.
 
+couchTests.skip = true;
 couchTests.replicator_db_invalid_filter = function(debug) {
-  return console.log('TODO');
-
   if (debug) debugger;
 
   var populate_db = replicator_db.populate_db;
diff --git a/test/javascript/tests/replicator_db_security.js b/test/javascript/tests/replicator_db_security.js
index ffb5c40..4994958 100644
--- a/test/javascript/tests/replicator_db_security.js
+++ b/test/javascript/tests/replicator_db_security.js
@@ -10,9 +10,8 @@
 // License for the specific language governing permissions and limitations under
 // the License.
 
+couchTests.skip = true;
 couchTests.replicator_db_security = function(debug) {
-  return console.log('TODO');
-
   var reset_dbs = function(dbs) {
     dbs.forEach(function(db) {
       db.deleteDb();
@@ -166,7 +165,7 @@ couchTests.replicator_db_security = function(debug) {
         names : ["benoitc"]
       }
     }).ok);
-    
+
     run_on_modified_server([
         {
           section: "admins",
diff --git a/test/javascript/tests/replicator_db_simple.js b/test/javascript/tests/replicator_db_simple.js
index 61fed8d..ad0a692 100644
--- a/test/javascript/tests/replicator_db_simple.js
+++ b/test/javascript/tests/replicator_db_simple.js
@@ -10,9 +10,8 @@
 // License for the specific language governing permissions and limitations under
 // the License.
 
+couchTests.skip = true;
 couchTests.replicator_db_simple = function(debug) {
-  return console.log('TODO');
-
   if (debug) debugger;
 
   var populate_db = replicator_db.populate_db;
diff --git a/test/javascript/tests/replicator_db_successive.js b/test/javascript/tests/replicator_db_successive.js
index c556baf..d2ff4df 100644
--- a/test/javascript/tests/replicator_db_successive.js
+++ b/test/javascript/tests/replicator_db_successive.js
@@ -10,9 +10,8 @@
 // License for the specific language governing permissions and limitations under
 // the License.
 
+couchTests.skip = true;
 couchTests.replicator_db_successive = function(debug) {
-  return console.log('TODO');
-
   if (debug) debugger;
 
   var populate_db = replicator_db.populate_db;
diff --git a/test/javascript/tests/replicator_db_survives.js b/test/javascript/tests/replicator_db_survives.js
index 2fa69da..e44156d 100644
--- a/test/javascript/tests/replicator_db_survives.js
+++ b/test/javascript/tests/replicator_db_survives.js
@@ -10,9 +10,8 @@
 // License for the specific language governing permissions and limitations under
 // the License.
 
+couchTests.skip = true;
 couchTests.replicator_db_survives = function(debug) {
-  return console.log('TODO');
-
   if (debug) debugger;
 
   var populate_db = replicator_db.populate_db;
diff --git a/test/javascript/tests/replicator_db_swap_rep_db.js b/test/javascript/tests/replicator_db_swap_rep_db.js
index a802134..4eac484 100644
--- a/test/javascript/tests/replicator_db_swap_rep_db.js
+++ b/test/javascript/tests/replicator_db_swap_rep_db.js
@@ -10,9 +10,8 @@
 // License for the specific language governing permissions and limitations under
 // the License.
 
+couchTests.skip = true;
 couchTests.replicator_db_swap_rep_db = function(debug) {
-  return console.log('TODO');
-
   if (debug) debugger;
 
   var populate_db = replicator_db.populate_db;
diff --git a/test/javascript/tests/replicator_db_update_security.js b/test/javascript/tests/replicator_db_update_security.js
index 78d02af..73c28f9 100644
--- a/test/javascript/tests/replicator_db_update_security.js
+++ b/test/javascript/tests/replicator_db_update_security.js
@@ -10,9 +10,8 @@
 // License for the specific language governing permissions and limitations under
 // the License.
 
+couchTests.skip = true;
 couchTests.replicator_db_update_security = function(debug) {
-  return console.log('TODO');
-
   if (debug) debugger;
 
   var populate_db = replicator_db.populate_db;
diff --git a/test/javascript/tests/replicator_db_user_ctx.js b/test/javascript/tests/replicator_db_user_ctx.js
index 353e2ed..06ca781 100644
--- a/test/javascript/tests/replicator_db_user_ctx.js
+++ b/test/javascript/tests/replicator_db_user_ctx.js
@@ -10,9 +10,8 @@
 // License for the specific language governing permissions and limitations under
 // the License.
 
+couchTests.skip = true;
 couchTests.replicator_db_user_ctx = function(debug) {
-  return console.log('TODO');
-
   if (debug) debugger;
 
   var populate_db = replicator_db.populate_db;
diff --git a/test/javascript/tests/replicator_db_write_auth.js b/test/javascript/tests/replicator_db_write_auth.js
index 9745395..2ac27c2 100644
--- a/test/javascript/tests/replicator_db_write_auth.js
+++ b/test/javascript/tests/replicator_db_write_auth.js
@@ -10,9 +10,8 @@
 // License for the specific language governing permissions and limitations under
 // the License.
 
+couchTests.skip = true;
 couchTests.replicator_db_survives = function(debug) {
-  return console.log('TODO');
-
   if (debug) debugger;
 
   var populate_db = replicator_db.populate_db;
diff --git a/test/javascript/tests/stats.js b/test/javascript/tests/stats.js
index be9d4d2..3a89ddd 100644
--- a/test/javascript/tests/stats.js
+++ b/test/javascript/tests/stats.js
@@ -10,11 +10,10 @@
 // License for the specific language governing permissions and limitations under
 // the License.
 
+// test has become very flaky - needs complete rewrite
+couchTests.skip = true;
 couchTests.stats = function(debug) {
 
-  // test has become very flaky - needs complete rewrite
-  return console.log('TODO');
-
   function newDb(doSetup) {
     var db_name = get_random_db_name();
     var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
@@ -65,14 +64,14 @@ couchTests.stats = function(debug) {
   (function() {
     var db = newDb(false);
     db.deleteDb();
-  
+
     var before = getStat(["couchdb", "open_databases"]);
     db.createDb();
     var after = getStat(["couchdb", "open_databases"]);
     TEquals(before+8, after, "Creating a db increments open db count.");
     db.deleteDb();
   })();
-  
+
   runTest(["couchdb", "open_databases"], {
     setup: function() {restartServer();},
     run: function(db) {db.open("123");},
@@ -80,7 +79,7 @@ couchTests.stats = function(debug) {
       T(before<after, "Opening a db increases open db count.");
     }
   });
-  
+
   runTest(["couchdb", "open_databases"], {
     setup: function(db) {restartServer(); db.open("123");},
     run: function(db) {db.deleteDb();},
@@ -88,16 +87,16 @@ couchTests.stats = function(debug) {
       T(before>after, "Deleting a db decrements open db count.");
     }
   });
-  
-  /* Improvements in LRU has made this test difficult... 
+
+  /* Improvements in LRU has made this test difficult...
   (function() {
     restartServer();
     var max = 5;
-    
+
     var testFun = function() {
       var pre_dbs = getStat(["couchdb", "open_databases"]) || 0;
       var pre_files = getStat(["couchdb", "open_os_files"]) || 0;
-     
+
       var triggered = false;
       var db = null;
       var dbs = [];
@@ -117,15 +116,15 @@ couchTests.stats = function(debug) {
         db.save({"a": "1"});
       }
       T(triggered, "We managed to force a all_dbs_active error.");
-      
+
       var open_dbs = getStat(["couchdb", "open_databases"]);
       TEquals(open_dbs > 0, true, "We actually opened some dbs.");
       TEquals(max, open_dbs, "We only have max db's open.");
-      
+
       for (var i = 0; i < dbs.length; i++) {
         dbs[i].deleteDb();
       }
-      
+
       var post_dbs = getStat(["couchdb", "open_databases"]);
       var post_files = getStat(["couchdb", "open_os_files"]);
       TEquals(pre_dbs, post_dbs, "We have the same number of open dbs.");
@@ -134,14 +133,14 @@ couchTests.stats = function(debug) {
         dbs[ctr].deleteDb();
       }
     };
-    
+
     run_on_modified_server(
       [{section: "couchdb", key: "max_dbs_open", value: "40"}],
       testFun
     );
   })();
   */
-  
+
   // Just fetching the before value is the extra +1 in test
   runTest(["couchdb", "httpd", "requests"], {
     run: function() {CouchDB.request("GET", "/");},
@@ -149,7 +148,7 @@ couchTests.stats = function(debug) {
       TEquals(before+2, after, "Request counts are incremented properly.");
     }
   });
-  
+
   runTest(["couchdb", "database_reads"], {
     setup: function(db) {db.save({"_id": "test"});},
     run: function(db) {db.open("test");},
@@ -157,7 +156,7 @@ couchTests.stats = function(debug) {
       T(before<after, "Reading a doc increments docs reads.");
     }
   });
-  
+
   runTest(["couchdb", "database_reads"], {
     setup: function(db) {db.save({"_id": "test"});},
     run: function(db) {db.request("GET", "/");},
@@ -165,7 +164,7 @@ couchTests.stats = function(debug) {
       TEquals(before, after, "Only doc reads increment doc reads.");
     }
   });
-  
+
   runTest(["couchdb", "database_reads"], {
     setup: function(db) {db.save({"_id": "test"});},
     run: function(db) {db.open("test", {"open_revs": "all"});},
@@ -173,14 +172,14 @@ couchTests.stats = function(debug) {
       T(before<after, "Reading doc revs increments docs reads.");
     }
   });
-  
+
   runTest(["couchdb", "database_writes"], {
     run: function(db) {db.save({"a": "1"});},
     test: function(before, after) {
       T(before<after, "Saving docs incrememnts doc writes.");
     }
   });
-  
+
   runTest(["couchdb", "database_writes"], {
     run: function(db) {
       CouchDB.request("POST", "/" + db.name + "", {
@@ -192,7 +191,7 @@ couchTests.stats = function(debug) {
       T(before<after, "POST'ing new docs increments doc writes.");
     }
   });
-  
+
   runTest(["couchdb", "database_writes"], {
     setup: function(db) {db.save({"_id": "test"});},
     run: function(db) {var doc = db.open("test"); db.save(doc);},
@@ -200,7 +199,7 @@ couchTests.stats = function(debug) {
       T(before<after, "Updating docs incrememnts doc writes.");
     }
   });
-  
+
   runTest(["couchdb", "database_writes"], {
     setup: function(db) {db.save({"_id": "test"});},
     run: function(db) {var doc = db.open("test"); db.deleteDoc(doc);},
@@ -208,7 +207,7 @@ couchTests.stats = function(debug) {
       T(before<after, "Deleting docs increments doc writes.");
     }
   });
-  
+
   runTest(["couchdb", "database_writes"], {
     setup: function(db) {db.save({"_id": "test"});},
     run: function(db) {
@@ -220,7 +219,7 @@ couchTests.stats = function(debug) {
       T(before<after, "Copying docs increments doc writes.");
     }
   });
-  
+
   runTest(["couchdb", "database_writes"], {
     run: function(db) {
       CouchDB.request("PUT", "/" + db.name + "/bin_doc2/foo2.txt", {
@@ -232,7 +231,7 @@ couchTests.stats = function(debug) {
       T(before<after, "Create with attachment increments doc writes.");
     }
   });
-  
+
   runTest(["couchdb", "database_writes"], {
     setup: function(db) {db.save({"_id": "test"});},
     run: function(db) {
@@ -246,21 +245,21 @@ couchTests.stats = function(debug) {
       T(before<after, "Adding attachment increments doc writes.");
     }
   });
-  
+
   runTest(["couchdb", "httpd", "bulk_requests"], {
     run: function(db) {db.bulkSave(makeDocs(5));},
     test: function(before, after) {
       TEquals(before+1, after, "The bulk_requests counter is incremented.");
     }
   });
-  
+
   runTest(["couchdb", "httpd", "view_reads"], {
     run: function(db) {doView(db);},
     test: function(before, after) {
       T(before<after, "Reading a view increments view reads.");
     }
   });
-  
+
   runTest(["couchdb", "httpd", "view_reads"], {
     setup: function(db) {db.save({"_id": "test"});},
     run: function(db) {db.open("test");},
@@ -268,35 +267,35 @@ couchTests.stats = function(debug) {
       TEquals(before, after, "Reading a doc doesn't increment view reads.");
     }
   });
-  
+
   // Relies on getting the stats values being GET requests.
   runTest(["couchdb", "httpd_request_methods", "GET"], {
     test: function(before, after) {
       TEquals(before+1, after, "Get requests are incremented properly.");
     }
   });
-  
+
   runTest(["couchdb", "httpd_request_methods", "GET"], {
     run: function() {CouchDB.request("POST", "/");},
     test: function(before, after) {
       TEquals(before+1, after, "POST requests don't affect GET counter.");
     }
   });
-  
+
   runTest(["couchdb", "httpd_request_methods", "POST"], {
     run: function() {CouchDB.request("POST", "/");},
     test: function(before, after) {
       TEquals(before+1, after, "POST requests are incremented properly.");
     }
   });
-  
+
   runTest(["couchdb", "httpd_status_codes", "404"], {
     run: function() {CouchDB.request("GET", "/nonexistant_db");},
     test: function(before, after) {
       TEquals(before+1, after, "Increments 404 counter on db not found.");
     }
   });
-  
+
   runTest(["couchdb", "httpd_status_codes", "404"], {
     run: function() {CouchDB.request("GET", "/");},
     test: function(before, after) {