http://git-wip-us.apache.org/repos/asf/couchdb-couch/blob/94ae4be2/test/couchdb_os_daemons_tests.erl ---------------------------------------------------------------------- diff --git a/test/couchdb_os_daemons_tests.erl b/test/couchdb_os_daemons_tests.erl index 3eeb7d7..68de6f7 100644 --- a/test/couchdb_os_daemons_tests.erl +++ b/test/couchdb_os_daemons_tests.erl @@ -36,193 +36,193 @@ -define(TIMEOUT, 1000). -setup(DName) -> - {ok, CfgPid} = config:start_link(?CONFIG_CHAIN), - {ok, OsDPid} = couch_os_daemons:start_link(), - config:set("os_daemons", DName, - filename:join([?FIXTURESDIR, DName]), false), - timer:sleep(?DELAY), % sleep a bit to let daemon set kill flag - {CfgPid, OsDPid}. - -teardown(_, {CfgPid, OsDPid}) -> - erlang:monitor(process, CfgPid), - config:stop(), - receive - {'DOWN', _, _, CfgPid, _} -> - ok - after ?TIMEOUT -> - throw({timeout, config_stop}) - end, - - erlang:monitor(process, OsDPid), - exit(OsDPid, normal), - receive - {'DOWN', _, _, OsDPid, _} -> - ok - after ?TIMEOUT -> - throw({timeout, os_daemon_stop}) - end. - - -os_daemons_test_() -> - { - "OS Daemons tests", - { - foreachx, - fun setup/1, fun teardown/2, - [{?DAEMON_LOOPER, Fun} || Fun <- [ - fun should_check_daemon/2, - fun should_check_daemon_table_form/2, - fun should_clean_tables_on_daemon_remove/2, - fun should_spawn_multiple_daemons/2, - fun should_keep_alive_one_daemon_on_killing_other/2 - ]] - } - }. - -configuration_reader_test_() -> - { - "OS Daemon requests CouchDB configuration", - { - foreachx, - fun setup/1, fun teardown/2, - [{?DAEMON_CONFIGER, - fun should_read_write_config_settings_by_daemon/2}] - - } - }. - -error_test_() -> - { - "OS Daemon process error tests", - { - foreachx, - fun setup/1, fun teardown/2, - [{?DAEMON_BAD_PERM, fun should_fail_due_to_lack_of_permissions/2}, - {?DAEMON_DIE_ON_BOOT, fun should_die_on_boot/2}, - {?DAEMON_DIE_QUICKLY, fun should_die_quickly/2}, - {?DAEMON_CAN_REBOOT, fun should_not_being_halted/2}] - } - }. - - -should_check_daemon(DName, _) -> - ?_test(begin - {ok, [D]} = couch_os_daemons:info([table]), - check_daemon(D, DName) - end). - -should_check_daemon_table_form(DName, _) -> - ?_test(begin - {ok, Tab} = couch_os_daemons:info(), - [D] = ets:tab2list(Tab), - check_daemon(D, DName) - end). - -should_clean_tables_on_daemon_remove(DName, _) -> - ?_test(begin - config:delete("os_daemons", DName, false), - {ok, Tab2} = couch_os_daemons:info(), - ?_assertEqual([], ets:tab2list(Tab2)) - end). - -should_spawn_multiple_daemons(DName, _) -> - ?_test(begin - config:set("os_daemons", "bar", - filename:join([?FIXTURESDIR, DName]), false), - config:set("os_daemons", "baz", - filename:join([?FIXTURESDIR, DName]), false), - timer:sleep(?DELAY), - {ok, Daemons} = couch_os_daemons:info([table]), - lists:foreach(fun(D) -> - check_daemon(D) - end, Daemons), - {ok, Tab} = couch_os_daemons:info(), - lists:foreach(fun(D) -> - check_daemon(D) - end, ets:tab2list(Tab)) - end). - -should_keep_alive_one_daemon_on_killing_other(DName, _) -> - ?_test(begin - config:set("os_daemons", "bar", - filename:join([?FIXTURESDIR, DName]), false), - timer:sleep(?DELAY), - {ok, Daemons} = couch_os_daemons:info([table]), - lists:foreach(fun(D) -> - check_daemon(D) - end, Daemons), - - config:delete("os_daemons", "bar", false), - timer:sleep(?DELAY), - {ok, [D2]} = couch_os_daemons:info([table]), - check_daemon(D2, DName), - - {ok, Tab} = couch_os_daemons:info(), - [T] = ets:tab2list(Tab), - check_daemon(T, DName) - end). - -should_read_write_config_settings_by_daemon(DName, _) -> - ?_test(begin - % have to wait till daemon run all his tests - % see daemon's script for more info - timer:sleep(?TIMEOUT), - {ok, [D]} = couch_os_daemons:info([table]), - check_daemon(D, DName) - end). - -should_fail_due_to_lack_of_permissions(DName, _) -> - ?_test(should_halts(DName, 1000)). - -should_die_on_boot(DName, _) -> - ?_test(should_halts(DName, 1000)). - -should_die_quickly(DName, _) -> - ?_test(should_halts(DName, 4000)). - -should_not_being_halted(DName, _) -> - ?_test(begin - timer:sleep(1000), - {ok, [D1]} = couch_os_daemons:info([table]), - check_daemon(D1, DName, 0), - - % Should reboot every two seconds. We're at 1s, so wait - % until 3s to be in the middle of the next invocation's - % life span. - - timer:sleep(2000), - {ok, [D2]} = couch_os_daemons:info([table]), - check_daemon(D2, DName, 1), - - % If the kill command changed, that means we rebooted the process. - ?assertNotEqual(D1#daemon.kill, D2#daemon.kill) - end). - -should_halts(DName, Time) -> - timer:sleep(Time), - {ok, [D]} = couch_os_daemons:info([table]), - check_dead(D, DName), - config:delete("os_daemons", DName, false). - -check_daemon(D) -> - check_daemon(D, D#daemon.name). - -check_daemon(D, Name) -> - check_daemon(D, Name, 0). - -check_daemon(D, Name, Errs) -> - ?assert(is_port(D#daemon.port)), - ?assertEqual(Name, D#daemon.name), - ?assertNotEqual(undefined, D#daemon.kill), - ?assertEqual(running, D#daemon.status), - ?assertEqual(Errs, length(D#daemon.errors)), - ?assertEqual([], D#daemon.buf). - -check_dead(D, Name) -> - ?assert(is_port(D#daemon.port)), - ?assertEqual(Name, D#daemon.name), - ?assertNotEqual(undefined, D#daemon.kill), - ?assertEqual(halted, D#daemon.status), - ?assertEqual(nil, D#daemon.errors), - ?assertEqual(nil, D#daemon.buf). +%% setup(DName) -> +%% {ok, CfgPid} = config:start_link(?CONFIG_CHAIN), +%% {ok, OsDPid} = couch_os_daemons:start_link(), +%% config:set("os_daemons", DName, +%% filename:join([?FIXTURESDIR, DName]), false), +%% timer:sleep(?DELAY), % sleep a bit to let daemon set kill flag +%% {CfgPid, OsDPid}. + +%% teardown(_, {CfgPid, OsDPid}) -> +%% erlang:monitor(process, CfgPid), +%% config:stop(), +%% receive +%% {'DOWN', _, _, CfgPid, _} -> +%% ok +%% after ?TIMEOUT -> +%% throw({timeout, config_stop}) +%% end, + +%% erlang:monitor(process, OsDPid), +%% exit(OsDPid, normal), +%% receive +%% {'DOWN', _, _, OsDPid, _} -> +%% ok +%% after ?TIMEOUT -> +%% throw({timeout, os_daemon_stop}) +%% end. + + +%% os_daemons_test_() -> +%% { +%% "OS Daemons tests", +%% { +%% foreachx, +%% fun setup/1, fun teardown/2, +%% [{?DAEMON_LOOPER, Fun} || Fun <- [ +%% fun should_check_daemon/2, +%% fun should_check_daemon_table_form/2, +%% fun should_clean_tables_on_daemon_remove/2, +%% fun should_spawn_multiple_daemons/2, +%% fun should_keep_alive_one_daemon_on_killing_other/2 +%% ]] +%% } +%% }. + +%% configuration_reader_test_() -> +%% { +%% "OS Daemon requests CouchDB configuration", +%% { +%% foreachx, +%% fun setup/1, fun teardown/2, +%% [{?DAEMON_CONFIGER, +%% fun should_read_write_config_settings_by_daemon/2}] + +%% } +%% }. + +%% error_test_() -> +%% { +%% "OS Daemon process error tests", +%% { +%% foreachx, +%% fun setup/1, fun teardown/2, +%% [{?DAEMON_BAD_PERM, fun should_fail_due_to_lack_of_permissions/2}, +%% {?DAEMON_DIE_ON_BOOT, fun should_die_on_boot/2}, +%% {?DAEMON_DIE_QUICKLY, fun should_die_quickly/2}, +%% {?DAEMON_CAN_REBOOT, fun should_not_being_halted/2}] +%% } +%% }. + + +%% should_check_daemon(DName, _) -> +%% ?_test(begin +%% {ok, [D]} = couch_os_daemons:info([table]), +%% check_daemon(D, DName) +%% end). + +%% should_check_daemon_table_form(DName, _) -> +%% ?_test(begin +%% {ok, Tab} = couch_os_daemons:info(), +%% [D] = ets:tab2list(Tab), +%% check_daemon(D, DName) +%% end). + +%% should_clean_tables_on_daemon_remove(DName, _) -> +%% ?_test(begin +%% config:delete("os_daemons", DName, false), +%% {ok, Tab2} = couch_os_daemons:info(), +%% ?_assertEqual([], ets:tab2list(Tab2)) +%% end). + +%% should_spawn_multiple_daemons(DName, _) -> +%% ?_test(begin +%% config:set("os_daemons", "bar", +%% filename:join([?FIXTURESDIR, DName]), false), +%% config:set("os_daemons", "baz", +%% filename:join([?FIXTURESDIR, DName]), false), +%% timer:sleep(?DELAY), +%% {ok, Daemons} = couch_os_daemons:info([table]), +%% lists:foreach(fun(D) -> +%% check_daemon(D) +%% end, Daemons), +%% {ok, Tab} = couch_os_daemons:info(), +%% lists:foreach(fun(D) -> +%% check_daemon(D) +%% end, ets:tab2list(Tab)) +%% end). + +%% should_keep_alive_one_daemon_on_killing_other(DName, _) -> +%% ?_test(begin +%% config:set("os_daemons", "bar", +%% filename:join([?FIXTURESDIR, DName]), false), +%% timer:sleep(?DELAY), +%% {ok, Daemons} = couch_os_daemons:info([table]), +%% lists:foreach(fun(D) -> +%% check_daemon(D) +%% end, Daemons), + +%% config:delete("os_daemons", "bar", false), +%% timer:sleep(?DELAY), +%% {ok, [D2]} = couch_os_daemons:info([table]), +%% check_daemon(D2, DName), + +%% {ok, Tab} = couch_os_daemons:info(), +%% [T] = ets:tab2list(Tab), +%% check_daemon(T, DName) +%% end). + +%% should_read_write_config_settings_by_daemon(DName, _) -> +%% ?_test(begin +%% % have to wait till daemon run all his tests +%% % see daemon's script for more info +%% timer:sleep(?TIMEOUT), +%% {ok, [D]} = couch_os_daemons:info([table]), +%% check_daemon(D, DName) +%% end). + +%% should_fail_due_to_lack_of_permissions(DName, _) -> +%% ?_test(should_halts(DName, 1000)). + +%% should_die_on_boot(DName, _) -> +%% ?_test(should_halts(DName, 1000)). + +%% should_die_quickly(DName, _) -> +%% ?_test(should_halts(DName, 4000)). + +%% should_not_being_halted(DName, _) -> +%% ?_test(begin +%% timer:sleep(1000), +%% {ok, [D1]} = couch_os_daemons:info([table]), +%% check_daemon(D1, DName, 0), + +%% % Should reboot every two seconds. We're at 1s, so wait +%% % until 3s to be in the middle of the next invocation's +%% % life span. + +%% timer:sleep(2000), +%% {ok, [D2]} = couch_os_daemons:info([table]), +%% check_daemon(D2, DName, 1), + +%% % If the kill command changed, that means we rebooted the process. +%% ?assertNotEqual(D1#daemon.kill, D2#daemon.kill) +%% end). + +%% should_halts(DName, Time) -> +%% timer:sleep(Time), +%% {ok, [D]} = couch_os_daemons:info([table]), +%% check_dead(D, DName), +%% config:delete("os_daemons", DName, false). + +%% check_daemon(D) -> +%% check_daemon(D, D#daemon.name). + +%% check_daemon(D, Name) -> +%% check_daemon(D, Name, 0). + +%% check_daemon(D, Name, Errs) -> +%% ?assert(is_port(D#daemon.port)), +%% ?assertEqual(Name, D#daemon.name), +%% ?assertNotEqual(undefined, D#daemon.kill), +%% ?assertEqual(running, D#daemon.status), +%% ?assertEqual(Errs, length(D#daemon.errors)), +%% ?assertEqual([], D#daemon.buf). + +%% check_dead(D, Name) -> +%% ?assert(is_port(D#daemon.port)), +%% ?assertEqual(Name, D#daemon.name), +%% ?assertNotEqual(undefined, D#daemon.kill), +%% ?assertEqual(halted, D#daemon.status), +%% ?assertEqual(nil, D#daemon.errors), +%% ?assertEqual(nil, D#daemon.buf).
http://git-wip-us.apache.org/repos/asf/couchdb-couch/blob/94ae4be2/test/couchdb_os_proc_pool.erl ---------------------------------------------------------------------- diff --git a/test/couchdb_os_proc_pool.erl b/test/couchdb_os_proc_pool.erl index a8ab752..607ccf3 100644 --- a/test/couchdb_os_proc_pool.erl +++ b/test/couchdb_os_proc_pool.erl @@ -18,152 +18,152 @@ -define(TIMEOUT, 3000). -start() -> - ok = test_util:start_couch(), - config:set("query_server_config", "os_process_limit", "3", false), - ok. - - -os_proc_pool_test_() -> - { - "OS processes pool tests", - { - setup, - fun start/0, fun test_util:stop_couch/1, - [ - should_block_new_proc_on_full_pool(), - should_free_slot_on_proc_unexpected_exit() - ] - } - }. - - -should_block_new_proc_on_full_pool() -> - ?_test(begin - Client1 = spawn_client(), - Client2 = spawn_client(), - Client3 = spawn_client(), - - ?assertEqual(ok, ping_client(Client1)), - ?assertEqual(ok, ping_client(Client2)), - ?assertEqual(ok, ping_client(Client3)), - - Proc1 = get_client_proc(Client1, "1"), - Proc2 = get_client_proc(Client2, "2"), - Proc3 = get_client_proc(Client3, "3"), - - ?assertNotEqual(Proc1, Proc2), - ?assertNotEqual(Proc2, Proc3), - ?assertNotEqual(Proc3, Proc1), - - Client4 = spawn_client(), - ?assertEqual(timeout, ping_client(Client4)), - - ?assertEqual(ok, stop_client(Client1)), - ?assertEqual(ok, ping_client(Client4)), - - Proc4 = get_client_proc(Client4, "4"), - ?assertEqual(Proc1, Proc4), - - lists:map(fun(C) -> - ?assertEqual(ok, stop_client(C)) - end, [Client2, Client3, Client4]) - end). - -should_free_slot_on_proc_unexpected_exit() -> - ?_test(begin - Client1 = spawn_client(), - Client2 = spawn_client(), - Client3 = spawn_client(), - - ?assertEqual(ok, ping_client(Client1)), - ?assertEqual(ok, ping_client(Client2)), - ?assertEqual(ok, ping_client(Client3)), - - Proc1 = get_client_proc(Client1, "1"), - Proc2 = get_client_proc(Client2, "2"), - Proc3 = get_client_proc(Client3, "3"), - - ?assertNotEqual(Proc1, Proc2), - ?assertNotEqual(Proc2, Proc3), - ?assertNotEqual(Proc3, Proc1), - - ?assertEqual(ok, kill_client(Client1)), - - Client4 = spawn_client(), - ?assertEqual(ok, ping_client(Client4)), - - Proc4 = get_client_proc(Client4, "4"), - ?assertNotEqual(Proc4, Proc1), - ?assertNotEqual(Proc2, Proc4), - ?assertNotEqual(Proc3, Proc4), - - lists:map(fun(C) -> - ?assertEqual(ok, stop_client(C)) - end, [Client2, Client3, Client4]) - end). - - -spawn_client() -> - Parent = self(), - Ref = make_ref(), - Pid = spawn(fun() -> - Proc = couch_query_servers:get_os_process(<<"javascript">>), - loop(Parent, Ref, Proc) - end), - {Pid, Ref}. - -ping_client({Pid, Ref}) -> - Pid ! ping, - receive - {pong, Ref} -> - ok - after ?TIMEOUT -> - timeout - end. - -get_client_proc({Pid, Ref}, ClientName) -> - Pid ! get_proc, - receive - {proc, Ref, Proc} -> Proc - after ?TIMEOUT -> - erlang:error({assertion_failed, - [{module, ?MODULE}, - {line, ?LINE}, - {reason, "Timeout getting client " - ++ ClientName ++ " proc"}]}) - end. - -stop_client({Pid, Ref}) -> - Pid ! stop, - receive - {stop, Ref} -> - ok - after ?TIMEOUT -> - timeout - end. - -kill_client({Pid, Ref}) -> - Pid ! die, - receive - {die, Ref} -> - ok - after ?TIMEOUT -> - timeout - end. - -loop(Parent, Ref, Proc) -> - receive - ping -> - Parent ! {pong, Ref}, - loop(Parent, Ref, Proc); - get_proc -> - Parent ! {proc, Ref, Proc}, - loop(Parent, Ref, Proc); - stop -> - couch_query_servers:ret_os_process(Proc), - Parent ! {stop, Ref}; - die -> - Parent ! {die, Ref}, - exit(some_error) - end. +%% start() -> +%% ok = test_util:start_couch(), +%% config:set("query_server_config", "os_process_limit", "3", false), +%% ok. + + +%% os_proc_pool_test_() -> +%% { +%% "OS processes pool tests", +%% { +%% setup, +%% fun start/0, fun test_util:stop_couch/1, +%% [ +%% should_block_new_proc_on_full_pool(), +%% should_free_slot_on_proc_unexpected_exit() +%% ] +%% } +%% }. + + +%% should_block_new_proc_on_full_pool() -> +%% ?_test(begin +%% Client1 = spawn_client(), +%% Client2 = spawn_client(), +%% Client3 = spawn_client(), + +%% ?assertEqual(ok, ping_client(Client1)), +%% ?assertEqual(ok, ping_client(Client2)), +%% ?assertEqual(ok, ping_client(Client3)), + +%% Proc1 = get_client_proc(Client1, "1"), +%% Proc2 = get_client_proc(Client2, "2"), +%% Proc3 = get_client_proc(Client3, "3"), + +%% ?assertNotEqual(Proc1, Proc2), +%% ?assertNotEqual(Proc2, Proc3), +%% ?assertNotEqual(Proc3, Proc1), + +%% Client4 = spawn_client(), +%% ?assertEqual(timeout, ping_client(Client4)), + +%% ?assertEqual(ok, stop_client(Client1)), +%% ?assertEqual(ok, ping_client(Client4)), + +%% Proc4 = get_client_proc(Client4, "4"), +%% ?assertEqual(Proc1, Proc4), + +%% lists:map(fun(C) -> +%% ?assertEqual(ok, stop_client(C)) +%% end, [Client2, Client3, Client4]) +%% end). + +%% should_free_slot_on_proc_unexpected_exit() -> +%% ?_test(begin +%% Client1 = spawn_client(), +%% Client2 = spawn_client(), +%% Client3 = spawn_client(), + +%% ?assertEqual(ok, ping_client(Client1)), +%% ?assertEqual(ok, ping_client(Client2)), +%% ?assertEqual(ok, ping_client(Client3)), + +%% Proc1 = get_client_proc(Client1, "1"), +%% Proc2 = get_client_proc(Client2, "2"), +%% Proc3 = get_client_proc(Client3, "3"), + +%% ?assertNotEqual(Proc1, Proc2), +%% ?assertNotEqual(Proc2, Proc3), +%% ?assertNotEqual(Proc3, Proc1), + +%% ?assertEqual(ok, kill_client(Client1)), + +%% Client4 = spawn_client(), +%% ?assertEqual(ok, ping_client(Client4)), + +%% Proc4 = get_client_proc(Client4, "4"), +%% ?assertNotEqual(Proc4, Proc1), +%% ?assertNotEqual(Proc2, Proc4), +%% ?assertNotEqual(Proc3, Proc4), + +%% lists:map(fun(C) -> +%% ?assertEqual(ok, stop_client(C)) +%% end, [Client2, Client3, Client4]) +%% end). + + +%% spawn_client() -> +%% Parent = self(), +%% Ref = make_ref(), +%% Pid = spawn(fun() -> +%% Proc = couch_query_servers:get_os_process(<<"javascript">>), +%% loop(Parent, Ref, Proc) +%% end), +%% {Pid, Ref}. + +%% ping_client({Pid, Ref}) -> +%% Pid ! ping, +%% receive +%% {pong, Ref} -> +%% ok +%% after ?TIMEOUT -> +%% timeout +%% end. + +%% get_client_proc({Pid, Ref}, ClientName) -> +%% Pid ! get_proc, +%% receive +%% {proc, Ref, Proc} -> Proc +%% after ?TIMEOUT -> +%% erlang:error({assertion_failed, +%% [{module, ?MODULE}, +%% {line, ?LINE}, +%% {reason, "Timeout getting client " +%% ++ ClientName ++ " proc"}]}) +%% end. + +%% stop_client({Pid, Ref}) -> +%% Pid ! stop, +%% receive +%% {stop, Ref} -> +%% ok +%% after ?TIMEOUT -> +%% timeout +%% end. + +%% kill_client({Pid, Ref}) -> +%% Pid ! die, +%% receive +%% {die, Ref} -> +%% ok +%% after ?TIMEOUT -> +%% timeout +%% end. + +%% loop(Parent, Ref, Proc) -> +%% receive +%% ping -> +%% Parent ! {pong, Ref}, +%% loop(Parent, Ref, Proc); +%% get_proc -> +%% Parent ! {proc, Ref, Proc}, +%% loop(Parent, Ref, Proc); +%% stop -> +%% couch_query_servers:ret_os_process(Proc), +%% Parent ! {stop, Ref}; +%% die -> +%% Parent ! {die, Ref}, +%% exit(some_error) +%% end. http://git-wip-us.apache.org/repos/asf/couchdb-couch/blob/94ae4be2/test/couchdb_vhosts_tests.erl ---------------------------------------------------------------------- diff --git a/test/couchdb_vhosts_tests.erl b/test/couchdb_vhosts_tests.erl index 321012f..addce30 100644 --- a/test/couchdb_vhosts_tests.erl +++ b/test/couchdb_vhosts_tests.erl @@ -20,408 +20,408 @@ -define(iofmt(S, A), lists:flatten(io_lib:format(S, A))). -setup() -> - DbName = ?tempdb(), - {ok, Db} = couch_db:create(DbName, [?ADMIN_USER]), - Doc = couch_doc:from_json_obj({[ - {<<"_id">>, <<"doc1">>}, - {<<"value">>, 666} - ]}), - - Doc1 = couch_doc:from_json_obj({[ - {<<"_id">>, <<"_design/doc1">>}, - {<<"shows">>, {[ - {<<"test">>, <<"function(doc, req) { - return { json: { - requested_path: '/' + req.requested_path.join('/'), - path: '/' + req.path.join('/')}};}">>} - ]}}, - {<<"rewrites">>, [ - {[ - {<<"from">>, <<"/">>}, - {<<"to">>, <<"_show/test">>} - ]} - ]} - ]}), - {ok, _} = couch_db:update_docs(Db, [Doc, Doc1]), - couch_db:ensure_full_commit(Db), - couch_db:close(Db), - - Addr = config:get("httpd", "bind_address", "127.0.0.1"), - Port = integer_to_list(mochiweb_socket_server:get(couch_httpd, port)), - Url = "http://" ++ Addr ++ ":" ++ Port, - {Url, ?b2l(DbName)}. - -setup_oauth() -> - DbName = ?tempdb(), - {ok, Db} = couch_db:create(DbName, [?ADMIN_USER]), - - config:set("couch_httpd_auth", "authentication_db", - ?b2l(?tempdb()), false), - config:set("oauth_token_users", "otoksec1", "joe", false), - config:set("oauth_consumer_secrets", "consec1", "foo", false), - config:set("oauth_token_secrets", "otoksec1", "foobar", false), - config:set("couch_httpd_auth", "require_valid_user", "true", false), - - ok = config:set( - "vhosts", "oauth-example.com", - "/" ++ ?b2l(DbName) ++ "/_design/test/_rewrite/foobar", false), - - DDoc = couch_doc:from_json_obj({[ - {<<"_id">>, <<"_design/test">>}, - {<<"language">>, <<"javascript">>}, - {<<"rewrites">>, [ - {[ - {<<"from">>, <<"foobar">>}, - {<<"to">>, <<"_info">>} - ]} - ]} - ]}), - {ok, _} = couch_db:update_doc(Db, DDoc, []), - - couch_db:ensure_full_commit(Db), - couch_db:close(Db), - - Addr = config:get("httpd", "bind_address", "127.0.0.1"), - Port = integer_to_list(mochiweb_socket_server:get(couch_httpd, port)), - Url = "http://" ++ Addr ++ ":" ++ Port, - {Url, ?b2l(DbName)}. - -teardown({_, DbName}) -> - ok = couch_server:delete(?l2b(DbName), []), - ok. - - -vhosts_test_() -> - { - "Virtual Hosts rewrite tests", - { - setup, - fun test_util:start_couch/0, fun test_util:stop_couch/1, - { - foreach, - fun setup/0, fun teardown/1, - [ - fun should_return_database_info/1, - fun should_return_revs_info/1, - fun should_serve_utils_for_vhost/1, - fun should_return_virtual_request_path_field_in_request/1, - fun should_return_real_request_path_field_in_request/1, - fun should_match_wildcard_vhost/1, - fun should_return_db_info_for_wildcard_vhost_for_custom_db/1, - fun should_replace_rewrite_variables_for_db_and_doc/1, - fun should_return_db_info_for_vhost_with_resource/1, - fun should_return_revs_info_for_vhost_with_resource/1, - fun should_return_db_info_for_vhost_with_wildcard_resource/1, - fun should_return_path_for_vhost_with_wildcard_host/1 - ] - } - } - }. - -oauth_test_() -> - { - "Virtual Hosts OAuth tests", - { - setup, - fun test_util:start_couch/0, fun test_util:stop_couch/1, - { - foreach, - fun setup_oauth/0, fun teardown/1, - [ - fun should_require_auth/1, - fun should_succeed_oauth/1, - fun should_fail_oauth_with_wrong_credentials/1 - ] - } - } - }. - - -should_return_database_info({Url, DbName}) -> - ?_test(begin - ok = config:set("vhosts", "example.com", "/" ++ DbName, false), - case test_request:get(Url, [], [{host_header, "example.com"}]) of - {ok, _, _, Body} -> - {JsonBody} = ejson:decode(Body), - ?assert(proplists:is_defined(<<"db_name">>, JsonBody)); - Else -> - erlang:error({assertion_failed, - [{module, ?MODULE}, - {line, ?LINE}, - {reason, ?iofmt("Request failed: ~p", [Else])}]}) - end - end). - -should_return_revs_info({Url, DbName}) -> - ?_test(begin - ok = config:set("vhosts", "example.com", "/" ++ DbName, false), - case test_request:get(Url ++ "/doc1?revs_info=true", [], - [{host_header, "example.com"}]) of - {ok, _, _, Body} -> - {JsonBody} = ejson:decode(Body), - ?assert(proplists:is_defined(<<"_revs_info">>, JsonBody)); - Else -> - erlang:error({assertion_failed, - [{module, ?MODULE}, - {line, ?LINE}, - {reason, ?iofmt("Request failed: ~p", [Else])}]}) - end - end). - -should_serve_utils_for_vhost({Url, DbName}) -> - ?_test(begin - ok = config:set("vhosts", "example.com", "/" ++ DbName, false), - case test_request:get(Url ++ "/_utils/index.html", [], - [{host_header, "example.com"}]) of - {ok, _, _, Body} -> - ?assertMatch(<<"<!DOCTYPE html>", _/binary>>, Body); - Else -> - erlang:error({assertion_failed, - [{module, ?MODULE}, - {line, ?LINE}, - {reason, ?iofmt("Request failed: ~p", [Else])}]}) - end - end). - -should_return_virtual_request_path_field_in_request({Url, DbName}) -> - ?_test(begin - ok = config:set("vhosts", "example1.com", - "/" ++ DbName ++ "/_design/doc1/_rewrite/", - false), - case test_request:get(Url, [], [{host_header, "example1.com"}]) of - {ok, _, _, Body} -> - {Json} = ejson:decode(Body), - ?assertEqual(<<"/">>, - proplists:get_value(<<"requested_path">>, Json)); - Else -> - erlang:error({assertion_failed, - [{module, ?MODULE}, - {line, ?LINE}, - {reason, ?iofmt("Request failed: ~p", [Else])}]}) - end - end). - -should_return_real_request_path_field_in_request({Url, DbName}) -> - ?_test(begin - ok = config:set("vhosts", "example1.com", - "/" ++ DbName ++ "/_design/doc1/_rewrite/", - false), - case test_request:get(Url, [], [{host_header, "example1.com"}]) of - {ok, _, _, Body} -> - {Json} = ejson:decode(Body), - Path = ?l2b("/" ++ DbName ++ "/_design/doc1/_show/test"), - ?assertEqual(Path, proplists:get_value(<<"path">>, Json)); - Else -> - erlang:error({assertion_failed, - [{module, ?MODULE}, - {line, ?LINE}, - {reason, ?iofmt("Request failed: ~p", [Else])}]}) - end - end). - -should_match_wildcard_vhost({Url, DbName}) -> - ?_test(begin - ok = config:set("vhosts", "*.example.com", - "/" ++ DbName ++ "/_design/doc1/_rewrite", false), - case test_request:get(Url, [], [{host_header, "test.example.com"}]) of - {ok, _, _, Body} -> - {Json} = ejson:decode(Body), - Path = ?l2b("/" ++ DbName ++ "/_design/doc1/_show/test"), - ?assertEqual(Path, proplists:get_value(<<"path">>, Json)); - Else -> - erlang:error({assertion_failed, - [{module, ?MODULE}, - {line, ?LINE}, - {reason, ?iofmt("Request failed: ~p", [Else])}]}) - end - end). - -should_return_db_info_for_wildcard_vhost_for_custom_db({Url, DbName}) -> - ?_test(begin - ok = config:set("vhosts", ":dbname.example1.com", - "/:dbname", false), - Host = DbName ++ ".example1.com", - case test_request:get(Url, [], [{host_header, Host}]) of - {ok, _, _, Body} -> - {JsonBody} = ejson:decode(Body), - ?assert(proplists:is_defined(<<"db_name">>, JsonBody)); - Else -> - erlang:error({assertion_failed, - [{module, ?MODULE}, - {line, ?LINE}, - {reason, ?iofmt("Request failed: ~p", [Else])}]}) - end - end). - -should_replace_rewrite_variables_for_db_and_doc({Url, DbName}) -> - ?_test(begin - ok = config:set("vhosts",":appname.:dbname.example1.com", - "/:dbname/_design/:appname/_rewrite/", false), - Host = "doc1." ++ DbName ++ ".example1.com", - case test_request:get(Url, [], [{host_header, Host}]) of - {ok, _, _, Body} -> - {Json} = ejson:decode(Body), - Path = ?l2b("/" ++ DbName ++ "/_design/doc1/_show/test"), - ?assertEqual(Path, proplists:get_value(<<"path">>, Json)); - Else -> - erlang:error({assertion_failed, - [{module, ?MODULE}, - {line, ?LINE}, - {reason, ?iofmt("Request failed: ~p", [Else])}]}) - end - end). - -should_return_db_info_for_vhost_with_resource({Url, DbName}) -> - ?_test(begin - ok = config:set("vhosts", - "example.com/test", "/" ++ DbName, false), - ReqUrl = Url ++ "/test", - case test_request:get(ReqUrl, [], [{host_header, "example.com"}]) of - {ok, _, _, Body} -> - {JsonBody} = ejson:decode(Body), - ?assert(proplists:is_defined(<<"db_name">>, JsonBody)); - Else -> - erlang:error({assertion_failed, - [{module, ?MODULE}, - {line, ?LINE}, - {reason, ?iofmt("Request failed: ~p", [Else])}]}) - end - end). - - -should_return_revs_info_for_vhost_with_resource({Url, DbName}) -> - ?_test(begin - ok = config:set("vhosts", - "example.com/test", "/" ++ DbName, false), - ReqUrl = Url ++ "/test/doc1?revs_info=true", - case test_request:get(ReqUrl, [], [{host_header, "example.com"}]) of - {ok, _, _, Body} -> - {JsonBody} = ejson:decode(Body), - ?assert(proplists:is_defined(<<"_revs_info">>, JsonBody)); - Else -> - erlang:error({assertion_failed, - [{module, ?MODULE}, - {line, ?LINE}, - {reason, ?iofmt("Request failed: ~p", [Else])}]}) - end - end). - -should_return_db_info_for_vhost_with_wildcard_resource({Url, DbName}) -> - ?_test(begin - ok = config:set("vhosts", "*.example2.com/test", "/*", false), - ReqUrl = Url ++ "/test", - Host = DbName ++ ".example2.com", - case test_request:get(ReqUrl, [], [{host_header, Host}]) of - {ok, _, _, Body} -> - {JsonBody} = ejson:decode(Body), - ?assert(proplists:is_defined(<<"db_name">>, JsonBody)); - Else -> - erlang:error({assertion_failed, - [{module, ?MODULE}, - {line, ?LINE}, - {reason, ?iofmt("Request failed: ~p", [Else])}]}) - end - end). - -should_return_path_for_vhost_with_wildcard_host({Url, DbName}) -> - ?_test(begin - ok = config:set("vhosts", "*/test1", - "/" ++ DbName ++ "/_design/doc1/_show/test", - false), - case test_request:get(Url ++ "/test1") of - {ok, _, _, Body} -> - {Json} = ejson:decode(Body), - Path = ?l2b("/" ++ DbName ++ "/_design/doc1/_show/test"), - ?assertEqual(Path, proplists:get_value(<<"path">>, Json)); - Else -> - erlang:error({assertion_failed, - [{module, ?MODULE}, - {line, ?LINE}, - {reason, ?iofmt("Request failed: ~p", [Else])}]}) - end - end). - -should_require_auth({Url, _}) -> - ?_test(begin - case test_request:get(Url, [], [{host_header, "oauth-example.com"}]) of - {ok, Code, _, Body} -> - ?assertEqual(401, Code), - {JsonBody} = ejson:decode(Body), - ?assertEqual(<<"unauthorized">>, - couch_util:get_value(<<"error">>, JsonBody)); - Else -> - erlang:error({assertion_failed, - [{module, ?MODULE}, - {line, ?LINE}, - {reason, ?iofmt("Request failed: ~p", [Else])}]}) - end - end). - -should_succeed_oauth({Url, _}) -> - ?_test(begin - AuthDbName = config:get("couch_httpd_auth", "authentication_db"), - JoeDoc = couch_doc:from_json_obj({[ - {<<"_id">>, <<"org.couchdb.user:joe">>}, - {<<"type">>, <<"user">>}, - {<<"name">>, <<"joe">>}, - {<<"roles">>, []}, - {<<"password_sha">>, <<"fe95df1ca59a9b567bdca5cbaf8412abd6e06121">>}, - {<<"salt">>, <<"4e170ffeb6f34daecfd814dfb4001a73">>} - ]}), - {ok, AuthDb} = couch_db:open_int(?l2b(AuthDbName), [?ADMIN_USER]), - {ok, _} = couch_db:update_doc(AuthDb, JoeDoc, [?ADMIN_USER]), - - Host = "oauth-example.com", - Consumer = {"consec1", "foo", hmac_sha1}, - SignedParams = oauth:sign( - "GET", "http://" ++ Host ++ "/", [], Consumer, "otoksec1", "foobar"), - OAuthUrl = oauth:uri(Url, SignedParams), - - case test_request:get(OAuthUrl, [], [{host_header, Host}]) of - {ok, Code, _, Body} -> - ?assertEqual(200, Code), - {JsonBody} = ejson:decode(Body), - ?assertEqual(<<"test">>, - couch_util:get_value(<<"name">>, JsonBody)); - Else -> - erlang:error({assertion_failed, - [{module, ?MODULE}, - {line, ?LINE}, - {reason, ?iofmt("Request failed: ~p", [Else])}]}) - end - end). - -should_fail_oauth_with_wrong_credentials({Url, _}) -> - ?_test(begin - AuthDbName = config:get("couch_httpd_auth", "authentication_db"), - JoeDoc = couch_doc:from_json_obj({[ - {<<"_id">>, <<"org.couchdb.user:joe">>}, - {<<"type">>, <<"user">>}, - {<<"name">>, <<"joe">>}, - {<<"roles">>, []}, - {<<"password_sha">>, <<"fe95df1ca59a9b567bdca5cbaf8412abd6e06121">>}, - {<<"salt">>, <<"4e170ffeb6f34daecfd814dfb4001a73">>} - ]}), - {ok, AuthDb} = couch_db:open_int(?l2b(AuthDbName), [?ADMIN_USER]), - {ok, _} = couch_db:update_doc(AuthDb, JoeDoc, [?ADMIN_USER]), - - Host = "oauth-example.com", - Consumer = {"consec1", "bad_secret", hmac_sha1}, - SignedParams = oauth:sign( - "GET", "http://" ++ Host ++ "/", [], Consumer, "otoksec1", "foobar"), - OAuthUrl = oauth:uri(Url, SignedParams), - - case test_request:get(OAuthUrl, [], [{host_header, Host}]) of - {ok, Code, _, Body} -> - ?assertEqual(401, Code), - {JsonBody} = ejson:decode(Body), - ?assertEqual(<<"unauthorized">>, - couch_util:get_value(<<"error">>, JsonBody)); - Else -> - erlang:error({assertion_failed, - [{module, ?MODULE}, - {line, ?LINE}, - {reason, ?iofmt("Request failed: ~p", [Else])}]}) - end - end). +%% setup() -> +%% DbName = ?tempdb(), +%% {ok, Db} = couch_db:create(DbName, [?ADMIN_USER]), +%% Doc = couch_doc:from_json_obj({[ +%% {<<"_id">>, <<"doc1">>}, +%% {<<"value">>, 666} +%% ]}), + +%% Doc1 = couch_doc:from_json_obj({[ +%% {<<"_id">>, <<"_design/doc1">>}, +%% {<<"shows">>, {[ +%% {<<"test">>, <<"function(doc, req) { +%% return { json: { +%% requested_path: '/' + req.requested_path.join('/'), +%% path: '/' + req.path.join('/')}};}">>} +%% ]}}, +%% {<<"rewrites">>, [ +%% {[ +%% {<<"from">>, <<"/">>}, +%% {<<"to">>, <<"_show/test">>} +%% ]} +%% ]} +%% ]}), +%% {ok, _} = couch_db:update_docs(Db, [Doc, Doc1]), +%% couch_db:ensure_full_commit(Db), +%% couch_db:close(Db), + +%% Addr = config:get("httpd", "bind_address", "127.0.0.1"), +%% Port = integer_to_list(mochiweb_socket_server:get(couch_httpd, port)), +%% Url = "http://" ++ Addr ++ ":" ++ Port, +%% {Url, ?b2l(DbName)}. + +%% setup_oauth() -> +%% DbName = ?tempdb(), +%% {ok, Db} = couch_db:create(DbName, [?ADMIN_USER]), + +%% config:set("couch_httpd_auth", "authentication_db", +%% ?b2l(?tempdb()), false), +%% config:set("oauth_token_users", "otoksec1", "joe", false), +%% config:set("oauth_consumer_secrets", "consec1", "foo", false), +%% config:set("oauth_token_secrets", "otoksec1", "foobar", false), +%% config:set("couch_httpd_auth", "require_valid_user", "true", false), + +%% ok = config:set( +%% "vhosts", "oauth-example.com", +%% "/" ++ ?b2l(DbName) ++ "/_design/test/_rewrite/foobar", false), + +%% DDoc = couch_doc:from_json_obj({[ +%% {<<"_id">>, <<"_design/test">>}, +%% {<<"language">>, <<"javascript">>}, +%% {<<"rewrites">>, [ +%% {[ +%% {<<"from">>, <<"foobar">>}, +%% {<<"to">>, <<"_info">>} +%% ]} +%% ]} +%% ]}), +%% {ok, _} = couch_db:update_doc(Db, DDoc, []), + +%% couch_db:ensure_full_commit(Db), +%% couch_db:close(Db), + +%% Addr = config:get("httpd", "bind_address", "127.0.0.1"), +%% Port = integer_to_list(mochiweb_socket_server:get(couch_httpd, port)), +%% Url = "http://" ++ Addr ++ ":" ++ Port, +%% {Url, ?b2l(DbName)}. + +%% teardown({_, DbName}) -> +%% ok = couch_server:delete(?l2b(DbName), []), +%% ok. + + +%% vhosts_test_() -> +%% { +%% "Virtual Hosts rewrite tests", +%% { +%% setup, +%% fun test_util:start_couch/0, fun test_util:stop_couch/1, +%% { +%% foreach, +%% fun setup/0, fun teardown/1, +%% [ +%% fun should_return_database_info/1, +%% fun should_return_revs_info/1, +%% fun should_serve_utils_for_vhost/1, +%% fun should_return_virtual_request_path_field_in_request/1, +%% fun should_return_real_request_path_field_in_request/1, +%% fun should_match_wildcard_vhost/1, +%% fun should_return_db_info_for_wildcard_vhost_for_custom_db/1, +%% fun should_replace_rewrite_variables_for_db_and_doc/1, +%% fun should_return_db_info_for_vhost_with_resource/1, +%% fun should_return_revs_info_for_vhost_with_resource/1, +%% fun should_return_db_info_for_vhost_with_wildcard_resource/1, +%% fun should_return_path_for_vhost_with_wildcard_host/1 +%% ] +%% } +%% } +%% }. + +%% oauth_test_() -> +%% { +%% "Virtual Hosts OAuth tests", +%% { +%% setup, +%% fun test_util:start_couch/0, fun test_util:stop_couch/1, +%% { +%% foreach, +%% fun setup_oauth/0, fun teardown/1, +%% [ +%% fun should_require_auth/1, +%% fun should_succeed_oauth/1, +%% fun should_fail_oauth_with_wrong_credentials/1 +%% ] +%% } +%% } +%% }. + + +%% should_return_database_info({Url, DbName}) -> +%% ?_test(begin +%% ok = config:set("vhosts", "example.com", "/" ++ DbName, false), +%% case test_request:get(Url, [], [{host_header, "example.com"}]) of +%% {ok, _, _, Body} -> +%% {JsonBody} = ejson:decode(Body), +%% ?assert(proplists:is_defined(<<"db_name">>, JsonBody)); +%% Else -> +%% erlang:error({assertion_failed, +%% [{module, ?MODULE}, +%% {line, ?LINE}, +%% {reason, ?iofmt("Request failed: ~p", [Else])}]}) +%% end +%% end). + +%% should_return_revs_info({Url, DbName}) -> +%% ?_test(begin +%% ok = config:set("vhosts", "example.com", "/" ++ DbName, false), +%% case test_request:get(Url ++ "/doc1?revs_info=true", [], +%% [{host_header, "example.com"}]) of +%% {ok, _, _, Body} -> +%% {JsonBody} = ejson:decode(Body), +%% ?assert(proplists:is_defined(<<"_revs_info">>, JsonBody)); +%% Else -> +%% erlang:error({assertion_failed, +%% [{module, ?MODULE}, +%% {line, ?LINE}, +%% {reason, ?iofmt("Request failed: ~p", [Else])}]}) +%% end +%% end). + +%% should_serve_utils_for_vhost({Url, DbName}) -> +%% ?_test(begin +%% ok = config:set("vhosts", "example.com", "/" ++ DbName, false), +%% case test_request:get(Url ++ "/_utils/index.html", [], +%% [{host_header, "example.com"}]) of +%% {ok, _, _, Body} -> +%% ?assertMatch(<<"<!DOCTYPE html>", _/binary>>, Body); +%% Else -> +%% erlang:error({assertion_failed, +%% [{module, ?MODULE}, +%% {line, ?LINE}, +%% {reason, ?iofmt("Request failed: ~p", [Else])}]}) +%% end +%% end). + +%% should_return_virtual_request_path_field_in_request({Url, DbName}) -> +%% ?_test(begin +%% ok = config:set("vhosts", "example1.com", +%% "/" ++ DbName ++ "/_design/doc1/_rewrite/", +%% false), +%% case test_request:get(Url, [], [{host_header, "example1.com"}]) of +%% {ok, _, _, Body} -> +%% {Json} = ejson:decode(Body), +%% ?assertEqual(<<"/">>, +%% proplists:get_value(<<"requested_path">>, Json)); +%% Else -> +%% erlang:error({assertion_failed, +%% [{module, ?MODULE}, +%% {line, ?LINE}, +%% {reason, ?iofmt("Request failed: ~p", [Else])}]}) +%% end +%% end). + +%% should_return_real_request_path_field_in_request({Url, DbName}) -> +%% ?_test(begin +%% ok = config:set("vhosts", "example1.com", +%% "/" ++ DbName ++ "/_design/doc1/_rewrite/", +%% false), +%% case test_request:get(Url, [], [{host_header, "example1.com"}]) of +%% {ok, _, _, Body} -> +%% {Json} = ejson:decode(Body), +%% Path = ?l2b("/" ++ DbName ++ "/_design/doc1/_show/test"), +%% ?assertEqual(Path, proplists:get_value(<<"path">>, Json)); +%% Else -> +%% erlang:error({assertion_failed, +%% [{module, ?MODULE}, +%% {line, ?LINE}, +%% {reason, ?iofmt("Request failed: ~p", [Else])}]}) +%% end +%% end). + +%% should_match_wildcard_vhost({Url, DbName}) -> +%% ?_test(begin +%% ok = config:set("vhosts", "*.example.com", +%% "/" ++ DbName ++ "/_design/doc1/_rewrite", false), +%% case test_request:get(Url, [], [{host_header, "test.example.com"}]) of +%% {ok, _, _, Body} -> +%% {Json} = ejson:decode(Body), +%% Path = ?l2b("/" ++ DbName ++ "/_design/doc1/_show/test"), +%% ?assertEqual(Path, proplists:get_value(<<"path">>, Json)); +%% Else -> +%% erlang:error({assertion_failed, +%% [{module, ?MODULE}, +%% {line, ?LINE}, +%% {reason, ?iofmt("Request failed: ~p", [Else])}]}) +%% end +%% end). + +%% should_return_db_info_for_wildcard_vhost_for_custom_db({Url, DbName}) -> +%% ?_test(begin +%% ok = config:set("vhosts", ":dbname.example1.com", +%% "/:dbname", false), +%% Host = DbName ++ ".example1.com", +%% case test_request:get(Url, [], [{host_header, Host}]) of +%% {ok, _, _, Body} -> +%% {JsonBody} = ejson:decode(Body), +%% ?assert(proplists:is_defined(<<"db_name">>, JsonBody)); +%% Else -> +%% erlang:error({assertion_failed, +%% [{module, ?MODULE}, +%% {line, ?LINE}, +%% {reason, ?iofmt("Request failed: ~p", [Else])}]}) +%% end +%% end). + +%% should_replace_rewrite_variables_for_db_and_doc({Url, DbName}) -> +%% ?_test(begin +%% ok = config:set("vhosts",":appname.:dbname.example1.com", +%% "/:dbname/_design/:appname/_rewrite/", false), +%% Host = "doc1." ++ DbName ++ ".example1.com", +%% case test_request:get(Url, [], [{host_header, Host}]) of +%% {ok, _, _, Body} -> +%% {Json} = ejson:decode(Body), +%% Path = ?l2b("/" ++ DbName ++ "/_design/doc1/_show/test"), +%% ?assertEqual(Path, proplists:get_value(<<"path">>, Json)); +%% Else -> +%% erlang:error({assertion_failed, +%% [{module, ?MODULE}, +%% {line, ?LINE}, +%% {reason, ?iofmt("Request failed: ~p", [Else])}]}) +%% end +%% end). + +%% should_return_db_info_for_vhost_with_resource({Url, DbName}) -> +%% ?_test(begin +%% ok = config:set("vhosts", +%% "example.com/test", "/" ++ DbName, false), +%% ReqUrl = Url ++ "/test", +%% case test_request:get(ReqUrl, [], [{host_header, "example.com"}]) of +%% {ok, _, _, Body} -> +%% {JsonBody} = ejson:decode(Body), +%% ?assert(proplists:is_defined(<<"db_name">>, JsonBody)); +%% Else -> +%% erlang:error({assertion_failed, +%% [{module, ?MODULE}, +%% {line, ?LINE}, +%% {reason, ?iofmt("Request failed: ~p", [Else])}]}) +%% end +%% end). + + +%% should_return_revs_info_for_vhost_with_resource({Url, DbName}) -> +%% ?_test(begin +%% ok = config:set("vhosts", +%% "example.com/test", "/" ++ DbName, false), +%% ReqUrl = Url ++ "/test/doc1?revs_info=true", +%% case test_request:get(ReqUrl, [], [{host_header, "example.com"}]) of +%% {ok, _, _, Body} -> +%% {JsonBody} = ejson:decode(Body), +%% ?assert(proplists:is_defined(<<"_revs_info">>, JsonBody)); +%% Else -> +%% erlang:error({assertion_failed, +%% [{module, ?MODULE}, +%% {line, ?LINE}, +%% {reason, ?iofmt("Request failed: ~p", [Else])}]}) +%% end +%% end). + +%% should_return_db_info_for_vhost_with_wildcard_resource({Url, DbName}) -> +%% ?_test(begin +%% ok = config:set("vhosts", "*.example2.com/test", "/*", false), +%% ReqUrl = Url ++ "/test", +%% Host = DbName ++ ".example2.com", +%% case test_request:get(ReqUrl, [], [{host_header, Host}]) of +%% {ok, _, _, Body} -> +%% {JsonBody} = ejson:decode(Body), +%% ?assert(proplists:is_defined(<<"db_name">>, JsonBody)); +%% Else -> +%% erlang:error({assertion_failed, +%% [{module, ?MODULE}, +%% {line, ?LINE}, +%% {reason, ?iofmt("Request failed: ~p", [Else])}]}) +%% end +%% end). + +%% should_return_path_for_vhost_with_wildcard_host({Url, DbName}) -> +%% ?_test(begin +%% ok = config:set("vhosts", "*/test1", +%% "/" ++ DbName ++ "/_design/doc1/_show/test", +%% false), +%% case test_request:get(Url ++ "/test1") of +%% {ok, _, _, Body} -> +%% {Json} = ejson:decode(Body), +%% Path = ?l2b("/" ++ DbName ++ "/_design/doc1/_show/test"), +%% ?assertEqual(Path, proplists:get_value(<<"path">>, Json)); +%% Else -> +%% erlang:error({assertion_failed, +%% [{module, ?MODULE}, +%% {line, ?LINE}, +%% {reason, ?iofmt("Request failed: ~p", [Else])}]}) +%% end +%% end). + +%% should_require_auth({Url, _}) -> +%% ?_test(begin +%% case test_request:get(Url, [], [{host_header, "oauth-example.com"}]) of +%% {ok, Code, _, Body} -> +%% ?assertEqual(401, Code), +%% {JsonBody} = ejson:decode(Body), +%% ?assertEqual(<<"unauthorized">>, +%% couch_util:get_value(<<"error">>, JsonBody)); +%% Else -> +%% erlang:error({assertion_failed, +%% [{module, ?MODULE}, +%% {line, ?LINE}, +%% {reason, ?iofmt("Request failed: ~p", [Else])}]}) +%% end +%% end). + +%% should_succeed_oauth({Url, _}) -> +%% ?_test(begin +%% AuthDbName = config:get("couch_httpd_auth", "authentication_db"), +%% JoeDoc = couch_doc:from_json_obj({[ +%% {<<"_id">>, <<"org.couchdb.user:joe">>}, +%% {<<"type">>, <<"user">>}, +%% {<<"name">>, <<"joe">>}, +%% {<<"roles">>, []}, +%% {<<"password_sha">>, <<"fe95df1ca59a9b567bdca5cbaf8412abd6e06121">>}, +%% {<<"salt">>, <<"4e170ffeb6f34daecfd814dfb4001a73">>} +%% ]}), +%% {ok, AuthDb} = couch_db:open_int(?l2b(AuthDbName), [?ADMIN_USER]), +%% {ok, _} = couch_db:update_doc(AuthDb, JoeDoc, [?ADMIN_USER]), + +%% Host = "oauth-example.com", +%% Consumer = {"consec1", "foo", hmac_sha1}, +%% SignedParams = oauth:sign( +%% "GET", "http://" ++ Host ++ "/", [], Consumer, "otoksec1", "foobar"), +%% OAuthUrl = oauth:uri(Url, SignedParams), + +%% case test_request:get(OAuthUrl, [], [{host_header, Host}]) of +%% {ok, Code, _, Body} -> +%% ?assertEqual(200, Code), +%% {JsonBody} = ejson:decode(Body), +%% ?assertEqual(<<"test">>, +%% couch_util:get_value(<<"name">>, JsonBody)); +%% Else -> +%% erlang:error({assertion_failed, +%% [{module, ?MODULE}, +%% {line, ?LINE}, +%% {reason, ?iofmt("Request failed: ~p", [Else])}]}) +%% end +%% end). + +%% should_fail_oauth_with_wrong_credentials({Url, _}) -> +%% ?_test(begin +%% AuthDbName = config:get("couch_httpd_auth", "authentication_db"), +%% JoeDoc = couch_doc:from_json_obj({[ +%% {<<"_id">>, <<"org.couchdb.user:joe">>}, +%% {<<"type">>, <<"user">>}, +%% {<<"name">>, <<"joe">>}, +%% {<<"roles">>, []}, +%% {<<"password_sha">>, <<"fe95df1ca59a9b567bdca5cbaf8412abd6e06121">>}, +%% {<<"salt">>, <<"4e170ffeb6f34daecfd814dfb4001a73">>} +%% ]}), +%% {ok, AuthDb} = couch_db:open_int(?l2b(AuthDbName), [?ADMIN_USER]), +%% {ok, _} = couch_db:update_doc(AuthDb, JoeDoc, [?ADMIN_USER]), + +%% Host = "oauth-example.com", +%% Consumer = {"consec1", "bad_secret", hmac_sha1}, +%% SignedParams = oauth:sign( +%% "GET", "http://" ++ Host ++ "/", [], Consumer, "otoksec1", "foobar"), +%% OAuthUrl = oauth:uri(Url, SignedParams), + +%% case test_request:get(OAuthUrl, [], [{host_header, Host}]) of +%% {ok, Code, _, Body} -> +%% ?assertEqual(401, Code), +%% {JsonBody} = ejson:decode(Body), +%% ?assertEqual(<<"unauthorized">>, +%% couch_util:get_value(<<"error">>, JsonBody)); +%% Else -> +%% erlang:error({assertion_failed, +%% [{module, ?MODULE}, +%% {line, ?LINE}, +%% {reason, ?iofmt("Request failed: ~p", [Else])}]}) +%% end +%% end).
