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/05 14:49:29 UTC

[couchdb] branch prototype/fdb-layer updated: Normalize fabric2 test suite

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

davisp pushed a commit to branch prototype/fdb-layer
in repository https://gitbox.apache.org/repos/asf/couchdb.git


The following commit(s) were added to refs/heads/prototype/fdb-layer by this push:
     new 788538d  Normalize fabric2 test suite
788538d is described below

commit 788538d6edd26aad99f6004ca0f9b1d935e8ceaa
Author: Paul J. Davis <pa...@gmail.com>
AuthorDate: Wed Dec 4 13:13:26 2019 -0600

    Normalize fabric2 test suite
    
    This change ensures that all test names are visible and follows a single
    unified pattern for each test module.
---
 src/fabric/test/fabric2_changes_fold_tests.erl     | 17 +++--
 src/fabric/test/fabric2_db_crud_tests.erl          | 16 ++--
 src/fabric/test/fabric2_db_misc_tests.erl          | 24 +++---
 src/fabric/test/fabric2_db_security_tests.erl      | 33 +++++----
 src/fabric/test/fabric2_dir_prefix_tests.erl       | 24 +++---
 src/fabric/test/fabric2_doc_count_tests.erl        | 13 ++--
 src/fabric/test/fabric2_doc_crud_tests.erl         | 85 +++++++++++-----------
 src/fabric/test/fabric2_doc_fold_tests.erl         | 29 +++-----
 src/fabric/test/fabric2_fdb_tx_retry_tests.erl     | 48 ++++++------
 src/fabric/test/fabric2_local_doc_fold_tests.erl   | 29 +++-----
 src/fabric/test/fabric2_node_types_tests.erl       | 21 ++----
 src/fabric/test/fabric2_rev_stemming.erl           | 23 +++---
 src/fabric/test/fabric2_test.hrl                   | 25 +++++++
 src/fabric/test/fabric2_trace_db_create_tests.erl  |  9 ++-
 src/fabric/test/fabric2_trace_db_delete_tests.erl  |  7 +-
 src/fabric/test/fabric2_trace_db_open_tests.erl    |  7 +-
 src/fabric/test/fabric2_trace_doc_create_tests.erl | 13 ++--
 17 files changed, 214 insertions(+), 209 deletions(-)

diff --git a/src/fabric/test/fabric2_changes_fold_tests.erl b/src/fabric/test/fabric2_changes_fold_tests.erl
index 892b448..8a29bcb 100644
--- a/src/fabric/test/fabric2_changes_fold_tests.erl
+++ b/src/fabric/test/fabric2_changes_fold_tests.erl
@@ -16,6 +16,7 @@
 -include_lib("couch/include/couch_db.hrl").
 -include_lib("couch/include/couch_eunit.hrl").
 -include_lib("eunit/include/eunit.hrl").
+-include("fabric2_test.hrl").
 
 
 -define(DOC_COUNT, 25).
@@ -28,14 +29,14 @@ changes_fold_test_() ->
             setup,
             fun setup/0,
             fun cleanup/1,
-            {with, [
-                fun fold_changes_basic/1,
-                fun fold_changes_since_now/1,
-                fun fold_changes_since_seq/1,
-                fun fold_changes_basic_rev/1,
-                fun fold_changes_since_now_rev/1,
-                fun fold_changes_since_seq_rev/1
-            ]}
+            with([
+                ?TDEF(fold_changes_basic),
+                ?TDEF(fold_changes_since_now),
+                ?TDEF(fold_changes_since_seq),
+                ?TDEF(fold_changes_basic_rev),
+                ?TDEF(fold_changes_since_now_rev),
+                ?TDEF(fold_changes_since_seq_rev)
+            ])
         }
     }.
 
diff --git a/src/fabric/test/fabric2_db_crud_tests.erl b/src/fabric/test/fabric2_db_crud_tests.erl
index 24deeb2..cc44f7d 100644
--- a/src/fabric/test/fabric2_db_crud_tests.erl
+++ b/src/fabric/test/fabric2_db_crud_tests.erl
@@ -15,9 +15,7 @@
 
 -include_lib("couch/include/couch_eunit.hrl").
 -include_lib("eunit/include/eunit.hrl").
-
-
--define(TDEF(A), {atom_to_list(A), fun A/0}).
+-include("fabric2_test.hrl").
 
 
 crud_test_() ->
@@ -27,24 +25,24 @@ crud_test_() ->
             setup,
             fun() -> test_util:start_couch([fabric]) end,
             fun test_util:stop_couch/1,
