summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoriilyak <iilyak@users.noreply.github.com>2019-07-29 07:44:08 -0700
committerGitHub <noreply@github.com>2019-07-29 07:44:08 -0700
commitf37e1e73205e98d6a74a714a23c4a59f7cf2bb0b (patch)
treecdc6c540ed1b43ec6363bade88ef853378b52ec1
parent29d484e45054c4b40f6b3a223298c8a31914f90d (diff)
parent25ad74a6cdc03732265d5175218e96a004dd4c40 (diff)
downloadcouchdb-f37e1e73205e98d6a74a714a23c4a59f7cf2bb0b.tar.gz
Merge pull request #2039 from cloudant/exunit-simplified
Exunit simplified
-rw-r--r--.credo.exs (renamed from test/elixir/.credo.exs)11
-rw-r--r--.formatter.exs9
-rw-r--r--.gitignore7
-rw-r--r--.travis.yml5
-rw-r--r--Makefile33
-rw-r--r--Makefile.win22
-rw-r--r--config/config.exs30
-rw-r--r--config/dev.exs1
-rw-r--r--config/integration.exs12
-rw-r--r--config/prod.exs1
-rw-r--r--config/test.exs12
-rw-r--r--mix.exs60
-rw-r--r--mix.lock (renamed from test/elixir/mix.lock)6
-rw-r--r--src/chttpd/test/eunit/chttpd_cors_test.erl (renamed from src/chttpd/test/chttpd_cors_test.erl)0
-rw-r--r--src/chttpd/test/eunit/chttpd_csp_tests.erl (renamed from src/chttpd/test/chttpd_csp_tests.erl)0
-rw-r--r--src/chttpd/test/eunit/chttpd_db_attachment_size_tests.erl (renamed from src/chttpd/test/chttpd_db_attachment_size_tests.erl)0
-rw-r--r--src/chttpd/test/eunit/chttpd_db_bulk_get_multipart_test.erl (renamed from src/chttpd/test/chttpd_db_bulk_get_multipart_test.erl)0
-rw-r--r--src/chttpd/test/eunit/chttpd_db_bulk_get_test.erl (renamed from src/chttpd/test/chttpd_db_bulk_get_test.erl)0
-rw-r--r--src/chttpd/test/eunit/chttpd_db_doc_size_tests.erl (renamed from src/chttpd/test/chttpd_db_doc_size_tests.erl)0
-rw-r--r--src/chttpd/test/eunit/chttpd_db_test.erl (renamed from src/chttpd/test/chttpd_db_test.erl)0
-rw-r--r--src/chttpd/test/eunit/chttpd_dbs_info_test.erl (renamed from src/chttpd/test/chttpd_dbs_info_test.erl)0
-rw-r--r--src/chttpd/test/eunit/chttpd_error_info_tests.erl (renamed from src/chttpd/test/chttpd_error_info_tests.erl)0
-rw-r--r--src/chttpd/test/eunit/chttpd_handlers_tests.erl (renamed from src/chttpd/test/chttpd_handlers_tests.erl)0
-rw-r--r--src/chttpd/test/eunit/chttpd_open_revs_error_test.erl (renamed from src/chttpd/test/chttpd_open_revs_error_test.erl)0
-rw-r--r--src/chttpd/test/eunit/chttpd_plugin_tests.erl (renamed from src/chttpd/test/chttpd_plugin_tests.erl)0
-rw-r--r--src/chttpd/test/eunit/chttpd_prefer_header_test.erl (renamed from src/chttpd/test/chttpd_prefer_header_test.erl)0
-rw-r--r--src/chttpd/test/eunit/chttpd_purge_tests.erl (renamed from src/chttpd/test/chttpd_purge_tests.erl)0
-rw-r--r--src/chttpd/test/eunit/chttpd_security_tests.erl (renamed from src/chttpd/test/chttpd_security_tests.erl)0
-rw-r--r--src/chttpd/test/eunit/chttpd_socket_buffer_size_test.erl (renamed from src/chttpd/test/chttpd_socket_buffer_size_test.erl)0
-rw-r--r--src/chttpd/test/eunit/chttpd_view_test.erl (renamed from src/chttpd/test/chttpd_view_test.erl)0
-rw-r--r--src/chttpd/test/eunit/chttpd_welcome_test.erl (renamed from src/chttpd/test/chttpd_welcome_test.erl)0
-rw-r--r--src/chttpd/test/eunit/chttpd_xframe_test.erl (renamed from src/chttpd/test/chttpd_xframe_test.erl)0
-rw-r--r--src/couch/include/couch_eunit.hrl2
-rw-r--r--src/couch/test/eunit/chttpd_endpoints_tests.erl (renamed from src/couch/test/chttpd_endpoints_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_auth_cache_tests.erl (renamed from src/couch/test/couch_auth_cache_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_base32_tests.erl (renamed from src/couch/test/couch_base32_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_bt_engine_compactor_tests.erl (renamed from src/couch/test/couch_bt_engine_compactor_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_bt_engine_tests.erl (renamed from src/couch/test/couch_bt_engine_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_bt_engine_upgrade_tests.erl (renamed from src/couch/test/couch_bt_engine_upgrade_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_btree_tests.erl (renamed from src/couch/test/couch_btree_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_changes_tests.erl (renamed from src/couch/test/couch_changes_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_compress_tests.erl (renamed from src/couch/test/couch_compress_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_db_doc_tests.erl (renamed from src/couch/test/couch_db_doc_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_db_mpr_tests.erl (renamed from src/couch/test/couch_db_mpr_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_db_plugin_tests.erl (renamed from src/couch/test/couch_db_plugin_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_db_props_upgrade_tests.erl (renamed from src/couch/test/couch_db_props_upgrade_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_db_split_tests.erl (renamed from src/couch/test/couch_db_split_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_db_tests.erl (renamed from src/couch/test/couch_db_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_doc_json_tests.erl (renamed from src/couch/test/couch_doc_json_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_doc_tests.erl (renamed from src/couch/test/couch_doc_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_ejson_size_tests.erl (renamed from src/couch/test/couch_ejson_size_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_etag_tests.erl (renamed from src/couch/test/couch_etag_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_file_tests.erl (renamed from src/couch/test/couch_file_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_flags_config_tests.erl (renamed from src/couch/test/couch_flags_config_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_flags_tests.erl (renamed from src/couch/test/couch_flags_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_hotp_tests.erl (renamed from src/couch/test/couch_hotp_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_index_tests.erl (renamed from src/couch/test/couch_index_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_key_tree_prop_tests.erl (renamed from src/couch/test/couch_key_tree_prop_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_key_tree_tests.erl (renamed from src/couch/test/couch_key_tree_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_passwords_tests.erl (renamed from src/couch/test/couch_passwords_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_query_servers_tests.erl (renamed from src/couch/test/couch_query_servers_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_server_tests.erl (renamed from src/couch/test/couch_server_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_stream_tests.erl (renamed from src/couch/test/couch_stream_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_task_status_tests.erl (renamed from src/couch/test/couch_task_status_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_totp_tests.erl (renamed from src/couch/test/couch_totp_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_util_tests.erl (renamed from src/couch/test/couch_util_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_uuids_tests.erl (renamed from src/couch/test/couch_uuids_tests.erl)0
-rw-r--r--src/couch/test/eunit/couch_work_queue_tests.erl (renamed from src/couch/test/couch_work_queue_tests.erl)0
-rw-r--r--src/couch/test/eunit/couchdb_attachments_tests.erl (renamed from src/couch/test/couchdb_attachments_tests.erl)0
-rw-r--r--src/couch/test/eunit/couchdb_auth_tests.erl (renamed from src/couch/test/couchdb_auth_tests.erl)0
-rwxr-xr-xsrc/couch/test/eunit/couchdb_cookie_domain_tests.erl (renamed from src/couch/test/couchdb_cookie_domain_tests.erl)0
-rw-r--r--src/couch/test/eunit/couchdb_cors_tests.erl (renamed from src/couch/test/couchdb_cors_tests.erl)0
-rw-r--r--src/couch/test/eunit/couchdb_db_tests.erl (renamed from src/couch/test/couchdb_db_tests.erl)0
-rw-r--r--src/couch/test/eunit/couchdb_design_doc_tests.erl (renamed from src/couch/test/couchdb_design_doc_tests.erl)0
-rw-r--r--src/couch/test/eunit/couchdb_file_compression_tests.erl (renamed from src/couch/test/couchdb_file_compression_tests.erl)0
-rw-r--r--src/couch/test/eunit/couchdb_location_header_tests.erl (renamed from src/couch/test/couchdb_location_header_tests.erl)0
-rw-r--r--src/couch/test/eunit/couchdb_mrview_cors_tests.erl (renamed from src/couch/test/couchdb_mrview_cors_tests.erl)0
-rw-r--r--src/couch/test/eunit/couchdb_mrview_tests.erl (renamed from src/couch/test/couchdb_mrview_tests.erl)0
-rw-r--r--src/couch/test/eunit/couchdb_os_proc_pool.erl (renamed from src/couch/test/couchdb_os_proc_pool.erl)0
-rw-r--r--src/couch/test/eunit/couchdb_update_conflicts_tests.erl (renamed from src/couch/test/couchdb_update_conflicts_tests.erl)0
-rw-r--r--src/couch/test/eunit/couchdb_vhosts_tests.erl (renamed from src/couch/test/couchdb_vhosts_tests.erl)0
-rw-r--r--src/couch/test/eunit/couchdb_views_tests.erl (renamed from src/couch/test/couchdb_views_tests.erl)0
-rw-r--r--src/couch/test/eunit/fixtures/3b835456c235b1827e012e25666152f3.view (renamed from src/couch/test/fixtures/3b835456c235b1827e012e25666152f3.view)bin4192 -> 4192 bytes
-rw-r--r--src/couch/test/eunit/fixtures/couch_stats_aggregates.cfg (renamed from src/couch/test/fixtures/couch_stats_aggregates.cfg)0
-rw-r--r--src/couch/test/eunit/fixtures/couch_stats_aggregates.ini (renamed from src/couch/test/fixtures/couch_stats_aggregates.ini)0
-rw-r--r--src/couch/test/eunit/fixtures/db_non_partitioned.couch (renamed from src/couch/test/fixtures/db_non_partitioned.couch)bin12479 -> 12479 bytes
-rw-r--r--src/couch/test/eunit/fixtures/db_v6_with_1_purge_req.couch (renamed from src/couch/test/fixtures/db_v6_with_1_purge_req.couch)bin12470 -> 12470 bytes
-rw-r--r--src/couch/test/eunit/fixtures/db_v6_with_1_purge_req_for_2_docs.couch (renamed from src/couch/test/fixtures/db_v6_with_1_purge_req_for_2_docs.couch)bin16557 -> 16557 bytes
-rw-r--r--src/couch/test/eunit/fixtures/db_v6_with_2_purge_req.couch (renamed from src/couch/test/fixtures/db_v6_with_2_purge_req.couch)bin16566 -> 16566 bytes
-rw-r--r--src/couch/test/eunit/fixtures/db_v6_without_purge_req.couch (renamed from src/couch/test/fixtures/db_v6_without_purge_req.couch)bin61644 -> 61644 bytes
-rw-r--r--src/couch/test/eunit/fixtures/db_v7_with_1_purge_req.couch (renamed from src/couch/test/fixtures/db_v7_with_1_purge_req.couch)bin16617 -> 16617 bytes
-rw-r--r--src/couch/test/eunit/fixtures/db_v7_with_1_purge_req_for_2_docs.couch (renamed from src/couch/test/fixtures/db_v7_with_1_purge_req_for_2_docs.couch)bin20705 -> 20705 bytes
-rw-r--r--src/couch/test/eunit/fixtures/db_v7_with_2_purge_req.couch (renamed from src/couch/test/fixtures/db_v7_with_2_purge_req.couch)bin20713 -> 20713 bytes
-rw-r--r--src/couch/test/eunit/fixtures/db_v7_without_purge_req.couch (renamed from src/couch/test/fixtures/db_v7_without_purge_req.couch)bin65781 -> 65781 bytes
-rw-r--r--src/couch/test/eunit/fixtures/logo.png (renamed from src/couch/test/fixtures/logo.png)bin3010 -> 3010 bytes
-rw-r--r--src/couch/test/eunit/fixtures/multipart.http (renamed from src/couch/test/fixtures/multipart.http)0
-rw-r--r--src/couch/test/eunit/fixtures/os_daemon_bad_perm.sh (renamed from src/couch/test/fixtures/os_daemon_bad_perm.sh)0
-rwxr-xr-xsrc/couch/test/eunit/fixtures/os_daemon_can_reboot.sh (renamed from src/couch/test/fixtures/os_daemon_can_reboot.sh)0
-rwxr-xr-xsrc/couch/test/eunit/fixtures/os_daemon_configer.escript (renamed from src/couch/test/fixtures/os_daemon_configer.escript)0
-rwxr-xr-xsrc/couch/test/eunit/fixtures/os_daemon_die_on_boot.sh (renamed from src/couch/test/fixtures/os_daemon_die_on_boot.sh)0
-rwxr-xr-xsrc/couch/test/eunit/fixtures/os_daemon_die_quickly.sh (renamed from src/couch/test/fixtures/os_daemon_die_quickly.sh)0
-rwxr-xr-xsrc/couch/test/eunit/fixtures/os_daemon_looper.escript (renamed from src/couch/test/fixtures/os_daemon_looper.escript)0
-rw-r--r--src/couch/test/eunit/fixtures/test.couch (renamed from src/couch/test/fixtures/test.couch)bin16482 -> 16482 bytes
-rw-r--r--src/couch/test/eunit/global_changes_tests.erl (renamed from src/couch/test/global_changes_tests.erl)0
-rw-r--r--src/couch/test/eunit/json_stream_parse_tests.erl (renamed from src/couch/test/json_stream_parse_tests.erl)0
-rw-r--r--src/couch/test/eunit/test_web.erl (renamed from src/couch/test/test_web.erl)0
-rw-r--r--src/couch/test/exunit/test_helper.exs2
-rw-r--r--src/couch_epi/test/eunit/couch_epi_basic_test.erl (renamed from src/couch_epi/test/couch_epi_basic_test.erl)0
-rw-r--r--src/couch_epi/test/eunit/couch_epi_tests.erl (renamed from src/couch_epi/test/couch_epi_tests.erl)4
-rw-r--r--src/couch_epi/test/eunit/fixtures/app_data1.cfg (renamed from src/couch_epi/test/fixtures/app_data1.cfg)0
-rw-r--r--src/couch_epi/test/eunit/fixtures/app_data2.cfg (renamed from src/couch_epi/test/fixtures/app_data2.cfg)0
-rw-r--r--src/couch_index/test/eunit/couch_index_compaction_tests.erl (renamed from src/couch_index/test/couch_index_compaction_tests.erl)0
-rw-r--r--src/couch_index/test/eunit/couch_index_ddoc_updated_tests.erl (renamed from src/couch_index/test/couch_index_ddoc_updated_tests.erl)0
-rw-r--r--src/couch_log/test/eunit/couch_log_config_listener_test.erl (renamed from src/couch_log/test/couch_log_config_listener_test.erl)0
-rw-r--r--src/couch_log/test/eunit/couch_log_config_test.erl (renamed from src/couch_log/test/couch_log_config_test.erl)0
-rw-r--r--src/couch_log/test/eunit/couch_log_error_logger_h_test.erl (renamed from src/couch_log/test/couch_log_error_logger_h_test.erl)0
-rw-r--r--src/couch_log/test/eunit/couch_log_formatter_test.erl (renamed from src/couch_log/test/couch_log_formatter_test.erl)0
-rw-r--r--src/couch_log/test/eunit/couch_log_monitor_test.erl (renamed from src/couch_log/test/couch_log_monitor_test.erl)0
-rw-r--r--src/couch_log/test/eunit/couch_log_server_test.erl (renamed from src/couch_log/test/couch_log_server_test.erl)0
-rw-r--r--src/couch_log/test/eunit/couch_log_test.erl (renamed from src/couch_log/test/couch_log_test.erl)0
-rw-r--r--src/couch_log/test/eunit/couch_log_test_util.erl (renamed from src/couch_log/test/couch_log_test_util.erl)0
-rw-r--r--src/couch_log/test/eunit/couch_log_trunc_io_fmt_test.erl (renamed from src/couch_log/test/couch_log_trunc_io_fmt_test.erl)0
-rw-r--r--src/couch_log/test/eunit/couch_log_util_test.erl (renamed from src/couch_log/test/couch_log_util_test.erl)0
-rw-r--r--src/couch_log/test/eunit/couch_log_writer_ets.erl (renamed from src/couch_log/test/couch_log_writer_ets.erl)0
-rw-r--r--src/couch_log/test/eunit/couch_log_writer_file_test.erl (renamed from src/couch_log/test/couch_log_writer_file_test.erl)0
-rw-r--r--src/couch_log/test/eunit/couch_log_writer_stderr_test.erl (renamed from src/couch_log/test/couch_log_writer_stderr_test.erl)0
-rw-r--r--src/couch_log/test/eunit/couch_log_writer_syslog_test.erl (renamed from src/couch_log/test/couch_log_writer_syslog_test.erl)0
-rw-r--r--src/couch_log/test/eunit/couch_log_writer_test.erl (renamed from src/couch_log/test/couch_log_writer_test.erl)0
-rw-r--r--src/couch_mrview/test/eunit/couch_mrview_all_docs_tests.erl (renamed from src/couch_mrview/test/couch_mrview_all_docs_tests.erl)0
-rw-r--r--src/couch_mrview/test/eunit/couch_mrview_changes_since_tests.erl (renamed from src/couch_mrview/test/couch_mrview_changes_since_tests.erl)0
-rw-r--r--src/couch_mrview/test/eunit/couch_mrview_collation_tests.erl (renamed from src/couch_mrview/test/couch_mrview_collation_tests.erl)0
-rw-r--r--src/couch_mrview/test/eunit/couch_mrview_compact_tests.erl (renamed from src/couch_mrview/test/couch_mrview_compact_tests.erl)0
-rw-r--r--src/couch_mrview/test/eunit/couch_mrview_ddoc_updated_tests.erl (renamed from src/couch_mrview/test/couch_mrview_ddoc_updated_tests.erl)0
-rw-r--r--src/couch_mrview/test/eunit/couch_mrview_ddoc_validation_tests.erl (renamed from src/couch_mrview/test/couch_mrview_ddoc_validation_tests.erl)0
-rw-r--r--src/couch_mrview/test/eunit/couch_mrview_design_docs_tests.erl (renamed from src/couch_mrview/test/couch_mrview_design_docs_tests.erl)0
-rw-r--r--src/couch_mrview/test/eunit/couch_mrview_http_tests.erl (renamed from src/couch_mrview/test/couch_mrview_http_tests.erl)0
-rw-r--r--src/couch_mrview/test/eunit/couch_mrview_index_changes_tests.erl (renamed from src/couch_mrview/test/couch_mrview_index_changes_tests.erl)0
-rw-r--r--src/couch_mrview/test/eunit/couch_mrview_index_info_tests.erl (renamed from src/couch_mrview/test/couch_mrview_index_info_tests.erl)0
-rw-r--r--src/couch_mrview/test/eunit/couch_mrview_local_docs_tests.erl (renamed from src/couch_mrview/test/couch_mrview_local_docs_tests.erl)0
-rw-r--r--src/couch_mrview/test/eunit/couch_mrview_map_views_tests.erl (renamed from src/couch_mrview/test/couch_mrview_map_views_tests.erl)0
-rw-r--r--src/couch_mrview/test/eunit/couch_mrview_purge_docs_fabric_tests.erl (renamed from src/couch_mrview/test/couch_mrview_purge_docs_fabric_tests.erl)0
-rw-r--r--src/couch_mrview/test/eunit/couch_mrview_purge_docs_tests.erl (renamed from src/couch_mrview/test/couch_mrview_purge_docs_tests.erl)0
-rw-r--r--src/couch_mrview/test/eunit/couch_mrview_red_views_tests.erl (renamed from src/couch_mrview/test/couch_mrview_red_views_tests.erl)0
-rw-r--r--src/couch_mrview/test/eunit/couch_mrview_util_tests.erl (renamed from src/couch_mrview/test/couch_mrview_util_tests.erl)0
-rw-r--r--src/couch_peruser/test/eunit/couch_peruser_test.erl (renamed from src/couch_peruser/test/couch_peruser_test.erl)0
-rw-r--r--src/couch_replicator/test/eunit/couch_replicator_attachments_too_large.erl (renamed from src/couch_replicator/test/couch_replicator_attachments_too_large.erl)0
-rw-r--r--src/couch_replicator/test/eunit/couch_replicator_compact_tests.erl (renamed from src/couch_replicator/test/couch_replicator_compact_tests.erl)0
-rw-r--r--src/couch_replicator/test/eunit/couch_replicator_connection_tests.erl (renamed from src/couch_replicator/test/couch_replicator_connection_tests.erl)0
-rw-r--r--src/couch_replicator/test/eunit/couch_replicator_create_target_with_options_tests.erl (renamed from src/couch_replicator/test/couch_replicator_create_target_with_options_tests.erl)0
-rw-r--r--src/couch_replicator/test/eunit/couch_replicator_filtered_tests.erl (renamed from src/couch_replicator/test/couch_replicator_filtered_tests.erl)0
-rw-r--r--src/couch_replicator/test/eunit/couch_replicator_httpc_pool_tests.erl (renamed from src/couch_replicator/test/couch_replicator_httpc_pool_tests.erl)0
-rw-r--r--src/couch_replicator/test/eunit/couch_replicator_id_too_long_tests.erl (renamed from src/couch_replicator/test/couch_replicator_id_too_long_tests.erl)0
-rw-r--r--src/couch_replicator/test/eunit/couch_replicator_large_atts_tests.erl (renamed from src/couch_replicator/test/couch_replicator_large_atts_tests.erl)0
-rw-r--r--src/couch_replicator/test/eunit/couch_replicator_many_leaves_tests.erl (renamed from src/couch_replicator/test/couch_replicator_many_leaves_tests.erl)0
-rw-r--r--src/couch_replicator/test/eunit/couch_replicator_missing_stubs_tests.erl (renamed from src/couch_replicator/test/couch_replicator_missing_stubs_tests.erl)0
-rw-r--r--src/couch_replicator/test/eunit/couch_replicator_proxy_tests.erl (renamed from src/couch_replicator/test/couch_replicator_proxy_tests.erl)0
-rw-r--r--src/couch_replicator/test/eunit/couch_replicator_rate_limiter_tests.erl (renamed from src/couch_replicator/test/couch_replicator_rate_limiter_tests.erl)0
-rw-r--r--src/couch_replicator/test/eunit/couch_replicator_retain_stats_between_job_runs.erl (renamed from src/couch_replicator/test/couch_replicator_retain_stats_between_job_runs.erl)0
-rw-r--r--src/couch_replicator/test/eunit/couch_replicator_selector_tests.erl (renamed from src/couch_replicator/test/couch_replicator_selector_tests.erl)0
-rw-r--r--src/couch_replicator/test/eunit/couch_replicator_small_max_request_size_target.erl (renamed from src/couch_replicator/test/couch_replicator_small_max_request_size_target.erl)0
-rw-r--r--src/couch_replicator/test/eunit/couch_replicator_test_helper.erl (renamed from src/couch_replicator/test/couch_replicator_test_helper.erl)0
-rw-r--r--src/couch_replicator/test/eunit/couch_replicator_use_checkpoints_tests.erl (renamed from src/couch_replicator/test/couch_replicator_use_checkpoints_tests.erl)0
-rw-r--r--src/ddoc_cache/test/eunit/ddoc_cache_basic_test.erl (renamed from src/ddoc_cache/test/ddoc_cache_basic_test.erl)0
-rw-r--r--src/ddoc_cache/test/eunit/ddoc_cache_coverage_test.erl (renamed from src/ddoc_cache/test/ddoc_cache_coverage_test.erl)0
-rw-r--r--src/ddoc_cache/test/eunit/ddoc_cache_disabled_test.erl (renamed from src/ddoc_cache/test/ddoc_cache_disabled_test.erl)0
-rw-r--r--src/ddoc_cache/test/eunit/ddoc_cache_entry_test.erl (renamed from src/ddoc_cache/test/ddoc_cache_entry_test.erl)0
-rw-r--r--src/ddoc_cache/test/eunit/ddoc_cache_ev.erl (renamed from src/ddoc_cache/test/ddoc_cache_ev.erl)0
-rw-r--r--src/ddoc_cache/test/eunit/ddoc_cache_eviction_test.erl (renamed from src/ddoc_cache/test/ddoc_cache_eviction_test.erl)0
-rw-r--r--src/ddoc_cache/test/eunit/ddoc_cache_lru_test.erl (renamed from src/ddoc_cache/test/ddoc_cache_lru_test.erl)0
-rw-r--r--src/ddoc_cache/test/eunit/ddoc_cache_no_cache_test.erl (renamed from src/ddoc_cache/test/ddoc_cache_no_cache_test.erl)0
-rw-r--r--src/ddoc_cache/test/eunit/ddoc_cache_open_error_test.erl (renamed from src/ddoc_cache/test/ddoc_cache_open_error_test.erl)0
-rw-r--r--src/ddoc_cache/test/eunit/ddoc_cache_open_test.erl (renamed from src/ddoc_cache/test/ddoc_cache_open_test.erl)0
-rw-r--r--src/ddoc_cache/test/eunit/ddoc_cache_opener_test.erl (renamed from src/ddoc_cache/test/ddoc_cache_opener_test.erl)0
-rw-r--r--src/ddoc_cache/test/eunit/ddoc_cache_refresh_test.erl (renamed from src/ddoc_cache/test/ddoc_cache_refresh_test.erl)0
-rw-r--r--src/ddoc_cache/test/eunit/ddoc_cache_remove_test.erl (renamed from src/ddoc_cache/test/ddoc_cache_remove_test.erl)0
-rw-r--r--src/ddoc_cache/test/eunit/ddoc_cache_test.hrl (renamed from src/ddoc_cache/test/ddoc_cache_test.hrl)0
-rw-r--r--src/ddoc_cache/test/eunit/ddoc_cache_tutil.erl (renamed from src/ddoc_cache/test/ddoc_cache_tutil.erl)0
-rw-r--r--src/dreyfus/test/elixir/test/partition_search_test.exs4
-rw-r--r--src/fabric/test/eunit/fabric_rpc_purge_tests.erl (renamed from src/fabric/test/fabric_rpc_purge_tests.erl)0
-rw-r--r--src/global_changes/test/eunit/global_changes_hooks_tests.erl (renamed from src/global_changes/test/global_changes_hooks_tests.erl)0
-rw-r--r--src/mem3/test/eunit/mem3_cluster_test.erl (renamed from src/mem3/test/mem3_cluster_test.erl)0
-rw-r--r--src/mem3/test/eunit/mem3_hash_test.erl (renamed from src/mem3/test/mem3_hash_test.erl)0
-rw-r--r--src/mem3/test/eunit/mem3_rep_test.erl (renamed from src/mem3/test/mem3_rep_test.erl)0
-rw-r--r--src/mem3/test/eunit/mem3_reshard_api_test.erl (renamed from src/mem3/test/mem3_reshard_api_test.erl)0
-rw-r--r--src/mem3/test/eunit/mem3_reshard_changes_feed_test.erl (renamed from src/mem3/test/mem3_reshard_changes_feed_test.erl)0
-rw-r--r--src/mem3/test/eunit/mem3_reshard_test.erl (renamed from src/mem3/test/mem3_reshard_test.erl)0
-rw-r--r--src/mem3/test/eunit/mem3_ring_prop_tests.erl (renamed from src/mem3/test/mem3_ring_prop_tests.erl)0
-rw-r--r--src/mem3/test/eunit/mem3_seeds_test.erl (renamed from src/mem3/test/mem3_seeds_test.erl)0
-rw-r--r--src/mem3/test/eunit/mem3_sync_security_test.erl (renamed from src/mem3/test/mem3_sync_security_test.erl)0
-rw-r--r--src/mem3/test/eunit/mem3_util_test.erl (renamed from src/mem3/test/mem3_util_test.erl)0
-rw-r--r--test/elixir/Makefile4
-rw-r--r--test/elixir/README.md143
-rw-r--r--test/elixir/lib/ex_unit.ex44
-rw-r--r--test/elixir/lib/setup.ex97
-rw-r--r--test/elixir/lib/setup/common.ex22
-rw-r--r--test/elixir/lib/step.ex44
-rw-r--r--test/elixir/lib/step/config.ex33
-rw-r--r--test/elixir/lib/step/create_db.ex53
-rw-r--r--test/elixir/lib/step/start.ex85
-rw-r--r--test/elixir/lib/step/user.ex104
-rw-r--r--test/elixir/lib/utils.ex61
-rw-r--r--test/elixir/mix.exs37
-rwxr-xr-xtest/elixir/run6
-rw-r--r--test/elixir/test/replication_test.exs4
-rw-r--r--test/elixir/test/test_helper.exs8
205 files changed, 887 insertions, 79 deletions
diff --git a/test/elixir/.credo.exs b/.credo.exs
index e24836c8f..2b84a5064 100644
--- a/test/elixir/.credo.exs
+++ b/.credo.exs
@@ -22,7 +22,16 @@
# In the latter case `**/*.{ex,exs}` will be used.
#
included: ["lib/", "src/", "test/", "web/", "apps/"],
- excluded: [~r"/_build/", ~r"/deps/", ~r"/node_modules/"]
+ excluded: [
+ ~r"/_build/",
+ ~r"/node_modules/",
+ ~r"/src/jason",
+ ~r"/src/httpotion",
+ ~r"/src/credo",
+ ~r"/src/junit_formatter",
+ ~r"/src/bunt",
+ ~r"/test/elixir/deps/"
+ ]
},
#
# If you create your own checks, you must specify the source files for
diff --git a/.formatter.exs b/.formatter.exs
new file mode 100644
index 000000000..28b883d54
--- /dev/null
+++ b/.formatter.exs
@@ -0,0 +1,9 @@
+# Used by "mix format"
+[
+ inputs: [
+ "{mix,.formatter}.exs",
+ "{config,src}/*/test/exunit/*.{ex,exs}"
+ ],
+ line_length: 90,
+ rename_deprecated_at: "1.5.0"
+]
diff --git a/.gitignore b/.gitignore
index 36bc13007..6b9198d42 100644
--- a/.gitignore
+++ b/.gitignore
@@ -104,3 +104,10 @@ src/global_changes/ebin/
src/mango/ebin/
src/mango/test/*.pyc
src/mango/venv/
+
+/_build/
+/src/bunt
+/src/credo/
+/src/httpotion/
+/src/jason/
+/src/junit_formatter/
diff --git a/.travis.yml b/.travis.yml
index 7ef4aeadf..4af915ee9 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -41,10 +41,6 @@ env:
- secure: "UdA/gKIlyuXaW+hUgRx40t1TYjLCGxMqHvM5Uw7UbUH2dqEkgJiLfhZGchS1JVzl8M01VKZUUzS7v2nvRLiHZN1kvaw5kfq31VRoafUah8jfmvqNWZVdLovHl3aw5UX/HRt0RkbWbhdbdknTfh6+YinSZ+Nb54jCErMg9nabXtM="
- COUCHDB_IO_LOG_DIR=/tmp/couchjslogs
-# Change to elixir folder so that travis can run mix deps.get during install
-before_install:
- - cd test/elixir
-
# Enable this block if you want to build docs & fauxton too
#node_js:
# - 6
@@ -53,7 +49,6 @@ before_install:
# Then comment this section out
before_script:
- - cd ../..
- kerl list installations
- rm -rf /tmp/couchjslogs
- mkdir -p /tmp/couchjslogs
diff --git a/Makefile b/Makefile
index 0acf8284d..58c814885 100644
--- a/Makefile
+++ b/Makefile
@@ -173,6 +173,16 @@ eunit: couch
$(REBAR) -r eunit $(EUNIT_OPTS) apps=$$dir || exit 1; \
done
+.PHONY: exunit
+# target: exunit - Run ExUnit tests
+exunit: export BUILDDIR = $(shell pwd)
+exunit: export MIX_ENV=test
+exunit: export ERL_LIBS = $(shell pwd)/src
+exunit: export ERL_AFLAGS = -config $(shell pwd)/rel/files/eunit.config
+exunit: export COUCHDB_QUERY_SERVER_JAVASCRIPT = $(shell pwd)/bin/couchjs $(shell pwd)/share/server/main.js
+exunit: couch elixir-init setup-eunit elixir-check-formatted elixir-credo
+ @mix test --trace $(EXUNIT_OPTS)
+
setup-eunit: export BUILDDIR = $(shell pwd)
setup-eunit: export ERL_AFLAGS = -config $(shell pwd)/rel/files/eunit.config
setup-eunit:
@@ -212,34 +222,37 @@ python-black-update: .venv/bin/black
. dev/run rel/overlay/bin/couchup test/javascript/run
.PHONY: elixir
+elixir: export MIX_ENV=integration
elixir: elixir-init elixir-check-formatted elixir-credo devclean
- @dev/run -a adm:pass --no-eval 'test/elixir/run --exclude without_quorum_test --exclude with_quorum_test $(EXUNIT_OPTS)'
+ @dev/run -a adm:pass --no-eval 'mix test --trace --exclude without_quorum_test --exclude with_quorum_test $(EXUNIT_OPTS)'
.PHONY: elixir-init
elixir-init:
- @cd test/elixir && mix local.rebar --force && mix local.hex --force && mix deps.get
+ @mix local.rebar --force && mix local.hex --force && mix deps.get
.PHONY: elixir-cluster-without-quorum
-elixir-cluster-without-quorum: elixir-check-formatted elixir-credo devclean
+elixir-cluster-without-quorum: export MIX_ENV=integration
+elixir-cluster-without-quorum: elixir-init elixir-check-formatted elixir-credo devclean
@dev/run -n 3 -q -a adm:pass \
--degrade-cluster 2 \
- --no-eval 'test/elixir/run --only without_quorum_test $(EXUNIT_OPTS)'
+ --no-eval 'mix test --trace --only without_quorum_test $(EXUNIT_OPTS)'
.PHONY: elixir-cluster-with-quorum
-elixir-cluster-with-quorum: elixir-check-formatted elixir-credo devclean
+elixir-cluster-with-quorum: export MIX_ENV=integration
+elixir-cluster-with-quorum: elixir-init elixir-check-formatted elixir-credo devclean
@dev/run -n 3 -q -a adm:pass \
--degrade-cluster 1 \
- --no-eval 'test/elixir/run --only with_quorum_test $(EXUNIT_OPTS)'
+ --no-eval 'mix test --trace --only with_quorum_test $(EXUNIT_OPTS)'
.PHONY: elixir-check-formatted
-elixir-check-formatted:
- @cd test/elixir/ && mix format --check-formatted
+elixir-check-formatted: elixir-init
+ @mix format --check-formatted
# Credo is a static code analysis tool for Elixir.
# We use it in our tests
.PHONY: elixir-credo
-elixir-credo:
- @cd test/elixir/ && mix credo
+elixir-credo: elixir-init
+ @mix credo
.PHONY: javascript
# target: javascript - Run JavaScript test suites or specific ones defined by suites option
diff --git a/Makefile.win b/Makefile.win
index 99ec71278..a5e23d498 100644
--- a/Makefile.win
+++ b/Makefile.win
@@ -144,6 +144,16 @@ eunit: couch
@$(REBAR) setup_eunit 2> nul
@$(REBAR) -r eunit $(EUNIT_OPTS)
+.PHONY: exunit
+# target: exunit - Run ExUnit tests
+exunit: export BUILDDIR = $(shell echo %cd%)
+exunit: export MIX_ENV=test
+exunit: export ERL_LIBS = $(shell echo %cd%)\src
+exunit: export ERL_AFLAGS = -config $(shell echo %cd%)/rel/files/eunit.config
+exunit: export COUCHDB_QUERY_SERVER_JAVASCRIPT = $(shell echo %cd%)/bin/couchjs $(shell echo %cd%)/share/server/main.js
+exunit: couch elixir-init setup-eunit elixir-check-formatted elixir-credo
+ @mix test --trace $(EXUNIT_OPTS)
+
setup-eunit: export BUILDDIR = $(shell pwd)
setup-eunit: export ERL_AFLAGS = $(shell echo "-config rel/files/eunit.config")
setup-eunit:
@@ -177,33 +187,33 @@ python-black-update: .venv/bin/black
.PHONY: elixir
elixir: elixir-init elixir-check-formatted elixir-credo devclean
- @dev\run -a adm:pass --no-eval 'test\elixir\run.cmd --exclude without_quorum_test --exclude with_quorum_test $(EXUNIT_OPTS)'
+ @dev\run -a adm:pass --no-eval 'mix test --trace --exclude without_quorum_test --exclude with_quorum_test $(EXUNIT_OPTS)'
.PHONY: elixir-init
elixir-init:
- @cd test/elixir && mix local.rebar --force && mix local.hex --force && mix deps.get
+ @mix local.rebar --force && mix local.hex --force && mix deps.get
.PHONY: elixir-cluster-without-quorum
elixir-cluster-without-quorum: elixir-check-formatted elixir-credo devclean
@dev\run -n 3 -q -a adm:pass \
--degrade-cluster 2 \
- --no-eval 'test\elixir\run.cmd --only without_quorum_test $(EXUNIT_OPTS)'
+ --no-eval 'mix test --trace --only without_quorum_test $(EXUNIT_OPTS)'
.PHONY: elixir-cluster-with-quorum
elixir-cluster-with-quorum: elixir-check-formatted elixir-credo devclean
@dev\run -n 3 -q -a adm:pass \
--degrade-cluster 1 \
- --no-eval 'test\elixir\run.cmd --only with_quorum_test $(EXUNIT_OPTS)'
+ --no-eval 'mix test --trace --only with_quorum_test $(EXUNIT_OPTS)'
.PHONY: elixir-check-formatted
elixir-check-formatted:
- @cd test\elixir && mix format --check-formatted
+ @mix format --check-formatted
# Credo is a static code analysis tool for Elixir.
# We use it in our tests
.PHONY: elixir-credo
elixir-credo:
- @cd test/elixir/ && mix credo
+ @mix credo
.PHONY: test-cluster-with-quorum
test-cluster-with-quorum: devclean
diff --git a/config/config.exs b/config/config.exs
new file mode 100644
index 000000000..8e52433cc
--- /dev/null
+++ b/config/config.exs
@@ -0,0 +1,30 @@
+# This file is responsible for configuring your application
+# and its dependencies with the aid of the Mix.Config module.
+use Mix.Config
+
+# This configuration is loaded before any dependency and is restricted
+# to this project. If another project depends on this project, this
+# file won't be loaded nor affect the parent project. For this reason,
+# if you want to provide default values for your application for
+# 3rd-party users, it should be done in your "mix.exs" file.
+
+# You can configure your application as:
+#
+# config :couchdbtest, key: :value
+#
+# and access this configuration in your application as:
+#
+# Application.get_env(:couchdbtest, :key)
+#
+# You can also configure a 3rd-party app:
+#
+# config :logger, level: :info
+#
+
+# It is also possible to import configuration files, relative to this
+# directory. For example, you can emulate configuration per environment
+# by uncommenting the line below and defining dev.exs, test.exs and such.
+# Configuration from the imported file will override the ones defined
+# here (which is why it is important to import them last).
+#
+import_config "#{Mix.env}.exs" \ No newline at end of file
diff --git a/config/dev.exs b/config/dev.exs
new file mode 100644
index 000000000..d2d855e6d
--- /dev/null
+++ b/config/dev.exs
@@ -0,0 +1 @@
+use Mix.Config
diff --git a/config/integration.exs b/config/integration.exs
new file mode 100644
index 000000000..c5a5ed24a
--- /dev/null
+++ b/config/integration.exs
@@ -0,0 +1,12 @@
+use Mix.Config
+
+config :logger,
+ backends: [:console],
+ compile_time_purge_level: :debug,
+ level: :debug
+
+config :kernel,
+ error_logger: false
+
+config :sasl,
+ sasl_error_logger: false
diff --git a/config/prod.exs b/config/prod.exs
new file mode 100644
index 000000000..d2d855e6d
--- /dev/null
+++ b/config/prod.exs
@@ -0,0 +1 @@
+use Mix.Config
diff --git a/config/test.exs b/config/test.exs
new file mode 100644
index 000000000..c5a5ed24a
--- /dev/null
+++ b/config/test.exs
@@ -0,0 +1,12 @@
+use Mix.Config
+
+config :logger,
+ backends: [:console],
+ compile_time_purge_level: :debug,
+ level: :debug
+
+config :kernel,
+ error_logger: false
+
+config :sasl,
+ sasl_error_logger: false
diff --git a/mix.exs b/mix.exs
new file mode 100644
index 000000000..2e213aeb1
--- /dev/null
+++ b/mix.exs
@@ -0,0 +1,60 @@
+defmodule CouchDBTest.Mixfile do
+ use Mix.Project
+
+ def project do
+ [
+ app: :couchdbtest,
+ version: "0.1.0",
+ elixir: "~> 1.5",
+ lockfile: Path.expand("mix.lock", __DIR__),
+ deps_path: Path.expand("src", __DIR__),
+ build_path: Path.expand("_build", __DIR__),
+ compilers: [:elixir, :app],
+ start_permanent: Mix.env() == :prod,
+ build_embedded: Mix.env() == :prod,
+ deps: deps(),
+ consolidate_protocols: Mix.env() not in [:test, :dev, :integration],
+ test_paths: get_test_paths(Mix.env()),
+ elixirc_paths: elixirc_paths(Mix.env())
+ ]
+ end
+
+ # Run "mix help compile.app" to learn about applications.
+ def application do
+ [
+ extra_applications: [:logger],
+ applications: [:httpotion]
+ ]
+ end
+
+ # Specifies which paths to compile per environment.
+ defp elixirc_paths(:test), do: ["test/elixir/lib", "test/elixir/test/support"]
+ defp elixirc_paths(:integration), do: ["test/elixir/lib", "test/elixir/test/support"]
+ defp elixirc_paths(_), do: ["test/elixir/lib"]
+
+ # Run "mix help deps" to learn about dependencies.
+ defp deps() do
+ [
+ {:httpotion, "~> 3.0", only: [:dev, :test, :integration], runtime: false},
+ {:jiffy, path: Path.expand("src/jiffy", __DIR__)},
+ {:ibrowse,
+ path: Path.expand("src/ibrowse", __DIR__), override: true, compile: false},
+ {:credo, "~> 1.0.0", only: [:dev, :test, :integration], runtime: false}
+ ]
+ end
+
+ def get_test_paths(:test) do
+ Path.wildcard("src/*/test/exunit") |> Enum.filter(&File.dir?/1)
+ end
+
+ def get_test_paths(:integration) do
+ integration_tests =
+ Path.wildcard("src/*/test/integration") |> Enum.filter(&File.dir?/1)
+
+ ["test/elixir/test" | integration_tests]
+ end
+
+ def get_test_paths(_) do
+ []
+ end
+end
diff --git a/test/elixir/mix.lock b/mix.lock
index 0fc391a92..34c0ea961 100644
--- a/test/elixir/mix.lock
+++ b/mix.lock
@@ -1,8 +1,8 @@
%{
"bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], [], "hexpm"},
- "credo": {:hex, :credo, "1.0.0", "aaa40fdd0543a0cf8080e8c5949d8c25f0a24e4fc8c1d83d06c388f5e5e0ea42", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm"},
- "httpotion": {:hex, :httpotion, "3.1.0", "14d20d9b0ce4e86e253eb91e4af79e469ad949f57a5d23c0a51b2f86559f6589", [:mix], [{:ibrowse, "~> 4.4", [hex: :ibrowse, repo: "hexpm", optional: false]}], "hexpm"},
- "ibrowse": {:hex, :ibrowse, "4.4.1", "2b7d0637b0f8b9b4182de4bd0f2e826a4da2c9b04898b6e15659ba921a8d6ec2", [:rebar3], [], "hexpm"},
+ "credo": {:hex, :credo, "1.0.5", "fdea745579f8845315fe6a3b43e2f9f8866839cfbc8562bb72778e9fdaa94214", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm"},
+ "httpotion": {:hex, :httpotion, "3.1.2", "50e3e559c2ffe8c8908c97e4ffb01efc1c18e8547cc7ce5dd173c9cf0a573a3b", [:mix], [{:ibrowse, "== 4.4.0", [hex: :ibrowse, repo: "hexpm", optional: false]}], "hexpm"},
+ "ibrowse": {:hex, :ibrowse, "4.4.0", "2d923325efe0d2cb09b9c6a047b2835a5eda69d8a47ed6ff8bc03628b764e991", [:rebar3], [], "hexpm"},
"jason": {:hex, :jason, "1.1.2", "b03dedea67a99223a2eaf9f1264ce37154564de899fd3d8b9a21b1a6fd64afe7", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm"},
"jiffy": {:hex, :jiffy, "0.15.2", "de266c390111fd4ea28b9302f0bc3d7472468f3b8e0aceabfbefa26d08cd73b7", [:rebar3], [], "hexpm"},
"junit_formatter": {:hex, :junit_formatter, "3.0.0", "13950d944dbd295da7d8cc4798b8faee808a8bb9b637c88069954eac078ac9da", [:mix], [], "hexpm"},
diff --git a/src/chttpd/test/chttpd_cors_test.erl b/src/chttpd/test/eunit/chttpd_cors_test.erl
index 19e851561..19e851561 100644
--- a/src/chttpd/test/chttpd_cors_test.erl
+++ b/src/chttpd/test/eunit/chttpd_cors_test.erl
diff --git a/src/chttpd/test/chttpd_csp_tests.erl b/src/chttpd/test/eunit/chttpd_csp_tests.erl
index e86436254..e86436254 100644
--- a/src/chttpd/test/chttpd_csp_tests.erl
+++ b/src/chttpd/test/eunit/chttpd_csp_tests.erl
diff --git a/src/chttpd/test/chttpd_db_attachment_size_tests.erl b/src/chttpd/test/eunit/chttpd_db_attachment_size_tests.erl
index 0ab08dd80..0ab08dd80 100644
--- a/src/chttpd/test/chttpd_db_attachment_size_tests.erl
+++ b/src/chttpd/test/eunit/chttpd_db_attachment_size_tests.erl
diff --git a/src/chttpd/test/chttpd_db_bulk_get_multipart_test.erl b/src/chttpd/test/eunit/chttpd_db_bulk_get_multipart_test.erl
index 8a95c92ac..8a95c92ac 100644
--- a/src/chttpd/test/chttpd_db_bulk_get_multipart_test.erl
+++ b/src/chttpd/test/eunit/chttpd_db_bulk_get_multipart_test.erl
diff --git a/src/chttpd/test/chttpd_db_bulk_get_test.erl b/src/chttpd/test/eunit/chttpd_db_bulk_get_test.erl
index 864e7079a..864e7079a 100644
--- a/src/chttpd/test/chttpd_db_bulk_get_test.erl
+++ b/src/chttpd/test/eunit/chttpd_db_bulk_get_test.erl
diff --git a/src/chttpd/test/chttpd_db_doc_size_tests.erl b/src/chttpd/test/eunit/chttpd_db_doc_size_tests.erl
index 88e2797a3..88e2797a3 100644
--- a/src/chttpd/test/chttpd_db_doc_size_tests.erl
+++ b/src/chttpd/test/eunit/chttpd_db_doc_size_tests.erl
diff --git a/src/chttpd/test/chttpd_db_test.erl b/src/chttpd/test/eunit/chttpd_db_test.erl
index 2708aa033..2708aa033 100644
--- a/src/chttpd/test/chttpd_db_test.erl
+++ b/src/chttpd/test/eunit/chttpd_db_test.erl
diff --git a/src/chttpd/test/chttpd_dbs_info_test.erl b/src/chttpd/test/eunit/chttpd_dbs_info_test.erl
index 5b61d8831..5b61d8831 100644
--- a/src/chttpd/test/chttpd_dbs_info_test.erl
+++ b/src/chttpd/test/eunit/chttpd_dbs_info_test.erl
diff --git a/src/chttpd/test/chttpd_error_info_tests.erl b/src/chttpd/test/eunit/chttpd_error_info_tests.erl
index fdb015c08..fdb015c08 100644
--- a/src/chttpd/test/chttpd_error_info_tests.erl
+++ b/src/chttpd/test/eunit/chttpd_error_info_tests.erl
diff --git a/src/chttpd/test/chttpd_handlers_tests.erl b/src/chttpd/test/eunit/chttpd_handlers_tests.erl
index f3e8f5dcd..f3e8f5dcd 100644
--- a/src/chttpd/test/chttpd_handlers_tests.erl
+++ b/src/chttpd/test/eunit/chttpd_handlers_tests.erl
diff --git a/src/chttpd/test/chttpd_open_revs_error_test.erl b/src/chttpd/test/eunit/chttpd_open_revs_error_test.erl
index d53d370f8..d53d370f8 100644
--- a/src/chttpd/test/chttpd_open_revs_error_test.erl
+++ b/src/chttpd/test/eunit/chttpd_open_revs_error_test.erl
diff --git a/src/chttpd/test/chttpd_plugin_tests.erl b/src/chttpd/test/eunit/chttpd_plugin_tests.erl
index 36572a419..36572a419 100644
--- a/src/chttpd/test/chttpd_plugin_tests.erl
+++ b/src/chttpd/test/eunit/chttpd_plugin_tests.erl
diff --git a/src/chttpd/test/chttpd_prefer_header_test.erl b/src/chttpd/test/eunit/chttpd_prefer_header_test.erl
index 0f43ba437..0f43ba437 100644
--- a/src/chttpd/test/chttpd_prefer_header_test.erl
+++ b/src/chttpd/test/eunit/chttpd_prefer_header_test.erl
diff --git a/src/chttpd/test/chttpd_purge_tests.erl b/src/chttpd/test/eunit/chttpd_purge_tests.erl
index dbd73de1f..dbd73de1f 100644
--- a/src/chttpd/test/chttpd_purge_tests.erl
+++ b/src/chttpd/test/eunit/chttpd_purge_tests.erl
diff --git a/src/chttpd/test/chttpd_security_tests.erl b/src/chttpd/test/eunit/chttpd_security_tests.erl
index 955b4ff01..955b4ff01 100644
--- a/src/chttpd/test/chttpd_security_tests.erl
+++ b/src/chttpd/test/eunit/chttpd_security_tests.erl
diff --git a/src/chttpd/test/chttpd_socket_buffer_size_test.erl b/src/chttpd/test/eunit/chttpd_socket_buffer_size_test.erl
index 937880621..937880621 100644
--- a/src/chttpd/test/chttpd_socket_buffer_size_test.erl
+++ b/src/chttpd/test/eunit/chttpd_socket_buffer_size_test.erl
diff --git a/src/chttpd/test/chttpd_view_test.erl b/src/chttpd/test/eunit/chttpd_view_test.erl
index 3457c6f30..3457c6f30 100644
--- a/src/chttpd/test/chttpd_view_test.erl
+++ b/src/chttpd/test/eunit/chttpd_view_test.erl
diff --git a/src/chttpd/test/chttpd_welcome_test.erl b/src/chttpd/test/eunit/chttpd_welcome_test.erl
index e427f4dff..e427f4dff 100644
--- a/src/chttpd/test/chttpd_welcome_test.erl
+++ b/src/chttpd/test/eunit/chttpd_welcome_test.erl
diff --git a/src/chttpd/test/chttpd_xframe_test.erl b/src/chttpd/test/eunit/chttpd_xframe_test.erl
index 1272c198c..1272c198c 100644
--- a/src/chttpd/test/chttpd_xframe_test.erl
+++ b/src/chttpd/test/eunit/chttpd_xframe_test.erl
diff --git a/src/couch/include/couch_eunit.hrl b/src/couch/include/couch_eunit.hrl
index f4617e1d3..d3611c88b 100644
--- a/src/couch/include/couch_eunit.hrl
+++ b/src/couch/include/couch_eunit.hrl
@@ -28,7 +28,7 @@
filename:join([?BUILDDIR(), "tmp", "etc", "local_eunit.ini"]),
filename:join([?BUILDDIR(), "tmp", "etc", "eunit.ini"])]).
-define(FIXTURESDIR,
- filename:join([?BUILDDIR(), "src", "couch", "test", "fixtures"])).
+ filename:join([?BUILDDIR(), "src", "couch", "test", "eunit", "fixtures"])).
-define(TEMPDIR,
filename:join([?BUILDDIR(), "tmp", "tmp_data"])).
diff --git a/src/couch/test/chttpd_endpoints_tests.erl b/src/couch/test/eunit/chttpd_endpoints_tests.erl
index 9b7430823..9b7430823 100644
--- a/src/couch/test/chttpd_endpoints_tests.erl
+++ b/src/couch/test/eunit/chttpd_endpoints_tests.erl
diff --git a/src/couch/test/couch_auth_cache_tests.erl b/src/couch/test/eunit/couch_auth_cache_tests.erl
index 706c0cee9..706c0cee9 100644
--- a/src/couch/test/couch_auth_cache_tests.erl
+++ b/src/couch/test/eunit/couch_auth_cache_tests.erl
diff --git a/src/couch/test/couch_base32_tests.erl b/src/couch/test/eunit/couch_base32_tests.erl
index 7e4d59a09..7e4d59a09 100644
--- a/src/couch/test/couch_base32_tests.erl
+++ b/src/couch/test/eunit/couch_base32_tests.erl
diff --git a/src/couch/test/couch_bt_engine_compactor_tests.erl b/src/couch/test/eunit/couch_bt_engine_compactor_tests.erl
index 6c99ceb73..6c99ceb73 100644
--- a/src/couch/test/couch_bt_engine_compactor_tests.erl
+++ b/src/couch/test/eunit/couch_bt_engine_compactor_tests.erl
diff --git a/src/couch/test/couch_bt_engine_tests.erl b/src/couch/test/eunit/couch_bt_engine_tests.erl
index 3e3ecbf25..3e3ecbf25 100644
--- a/src/couch/test/couch_bt_engine_tests.erl
+++ b/src/couch/test/eunit/couch_bt_engine_tests.erl
diff --git a/src/couch/test/couch_bt_engine_upgrade_tests.erl b/src/couch/test/eunit/couch_bt_engine_upgrade_tests.erl
index 3a516f8f7..3a516f8f7 100644
--- a/src/couch/test/couch_bt_engine_upgrade_tests.erl
+++ b/src/couch/test/eunit/couch_bt_engine_upgrade_tests.erl
diff --git a/src/couch/test/couch_btree_tests.erl b/src/couch/test/eunit/couch_btree_tests.erl
index c9b791d2c..c9b791d2c 100644
--- a/src/couch/test/couch_btree_tests.erl
+++ b/src/couch/test/eunit/couch_btree_tests.erl
diff --git a/src/couch/test/couch_changes_tests.erl b/src/couch/test/eunit/couch_changes_tests.erl
index 0c2f5f91f..0c2f5f91f 100644
--- a/src/couch/test/couch_changes_tests.erl
+++ b/src/couch/test/eunit/couch_changes_tests.erl
diff --git a/src/couch/test/couch_compress_tests.erl b/src/couch/test/eunit/couch_compress_tests.erl
index addb9a0e2..addb9a0e2 100644
--- a/src/couch/test/couch_compress_tests.erl
+++ b/src/couch/test/eunit/couch_compress_tests.erl
diff --git a/src/couch/test/couch_db_doc_tests.erl b/src/couch/test/eunit/couch_db_doc_tests.erl
index cdcf81d15..cdcf81d15 100644
--- a/src/couch/test/couch_db_doc_tests.erl
+++ b/src/couch/test/eunit/couch_db_doc_tests.erl
diff --git a/src/couch/test/couch_db_mpr_tests.erl b/src/couch/test/eunit/couch_db_mpr_tests.erl
index bb97c66d7..bb97c66d7 100644
--- a/src/couch/test/couch_db_mpr_tests.erl
+++ b/src/couch/test/eunit/couch_db_mpr_tests.erl
diff --git a/src/couch/test/couch_db_plugin_tests.erl b/src/couch/test/eunit/couch_db_plugin_tests.erl
index 93551adbc..93551adbc 100644
--- a/src/couch/test/couch_db_plugin_tests.erl
+++ b/src/couch/test/eunit/couch_db_plugin_tests.erl
diff --git a/src/couch/test/couch_db_props_upgrade_tests.erl b/src/couch/test/eunit/couch_db_props_upgrade_tests.erl
index 40ad283cf..40ad283cf 100644
--- a/src/couch/test/couch_db_props_upgrade_tests.erl
+++ b/src/couch/test/eunit/couch_db_props_upgrade_tests.erl
diff --git a/src/couch/test/couch_db_split_tests.erl b/src/couch/test/eunit/couch_db_split_tests.erl
index 7d2bb4006..7d2bb4006 100644
--- a/src/couch/test/couch_db_split_tests.erl
+++ b/src/couch/test/eunit/couch_db_split_tests.erl
diff --git a/src/couch/test/couch_db_tests.erl b/src/couch/test/eunit/couch_db_tests.erl
index d64f7c640..d64f7c640 100644
--- a/src/couch/test/couch_db_tests.erl
+++ b/src/couch/test/eunit/couch_db_tests.erl
diff --git a/src/couch/test/couch_doc_json_tests.erl b/src/couch/test/eunit/couch_doc_json_tests.erl
index 51f228900..51f228900 100644
--- a/src/couch/test/couch_doc_json_tests.erl
+++ b/src/couch/test/eunit/couch_doc_json_tests.erl
diff --git a/src/couch/test/couch_doc_tests.erl b/src/couch/test/eunit/couch_doc_tests.erl
index cf41df61d..cf41df61d 100644
--- a/src/couch/test/couch_doc_tests.erl
+++ b/src/couch/test/eunit/couch_doc_tests.erl
diff --git a/src/couch/test/couch_ejson_size_tests.erl b/src/couch/test/eunit/couch_ejson_size_tests.erl
index df9168ed1..df9168ed1 100644
--- a/src/couch/test/couch_ejson_size_tests.erl
+++ b/src/couch/test/eunit/couch_ejson_size_tests.erl
diff --git a/src/couch/test/couch_etag_tests.erl b/src/couch/test/eunit/couch_etag_tests.erl
index 9d15e483f..9d15e483f 100644
--- a/src/couch/test/couch_etag_tests.erl
+++ b/src/couch/test/eunit/couch_etag_tests.erl
diff --git a/src/couch/test/couch_file_tests.erl b/src/couch/test/eunit/couch_file_tests.erl
index e9806c09a..e9806c09a 100644
--- a/src/couch/test/couch_file_tests.erl
+++ b/src/couch/test/eunit/couch_file_tests.erl
diff --git a/src/couch/test/couch_flags_config_tests.erl b/src/couch/test/eunit/couch_flags_config_tests.erl
index 1a66cdcff..1a66cdcff 100644
--- a/src/couch/test/couch_flags_config_tests.erl
+++ b/src/couch/test/eunit/couch_flags_config_tests.erl
diff --git a/src/couch/test/couch_flags_tests.erl b/src/couch/test/eunit/couch_flags_tests.erl
index 32ec57b77..32ec57b77 100644
--- a/src/couch/test/couch_flags_tests.erl
+++ b/src/couch/test/eunit/couch_flags_tests.erl
diff --git a/src/couch/test/couch_hotp_tests.erl b/src/couch/test/eunit/couch_hotp_tests.erl
index fee10ff5e..fee10ff5e 100644
--- a/src/couch/test/couch_hotp_tests.erl
+++ b/src/couch/test/eunit/couch_hotp_tests.erl
diff --git a/src/couch/test/couch_index_tests.erl b/src/couch/test/eunit/couch_index_tests.erl
index fab3806d0..fab3806d0 100644
--- a/src/couch/test/couch_index_tests.erl
+++ b/src/couch/test/eunit/couch_index_tests.erl
diff --git a/src/couch/test/couch_key_tree_prop_tests.erl b/src/couch/test/eunit/couch_key_tree_prop_tests.erl
index f8146926a..f8146926a 100644
--- a/src/couch/test/couch_key_tree_prop_tests.erl
+++ b/src/couch/test/eunit/couch_key_tree_prop_tests.erl
diff --git a/src/couch/test/couch_key_tree_tests.erl b/src/couch/test/eunit/couch_key_tree_tests.erl
index 5d9cc8372..5d9cc8372 100644
--- a/src/couch/test/couch_key_tree_tests.erl
+++ b/src/couch/test/eunit/couch_key_tree_tests.erl
diff --git a/src/couch/test/couch_passwords_tests.erl b/src/couch/test/eunit/couch_passwords_tests.erl
index 88de8530f..88de8530f 100644
--- a/src/couch/test/couch_passwords_tests.erl
+++ b/src/couch/test/eunit/couch_passwords_tests.erl
diff --git a/src/couch/test/couch_query_servers_tests.erl b/src/couch/test/eunit/couch_query_servers_tests.erl
index f8df896c4..f8df896c4 100644
--- a/src/couch/test/couch_query_servers_tests.erl
+++ b/src/couch/test/eunit/couch_query_servers_tests.erl
diff --git a/src/couch/test/couch_server_tests.erl b/src/couch/test/eunit/couch_server_tests.erl
index 530b7efd0..530b7efd0 100644
--- a/src/couch/test/couch_server_tests.erl
+++ b/src/couch/test/eunit/couch_server_tests.erl
diff --git a/src/couch/test/couch_stream_tests.erl b/src/couch/test/eunit/couch_stream_tests.erl
index a7fedf0af..a7fedf0af 100644
--- a/src/couch/test/couch_stream_tests.erl
+++ b/src/couch/test/eunit/couch_stream_tests.erl
diff --git a/src/couch/test/couch_task_status_tests.erl b/src/couch/test/eunit/couch_task_status_tests.erl
index 0ec03563b..0ec03563b 100644
--- a/src/couch/test/couch_task_status_tests.erl
+++ b/src/couch/test/eunit/couch_task_status_tests.erl
diff --git a/src/couch/test/couch_totp_tests.erl b/src/couch/test/eunit/couch_totp_tests.erl
index 6817a092a..6817a092a 100644
--- a/src/couch/test/couch_totp_tests.erl
+++ b/src/couch/test/eunit/couch_totp_tests.erl
diff --git a/src/couch/test/couch_util_tests.erl b/src/couch/test/eunit/couch_util_tests.erl
index 3e145c4f6..3e145c4f6 100644
--- a/src/couch/test/couch_util_tests.erl
+++ b/src/couch/test/eunit/couch_util_tests.erl
diff --git a/src/couch/test/couch_uuids_tests.erl b/src/couch/test/eunit/couch_uuids_tests.erl
index a836eccc6..a836eccc6 100644
--- a/src/couch/test/couch_uuids_tests.erl
+++ b/src/couch/test/eunit/couch_uuids_tests.erl
diff --git a/src/couch/test/couch_work_queue_tests.erl b/src/couch/test/eunit/couch_work_queue_tests.erl
index a192230ef..a192230ef 100644
--- a/src/couch/test/couch_work_queue_tests.erl
+++ b/src/couch/test/eunit/couch_work_queue_tests.erl
diff --git a/src/couch/test/couchdb_attachments_tests.erl b/src/couch/test/eunit/couchdb_attachments_tests.erl
index 04859dbc9..04859dbc9 100644
--- a/src/couch/test/couchdb_attachments_tests.erl
+++ b/src/couch/test/eunit/couchdb_attachments_tests.erl
diff --git a/src/couch/test/couchdb_auth_tests.erl b/src/couch/test/eunit/couchdb_auth_tests.erl
index ed2c064de..ed2c064de 100644
--- a/src/couch/test/couchdb_auth_tests.erl
+++ b/src/couch/test/eunit/couchdb_auth_tests.erl
diff --git a/src/couch/test/couchdb_cookie_domain_tests.erl b/src/couch/test/eunit/couchdb_cookie_domain_tests.erl
index e66ab31e6..e66ab31e6 100755
--- a/src/couch/test/couchdb_cookie_domain_tests.erl
+++ b/src/couch/test/eunit/couchdb_cookie_domain_tests.erl
diff --git a/src/couch/test/couchdb_cors_tests.erl b/src/couch/test/eunit/couchdb_cors_tests.erl
index 82630bba7..82630bba7 100644
--- a/src/couch/test/couchdb_cors_tests.erl
+++ b/src/couch/test/eunit/couchdb_cors_tests.erl
diff --git a/src/couch/test/couchdb_db_tests.erl b/src/couch/test/eunit/couchdb_db_tests.erl
index 734bafb9f..734bafb9f 100644
--- a/src/couch/test/couchdb_db_tests.erl
+++ b/src/couch/test/eunit/couchdb_db_tests.erl
diff --git a/src/couch/test/couchdb_design_doc_tests.erl b/src/couch/test/eunit/couchdb_design_doc_tests.erl
index eef12e039..eef12e039 100644
--- a/src/couch/test/couchdb_design_doc_tests.erl
+++ b/src/couch/test/eunit/couchdb_design_doc_tests.erl
diff --git a/src/couch/test/couchdb_file_compression_tests.erl b/src/couch/test/eunit/couchdb_file_compression_tests.erl
index 8f0fe5bf1..8f0fe5bf1 100644
--- a/src/couch/test/couchdb_file_compression_tests.erl
+++ b/src/couch/test/eunit/couchdb_file_compression_tests.erl
diff --git a/src/couch/test/couchdb_location_header_tests.erl b/src/couch/test/eunit/couchdb_location_header_tests.erl
index c6c039eb0..c6c039eb0 100644
--- a/src/couch/test/couchdb_location_header_tests.erl
+++ b/src/couch/test/eunit/couchdb_location_header_tests.erl
diff --git a/src/couch/test/couchdb_mrview_cors_tests.erl b/src/couch/test/eunit/couchdb_mrview_cors_tests.erl
index 0f69048a0..0f69048a0 100644
--- a/src/couch/test/couchdb_mrview_cors_tests.erl
+++ b/src/couch/test/eunit/couchdb_mrview_cors_tests.erl
diff --git a/src/couch/test/couchdb_mrview_tests.erl b/src/couch/test/eunit/couchdb_mrview_tests.erl
index 1c96a0ae0..1c96a0ae0 100644
--- a/src/couch/test/couchdb_mrview_tests.erl
+++ b/src/couch/test/eunit/couchdb_mrview_tests.erl
diff --git a/src/couch/test/couchdb_os_proc_pool.erl b/src/couch/test/eunit/couchdb_os_proc_pool.erl
index 69f8051ad..69f8051ad 100644
--- a/src/couch/test/couchdb_os_proc_pool.erl
+++ b/src/couch/test/eunit/couchdb_os_proc_pool.erl
diff --git a/src/couch/test/couchdb_update_conflicts_tests.erl b/src/couch/test/eunit/couchdb_update_conflicts_tests.erl
index e92c73856..e92c73856 100644
--- a/src/couch/test/couchdb_update_conflicts_tests.erl
+++ b/src/couch/test/eunit/couchdb_update_conflicts_tests.erl
diff --git a/src/couch/test/couchdb_vhosts_tests.erl b/src/couch/test/eunit/couchdb_vhosts_tests.erl
index 1c4117215..1c4117215 100644
--- a/src/couch/test/couchdb_vhosts_tests.erl
+++ b/src/couch/test/eunit/couchdb_vhosts_tests.erl
diff --git a/src/couch/test/couchdb_views_tests.erl b/src/couch/test/eunit/couchdb_views_tests.erl
index 60bb5c975..60bb5c975 100644
--- a/src/couch/test/couchdb_views_tests.erl
+++ b/src/couch/test/eunit/couchdb_views_tests.erl
diff --git a/src/couch/test/fixtures/3b835456c235b1827e012e25666152f3.view b/src/couch/test/eunit/fixtures/3b835456c235b1827e012e25666152f3.view
index 9c67648be..9c67648be 100644
--- a/src/couch/test/fixtures/3b835456c235b1827e012e25666152f3.view
+++ b/src/couch/test/eunit/fixtures/3b835456c235b1827e012e25666152f3.view
Binary files differ
diff --git a/src/couch/test/fixtures/couch_stats_aggregates.cfg b/src/couch/test/eunit/fixtures/couch_stats_aggregates.cfg
index 30e475da8..30e475da8 100644
--- a/src/couch/test/fixtures/couch_stats_aggregates.cfg
+++ b/src/couch/test/eunit/fixtures/couch_stats_aggregates.cfg
diff --git a/src/couch/test/fixtures/couch_stats_aggregates.ini b/src/couch/test/eunit/fixtures/couch_stats_aggregates.ini
index cc5cd2187..cc5cd2187 100644
--- a/src/couch/test/fixtures/couch_stats_aggregates.ini
+++ b/src/couch/test/eunit/fixtures/couch_stats_aggregates.ini
diff --git a/src/couch/test/fixtures/db_non_partitioned.couch b/src/couch/test/eunit/fixtures/db_non_partitioned.couch
index 327d9bb5d..327d9bb5d 100644
--- a/src/couch/test/fixtures/db_non_partitioned.couch
+++ b/src/couch/test/eunit/fixtures/db_non_partitioned.couch
Binary files differ
diff --git a/src/couch/test/fixtures/db_v6_with_1_purge_req.couch b/src/couch/test/eunit/fixtures/db_v6_with_1_purge_req.couch
index b0d39c9ec..b0d39c9ec 100644
--- a/src/couch/test/fixtures/db_v6_with_1_purge_req.couch
+++ b/src/couch/test/eunit/fixtures/db_v6_with_1_purge_req.couch
Binary files differ
diff --git a/src/couch/test/fixtures/db_v6_with_1_purge_req_for_2_docs.couch b/src/couch/test/eunit/fixtures/db_v6_with_1_purge_req_for_2_docs.couch
index b584fce31..b584fce31 100644
--- a/src/couch/test/fixtures/db_v6_with_1_purge_req_for_2_docs.couch
+++ b/src/couch/test/eunit/fixtures/db_v6_with_1_purge_req_for_2_docs.couch
Binary files differ
diff --git a/src/couch/test/fixtures/db_v6_with_2_purge_req.couch b/src/couch/test/eunit/fixtures/db_v6_with_2_purge_req.couch
index ee4e11b7f..ee4e11b7f 100644
--- a/src/couch/test/fixtures/db_v6_with_2_purge_req.couch
+++ b/src/couch/test/eunit/fixtures/db_v6_with_2_purge_req.couch
Binary files differ
diff --git a/src/couch/test/fixtures/db_v6_without_purge_req.couch b/src/couch/test/eunit/fixtures/db_v6_without_purge_req.couch
index 814feb8e1..814feb8e1 100644
--- a/src/couch/test/fixtures/db_v6_without_purge_req.couch
+++ b/src/couch/test/eunit/fixtures/db_v6_without_purge_req.couch
Binary files differ
diff --git a/src/couch/test/fixtures/db_v7_with_1_purge_req.couch b/src/couch/test/eunit/fixtures/db_v7_with_1_purge_req.couch
index cab8331db..cab8331db 100644
--- a/src/couch/test/fixtures/db_v7_with_1_purge_req.couch
+++ b/src/couch/test/eunit/fixtures/db_v7_with_1_purge_req.couch
Binary files differ
diff --git a/src/couch/test/fixtures/db_v7_with_1_purge_req_for_2_docs.couch b/src/couch/test/eunit/fixtures/db_v7_with_1_purge_req_for_2_docs.couch
index b613646b1..b613646b1 100644
--- a/src/couch/test/fixtures/db_v7_with_1_purge_req_for_2_docs.couch
+++ b/src/couch/test/eunit/fixtures/db_v7_with_1_purge_req_for_2_docs.couch
Binary files differ
diff --git a/src/couch/test/fixtures/db_v7_with_2_purge_req.couch b/src/couch/test/eunit/fixtures/db_v7_with_2_purge_req.couch
index 126fc919e..126fc919e 100644
--- a/src/couch/test/fixtures/db_v7_with_2_purge_req.couch
+++ b/src/couch/test/eunit/fixtures/db_v7_with_2_purge_req.couch
Binary files differ
diff --git a/src/couch/test/fixtures/db_v7_without_purge_req.couch b/src/couch/test/eunit/fixtures/db_v7_without_purge_req.couch
index 762dc8dad..762dc8dad 100644
--- a/src/couch/test/fixtures/db_v7_without_purge_req.couch
+++ b/src/couch/test/eunit/fixtures/db_v7_without_purge_req.couch
Binary files differ
diff --git a/src/couch/test/fixtures/logo.png b/src/couch/test/eunit/fixtures/logo.png
index d21ac025b..d21ac025b 100644
--- a/src/couch/test/fixtures/logo.png
+++ b/src/couch/test/eunit/fixtures/logo.png
Binary files differ
diff --git a/src/couch/test/fixtures/multipart.http b/src/couch/test/eunit/fixtures/multipart.http
index fe9f271cc..fe9f271cc 100644
--- a/src/couch/test/fixtures/multipart.http
+++ b/src/couch/test/eunit/fixtures/multipart.http
diff --git a/src/couch/test/fixtures/os_daemon_bad_perm.sh b/src/couch/test/eunit/fixtures/os_daemon_bad_perm.sh
index 345c8b40b..345c8b40b 100644
--- a/src/couch/test/fixtures/os_daemon_bad_perm.sh
+++ b/src/couch/test/eunit/fixtures/os_daemon_bad_perm.sh
diff --git a/src/couch/test/fixtures/os_daemon_can_reboot.sh b/src/couch/test/eunit/fixtures/os_daemon_can_reboot.sh
index 5bc10e83f..5bc10e83f 100755
--- a/src/couch/test/fixtures/os_daemon_can_reboot.sh
+++ b/src/couch/test/eunit/fixtures/os_daemon_can_reboot.sh
diff --git a/src/couch/test/fixtures/os_daemon_configer.escript b/src/couch/test/eunit/fixtures/os_daemon_configer.escript
index f146b8314..f146b8314 100755
--- a/src/couch/test/fixtures/os_daemon_configer.escript
+++ b/src/couch/test/eunit/fixtures/os_daemon_configer.escript
diff --git a/src/couch/test/fixtures/os_daemon_die_on_boot.sh b/src/couch/test/eunit/fixtures/os_daemon_die_on_boot.sh
index 256ee7935..256ee7935 100755
--- a/src/couch/test/fixtures/os_daemon_die_on_boot.sh
+++ b/src/couch/test/eunit/fixtures/os_daemon_die_on_boot.sh
diff --git a/src/couch/test/fixtures/os_daemon_die_quickly.sh b/src/couch/test/eunit/fixtures/os_daemon_die_quickly.sh
index f5a13684e..f5a13684e 100755
--- a/src/couch/test/fixtures/os_daemon_die_quickly.sh
+++ b/src/couch/test/eunit/fixtures/os_daemon_die_quickly.sh
diff --git a/src/couch/test/fixtures/os_daemon_looper.escript b/src/couch/test/eunit/fixtures/os_daemon_looper.escript
index 73974e905..73974e905 100755
--- a/src/couch/test/fixtures/os_daemon_looper.escript
+++ b/src/couch/test/eunit/fixtures/os_daemon_looper.escript
diff --git a/src/couch/test/fixtures/test.couch b/src/couch/test/eunit/fixtures/test.couch
index 32c79af32..32c79af32 100644
--- a/src/couch/test/fixtures/test.couch
+++ b/src/couch/test/eunit/fixtures/test.couch
Binary files differ
diff --git a/src/couch/test/global_changes_tests.erl b/src/couch/test/eunit/global_changes_tests.erl
index 4392aafac..4392aafac 100644
--- a/src/couch/test/global_changes_tests.erl
+++ b/src/couch/test/eunit/global_changes_tests.erl
diff --git a/src/couch/test/json_stream_parse_tests.erl b/src/couch/test/eunit/json_stream_parse_tests.erl
index e690d7728..e690d7728 100644
--- a/src/couch/test/json_stream_parse_tests.erl
+++ b/src/couch/test/eunit/json_stream_parse_tests.erl
diff --git a/src/couch/test/test_web.erl b/src/couch/test/eunit/test_web.erl
index b1b3e65c9..b1b3e65c9 100644
--- a/src/couch/test/test_web.erl
+++ b/src/couch/test/eunit/test_web.erl
diff --git a/src/couch/test/exunit/test_helper.exs b/src/couch/test/exunit/test_helper.exs
new file mode 100644
index 000000000..314050085
--- /dev/null
+++ b/src/couch/test/exunit/test_helper.exs
@@ -0,0 +1,2 @@
+ExUnit.configure(formatters: [JUnitFormatter, ExUnit.CLIFormatter])
+ExUnit.start()
diff --git a/src/couch_epi/test/couch_epi_basic_test.erl b/src/couch_epi/test/eunit/couch_epi_basic_test.erl
index 587d1564e..587d1564e 100644
--- a/src/couch_epi/test/couch_epi_basic_test.erl
+++ b/src/couch_epi/test/eunit/couch_epi_basic_test.erl
diff --git a/src/couch_epi/test/couch_epi_tests.erl b/src/couch_epi/test/eunit/couch_epi_tests.erl
index 042753215..12d8610c1 100644
--- a/src/couch_epi/test/couch_epi_tests.erl
+++ b/src/couch_epi/test/eunit/couch_epi_tests.erl
@@ -14,8 +14,8 @@
-include_lib("couch/include/couch_eunit.hrl").
--define(DATA_FILE1, ?ABS_PATH("test/fixtures/app_data1.cfg")).
--define(DATA_FILE2, ?ABS_PATH("test/fixtures/app_data2.cfg")).
+-define(DATA_FILE1, ?ABS_PATH("test/eunit/fixtures/app_data1.cfg")).
+-define(DATA_FILE2, ?ABS_PATH("test/eunit/fixtures/app_data2.cfg")).
-export([notify_cb/4, save/3, get/2]).
diff --git a/src/couch_epi/test/fixtures/app_data1.cfg b/src/couch_epi/test/eunit/fixtures/app_data1.cfg
index 4c9f3fe2d..4c9f3fe2d 100644
--- a/src/couch_epi/test/fixtures/app_data1.cfg
+++ b/src/couch_epi/test/eunit/fixtures/app_data1.cfg
diff --git a/src/couch_epi/test/fixtures/app_data2.cfg b/src/couch_epi/test/eunit/fixtures/app_data2.cfg
index e5a5ffb8c..e5a5ffb8c 100644
--- a/src/couch_epi/test/fixtures/app_data2.cfg
+++ b/src/couch_epi/test/eunit/fixtures/app_data2.cfg
diff --git a/src/couch_index/test/couch_index_compaction_tests.erl b/src/couch_index/test/eunit/couch_index_compaction_tests.erl
index 53316d944..53316d944 100644
--- a/src/couch_index/test/couch_index_compaction_tests.erl
+++ b/src/couch_index/test/eunit/couch_index_compaction_tests.erl
diff --git a/src/couch_index/test/couch_index_ddoc_updated_tests.erl b/src/couch_index/test/eunit/couch_index_ddoc_updated_tests.erl
index 0e23adf91..0e23adf91 100644
--- a/src/couch_index/test/couch_index_ddoc_updated_tests.erl
+++ b/src/couch_index/test/eunit/couch_index_ddoc_updated_tests.erl
diff --git a/src/couch_log/test/couch_log_config_listener_test.erl b/src/couch_log/test/eunit/couch_log_config_listener_test.erl
index 07abae1ff..07abae1ff 100644
--- a/src/couch_log/test/couch_log_config_listener_test.erl
+++ b/src/couch_log/test/eunit/couch_log_config_listener_test.erl
diff --git a/src/couch_log/test/couch_log_config_test.erl b/src/couch_log/test/eunit/couch_log_config_test.erl
index c4677f37f..c4677f37f 100644
--- a/src/couch_log/test/couch_log_config_test.erl
+++ b/src/couch_log/test/eunit/couch_log_config_test.erl
diff --git a/src/couch_log/test/couch_log_error_logger_h_test.erl b/src/couch_log/test/eunit/couch_log_error_logger_h_test.erl
index b78598fa4..b78598fa4 100644
--- a/src/couch_log/test/couch_log_error_logger_h_test.erl
+++ b/src/couch_log/test/eunit/couch_log_error_logger_h_test.erl
diff --git a/src/couch_log/test/couch_log_formatter_test.erl b/src/couch_log/test/eunit/couch_log_formatter_test.erl
index 795efcf29..795efcf29 100644
--- a/src/couch_log/test/couch_log_formatter_test.erl
+++ b/src/couch_log/test/eunit/couch_log_formatter_test.erl
diff --git a/src/couch_log/test/couch_log_monitor_test.erl b/src/couch_log/test/eunit/couch_log_monitor_test.erl
index eec008522..eec008522 100644
--- a/src/couch_log/test/couch_log_monitor_test.erl
+++ b/src/couch_log/test/eunit/couch_log_monitor_test.erl
diff --git a/src/couch_log/test/couch_log_server_test.erl b/src/couch_log/test/eunit/couch_log_server_test.erl
index 7af570e90..7af570e90 100644
--- a/src/couch_log/test/couch_log_server_test.erl
+++ b/src/couch_log/test/eunit/couch_log_server_test.erl
diff --git a/src/couch_log/test/couch_log_test.erl b/src/couch_log/test/eunit/couch_log_test.erl
index c7195f65f..c7195f65f 100644
--- a/src/couch_log/test/couch_log_test.erl
+++ b/src/couch_log/test/eunit/couch_log_test.erl
diff --git a/src/couch_log/test/couch_log_test_util.erl b/src/couch_log/test/eunit/couch_log_test_util.erl
index 00f3981fc..00f3981fc 100644
--- a/src/couch_log/test/couch_log_test_util.erl
+++ b/src/couch_log/test/eunit/couch_log_test_util.erl
diff --git a/src/couch_log/test/couch_log_trunc_io_fmt_test.erl b/src/couch_log/test/eunit/couch_log_trunc_io_fmt_test.erl
index 77d555440..77d555440 100644
--- a/src/couch_log/test/couch_log_trunc_io_fmt_test.erl
+++ b/src/couch_log/test/eunit/couch_log_trunc_io_fmt_test.erl
diff --git a/src/couch_log/test/couch_log_util_test.erl b/src/couch_log/test/eunit/couch_log_util_test.erl
index e97911aa9..e97911aa9 100644
--- a/src/couch_log/test/couch_log_util_test.erl
+++ b/src/couch_log/test/eunit/couch_log_util_test.erl
diff --git a/src/couch_log/test/couch_log_writer_ets.erl b/src/couch_log/test/eunit/couch_log_writer_ets.erl
index d5fd327ac..d5fd327ac 100644
--- a/src/couch_log/test/couch_log_writer_ets.erl
+++ b/src/couch_log/test/eunit/couch_log_writer_ets.erl
diff --git a/src/couch_log/test/couch_log_writer_file_test.erl b/src/couch_log/test/eunit/couch_log_writer_file_test.erl
index ba042610a..ba042610a 100644
--- a/src/couch_log/test/couch_log_writer_file_test.erl
+++ b/src/couch_log/test/eunit/couch_log_writer_file_test.erl
diff --git a/src/couch_log/test/couch_log_writer_stderr_test.erl b/src/couch_log/test/eunit/couch_log_writer_stderr_test.erl
index 1e99263dd..1e99263dd 100644
--- a/src/couch_log/test/couch_log_writer_stderr_test.erl
+++ b/src/couch_log/test/eunit/couch_log_writer_stderr_test.erl
diff --git a/src/couch_log/test/couch_log_writer_syslog_test.erl b/src/couch_log/test/eunit/couch_log_writer_syslog_test.erl
index c32b5c6bf..c32b5c6bf 100644
--- a/src/couch_log/test/couch_log_writer_syslog_test.erl
+++ b/src/couch_log/test/eunit/couch_log_writer_syslog_test.erl
diff --git a/src/couch_log/test/couch_log_writer_test.erl b/src/couch_log/test/eunit/couch_log_writer_test.erl
index d0bb347fe..d0bb347fe 100644
--- a/src/couch_log/test/couch_log_writer_test.erl
+++ b/src/couch_log/test/eunit/couch_log_writer_test.erl
diff --git a/src/couch_mrview/test/couch_mrview_all_docs_tests.erl b/src/couch_mrview/test/eunit/couch_mrview_all_docs_tests.erl
index bf8eb7e5b..bf8eb7e5b 100644
--- a/src/couch_mrview/test/couch_mrview_all_docs_tests.erl
+++ b/src/couch_mrview/test/eunit/couch_mrview_all_docs_tests.erl
diff --git a/src/couch_mrview/test/couch_mrview_changes_since_tests.erl b/src/couch_mrview/test/eunit/couch_mrview_changes_since_tests.erl
index d670e109b..d670e109b 100644
--- a/src/couch_mrview/test/couch_mrview_changes_since_tests.erl
+++ b/src/couch_mrview/test/eunit/couch_mrview_changes_since_tests.erl
diff --git a/src/couch_mrview/test/couch_mrview_collation_tests.erl b/src/couch_mrview/test/eunit/couch_mrview_collation_tests.erl
index 5c8cb54b1..5c8cb54b1 100644
--- a/src/couch_mrview/test/couch_mrview_collation_tests.erl
+++ b/src/couch_mrview/test/eunit/couch_mrview_collation_tests.erl
diff --git a/src/couch_mrview/test/couch_mrview_compact_tests.erl b/src/couch_mrview/test/eunit/couch_mrview_compact_tests.erl
index 7664becdc..7664becdc 100644
--- a/src/couch_mrview/test/couch_mrview_compact_tests.erl
+++ b/src/couch_mrview/test/eunit/couch_mrview_compact_tests.erl
diff --git a/src/couch_mrview/test/couch_mrview_ddoc_updated_tests.erl b/src/couch_mrview/test/eunit/couch_mrview_ddoc_updated_tests.erl
index 4310157eb..4310157eb 100644
--- a/src/couch_mrview/test/couch_mrview_ddoc_updated_tests.erl
+++ b/src/couch_mrview/test/eunit/couch_mrview_ddoc_updated_tests.erl
diff --git a/src/couch_mrview/test/couch_mrview_ddoc_validation_tests.erl b/src/couch_mrview/test/eunit/couch_mrview_ddoc_validation_tests.erl
index ce2be8904..ce2be8904 100644
--- a/src/couch_mrview/test/couch_mrview_ddoc_validation_tests.erl
+++ b/src/couch_mrview/test/eunit/couch_mrview_ddoc_validation_tests.erl
diff --git a/src/couch_mrview/test/couch_mrview_design_docs_tests.erl b/src/couch_mrview/test/eunit/couch_mrview_design_docs_tests.erl
index aedd42865..aedd42865 100644
--- a/src/couch_mrview/test/couch_mrview_design_docs_tests.erl
+++ b/src/couch_mrview/test/eunit/couch_mrview_design_docs_tests.erl
diff --git a/src/couch_mrview/test/couch_mrview_http_tests.erl b/src/couch_mrview/test/eunit/couch_mrview_http_tests.erl
index bd11c7ad8..bd11c7ad8 100644
--- a/src/couch_mrview/test/couch_mrview_http_tests.erl
+++ b/src/couch_mrview/test/eunit/couch_mrview_http_tests.erl
diff --git a/src/couch_mrview/test/couch_mrview_index_changes_tests.erl b/src/couch_mrview/test/eunit/couch_mrview_index_changes_tests.erl
index f0be1b9b1..f0be1b9b1 100644
--- a/src/couch_mrview/test/couch_mrview_index_changes_tests.erl
+++ b/src/couch_mrview/test/eunit/couch_mrview_index_changes_tests.erl
diff --git a/src/couch_mrview/test/couch_mrview_index_info_tests.erl b/src/couch_mrview/test/eunit/couch_mrview_index_info_tests.erl
index efa03e7c0..efa03e7c0 100644
--- a/src/couch_mrview/test/couch_mrview_index_info_tests.erl
+++ b/src/couch_mrview/test/eunit/couch_mrview_index_info_tests.erl
diff --git a/src/couch_mrview/test/couch_mrview_local_docs_tests.erl b/src/couch_mrview/test/eunit/couch_mrview_local_docs_tests.erl
index b0d25469a..b0d25469a 100644
--- a/src/couch_mrview/test/couch_mrview_local_docs_tests.erl
+++ b/src/couch_mrview/test/eunit/couch_mrview_local_docs_tests.erl
diff --git a/src/couch_mrview/test/couch_mrview_map_views_tests.erl b/src/couch_mrview/test/eunit/couch_mrview_map_views_tests.erl
index 805dc6c74..805dc6c74 100644
--- a/src/couch_mrview/test/couch_mrview_map_views_tests.erl
+++ b/src/couch_mrview/test/eunit/couch_mrview_map_views_tests.erl
diff --git a/src/couch_mrview/test/couch_mrview_purge_docs_fabric_tests.erl b/src/couch_mrview/test/eunit/couch_mrview_purge_docs_fabric_tests.erl
index 213acac0b..213acac0b 100644
--- a/src/couch_mrview/test/couch_mrview_purge_docs_fabric_tests.erl
+++ b/src/couch_mrview/test/eunit/couch_mrview_purge_docs_fabric_tests.erl
diff --git a/src/couch_mrview/test/couch_mrview_purge_docs_tests.erl b/src/couch_mrview/test/eunit/couch_mrview_purge_docs_tests.erl
index 1020607a4..1020607a4 100644
--- a/src/couch_mrview/test/couch_mrview_purge_docs_tests.erl
+++ b/src/couch_mrview/test/eunit/couch_mrview_purge_docs_tests.erl
diff --git a/src/couch_mrview/test/couch_mrview_red_views_tests.erl b/src/couch_mrview/test/eunit/couch_mrview_red_views_tests.erl
index b83686113..b83686113 100644
--- a/src/couch_mrview/test/couch_mrview_red_views_tests.erl
+++ b/src/couch_mrview/test/eunit/couch_mrview_red_views_tests.erl
diff --git a/src/couch_mrview/test/couch_mrview_util_tests.erl b/src/couch_mrview/test/eunit/couch_mrview_util_tests.erl
index 7046c9bb2..7046c9bb2 100644
--- a/src/couch_mrview/test/couch_mrview_util_tests.erl
+++ b/src/couch_mrview/test/eunit/couch_mrview_util_tests.erl
diff --git a/src/couch_peruser/test/couch_peruser_test.erl b/src/couch_peruser/test/eunit/couch_peruser_test.erl
index 8501cc36f..8501cc36f 100644
--- a/src/couch_peruser/test/couch_peruser_test.erl
+++ b/src/couch_peruser/test/eunit/couch_peruser_test.erl
diff --git a/src/couch_replicator/test/couch_replicator_attachments_too_large.erl b/src/couch_replicator/test/eunit/couch_replicator_attachments_too_large.erl
index 7fe84d2d9..7fe84d2d9 100644
--- a/src/couch_replicator/test/couch_replicator_attachments_too_large.erl
+++ b/src/couch_replicator/test/eunit/couch_replicator_attachments_too_large.erl
diff --git a/src/couch_replicator/test/couch_replicator_compact_tests.erl b/src/couch_replicator/test/eunit/couch_replicator_compact_tests.erl
index 7cc530c19..7cc530c19 100644
--- a/src/couch_replicator/test/couch_replicator_compact_tests.erl
+++ b/src/couch_replicator/test/eunit/couch_replicator_compact_tests.erl
diff --git a/src/couch_replicator/test/couch_replicator_connection_tests.erl b/src/couch_replicator/test/eunit/couch_replicator_connection_tests.erl
index e75cc5a63..e75cc5a63 100644
--- a/src/couch_replicator/test/couch_replicator_connection_tests.erl
+++ b/src/couch_replicator/test/eunit/couch_replicator_connection_tests.erl
diff --git a/src/couch_replicator/test/couch_replicator_create_target_with_options_tests.erl b/src/couch_replicator/test/eunit/couch_replicator_create_target_with_options_tests.erl
index 63310d39e..63310d39e 100644
--- a/src/couch_replicator/test/couch_replicator_create_target_with_options_tests.erl
+++ b/src/couch_replicator/test/eunit/couch_replicator_create_target_with_options_tests.erl
diff --git a/src/couch_replicator/test/couch_replicator_filtered_tests.erl b/src/couch_replicator/test/eunit/couch_replicator_filtered_tests.erl
index d34e9f020..d34e9f020 100644
--- a/src/couch_replicator/test/couch_replicator_filtered_tests.erl
+++ b/src/couch_replicator/test/eunit/couch_replicator_filtered_tests.erl
diff --git a/src/couch_replicator/test/couch_replicator_httpc_pool_tests.erl b/src/couch_replicator/test/eunit/couch_replicator_httpc_pool_tests.erl
index c4ad4e9b6..c4ad4e9b6 100644
--- a/src/couch_replicator/test/couch_replicator_httpc_pool_tests.erl
+++ b/src/couch_replicator/test/eunit/couch_replicator_httpc_pool_tests.erl
diff --git a/src/couch_replicator/test/couch_replicator_id_too_long_tests.erl b/src/couch_replicator/test/eunit/couch_replicator_id_too_long_tests.erl
index 70eda0566..70eda0566 100644
--- a/src/couch_replicator/test/couch_replicator_id_too_long_tests.erl
+++ b/src/couch_replicator/test/eunit/couch_replicator_id_too_long_tests.erl
diff --git a/src/couch_replicator/test/couch_replicator_large_atts_tests.erl b/src/couch_replicator/test/eunit/couch_replicator_large_atts_tests.erl
index b9adf5c4b..b9adf5c4b 100644
--- a/src/couch_replicator/test/couch_replicator_large_atts_tests.erl
+++ b/src/couch_replicator/test/eunit/couch_replicator_large_atts_tests.erl
diff --git a/src/couch_replicator/test/couch_replicator_many_leaves_tests.erl b/src/couch_replicator/test/eunit/couch_replicator_many_leaves_tests.erl
index eee5b1647..eee5b1647 100644
--- a/src/couch_replicator/test/couch_replicator_many_leaves_tests.erl
+++ b/src/couch_replicator/test/eunit/couch_replicator_many_leaves_tests.erl
diff --git a/src/couch_replicator/test/couch_replicator_missing_stubs_tests.erl b/src/couch_replicator/test/eunit/couch_replicator_missing_stubs_tests.erl
index c1681781f..c1681781f 100644
--- a/src/couch_replicator/test/couch_replicator_missing_stubs_tests.erl
+++ b/src/couch_replicator/test/eunit/couch_replicator_missing_stubs_tests.erl
diff --git a/src/couch_replicator/test/couch_replicator_proxy_tests.erl b/src/couch_replicator/test/eunit/couch_replicator_proxy_tests.erl
index 4f545bcb5..4f545bcb5 100644
--- a/src/couch_replicator/test/couch_replicator_proxy_tests.erl
+++ b/src/couch_replicator/test/eunit/couch_replicator_proxy_tests.erl
diff --git a/src/couch_replicator/test/couch_replicator_rate_limiter_tests.erl b/src/couch_replicator/test/eunit/couch_replicator_rate_limiter_tests.erl
index 034550aec..034550aec 100644
--- a/src/couch_replicator/test/couch_replicator_rate_limiter_tests.erl
+++ b/src/couch_replicator/test/eunit/couch_replicator_rate_limiter_tests.erl
diff --git a/src/couch_replicator/test/couch_replicator_retain_stats_between_job_runs.erl b/src/couch_replicator/test/eunit/couch_replicator_retain_stats_between_job_runs.erl
index 3b7377b78..3b7377b78 100644
--- a/src/couch_replicator/test/couch_replicator_retain_stats_between_job_runs.erl
+++ b/src/couch_replicator/test/eunit/couch_replicator_retain_stats_between_job_runs.erl
diff --git a/src/couch_replicator/test/couch_replicator_selector_tests.erl b/src/couch_replicator/test/eunit/couch_replicator_selector_tests.erl
index a7f4c5df3..a7f4c5df3 100644
--- a/src/couch_replicator/test/couch_replicator_selector_tests.erl
+++ b/src/couch_replicator/test/eunit/couch_replicator_selector_tests.erl
diff --git a/src/couch_replicator/test/couch_replicator_small_max_request_size_target.erl b/src/couch_replicator/test/eunit/couch_replicator_small_max_request_size_target.erl
index af3a285f5..af3a285f5 100644
--- a/src/couch_replicator/test/couch_replicator_small_max_request_size_target.erl
+++ b/src/couch_replicator/test/eunit/couch_replicator_small_max_request_size_target.erl
diff --git a/src/couch_replicator/test/couch_replicator_test_helper.erl b/src/couch_replicator/test/eunit/couch_replicator_test_helper.erl
index fd0409164..fd0409164 100644
--- a/src/couch_replicator/test/couch_replicator_test_helper.erl
+++ b/src/couch_replicator/test/eunit/couch_replicator_test_helper.erl
diff --git a/src/couch_replicator/test/couch_replicator_use_checkpoints_tests.erl b/src/couch_replicator/test/eunit/couch_replicator_use_checkpoints_tests.erl
index c2fcf8bf1..c2fcf8bf1 100644
--- a/src/couch_replicator/test/couch_replicator_use_checkpoints_tests.erl
+++ b/src/couch_replicator/test/eunit/couch_replicator_use_checkpoints_tests.erl
diff --git a/src/ddoc_cache/test/ddoc_cache_basic_test.erl b/src/ddoc_cache/test/eunit/ddoc_cache_basic_test.erl
index b576d88bb..b576d88bb 100644
--- a/src/ddoc_cache/test/ddoc_cache_basic_test.erl
+++ b/src/ddoc_cache/test/eunit/ddoc_cache_basic_test.erl
diff --git a/src/ddoc_cache/test/ddoc_cache_coverage_test.erl b/src/ddoc_cache/test/eunit/ddoc_cache_coverage_test.erl
index b1a185bdc..b1a185bdc 100644
--- a/src/ddoc_cache/test/ddoc_cache_coverage_test.erl
+++ b/src/ddoc_cache/test/eunit/ddoc_cache_coverage_test.erl
diff --git a/src/ddoc_cache/test/ddoc_cache_disabled_test.erl b/src/ddoc_cache/test/eunit/ddoc_cache_disabled_test.erl
index d46bdde32..d46bdde32 100644
--- a/src/ddoc_cache/test/ddoc_cache_disabled_test.erl
+++ b/src/ddoc_cache/test/eunit/ddoc_cache_disabled_test.erl
diff --git a/src/ddoc_cache/test/ddoc_cache_entry_test.erl b/src/ddoc_cache/test/eunit/ddoc_cache_entry_test.erl
index c992bea8d..c992bea8d 100644
--- a/src/ddoc_cache/test/ddoc_cache_entry_test.erl
+++ b/src/ddoc_cache/test/eunit/ddoc_cache_entry_test.erl
diff --git a/src/ddoc_cache/test/ddoc_cache_ev.erl b/src/ddoc_cache/test/eunit/ddoc_cache_ev.erl
index a451342cf..a451342cf 100644
--- a/src/ddoc_cache/test/ddoc_cache_ev.erl
+++ b/src/ddoc_cache/test/eunit/ddoc_cache_ev.erl
diff --git a/src/ddoc_cache/test/ddoc_cache_eviction_test.erl b/src/ddoc_cache/test/eunit/ddoc_cache_eviction_test.erl
index bd61afc37..bd61afc37 100644
--- a/src/ddoc_cache/test/ddoc_cache_eviction_test.erl
+++ b/src/ddoc_cache/test/eunit/ddoc_cache_eviction_test.erl
diff --git a/src/ddoc_cache/test/ddoc_cache_lru_test.erl b/src/ddoc_cache/test/eunit/ddoc_cache_lru_test.erl
index e37f1c090..e37f1c090 100644
--- a/src/ddoc_cache/test/ddoc_cache_lru_test.erl
+++ b/src/ddoc_cache/test/eunit/ddoc_cache_lru_test.erl
diff --git a/src/ddoc_cache/test/ddoc_cache_no_cache_test.erl b/src/ddoc_cache/test/eunit/ddoc_cache_no_cache_test.erl
index 637a6e872..637a6e872 100644
--- a/src/ddoc_cache/test/ddoc_cache_no_cache_test.erl
+++ b/src/ddoc_cache/test/eunit/ddoc_cache_no_cache_test.erl
diff --git a/src/ddoc_cache/test/ddoc_cache_open_error_test.erl b/src/ddoc_cache/test/eunit/ddoc_cache_open_error_test.erl
index c7379d26a..c7379d26a 100644
--- a/src/ddoc_cache/test/ddoc_cache_open_error_test.erl
+++ b/src/ddoc_cache/test/eunit/ddoc_cache_open_error_test.erl
diff --git a/src/ddoc_cache/test/ddoc_cache_open_test.erl b/src/ddoc_cache/test/eunit/ddoc_cache_open_test.erl
index 73d644f71..73d644f71 100644
--- a/src/ddoc_cache/test/ddoc_cache_open_test.erl
+++ b/src/ddoc_cache/test/eunit/ddoc_cache_open_test.erl
diff --git a/src/ddoc_cache/test/ddoc_cache_opener_test.erl b/src/ddoc_cache/test/eunit/ddoc_cache_opener_test.erl
index c3846360c..c3846360c 100644
--- a/src/ddoc_cache/test/ddoc_cache_opener_test.erl
+++ b/src/ddoc_cache/test/eunit/ddoc_cache_opener_test.erl
diff --git a/src/ddoc_cache/test/ddoc_cache_refresh_test.erl b/src/ddoc_cache/test/eunit/ddoc_cache_refresh_test.erl
index 24ae346d4..24ae346d4 100644
--- a/src/ddoc_cache/test/ddoc_cache_refresh_test.erl
+++ b/src/ddoc_cache/test/eunit/ddoc_cache_refresh_test.erl
diff --git a/src/ddoc_cache/test/ddoc_cache_remove_test.erl b/src/ddoc_cache/test/eunit/ddoc_cache_remove_test.erl
index e40518529..e40518529 100644
--- a/src/ddoc_cache/test/ddoc_cache_remove_test.erl
+++ b/src/ddoc_cache/test/eunit/ddoc_cache_remove_test.erl
diff --git a/src/ddoc_cache/test/ddoc_cache_test.hrl b/src/ddoc_cache/test/eunit/ddoc_cache_test.hrl
index 73f7bc217..73f7bc217 100644
--- a/src/ddoc_cache/test/ddoc_cache_test.hrl
+++ b/src/ddoc_cache/test/eunit/ddoc_cache_test.hrl
diff --git a/src/ddoc_cache/test/ddoc_cache_tutil.erl b/src/ddoc_cache/test/eunit/ddoc_cache_tutil.erl
index b34d4b163..b34d4b163 100644
--- a/src/ddoc_cache/test/ddoc_cache_tutil.erl
+++ b/src/ddoc_cache/test/eunit/ddoc_cache_tutil.erl
diff --git a/src/dreyfus/test/elixir/test/partition_search_test.exs b/src/dreyfus/test/elixir/test/partition_search_test.exs
index 052a41ad1..4400d7b7f 100644
--- a/src/dreyfus/test/elixir/test/partition_search_test.exs
+++ b/src/dreyfus/test/elixir/test/partition_search_test.exs
@@ -26,12 +26,12 @@ defmodule PartitionSearchTest do
end
def create_ddoc(db_name, opts \\ %{}) do
- indexFn = "function(doc) {\n if (doc.some) {\n index('some', doc.some);\n }\n}"
+ index_fn = "function(doc) {\n if (doc.some) {\n index('some', doc.some);\n }\n}"
default_ddoc = %{
indexes: %{
books: %{
analyzer: %{name: "standard"},
- index: indexFn
+ index: index_fn
}
}
}
diff --git a/src/fabric/test/fabric_rpc_purge_tests.erl b/src/fabric/test/eunit/fabric_rpc_purge_tests.erl
index 4eafb2bc4..4eafb2bc4 100644
--- a/src/fabric/test/fabric_rpc_purge_tests.erl
+++ b/src/fabric/test/eunit/fabric_rpc_purge_tests.erl
diff --git a/src/global_changes/test/global_changes_hooks_tests.erl b/src/global_changes/test/eunit/global_changes_hooks_tests.erl
index 23fa2c87f..23fa2c87f 100644
--- a/src/global_changes/test/global_changes_hooks_tests.erl
+++ b/src/global_changes/test/eunit/global_changes_hooks_tests.erl
diff --git a/src/mem3/test/mem3_cluster_test.erl b/src/mem3/test/eunit/mem3_cluster_test.erl
index 4610d64bd..4610d64bd 100644
--- a/src/mem3/test/mem3_cluster_test.erl
+++ b/src/mem3/test/eunit/mem3_cluster_test.erl
diff --git a/src/mem3/test/mem3_hash_test.erl b/src/mem3/test/eunit/mem3_hash_test.erl
index 7a40c5366..7a40c5366 100644
--- a/src/mem3/test/mem3_hash_test.erl
+++ b/src/mem3/test/eunit/mem3_hash_test.erl
diff --git a/src/mem3/test/mem3_rep_test.erl b/src/mem3/test/eunit/mem3_rep_test.erl
index 4a46e7b93..4a46e7b93 100644
--- a/src/mem3/test/mem3_rep_test.erl
+++ b/src/mem3/test/eunit/mem3_rep_test.erl
diff --git a/src/mem3/test/mem3_reshard_api_test.erl b/src/mem3/test/eunit/mem3_reshard_api_test.erl
index c4df24ad3..c4df24ad3 100644
--- a/src/mem3/test/mem3_reshard_api_test.erl
+++ b/src/mem3/test/eunit/mem3_reshard_api_test.erl
diff --git a/src/mem3/test/mem3_reshard_changes_feed_test.erl b/src/mem3/test/eunit/mem3_reshard_changes_feed_test.erl
index 4b9e2a34a..4b9e2a34a 100644
--- a/src/mem3/test/mem3_reshard_changes_feed_test.erl
+++ b/src/mem3/test/eunit/mem3_reshard_changes_feed_test.erl
diff --git a/src/mem3/test/mem3_reshard_test.erl b/src/mem3/test/eunit/mem3_reshard_test.erl
index ab6202115..ab6202115 100644
--- a/src/mem3/test/mem3_reshard_test.erl
+++ b/src/mem3/test/eunit/mem3_reshard_test.erl
diff --git a/src/mem3/test/mem3_ring_prop_tests.erl b/src/mem3/test/eunit/mem3_ring_prop_tests.erl
index 9f4f86f5f..9f4f86f5f 100644
--- a/src/mem3/test/mem3_ring_prop_tests.erl
+++ b/src/mem3/test/eunit/mem3_ring_prop_tests.erl
diff --git a/src/mem3/test/mem3_seeds_test.erl b/src/mem3/test/eunit/mem3_seeds_test.erl
index ba83b66be..ba83b66be 100644
--- a/src/mem3/test/mem3_seeds_test.erl
+++ b/src/mem3/test/eunit/mem3_seeds_test.erl
diff --git a/src/mem3/test/mem3_sync_security_test.erl b/src/mem3/test/eunit/mem3_sync_security_test.erl
index e67a72017..e67a72017 100644
--- a/src/mem3/test/mem3_sync_security_test.erl
+++ b/src/mem3/test/eunit/mem3_sync_security_test.erl
diff --git a/src/mem3/test/mem3_util_test.erl b/src/mem3/test/eunit/mem3_util_test.erl
index 8b74c4b2b..8b74c4b2b 100644
--- a/src/mem3/test/mem3_util_test.erl
+++ b/src/mem3/test/eunit/mem3_util_test.erl
diff --git a/test/elixir/Makefile b/test/elixir/Makefile
index bfcf017d5..67ce2b427 100644
--- a/test/elixir/Makefile
+++ b/test/elixir/Makefile
@@ -1,2 +1,4 @@
+SELF_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
+
all:
- mix test --trace
+ make -C ${SELF_DIR}../.. elixir
diff --git a/test/elixir/README.md b/test/elixir/README.md
index a59b4df90..f7691ad3c 100644
--- a/test/elixir/README.md
+++ b/test/elixir/README.md
@@ -111,3 +111,146 @@ X means done, - means partially
- [ ] Port view_pagination.js
- [ ] Port view_sandboxing.js
- [ ] Port view_update_seq.js
+
+# Using ExUnit to write unit tests
+
+Elixir has a number of benefits which makes writing unit tests easier.
+For example it is trivial to do codegeneration of tests.
+Bellow we present a few use cases where code-generation is really helpful.
+
+## How to write ExUnit tests
+
+1. Create new file in test/exunit/ directory (the file name should match *_test.exs)
+2. In case it is a first file in the directory create test_helper.exs (look at src/couch/test/exunit/test_helper.exs to get an idea)
+3. define test module which does `use Couch.Test.ExUnit.Case`
+4. Define test cases in the module
+
+You can run tests either:
+- using make: `make exunit`
+- using mix: BUILDDIR=`pwd` ERL_LIBS=`pwd`/src MIX_ENV=test mix test --trace
+
+## Generating tests from spec
+
+Sometimes we have some data in structured format and want
+to generate test cases using that data. This is easy in Elixir.
+For example suppose we have following spec:
+```
+{
+ "{db_name}/_view_cleanup": {
+ "roles": ["_admin"]
+ }
+}
+```
+We can use this spec to generate test cases
+```
+defmodule GenerateTestsFromSpec do
+ use ExUnit.Case
+ require Record
+ Record.defrecordp :user_ctx, Record.extract(:user_ctx, from_lib: "couch/include/couch_db.hrl")
+ Record.defrecordp :httpd, Record.extract(:httpd, from_lib: "couch/include/couch_db.hrl")
+
+ {:ok, spec_bin} = File.read("roles.json")
+ spec = :jiffy.decode(spec_bin, [:return_maps])
+ Enum.each spec, fn {path, path_spec} ->
+ roles = path_spec["roles"]
+ @roles roles
+ @path_parts String.split(path, "/")
+ test "Access with `#{inspect(roles)}` roles" do
+ req = httpd(path_parts: @path_parts, user_ctx: user_ctx(roles: @roles))
+ :chttpd_auth_request.authorize_request(req)
+ end
+ end
+end
+```
+As a result we would get
+```
+GenerateTestsFromSpec
+ * test Access with `["_admin"]` roles (0.00ms)
+```
+
+## Test all possible combinations
+
+Sometimes we want to test all possible permutations for parameters.
+This can be accomplished using something like the following:
+
+```
+defmodule Permutations do
+ use ExUnit.Case
+ pairs = :couch_tests_combinatorics.product([
+ [:remote, :local], [:remote, :local]
+ ])
+ for [source, dest] <- pairs do
+ @source source
+ @dest dest
+ test "Replication #{source} -> #{dest}" do
+ assert :ok == :ok
+ end
+ end
+end
+```
+
+This would produce following tests
+```
+Permutations
+ * test Replication remote -> remote (0.00ms)
+ * test Replication local -> remote (0.00ms)
+ * test Replication remote -> local (0.00ms)
+ * test Replication local -> local (0.00ms)
+```
+
+## Reuseing of common setups
+
+The setup functions are quite similar in lots of tests therefore it makes
+sense to reuse them. The idea is to add shared setup functions into either
+- test/elixir/lib/setup/common.ex
+- test/elixir/lib/setup/<something>.ex
+
+The setup functions looks like the following:
+```
+defmodule Foo do
+ alias Couch.Test.Setup.Step
+
+ def httpd_with_admin(setup) do
+ setup
+ |> Step.Start.new(:start, extra_apps: [:chttpd])
+ |> Step.User.new(:admin, roles: [:server_admin])
+ end
+end
+```
+
+These parts of a setup chain can be invoked as follows:
+```
+defmodule Couch.Test.CRUD do
+ use Couch.Test.ExUnit.Case
+ alias Couch.Test.Utils
+
+ alias Couch.Test.Setup
+
+ alias Couch.Test.Setup.Step
+
+ def with_db(context, setup) do
+ setup =
+ setup
+ |> Setup.Common.httpd_with_db()
+ |> Setup.run()
+
+ context =
+ Map.merge(context, %{
+ db_name: setup |> Setup.get(:db) |> Step.Create.DB.name(),
+ base_url: setup |> Setup.get(:start) |> Step.Start.clustered_url(),
+ user: setup |> Setup.get(:admin) |> Step.User.name()
+ })
+
+ {context, setup}
+ end
+
+ describe "Database CRUD using Fabric API" do
+ @describetag setup: &__MODULE__.with_db/2
+ test "Create DB", ctx do
+ IO.puts("base_url: #{ctx.base_url}")
+ IO.puts("admin: #{ctx.user}")
+ IO.puts("db_name: #{ctx.db_name}")
+ end
+ end
+end
+``` \ No newline at end of file
diff --git a/test/elixir/lib/ex_unit.ex b/test/elixir/lib/ex_unit.ex
new file mode 100644
index 000000000..7abba07ef
--- /dev/null
+++ b/test/elixir/lib/ex_unit.ex
@@ -0,0 +1,44 @@
+defmodule Couch.Test.ExUnit.Case do
+ @moduledoc """
+ Template for ExUnit test case. It can be used as follows:
+ ```
+ defmodule Couch.Test.CRUD do
+ use Couch.Test.ExUnit.Case
+ ...
+ def with_db(context, setup) do
+ setup = setup
+ |> Step.Start.new(:start, extra_apps: [:chttpd])
+ |> Setup.run
+ context = Map.merge(context, %{
+ base_url: setup |> Setup.get(:start) |> Step.Start.clustered_url
+ })
+ {context, setup}
+ end
+ describe "Group of tests" do
+ @describetag setup: &__MODULE__.with_db/2
+ test "Single test in a group", ctx do
+ ctx.base_url
+ end
+ ...
+ end
+ ```
+ """
+
+ use ExUnit.CaseTemplate
+ alias Couch.Test.Setup
+
+ using do
+ quote do
+ require Logger
+ use ExUnit.Case
+ end
+ end
+
+ setup context do
+ case context do
+ %{:setup => setup_fun} ->
+ {:ok, Setup.setup(context, setup_fun)}
+ _ -> {:ok, context}
+ end
+ end
+end \ No newline at end of file
diff --git a/test/elixir/lib/setup.ex b/test/elixir/lib/setup.ex
new file mode 100644
index 000000000..037988521
--- /dev/null
+++ b/test/elixir/lib/setup.ex
@@ -0,0 +1,97 @@
+defmodule Couch.Test.Setup do
+ @moduledoc """
+ Allows to chain setup functions.
+ Example of using:
+
+ ```
+ alias Couch,Test.Utils
+ def with_db_name(context, setup) do
+ setup =
+ setup
+ |> Step.Start.new(:start, extra_apps: [:chttpd])
+ |> Step.User.new(:admin, roles: [:server_admin])
+ |> Setup.run()
+
+ context =
+ Map.merge(context, %{
+ db_name: Utils.random_name("db")
+ base_url: setup |> Setup.get(:start) |> Step.Start.clustered_url(),
+ user: setup |> Setup.get(:admin) |> Step.User.name()
+ })
+ {context, setup}
+ end
+
+ @tag setup: &__MODULE__.with_db_name/2
+ test "Create", %{db_name: db_name, user: user} do
+ ...
+ end
+ ```
+ """
+ import ExUnit.Callbacks, only: [on_exit: 1]
+ import ExUnit.Assertions, only: [assert: 2]
+ require Logger
+
+ alias Couch.Test.Setup
+ alias Couch.Test.Setup.Step
+ defstruct stages: [], by_type: %{}, state: %{}
+
+ def step(%Setup{stages: stages} = setup, id, step) do
+ %{setup | stages: [{id, step} | stages]}
+ end
+
+ defp setup_step({id, step}, %Setup{state: state, by_type: by_type} = setup) do
+ %module{} = step
+ # credo:disable-for-next-line Credo.Check.Warning.LazyLogging
+ Logger.debug("Calling 'setup/2' for '#{module}'")
+ step = module.setup(setup, step)
+ state = Map.put(state, id, step)
+ by_type = Map.update(by_type, module, [id], fn ids -> [id | ids] end)
+ on_exit(fn ->
+ # credo:disable-for-next-line Credo.Check.Warning.LazyLogging
+ Logger.debug("Calling 'teardown/3' for '#{module}'")
+ try do
+ module.teardown(setup, step)
+ :ok
+ catch
+ _ -> :ok
+ _, _ -> :ok
+ end
+ end)
+ {{id, step}, %{setup | state: state, by_type: by_type}}
+ end
+
+ def run(%Setup{stages: stages} = setup) do
+ {stages, setup} = stages
+ |> Enum.reverse
+ |> Enum.map_reduce(setup, &setup_step/2)
+ %{setup | stages: stages}
+ end
+
+ def setup(ctx) do
+ Map.get(ctx, :__setup)
+ end
+
+ def setup(ctx, setup_fun) do
+ setup = %Setup{} |> Step.Config.new(:test_config, config_file: nil)
+ {ctx, setup} = setup_fun.(ctx, setup)
+ assert not Map.has_key?(ctx, :__setup), "Key `__setup` is reserved for internal purposes"
+ Map.put(ctx, :__setup, setup)
+ end
+
+ def completed?(%Setup{by_type: by_type}, step) do
+ Map.has_key?(by_type, step)
+ end
+
+ def all_for(%Setup{by_type: by_type, state: state}, step_module) do
+ Map.take(state, by_type[step_module] || [])
+ end
+
+ def reduce_for(setup, step_module, acc, fun) do
+ Enum.reduce(all_for(setup, step_module), acc, fun)
+ end
+
+ def get(%Setup{state: state}, id) do
+ state[id]
+ end
+
+end \ No newline at end of file
diff --git a/test/elixir/lib/setup/common.ex b/test/elixir/lib/setup/common.ex
new file mode 100644
index 000000000..3b59e9476
--- /dev/null
+++ b/test/elixir/lib/setup/common.ex
@@ -0,0 +1,22 @@
+defmodule Couch.Test.Setup.Common do
+ @moduledoc """
+ A set of common setup pipelines for reuse
+
+ - httpd_with_admin - chttpd is started and new admin is created
+ - httpd_with_db - httpd_with_admin and new database is created
+ """
+ alias Couch.Test.Setup.Step
+
+ def httpd_with_admin(setup) do
+ setup
+ |> Step.Start.new(:start, extra_apps: [:chttpd])
+ |> Step.User.new(:admin, roles: [:server_admin])
+ end
+
+ def httpd_with_db(setup) do
+ setup
+ |> httpd_with_admin()
+ |> Step.Create.DB.new(:db)
+ end
+
+end \ No newline at end of file
diff --git a/test/elixir/lib/step.ex b/test/elixir/lib/step.ex
new file mode 100644
index 000000000..316d765aa
--- /dev/null
+++ b/test/elixir/lib/step.ex
@@ -0,0 +1,44 @@
+defmodule Couch.Test.Setup.Step do
+ @moduledoc """
+ A behaviour module for implementing custom setup steps for future reuse.
+
+ Every module implementing this behaviour must implement following three functions:
+ - new
+ - setup
+ - teardown
+
+ Here is an example of a custom step
+ ```
+ defmodule Couch.Test.Setup.Step.Foo do
+
+ alias Couch.Test.Setup
+
+ defstruct [:foo_data, :foo_arg]
+
+ def new(setup, id, arg: arg) do
+ setup |> Setup.step(id, %__MODULE__{foo_arg: arg})
+ end
+
+ def setup(_setup, %__MODULE__{foo_arg: arg} = step) do
+ ...
+ foo_data = ...
+ %{step | foo_data: foo_data}
+ end
+
+ def teardown(_setup, _step) do
+ end
+
+ def get_data(%__MODULE__{foo_data: data}) do
+ data
+ end
+ end
+ ```
+ """
+ @type t :: struct()
+ @callback new(setup :: %Couch.Test.Setup{}, id :: atom(), args: Keyword.t()) ::
+ %Couch.Test.Setup{}
+ @callback setup(setup :: %Couch.Test.Setup{}, step :: t()) ::
+ t()
+ @callback teardown(setup :: %Couch.Test.Setup{}, step :: t()) ::
+ any()
+end \ No newline at end of file
diff --git a/test/elixir/lib/step/config.ex b/test/elixir/lib/step/config.ex
new file mode 100644
index 000000000..9d9ac8eab
--- /dev/null
+++ b/test/elixir/lib/step/config.ex
@@ -0,0 +1,33 @@
+defmodule Couch.Test.Setup.Step.Config do
+ @moduledoc """
+ This setup reads configuration for a test run.
+ It is not supposed to be called manually.
+ """
+
+ alias Couch.Test.Setup
+
+ defstruct [:config, :config_file]
+
+ def new(setup, id, config_file: config_file) do
+ setup |> Setup.step(id, %__MODULE__{config_file: config_file})
+ end
+
+ def setup(_setup, %__MODULE__{config_file: config_file} = step) do
+ # TODO we would need to access config file here
+ %{step | config: %{
+ backdoor: %{
+ protocol: "http"
+ },
+ clustered: %{
+ protocol: "http"
+ }
+ }}
+ end
+
+ def teardown(_setup, _step) do
+ end
+
+ def get(%__MODULE__{config: config}) do
+ config
+ end
+end \ No newline at end of file
diff --git a/test/elixir/lib/step/create_db.ex b/test/elixir/lib/step/create_db.ex
new file mode 100644
index 000000000..3cca3c55a
--- /dev/null
+++ b/test/elixir/lib/step/create_db.ex
@@ -0,0 +1,53 @@
+defmodule Couch.Test.Setup.Step.Create.DB do
+ @moduledoc """
+ This setup step creates a database with given name.
+ If name is not provided random name would be used.
+
+ Example
+ setup
+ ...
+ |> Setup.Step.Create.DB.new(:db)
+ ...
+ |> Setup.run
+ ...
+
+ db_name = setup |> Setup.get(:db) |> Setup.Step.Create.DB.name
+ """
+ alias Couch.Test.Setup
+ alias Couch.Test.Setup.Step
+ alias Couch.Test.Utils
+
+ defstruct [:name]
+
+ import ExUnit.Assertions, only: [assert: 1, assert: 2]
+
+ import Utils
+
+ @admin {:user_ctx, user_ctx(roles: ["_admin"])}
+
+ def new(setup, id) do
+ new(setup, id, name: Utils.random_name("db"))
+ end
+
+ def new(setup, id, name: name) do
+ setup |> Setup.step(id, %__MODULE__{name: name})
+ end
+
+ def setup(setup, %__MODULE__{name: name} = step) do
+ assert Setup.completed?(setup, Step.Start), "Require `Start` step"
+ assert :fabric in Step.Start.apps(), "Fabric is not started"
+ res = :fabric.create_db(name, [@admin])
+ assert res in [:ok, :accepted], "Cannot create `#{name}` database"
+ step
+ end
+
+ def teardown(setup, %__MODULE__{name: name} = step) do
+ :fabric.delete_db(name, [@admin])
+ :ok
+ end
+
+ def name(%__MODULE__{name: name}) do
+ name
+ end
+
+end \ No newline at end of file
diff --git a/test/elixir/lib/step/start.ex b/test/elixir/lib/step/start.ex
new file mode 100644
index 000000000..ea7c70f5a
--- /dev/null
+++ b/test/elixir/lib/step/start.ex
@@ -0,0 +1,85 @@
+defmodule Couch.Test.Setup.Step.Start do
+ @moduledoc """
+ Step to start a set of couchdb applications. By default it starts
+ list of applications from DEFAULT_APPS macro defined in `test_util.erl`.
+ At the time of writing this list included:
+ - inets
+ - ibrowse
+ - ssl
+ - config
+ - couch_epi
+ - couch_event
+ - couch
+
+ It is possible to specify additional list of applications to start.
+
+ This setup is also maintains `clustered_url` and `backdoor_url` for future use.
+ The value for `clustered_url` could be nil if :chttpd app is not included in extra_apps.
+
+ Example
+ setup
+ |> Setup.Step.Start.new(:start, extra_apps: [:fabric, :chttpd])
+ ...
+ |> Setup.run
+ ...
+
+ started_apps = Setup.Step.Start.apps
+ clustered_url = setup |> Setup.get(:start) |> Setup.Step.Start.clustered_url
+ backdoor_url = setup |> Setup.get(:start) |> Setup.Step.Start.backdoor_url
+ """
+ alias Couch.Test.Setup
+ alias Couch.Test.Setup.Step
+
+ defstruct [:test_ctx, :extra_apps, :clustered_url, :backdoor_url]
+
+ def new(setup, id, extra_apps: extra_apps) do
+ setup |> Setup.step(id, %__MODULE__{extra_apps: extra_apps || []})
+ end
+
+ def setup(setup, %__MODULE__{extra_apps: extra_apps} = step) do
+ test_config = setup |> Setup.get(:test_config) |> Step.Config.get()
+ protocol = test_config[:backdoor][:protocol] || "http"
+ test_ctx = :test_util.start_couch(extra_apps)
+ addr = :config.get('couch_httpd', 'bind_address', '127.0.0.1')
+ port = :mochiweb_socket_server.get(:couch_httpd, :port)
+ backdoor_url = "#{protocol}://#{addr}:#{port}"
+ clustered_url =
+ if :chttpd in extra_apps do
+ protocol = test_config[:clustered][:protocol] || "http"
+ addr = :config.get('chttpd', 'bind_address', '127.0.0.1')
+ port = :mochiweb_socket_server.get(:chttpd, :port)
+ "#{protocol}://#{addr}:#{port}"
+ else
+ nil
+ end
+ %{step |
+ test_ctx: test_ctx,
+ clustered_url: clustered_url,
+ backdoor_url: backdoor_url
+ }
+ end
+
+ def teardown(_setup, %___MODULE__{test_ctx: test_ctx}) do
+ :test_util.stop_couch(test_ctx)
+ end
+
+ def backdoor_url(%__MODULE__{backdoor_url: url}) do
+ url
+ end
+
+ def clustered_url(%__MODULE__{clustered_url: url}) do
+ url
+ end
+
+ def extra_apps(%__MODULE__{extra_apps: apps}) do
+ apps
+ end
+
+ @doc """
+ Returns list of currently running applications
+ """
+ def apps() do
+ for {x, _, _} <- Application.started_applications, do: x
+ end
+
+end \ No newline at end of file
diff --git a/test/elixir/lib/step/user.ex b/test/elixir/lib/step/user.ex
new file mode 100644
index 000000000..5a1cab33c
--- /dev/null
+++ b/test/elixir/lib/step/user.ex
@@ -0,0 +1,104 @@
+defmodule Couch.Test.Setup.Step.User do
+ @moduledoc """
+ Step to create user with given list of roles.
+ The :server_admin is a special role which is used to put user
+ into `admins` section of a config instead of a database.
+
+ Example
+ setup
+ |> Setup.Step.User.new(:admin, roles: [:server_admin])
+ ...
+ |> Setup.run
+ ...
+
+ user = setup |> Setup.get(:admin) |> Step.User.name()
+ """
+
+ alias Couch.Test.Setup
+ alias Couch.Test.Setup.Step
+ alias Couch.Test.Utils
+
+ import ExUnit.Callbacks, only: [on_exit: 1]
+
+ defstruct [:roles, :name, :password, :users_db]
+
+ import ExUnit.Assertions, only: [assert: 1, assert: 2]
+
+ import Utils
+
+ @admin {:user_ctx, user_ctx(roles: ["_admin"])}
+
+ def new(setup, id, roles: roles) do
+ setup |> Setup.step(id, %__MODULE__{roles: roles || []})
+ end
+
+ def setup(setup, %__MODULE__{roles: roles} = step) do
+ users_db = IO.chardata_to_string(
+ :config.get('chttpd_auth', 'authentication_db', '_users'))
+ if not Utils.db_exists?(users_db) do
+ on_exit fn ->
+ :fabric.delete_db(users_db, [@admin])
+ end
+ res = :fabric.create_db(users_db, [@admin])
+ assert res in [:ok, :accepted], "Cannot create `users` database #{users_db}"
+ end
+
+ if :server_admin in roles do
+ name = Utils.random_name("admin")
+ pass = Utils.random_password()
+ :config.set(
+ 'admins', String.to_charlist(name), String.to_charlist(pass), false)
+ %{step |
+ name: name,
+ password: pass,
+ users_db: users_db
+ }
+ else
+ name = Utils.random_name("admin")
+ pass = Utils.random_password()
+ doc_id = "org.couchdb.user:#{name}"
+ user_doc = :couch_doc.from_json_obj(%{
+ _id: doc_id,
+ name: name,
+ type: "user",
+ roles: roles,
+ password: pass
+ })
+ res = :fabric.update_doc(users_db, user_doc, [@admin])
+ assert res in [:ok, :accepted], "Cannot create user document"
+ %{step |
+ name: name,
+ password: pass,
+ users_db: users_db,
+ roles: roles
+ }
+ end
+ end
+
+ def teardown(setup, %__MODULE__{name: name, users_db: users_db, roles: roles} = step) do
+ if :server_admin in roles do
+ :config.delete("admins", String.to_charlist(name), false)
+ else
+ doc_id = "org.couchdb.user:#{name}"
+ assert {:ok, doc_info(revs: [rev | _])} = :fabric.get_doc_info(users_db)
+ doc = :couch_doc.from_json_obj(%{
+ _id: doc_id,
+ _rev: rev,
+ _deleted: true
+ })
+ assert {:ok, _resp} = :fabric.update_doc(users_db, doc, [@admin])
+ end
+ :ok
+ end
+
+ def name(%__MODULE__{name: name}) do
+ name
+ end
+ def password(%__MODULE__{password: pass}) do
+ pass
+ end
+ def credentials(%__MODULE__{name: name, password: pass}) do
+ {name, pass}
+ end
+
+end \ No newline at end of file
diff --git a/test/elixir/lib/utils.ex b/test/elixir/lib/utils.ex
new file mode 100644
index 000000000..3ecf878e7
--- /dev/null
+++ b/test/elixir/lib/utils.ex
@@ -0,0 +1,61 @@
+defmodule Couch.Test.Utils do
+ require Record
+ @moduledoc "Helper functions for testing"
+ @project_root "#{__DIR__}/../../../"
+ Record.defrecord :user_ctx, Record.extract(
+ :user_ctx, from: "#{@project_root}/src/couch/include/couch_db.hrl")
+
+ Record.defrecord :doc_info, Record.extract(
+ :doc_info, from: "#{@project_root}/src/couch/include/couch_db.hrl")
+
+ def random_name(prefix) do
+ time = :erlang.monotonic_time()
+ umi = :erlang.unique_integer([:monotonic])
+ "#{prefix}-#{time}-#{umi}"
+ end
+
+ def random_password() do
+ rand_bytes = :crypto.strong_rand_bytes(16)
+ rand_bytes
+ |> :base64.encode()
+ |> String.slice(0..16)
+ end
+
+ def db_exists?(db_name) do
+ try do
+ :fabric.get_db_info(db_name)
+ catch
+ :error, :database_does_not_exist -> false
+ end
+ end
+
+ @doc """
+ In some cases we need to access record definition at compile time.
+ We cannot use Record.defrecord in such cases. This helper function
+ can be used instead. Use it as follows:
+ ```
+ defmodule Foo do
+ admin_ctx = {:user_ctx, Utils.erlang_record(
+ :user_ctx, "couch/include/couch_db.hrl", roles: ["_admin"])}
+ end
+ ```
+
+ Longer term we should wrap erlang records as it is done for user_ctx
+ see beginning of the Utils.ex. In this case we would be able to use
+ them at compile time in other modules.
+ ```
+ Record.defrecord :user_ctx, Record.extract(
+ :user_ctx, from_lib: "couch/include/couch_db.hrl")
+ ```
+ """
+ def erlang_record(name, from_lib, opts \\ []) do
+ record_info = Record.extract(name, from_lib: from_lib)
+ index = [name | Keyword.keys(record_info)] |> Enum.with_index
+ draft = [name | Keyword.values(record_info)] |> List.to_tuple
+ opts
+ |> Enum.reduce(draft, fn
+ {k, v}, acc -> put_elem(acc, index[k], v)
+ end)
+ end
+
+end \ No newline at end of file
diff --git a/test/elixir/mix.exs b/test/elixir/mix.exs
deleted file mode 100644
index f04038ef3..000000000
--- a/test/elixir/mix.exs
+++ /dev/null
@@ -1,37 +0,0 @@
-defmodule Foo.Mixfile do
- use Mix.Project
-
- def project do
- [
- app: :foo,
- version: "0.1.0",
- elixir: "~> 1.6",
- elixirc_paths: elixirc_paths(Mix.env()),
- start_permanent: Mix.env() == :prod,
- deps: deps()
- ]
- end
-
- # Run "mix help compile.app" to learn about applications.
- def application do
- [
- extra_applications: [:logger]
- ]
- end
-
- # Specifies which paths to compile per environment.
- defp elixirc_paths(:test), do: ["lib", "test/support"]
- defp elixirc_paths(_), do: ["lib"]
-
- # Run "mix help deps" to learn about dependencies.
- defp deps do
- [
- # {:dep_from_hexpm, "~> 0.3.0"},
- {:httpotion, "~> 3.0"},
- {:jiffy, "~> 0.15.2"},
- {:credo, "~> 1.0.0", only: [:dev, :test], runtime: false},
- {:junit_formatter, "~> 3.0", only: [:test]}
- # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"},
- ]
- end
-end
diff --git a/test/elixir/run b/test/elixir/run
deleted file mode 100755
index a9c2efa4d..000000000
--- a/test/elixir/run
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/bash -e
-cd "$(dirname "$0")"
-mix local.hex --force
-mix local.rebar --force
-mix deps.get
-mix test --trace "$@"
diff --git a/test/elixir/test/replication_test.exs b/test/elixir/test/replication_test.exs
index e98775fbd..a6e1303e6 100644
--- a/test/elixir/test/replication_test.exs
+++ b/test/elixir/test/replication_test.exs
@@ -1757,11 +1757,11 @@ defmodule ReplicationTest do
end
def get_att1_data do
- File.read!("test/data/lorem.txt")
+ File.read!(Path.expand("data/lorem.txt", __DIR__))
end
def get_att2_data do
- File.read!("test/data/lorem_b64.txt")
+ File.read!(Path.expand("data/lorem_b64.txt", __DIR__))
end
def cmp_json(lhs, rhs) when is_map(lhs) and is_map(rhs) do
diff --git a/test/elixir/test/test_helper.exs b/test/elixir/test/test_helper.exs
index ef71bbb1b..4bf65bcf6 100644
--- a/test/elixir/test/test_helper.exs
+++ b/test/elixir/test/test_helper.exs
@@ -2,12 +2,14 @@
# and skip certain tests that fail on jenkins.
exclude =
case System.get_env("BUILD_NUMBER") !== nil do
- true -> [pending: true, skip_on_jenkins: true]
- false -> [pending: true]
+ true -> [:pending, :skip_on_jenkins]
+ false -> [:pending]
end
+current_exclude = Keyword.get(ExUnit.configuration(), :exclude, [])
+
ExUnit.configure(
- exclude: exclude,
+ exclude: Enum.uniq(exclude ++ current_exclude),
formatters: [JUnitFormatter, ExUnit.CLIFormatter]
)