You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ch...@apache.org on 2014/07/22 01:57:33 UTC
[20/43] couchdb commit: updated refs/heads/1963-eunit-bigcouch to
424dca5
Port 082-config-register.t etap test suite to eunit
Merged into couch_config_tests suite.
Project: http://git-wip-us.apache.org/repos/asf/couchdb/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb/commit/af16d289
Tree: http://git-wip-us.apache.org/repos/asf/couchdb/tree/af16d289
Diff: http://git-wip-us.apache.org/repos/asf/couchdb/diff/af16d289
Branch: refs/heads/1963-eunit-bigcouch
Commit: af16d2892312aeca51ca364f563be7c7bf15117f
Parents: cfdcbac
Author: Alexander Shorin <kx...@apache.org>
Authored: Mon May 26 09:26:22 2014 +0400
Committer: Russell Branca <ch...@apache.org>
Committed: Mon Jul 21 16:43:31 2014 -0700
----------------------------------------------------------------------
test/couchdb/couch_config_tests.erl | 147 ++++++++++++++++++++++++++++++-
test/etap/082-config-register.t | 79 -----------------
2 files changed, 146 insertions(+), 80 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/couchdb/blob/af16d289/test/couchdb/couch_config_tests.erl
----------------------------------------------------------------------
diff --git a/test/couchdb/couch_config_tests.erl b/test/couchdb/couch_config_tests.erl
index 4bdc333..fdd2479 100644
--- a/test/couchdb/couch_config_tests.erl
+++ b/test/couchdb/couch_config_tests.erl
@@ -15,6 +15,7 @@
-include("couch_eunit.hrl").
-include_lib("couchdb/couch_db.hrl").
+-define(SHORT_TIMEOUT, 100).
-define(TIMEOUT, 1000).
-define(CONFIG_DEFAULT,
@@ -43,6 +44,32 @@ setup(Chain) ->
{ok, Pid} = couch_config:start_link(Chain),
Pid.
+setup_register() ->
+ ConfigPid = setup(),
+ SentinelFunc = fun() ->
+ % Ping/Pong to make sure we wait for this
+ % process to die
+ receive
+ {ping, From} ->
+ From ! pong
+ end
+ end,
+ SentinelPid = spawn(SentinelFunc),
+ {ConfigPid, SentinelPid}.
+
+teardown({ConfigPid, SentinelPid}) ->
+ teardown(ConfigPid),
+ case process_info(SentinelPid) of
+ undefined -> ok;
+ _ ->
+ SentinelPid ! {ping, self()},
+ receive
+ pong ->
+ ok
+ after 100 ->
+ throw({timeout_error, registered_pid})
+ end
+ end;
teardown(Pid) ->
couch_config:stop(),
erlang:monitor(process, Pid),
@@ -64,7 +91,8 @@ couch_config_test_() ->
couch_config_set_tests(),
couch_config_del_tests(),
config_override_tests(),
- config_persistent_changes_tests()
+ config_persistent_changes_tests(),
+ config_register_tests()
]
}.
@@ -152,6 +180,21 @@ config_persistent_changes_tests() ->
}
}.
+config_register_tests() ->
+ {
+ "Config changes subscriber",
+ {
+ foreach,
+ fun setup_register/0, fun teardown/1,
+ [
+ fun should_handle_port_changes/1,
+ fun should_pass_persistent_flag/1,
+ fun should_not_trigger_handler_on_other_options_changes/1,
+ fun should_not_trigger_handler_after_related_process_death/1
+ ]
+ }
+ }.
+
should_load_all_configs() ->
?_assert(length(couch_config:all()) > 0).
@@ -281,3 +324,105 @@ should_ensure_that_written_to_last_config_in_chain(_, _) ->
?assertEqual(undefined,
couch_config:get("httpd", "bind_address"))
end).
+
+should_handle_port_changes({_, SentinelPid}) ->
+ ?_assert(begin
+ MainProc = self(),
+ Port = "8080",
+
+ couch_config:register(
+ fun("httpd", "port", Value) ->
+ % couch_config catches every error raised from handler
+ % so it's not possible to just assert on wrong value.
+ % We have to return the result as message
+ MainProc ! (Value =:= Port)
+ end,
+ SentinelPid
+ ),
+ ok = couch_config:set("httpd", "port", Port, false),
+
+ receive
+ R ->
+ R
+ after ?TIMEOUT ->
+ erlang:error({assertion_failed,
+ [{module, ?MODULE},
+ {line, ?LINE},
+ {reason, "Timeout"}]})
+ end
+ end).
+
+should_pass_persistent_flag({_, SentinelPid}) ->
+ ?_assert(begin
+ MainProc = self(),
+
+ couch_config:register(
+ fun("httpd", "port", _, Persist) ->
+ % couch_config catches every error raised from handler
+ % so it's not possible to just assert on wrong value.
+ % We have to return the result as message
+ MainProc ! Persist
+ end,
+ SentinelPid
+ ),
+ ok = couch_config:set("httpd", "port", "8080", false),
+
+ receive
+ false ->
+ true
+ after ?SHORT_TIMEOUT ->
+ false
+ end
+ end).
+
+should_not_trigger_handler_on_other_options_changes({_, SentinelPid}) ->
+ ?_assert(begin
+ MainProc = self(),
+
+ couch_config:register(
+ fun("httpd", "port", _) ->
+ MainProc ! ok
+ end,
+ SentinelPid
+ ),
+ ok = couch_config:set("httpd", "bind_address", "0.0.0.0", false),
+
+ receive
+ ok ->
+ false
+ after ?SHORT_TIMEOUT ->
+ true
+ end
+ end).
+
+should_not_trigger_handler_after_related_process_death({_, SentinelPid}) ->
+ ?_assert(begin
+ MainProc = self(),
+
+ couch_config:register(
+ fun("httpd", "port", _) ->
+ MainProc ! ok
+ end,
+ SentinelPid
+ ),
+
+ SentinelPid ! {ping, MainProc},
+ receive
+ pong ->
+ ok
+ after ?SHORT_TIMEOUT ->
+ erlang:error({assertion_failed,
+ [{module, ?MODULE},
+ {line, ?LINE},
+ {reason, "Timeout"}]})
+ end,
+
+ ok = couch_config:set("httpd", "port", "12345", false),
+
+ receive
+ ok ->
+ false
+ after ?SHORT_TIMEOUT ->
+ true
+ end
+ end).
http://git-wip-us.apache.org/repos/asf/couchdb/blob/af16d289/test/etap/082-config-register.t
----------------------------------------------------------------------
diff --git a/test/etap/082-config-register.t b/test/etap/082-config-register.t
deleted file mode 100755
index bd09ea7..0000000
--- a/test/etap/082-config-register.t
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/usr/bin/env escript
-%% -*- erlang -*-
-
-% Licensed under the Apache License, Version 2.0 (the "License"); you may not
-% use this file except in compliance with the License. You may obtain a copy of
-% the License at
-%
-% http://www.apache.org/licenses/LICENSE-2.0
-%
-% Unless required by applicable law or agreed to in writing, software
-% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-% License for the specific language governing permissions and limitations under
-% the License.
-
--mode(compile).
--export([handle_config_change/5]).
-
-default_config() ->
- test_util:build_file("etc/couchdb/default_dev.ini").
-
-main(_) ->
- test_util:init_code_path(),
- etap:plan(5),
- case (catch test()) of
- ok ->
- etap:end_tests();
- Other ->
- etap:diag(io_lib:format("Test died abnormally: ~p", [Other])),
- etap:bail(Other)
- end,
- ok.
-
-test() ->
- application:set_env(config, ini_files, ["etc/couchdb/default_dev.ini"]),
- ok = application:start(config),
-
- etap:is(
- config:get("httpd", "port"),
- "5984",
- "{httpd, port} is 5984 by default."
- ),
-
- ok = config:set("httpd", "port", "4895", false),
-
- etap:is(
- config:get("httpd", "port"),
- "4895",
- "{httpd, port} changed to 4895"
- ),
-
- config:listen_for_changes(?MODULE, self()),
-
- ok = config:set("httpd", "port", "8080", false),
-
- receive
- {"httpd", "port", Value, false} ->
- etap:is(Value, "8080", "Registered function got notification.")
- after
- 1000 ->
- etap:fail("notification failed")
- end,
-
- % Implicitly checking that we *don't* call the function
- etap:is(
- config:get("httpd", "bind_address"),
- "127.0.0.1",
- "{httpd, bind_address} is not '0.0.0.0'"
- ),
-
- Msg = receive M -> M after 500 -> nil end,
- etap:is(Msg, nil, "yay, no notification for get"),
-
- ok.
-
-handle_config_change(Sec, Key, Val, Persist, Pid) ->
- Pid ! {Sec, Key, Val, Persist},
- {ok, Pid}.
-