-            [
+            with([
                 ?TDEF(create_db),
                 ?TDEF(open_db),
                 ?TDEF(delete_db),
                 ?TDEF(list_dbs)
-            ]
+            ])
         }
     }.
 
 
-create_db() ->
+create_db(_) ->
     DbName = ?tempdb(),
     ?assertMatch({ok, _}, fabric2_db:create(DbName, [])),
     ?assertEqual(true, ets:member(fabric2_server, DbName)),
     ?assertEqual({error, file_exists}, fabric2_db:create(DbName, [])).
 
 
-open_db() ->
+open_db(_) ->
     DbName = ?tempdb(),
     ?assertError(database_does_not_exist, fabric2_db:open(DbName, [])),
 
@@ -59,7 +57,7 @@ open_db() ->
     ?assertMatch({ok, _}, fabric2_db:open(DbName, [])).
 
 
-delete_db() ->
+delete_db(_) ->
     DbName = ?tempdb(),
     ?assertError(database_does_not_exist, fabric2_db:delete(DbName, [])),
 
@@ -72,7 +70,7 @@ delete_db() ->
     ?assertError(database_does_not_exist, fabric2_db:open(DbName, [])).
 
 
-list_dbs() ->
+list_dbs(_) ->
     DbName = ?tempdb(),
     AllDbs1 = fabric2_db:list_dbs(),
 
diff --git a/src/fabric/test/fabric2_db_misc_tests.erl b/src/fabric/test/fabric2_db_misc_tests.erl
index 913b6aa..12fc3e5 100644
--- a/src/fabric/test/fabric2_db_misc_tests.erl
+++ b/src/fabric/test/fabric2_db_misc_tests.erl
@@ -17,9 +17,7 @@
 -include_lib("couch/include/couch_eunit.hrl").
 -include_lib("eunit/include/eunit.hrl").
 -include("fabric2.hrl").
-
-
--define(TDEF(A), {atom_to_list(A), fun A/1}).
+-include("fabric2_test.hrl").
 
 
 misc_test_() ->
@@ -29,16 +27,16 @@ misc_test_() ->
             setup,
             fun setup/0,
             fun cleanup/1,
-            {with, [
-                fun empty_db_info/1,
-                fun accessors/1,
-                fun set_revs_limit/1,
-                fun set_security/1,
-                fun is_system_db/1,
-                fun ensure_full_commit/1,
-                fun metadata_bump/1,
-                fun db_version_bump/1
-            ]}
+            with([
+                ?TDEF(empty_db_info),
+                ?TDEF(accessors),
+                ?TDEF(set_revs_limit),
+                ?TDEF(set_security),
+                ?TDEF(is_system_db),
+                ?TDEF(ensure_full_commit),
+                ?TDEF(metadata_bump),
+                ?TDEF(db_version_bump)
+            ])
         }
     }.
 
diff --git a/src/fabric/test/fabric2_db_security_tests.erl b/src/fabric/test/fabric2_db_security_tests.erl
index 5015454..063979a 100644
--- a/src/fabric/test/fabric2_db_security_tests.erl
+++ b/src/fabric/test/fabric2_db_security_tests.erl
@@ -16,6 +16,7 @@
 -include_lib("couch/include/couch_db.hrl").
 -include_lib("couch/include/couch_eunit.hrl").
 -include_lib("eunit/include/eunit.hrl").
+-include("fabric2_test.hrl").
 
 
 security_test_() ->
@@ -25,22 +26,22 @@ security_test_() ->
             setup,
             fun setup/0,
             fun cleanup/1,
-            {with, [
-                fun check_is_admin/1,
-                fun check_is_not_admin/1,
-                fun check_is_admin_role/1,
-                fun check_is_not_admin_role/1,
-                fun check_is_member_name/1,
-                fun check_is_not_member_name/1,
-                fun check_is_member_role/1,
-                fun check_is_not_member_role/1,
-                fun check_admin_is_member/1,
-                fun check_is_member_of_public_db/1,
-                fun check_set_user_ctx/1,
-                fun check_forbidden/1,
-                fun check_fail_no_opts/1,
-                fun check_fail_name_null/1
-            ]}
+            with([
+                ?TDEF(check_is_admin),
+                ?TDEF(check_is_not_admin),
+                ?TDEF(check_is_admin_role),
+                ?TDEF(check_is_not_admin_role),
+                ?TDEF(check_is_member_name),
+                ?TDEF(check_is_not_member_name),
+                ?TDEF(check_is_member_role),
+                ?TDEF(check_is_not_member_role),
+                ?TDEF(check_admin_is_member),
+                ?TDEF(check_is_member_of_public_db),
+                ?TDEF(check_set_user_ctx),
+                ?TDEF(check_forbidden),
+                ?TDEF(check_fail_no_opts),
+                ?TDEF(check_fail_name_null)
+            ])
         }
     }.
 
diff --git a/src/fabric/test/fabric2_dir_prefix_tests.erl b/src/fabric/test/fabric2_dir_prefix_tests.erl
index e4e78a3..75d68a8 100644
--- a/src/fabric/test/fabric2_dir_prefix_tests.erl
+++ b/src/fabric/test/fabric2_dir_prefix_tests.erl
@@ -15,34 +15,34 @@
 
 -include_lib("couch/include/couch_eunit.hrl").
 -include_lib("eunit/include/eunit.hrl").
-
-
--define(TDEF(A), {atom_to_list(A), fun A/0}).
+-include("fabric2_test.hrl").
 
 
 dir_prefix_test_() ->
     {
         "Test couchdb fdb directory prefix",
-        foreach,
+        setup,
         fun() ->
             % erlfdb, rexi and mem3 are all dependent apps for fabric. We make
             % sure to start them so when fabric is started during the test it
             % already has its dependencies
-            test_util:start_couch([erlfdb, rexi, mem3, ctrace])
+            test_util:start_couch([erlfdb, rexi, mem3, ctrace, fabric])
         end,
         fun(Ctx) ->
             config:delete("fabric", "fdb_directory"),
-            ok = application:stop(fabric),
             test_util:stop_couch(Ctx)
         end,
-        [
+        with([
             ?TDEF(default_prefix),
             ?TDEF(custom_prefix)
-        ]
+        ])
     }.
 
 
-default_prefix() ->
+default_prefix(_) ->
+    erase(fdb_directory),
+    ok = config:delete("fabric", "fdb_directory", false),
+    ok = application:stop(fabric),
     ok = application:start(fabric),
 
     ?assertEqual([<<"couchdb">>], fabric2_server:fdb_directory()),
@@ -55,8 +55,10 @@ default_prefix() ->
     ?assertMatch({ok, _}, fabric2_db:create(DbName, [])).
 
 
-custom_prefix() ->
-    ok = config:set("fabric", "fdb_directory", "couchdb_foo"),
+custom_prefix(_) ->
+    erase(fdb_directory),
+    ok = config:set("fabric", "fdb_directory", "couchdb_foo", false),
+    ok = application:stop(fabric),
     ok = application:start(fabric),
 
     ?assertEqual([<<"couchdb_foo">>], fabric2_server:fdb_directory()),
diff --git a/src/fabric/test/fabric2_doc_count_tests.erl b/src/fabric/test/fabric2_doc_count_tests.erl
index 743ae76..7aaf288 100644
--- a/src/fabric/test/fabric2_doc_count_tests.erl
+++ b/src/fabric/test/fabric2_doc_count_tests.erl
@@ -16,6 +16,7 @@
 -include_lib("couch/include/couch_db.hrl").
 -include_lib("couch/include/couch_eunit.hrl").
 -include_lib("eunit/include/eunit.hrl").
+-include("fabric2_test.hrl").
 
 
 -define(DOC_COUNT, 10).
@@ -28,12 +29,12 @@ doc_count_test_() ->
             setup,
             fun setup/0,
             fun cleanup/1,
-            {with, [
-                fun normal_docs/1,
-                fun replicated_docs/1,
-                fun design_docs/1,
-                fun local_docs/1
-            ]}
+            with([
+                ?TDEF(normal_docs),
+                ?TDEF(replicated_docs),
+                ?TDEF(design_docs),
+                ?TDEF(local_docs)
+            ])
         }
     }.
 
diff --git a/src/fabric/test/fabric2_doc_crud_tests.erl b/src/fabric/test/fabric2_doc_crud_tests.erl
index a9085be..184eb4a 100644
--- a/src/fabric/test/fabric2_doc_crud_tests.erl
+++ b/src/fabric/test/fabric2_doc_crud_tests.erl
@@ -17,6 +17,7 @@
 -include_lib("couch/include/couch_eunit.hrl").
 -include_lib("eunit/include/eunit.hrl").
 -include("fabric2.hrl").
+-include("fabric2_test.hrl").
 
 
 doc_crud_test_() ->
@@ -26,48 +27,48 @@ doc_crud_test_() ->
             setup,
             fun setup/0,
             fun cleanup/1,
-            {with, [
-                fun open_missing_doc/1,
-                fun create_new_doc/1,
-                fun create_ddoc_basic/1,
-                fun create_ddoc_requires_admin/1,
-                fun create_ddoc_requires_validation/1,
-                fun create_ddoc_requires_compilation/1,
-                fun can_create_a_partitioned_ddoc/1,
-                fun update_doc_basic/1,
-                fun update_ddoc_basic/1,
-                fun update_doc_replicated/1,
-                fun update_doc_replicated_add_conflict/1,
-                fun update_doc_replicated_changes_winner/1,
-                fun update_doc_replicated_extension/1,
-                fun update_doc_replicate_existing_rev/1,
-                fun update_winning_conflict_branch/1,
-                fun update_non_winning_conflict_branch/1,
-                fun delete_doc_basic/1,
-                fun delete_changes_winner/1,
-                fun recreate_doc_basic/1,
-                fun conflict_on_create_new_with_rev/1,
-                fun conflict_on_update_with_no_rev/1,
-                fun conflict_on_create_as_deleted/1,
-                fun conflict_on_recreate_as_deleted/1,
-                fun conflict_on_extend_deleted/1,
-                fun open_doc_revs_basic/1,
-                fun open_doc_revs_all/1,
-                fun open_doc_revs_latest/1,
-                fun get_missing_revs_basic/1,
-                fun get_missing_revs_on_missing_doc/1,
-                fun open_missing_local_doc/1,
-                fun create_local_doc_basic/1,
-                fun update_local_doc_basic/1,
-                fun delete_local_doc_basic/1,
-                fun recreate_local_doc/1,
-                fun create_local_doc_bad_rev/1,
-                fun create_local_doc_random_rev/1,
-                fun create_a_large_local_doc/1,
-                fun create_2_large_local_docs/1,
-                fun local_doc_with_previous_encoding/1,
-                fun before_doc_update_skips_local_docs/1
-            ]}
+            with([
+                ?TDEF(open_missing_doc),
+                ?TDEF(create_new_doc),
+                ?TDEF(create_ddoc_basic),
+                ?TDEF(create_ddoc_requires_admin),
+                ?TDEF(create_ddoc_requires_validation),
+                ?TDEF(create_ddoc_requires_compilation),
+                ?TDEF(can_create_a_partitioned_ddoc),
+                ?TDEF(update_doc_basic),
+                ?TDEF(update_ddoc_basic),
+                ?TDEF(update_doc_replicated),
+                ?TDEF(update_doc_replicated_add_conflict),
+                ?TDEF(update_doc_replicated_changes_winner),
+                ?TDEF(update_doc_replicated_extension),
+                ?TDEF(update_doc_replicate_existing_rev),
+                ?TDEF(update_winning_conflict_branch),
+                ?TDEF(update_non_winning_conflict_branch),
+                ?TDEF(delete_doc_basic),
+                ?TDEF(delete_changes_winner),
+                ?TDEF(recreate_doc_basic),
+                ?TDEF(conflict_on_create_new_with_rev),
+                ?TDEF(conflict_on_update_with_no_rev),
+                ?TDEF(conflict_on_create_as_deleted),
+                ?TDEF(conflict_on_recreate_as_deleted),
+                ?TDEF(conflict_on_extend_deleted),
+                ?TDEF(open_doc_revs_basic),
+                ?TDEF(open_doc_revs_all),
+                ?TDEF(open_doc_revs_latest),
+                ?TDEF(get_missing_revs_basic),
+                ?TDEF(get_missing_revs_on_missing_doc),
+                ?TDEF(open_missing_local_doc),
+                ?TDEF(create_local_doc_basic),
+                ?TDEF(update_local_doc_basic),
+                ?TDEF(delete_local_doc_basic),
+                ?TDEF(recreate_local_doc),
+                ?TDEF(create_local_doc_bad_rev),
+                ?TDEF(create_local_doc_random_rev),
+                ?TDEF(create_a_large_local_doc),
+                ?TDEF(create_2_large_local_docs),
+                ?TDEF(local_doc_with_previous_encoding),
+                ?TDEF(before_doc_update_skips_local_docs)
+            ])
         }
     }.
 
diff --git a/src/fabric/test/fabric2_doc_fold_tests.erl b/src/fabric/test/fabric2_doc_fold_tests.erl
index 3cb68bd..6262a10 100644
--- a/src/fabric/test/fabric2_doc_fold_tests.erl
+++ b/src/fabric/test/fabric2_doc_fold_tests.erl
@@ -16,20 +16,11 @@
 -include_lib("couch/include/couch_db.hrl").
 -include_lib("couch/include/couch_eunit.hrl").
 -include_lib("eunit/include/eunit.hrl").
+-include("fabric2_test.hrl").
 
 
 -define(DOC_COUNT, 50).
 
-%% eunit implementation of {with, Tests} doesn't detect test name correctly
-with(Tests) ->
-  fun(ArgsTuple) ->
-      [{Name, ?_test(Fun(ArgsTuple))} || {Name, Fun} <- Tests]
-      ++
-      [{Name, {timeout, Timeout, ?_test(Fun(ArgsTuple))}} || {Name, Timeout, Fun} <- Tests]
-  end.
-
--define(NAMED(A), {atom_to_list(A), fun A/1}).
--define(WITH_TIMEOUT(Timeout, A), {atom_to_list(A), Timeout, fun A/1}).
 
 doc_fold_test_() ->
     {
@@ -39,15 +30,15 @@ doc_fold_test_() ->
             fun setup/0,
             fun cleanup/1,
             with([
-                ?NAMED(fold_docs_basic),
-                ?NAMED(fold_docs_rev),
-                ?NAMED(fold_docs_with_start_key),
-                ?NAMED(fold_docs_with_end_key),
-                ?NAMED(fold_docs_with_both_keys_the_same),
-                ?WITH_TIMEOUT(10000, fold_docs_with_different_keys),
-                ?NAMED(fold_docs_with_limit),
-                ?NAMED(fold_docs_with_skip),
-                ?NAMED(fold_docs_with_skip_and_limit)
+                ?TDEF(fold_docs_basic),
+                ?TDEF(fold_docs_rev),
+                ?TDEF(fold_docs_with_start_key),
+                ?TDEF(fold_docs_with_end_key),
+                ?TDEF(fold_docs_with_both_keys_the_same),
+                ?TDEF(fold_docs_with_different_keys, 10000),
+                ?TDEF(fold_docs_with_limit),
+                ?TDEF(fold_docs_with_skip),
+                ?TDEF(fold_docs_with_skip_and_limit)
             ])
         }
     }.
diff --git a/src/fabric/test/fabric2_fdb_tx_retry_tests.erl b/src/fabric/test/fabric2_fdb_tx_retry_tests.erl
index c924ce5..7fb0f21 100644
--- a/src/fabric/test/fabric2_fdb_tx_retry_tests.erl
+++ b/src/fabric/test/fabric2_fdb_tx_retry_tests.erl
@@ -14,12 +14,26 @@
 
 
 -include_lib("eunit/include/eunit.hrl").
+-include("fabric2_test.hrl").
 
 
--define(TDEF(A), {atom_to_list(A), fun A/0}).
+retry_test_() ->
+    {
+        setup,
+        fun setup/0,
+        fun cleanup/1,
+        with([
+            ?TDEF(read_only_no_retry),
+            ?TDEF(read_only_commit_unknown_result),
+            ?TDEF(run_on_first_try),
+            ?TDEF(retry_when_commit_conflict),
+            ?TDEF(retry_when_txid_not_found),
+            ?TDEF(no_retry_when_txid_found)
+        ])
+    }.
 
 
-meck_setup() ->
+setup() ->
     meck:new(erlfdb),
     meck:new(fabric2_txids),
     EnvSt = case application:get_env(fabric, db) of
@@ -30,7 +44,7 @@ meck_setup() ->
     EnvSt.
 
 
-meck_cleanup(EnvSt) ->
+cleanup(EnvSt) ->
     case EnvSt of
         {ok, Db} -> application:set_env(fabric, db, Db);
         undefined -> application:unset_env(fabric, db)
@@ -38,23 +52,7 @@ meck_cleanup(EnvSt) ->
     meck:unload().
 
 
-retry_test_() ->
-    {
-        foreach,
-        fun meck_setup/0,
-        fun meck_cleanup/1,
-        [
-            ?TDEF(read_only_no_retry),
-            ?TDEF(read_only_commit_unknown_result),
-            ?TDEF(run_on_first_try),
-            ?TDEF(retry_when_commit_conflict),
-            ?TDEF(retry_when_txid_not_found),
-            ?TDEF(no_retry_when_txid_found)
-        ]
-    }.
-
-
-read_only_no_retry() ->
+read_only_no_retry(_) ->
     meck:expect(erlfdb, transactional, fun(_Db, UserFun) ->
         UserFun(not_a_real_transaction)
     end),
@@ -72,7 +70,7 @@ read_only_no_retry() ->
     ?assert(meck:validate([erlfdb, fabric2_txids])).
 
 
-read_only_commit_unknown_result() ->
+read_only_commit_unknown_result(_) ->
     % Not 100% certain that this would ever actually
     % happen in the wild but might as well test that
     % we don't blow up if it does.
@@ -93,7 +91,7 @@ read_only_commit_unknown_result() ->
     ?assert(meck:validate([erlfdb, fabric2_txids])).
 
 
-run_on_first_try() ->
+run_on_first_try(_) ->
     meck:expect(erlfdb, transactional, fun(_Db, UserFun) ->
         UserFun(not_a_real_transaction)
     end),
@@ -113,7 +111,7 @@ run_on_first_try() ->
     ?assert(meck:validate([erlfdb, fabric2_txids])).
 
 
-retry_when_commit_conflict() ->
+retry_when_commit_conflict(_) ->
     meck:expect(erlfdb, transactional, fun(_Db, UserFun) ->
         UserFun(not_a_real_transaction)
     end),
@@ -133,7 +131,7 @@ retry_when_commit_conflict() ->
     ?assert(meck:validate([erlfdb, fabric2_txids])).
 
 
-retry_when_txid_not_found() ->
+retry_when_txid_not_found(_) ->
     meck:expect(erlfdb, transactional, fun(_Db, UserFun) ->
         UserFun(not_a_real_transaction)
     end),
@@ -157,7 +155,7 @@ retry_when_txid_not_found() ->
     ?assert(meck:validate([erlfdb, fabric2_txids])).
 
 
-no_retry_when_txid_found() ->
+no_retry_when_txid_found(_) ->
     meck:expect(erlfdb, transactional, fun(_Db, UserFun) ->
         UserFun(not_a_real_transaction)
     end),
diff --git a/src/fabric/test/fabric2_local_doc_fold_tests.erl b/src/fabric/test/fabric2_local_doc_fold_tests.erl
index 82203b4..e3ff0eb 100644
--- a/src/fabric/test/fabric2_local_doc_fold_tests.erl
+++ b/src/fabric/test/fabric2_local_doc_fold_tests.erl
@@ -16,20 +16,11 @@
 -include_lib("couch/include/couch_db.hrl").
 -include_lib("couch/include/couch_eunit.hrl").
 -include_lib("eunit/include/eunit.hrl").
+-include("fabric2_test.hrl").
 
 
 -define(DOC_COUNT, 50).
 
-%% eunit implementation of {with, Tests} doesn't detect test name correctly
-with(Tests) ->
-  fun(ArgsTuple) ->
-      [{Name, ?_test(Fun(ArgsTuple))} || {Name, Fun} <- Tests]
-      ++
-      [{Name, {timeout, Timeout, ?_test(Fun(ArgsTuple))}} || {Name, Timeout, Fun} <- Tests]
-  end.
-
--define(NAMED(A), {atom_to_list(A), fun A/1}).
--define(WITH_TIMEOUT(Timeout, A), {atom_to_list(A), Timeout, fun A/1}).
 
 doc_fold_test_() ->
     {
@@ -39,15 +30,15 @@ doc_fold_test_() ->
             fun setup/0,
             fun cleanup/1,
             with([
-                ?NAMED(fold_local_docs_basic),
-                ?NAMED(fold_local_docs_rev),
-                ?NAMED(fold_local_docs_with_start_key),
-                ?NAMED(fold_local_docs_with_end_key),
-                ?NAMED(fold_local_docs_with_both_keys_the_same),
-                ?WITH_TIMEOUT(15000, fold_local_docs_with_different_keys),
-                ?NAMED(fold_local_docs_with_limit),
-                ?NAMED(fold_local_docs_with_skip),
-                ?NAMED(fold_local_docs_with_skip_and_limit)
+                ?TDEF(fold_local_docs_basic),
+                ?TDEF(fold_local_docs_rev),
+                ?TDEF(fold_local_docs_with_start_key),
+                ?TDEF(fold_local_docs_with_end_key),
+                ?TDEF(fold_local_docs_with_both_keys_the_same),
+                ?TDEF(fold_local_docs_with_different_keys, 15000),
+                ?TDEF(fold_local_docs_with_limit),
+                ?TDEF(fold_local_docs_with_skip),
+                ?TDEF(fold_local_docs_with_skip_and_limit)
             ])
         }
     }.
diff --git a/src/fabric/test/fabric2_node_types_tests.erl b/src/fabric/test/fabric2_node_types_tests.erl
index ad400f9..074afe8 100644
--- a/src/fabric/test/fabric2_node_types_tests.erl
+++ b/src/fabric/test/fabric2_node_types_tests.erl
@@ -14,15 +14,13 @@
 
 
 -include_lib("eunit/include/eunit.hrl").
-
-
--define(TDEF(A), {atom_to_list(A), fun A/0}).
+-include("fabric2_test.hrl").
 
 
 node_types_test_() ->
     {
         "Test node types",
-        foreach,
+        setup,
         fun() ->
             os:putenv("COUCHDB_NODE_TYPE_FOO", "false"),
             os:putenv("COUCHDB_NODE_TYPE_BAZ", "true"),
@@ -30,26 +28,23 @@ node_types_test_() ->
             % erlfdb, rexi and mem3 are all dependent apps for fabric. We make
             % sure to start them so when fabric is started during the test it
             % already has its dependencies
-            test_util:start_couch([erlfdb, rexi, mem3, ctrace])
+            test_util:start_couch([erlfdb, rexi, mem3, ctrace, fabric])
         end,
         fun(Ctx) ->
-            ok = application:stop(fabric),
             test_util:stop_couch(Ctx),
             application:unset_env(fabric, node_types),
             os:unsetenv("COUCHDB_NODE_TYPE_FOO"),
             os:unsetenv("COUCHDB_NODE_TYPE_BAZ"),
             os:unsetenv("COUCHDB_NODE_TYPE_ZIG")
         end,
-        [
+        with([
             ?TDEF(basics),
             ?TDEF(os_env_priority)
-        ]
+        ])
     }.
 
 
-basics() ->
-    ok = application:start(fabric),
-
+basics(_) ->
     % default is true for new types
     ?assert(fabric2_node_types:is_type(some_new_node_type)),
 
@@ -64,9 +59,7 @@ basics() ->
     ?assert(not fabric2_node_types:is_type(bam)).
 
 
-os_env_priority() ->
-    ok = application:start(fabric),
-
+os_env_priority(_) ->
     % os env takes precedence
     application:set_env(fabric, node_types, [{foo, true}, {baz, false}]),
     ?assert(not fabric2_node_types:is_type(foo)),
diff --git a/src/fabric/test/fabric2_rev_stemming.erl b/src/fabric/test/fabric2_rev_stemming.erl
index 99e086e..62ce690 100644
--- a/src/fabric/test/fabric2_rev_stemming.erl
+++ b/src/fabric/test/fabric2_rev_stemming.erl
@@ -16,6 +16,7 @@
 -include_lib("couch/include/couch_db.hrl").
 -include_lib("couch/include/couch_eunit.hrl").
 -include_lib("eunit/include/eunit.hrl").
+-include("fabric2_test.hrl").
 
 
 doc_crud_test_() ->
@@ -25,16 +26,16 @@ doc_crud_test_() ->
             setup,
             fun setup/0,
             fun cleanup/1,
-            {with, [
-                fun update_doc/1,
-                fun update_doc_replicated_no_stemming/1,
-                fun update_doc_replicated_with_stemming/1,
-                fun update_doc_replicate_existing_rev/1,
-                fun update_winning_conflict_branch/1,
-                fun update_non_winning_conflict_branch/1,
-                fun delete_doc_basic/1,
-                fun recreate_doc_basic/1
-            ]}
+            with([
+                ?TDEF(update_doc),
+                ?TDEF(update_doc_replicated_no_stemming),
+                ?TDEF(update_doc_replicated_with_stemming),
+                ?TDEF(update_doc_replicate_existing_rev),
+                ?TDEF(update_winning_conflict_branch),
+                ?TDEF(update_non_winning_conflict_branch),
+                ?TDEF(delete_doc_basic),
+                ?TDEF(recreate_doc_basic)
+            ])
         }
     }.
 
@@ -192,7 +193,7 @@ recreate_doc_basic({Db, _}) ->
         deleted = true,
         body = {[{<<"state">>, 2}]}
     },
-    {ok, {2, Rev2}} = fabric2_db:update_doc(Db, Doc2),
+    {ok, {2, _Rev2}} = fabric2_db:update_doc(Db, Doc2),
     Doc3 = Doc1#doc{
         revs = {0, []},
         deleted = false,
diff --git a/src/fabric/test/fabric2_test.hrl b/src/fabric/test/fabric2_test.hrl
new file mode 100644
index 0000000..a0532b3
--- /dev/null
+++ b/src/fabric/test/fabric2_test.hrl
@@ -0,0 +1,25 @@
+% 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.
+
+-define(TDEF(Name), {atom_to_list(Name), fun Name/1}).
+-define(TDEF(Name, Timeout), {atom_to_list(Name), Timeout, fun Name/1}).
+
+
+with(Tests) ->
+    fun(ArgsTuple) ->
+        lists:map(fun
+            ({Name, Fun}) ->
+                {Name, ?_test(Fun(ArgsTuple))};
+            ({Name, Timeout, Fun}) ->
+                {Name, {timeout, Timeout, ?_test(Fun(ArgsTuple))}}
+        end, Tests)
+    end.
diff --git a/src/fabric/test/fabric2_trace_db_create_tests.erl b/src/fabric/test/fabric2_trace_db_create_tests.erl
index 09cc863..926219f 100644
--- a/src/fabric/test/fabric2_trace_db_create_tests.erl
+++ b/src/fabric/test/fabric2_trace_db_create_tests.erl
@@ -16,6 +16,7 @@
 -include_lib("couch/include/couch_db.hrl").
 -include_lib("couch/include/couch_eunit.hrl").
 -include_lib("eunit/include/eunit.hrl").
+-include("fabric2_test.hrl").
 
 
 trace_test_() ->
@@ -25,9 +26,9 @@ trace_test_() ->
             setup,
             fun setup/0,
             fun cleanup/1,
-            [
-                fun create_db/0
-            ]
+            with([
+                ?TDEF(create_db)
+            ])
         }
     }.
 
@@ -41,6 +42,6 @@ cleanup(Ctx) ->
     test_util:stop_couch(Ctx).
 
 
-create_db() ->
+create_db(_) ->
     put(erlfdb_trace, <<"create db">>),
     {ok, _Db} = fabric2_db:create(?tempdb(), [{user_ctx, ?ADMIN_USER}]).
diff --git a/src/fabric/test/fabric2_trace_db_delete_tests.erl b/src/fabric/test/fabric2_trace_db_delete_tests.erl
index ddbb2c8..ac92c53 100644
--- a/src/fabric/test/fabric2_trace_db_delete_tests.erl
+++ b/src/fabric/test/fabric2_trace_db_delete_tests.erl
@@ -16,6 +16,7 @@
 -include_lib("couch/include/couch_db.hrl").
 -include_lib("couch/include/couch_eunit.hrl").
 -include_lib("eunit/include/eunit.hrl").
+-include("fabric2_test.hrl").
 
 
 trace_test_() ->
@@ -25,9 +26,9 @@ trace_test_() ->
             setup,
             fun setup/0,
             fun cleanup/1,
-            {with, [
-                fun delete_db/1
-            ]}
+            with([
+                ?TDEF(delete_db)
+            ])
         }
     }.
 
diff --git a/src/fabric/test/fabric2_trace_db_open_tests.erl b/src/fabric/test/fabric2_trace_db_open_tests.erl
index 71e3301..3602b50 100644
--- a/src/fabric/test/fabric2_trace_db_open_tests.erl
+++ b/src/fabric/test/fabric2_trace_db_open_tests.erl
@@ -16,6 +16,7 @@
 -include_lib("couch/include/couch_db.hrl").
 -include_lib("couch/include/couch_eunit.hrl").
 -include_lib("eunit/include/eunit.hrl").
+-include("fabric2_test.hrl").
 
 
 trace_test_() ->
@@ -25,9 +26,9 @@ trace_test_() ->
             setup,
             fun setup/0,
             fun cleanup/1,
-            {with, [
-                fun open_db/1
-            ]}
+            with([
+                ?TDEF(open_db)
+            ])
         }
     }.
 
diff --git a/src/fabric/test/fabric2_trace_doc_create_tests.erl b/src/fabric/test/fabric2_trace_doc_create_tests.erl
index 1e0b47c..888039d 100644
--- a/src/fabric/test/fabric2_trace_doc_create_tests.erl
+++ b/src/fabric/test/fabric2_trace_doc_create_tests.erl
@@ -16,20 +16,21 @@
 -include_lib("couch/include/couch_db.hrl").
 -include_lib("couch/include/couch_eunit.hrl").
 -include_lib("eunit/include/eunit.hrl").
+-include("fabric2_test.hrl").
 
 
-doc_crud_test_() ->
+trace_doc_create_test_() ->
     {
         "Test document CRUD operations",
         {
             setup,
             fun setup/0,
             fun cleanup/1,
-            {with, [
-                fun create_new_doc/1,
-                fun create_two_docs/1,
-                fun create_50_docs/1
-            ]}
+            with([
+                ?TDEF(create_new_doc),
+                ?TDEF(create_two_docs),
+                ?TDEF(create_50_docs)
+            ])
         }
     }.