From 8a198316eb603850342f8a97bad56e6eaccd1e2f Mon Sep 17 00:00:00 2001 From: Paul Joseph Davis Date: Wed, 24 Jun 2009 05:51:41 +0000 Subject: Lots of tests for couch_config.erl Refactored couch_config.erl to resolve COUCHDB-384 Tweaked the main Makefile.am to make the cover and check targets depend on the dev target instead of the all target. Added the executable property to all test files to make them easily runnable as standalone tests (as in not via prove). git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@787914 13f79535-47bb-0310-9956-ffa450edef68 --- test/etap/031-doc-to-json.t | 2 +- test/etap/040-util.t | 0 test/etap/050-stream.t | 2 +- test/etap/060-kt-merging.t | 0 test/etap/061-kt-missing-leaves.t | 0 test/etap/062-kt-remove-leaves.t | 0 test/etap/063-kt-get-leaves.t | 0 test/etap/064-kt-counting.t | 0 test/etap/065-kt-stemming.t | 0 test/etap/070-couch-db.t | 0 test/etap/080-config-get-set.t | 116 +++++++++++++++++++++ test/etap/081-config-override.1.ini | 5 + test/etap/081-config-override.2.ini | 5 + test/etap/081-config-override.t | 200 ++++++++++++++++++++++++++++++++++++ test/etap/082-config-register.t | 75 ++++++++++++++ test/etap/083-config-no-files.t | 43 ++++++++ 16 files changed, 446 insertions(+), 2 deletions(-) mode change 100644 => 100755 test/etap/040-util.t mode change 100644 => 100755 test/etap/050-stream.t mode change 100644 => 100755 test/etap/060-kt-merging.t mode change 100644 => 100755 test/etap/061-kt-missing-leaves.t mode change 100644 => 100755 test/etap/062-kt-remove-leaves.t mode change 100644 => 100755 test/etap/063-kt-get-leaves.t mode change 100644 => 100755 test/etap/064-kt-counting.t mode change 100644 => 100755 test/etap/065-kt-stemming.t mode change 100644 => 100755 test/etap/070-couch-db.t create mode 100755 test/etap/080-config-get-set.t create mode 100644 test/etap/081-config-override.1.ini create mode 100644 test/etap/081-config-override.2.ini create mode 100755 test/etap/081-config-override.t create mode 100755 test/etap/082-config-register.t create mode 100755 test/etap/083-config-no-files.t (limited to 'test/etap') diff --git a/test/etap/031-doc-to-json.t b/test/etap/031-doc-to-json.t index 37b23848..37ee9946 100755 --- a/test/etap/031-doc-to-json.t +++ b/test/etap/031-doc-to-json.t @@ -9,7 +9,7 @@ main(_) -> code:add_pathz("src/couchdb"), - etap:plan(unknown), + etap:plan(12), case (catch test()) of ok -> etap:end_tests(); diff --git a/test/etap/040-util.t b/test/etap/040-util.t old mode 100644 new mode 100755 diff --git a/test/etap/050-stream.t b/test/etap/050-stream.t old mode 100644 new mode 100755 index 41aa9754..dab2d50c --- a/test/etap/050-stream.t +++ b/test/etap/050-stream.t @@ -3,7 +3,7 @@ main(_) -> code:add_pathz("src/couchdb"), - etap:plan(unknown), + etap:plan(13), case (catch test()) of ok -> etap:end_tests(); diff --git a/test/etap/060-kt-merging.t b/test/etap/060-kt-merging.t old mode 100644 new mode 100755 diff --git a/test/etap/061-kt-missing-leaves.t b/test/etap/061-kt-missing-leaves.t old mode 100644 new mode 100755 diff --git a/test/etap/062-kt-remove-leaves.t b/test/etap/062-kt-remove-leaves.t old mode 100644 new mode 100755 diff --git a/test/etap/063-kt-get-leaves.t b/test/etap/063-kt-get-leaves.t old mode 100644 new mode 100755 diff --git a/test/etap/064-kt-counting.t b/test/etap/064-kt-counting.t old mode 100644 new mode 100755 diff --git a/test/etap/065-kt-stemming.t b/test/etap/065-kt-stemming.t old mode 100644 new mode 100755 diff --git a/test/etap/070-couch-db.t b/test/etap/070-couch-db.t old mode 100644 new mode 100755 diff --git a/test/etap/080-config-get-set.t b/test/etap/080-config-get-set.t new file mode 100755 index 00000000..4824b2aa --- /dev/null +++ b/test/etap/080-config-get-set.t @@ -0,0 +1,116 @@ +#!/usr/bin/env escript +%% -*- erlang -*- + +default_config() -> + "etc/couchdb/default_dev.ini". + +main(_) -> + code:add_pathz("src/couchdb"), + etap:plan(12), + 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() -> + % start couch_config with default + couch_config:start_link([default_config()]), + + + % Check that we can get values + + + etap:fun_is( + fun(List) -> length(List) > 0 end, + couch_config:all(), + "Data was loaded from the INI file." + ), + + etap:fun_is( + fun(List) -> length(List) > 0 end, + couch_config:get("daemons"), + "There are settings in the [daemons] section of the INI file." + ), + + etap:is( + couch_config:get("httpd_design_handlers", "_view"), + "{couch_httpd_view, handle_view_req}", + "The {httpd_design_handlers, view} is the expected default." + ), + + etap:is( + couch_config:get("httpd", "foo", "bar"), + "bar", + "Returns the default when key doesn't exist in config." + ), + + etap:is( + couch_config:get("httpd", "foo"), + undefined, + "The default default is the atom 'undefined'." + ), + + etap:is( + couch_config:get("httpd", "port", "bar"), + "5984", + "Only returns the default when the config setting does not exist." + ), + + + % Check that setting values works. + + + ok = couch_config:set("log", "level", "severe", false), + + etap:is( + couch_config:get("log", "level"), + "severe", + "Non persisted changes take effect." + ), + + etap:is( + couch_config:get("new_section", "bizzle"), + undefined, + "Section 'new_section' does not exist." + ), + + ok = couch_config:set("new_section", "bizzle", "bang", false), + + etap:is( + couch_config:get("new_section", "bizzle"), + "bang", + "New section 'new_section' was created for a new key/value pair." + ), + + + % Check that deleting works + + + ok = couch_config:delete("new_section", "bizzle", false), + etap:is( + couch_config:get("new_section", "bizzle"), + "", + "Deleting sets the value to \"\"" + ), + + + % Check ge/set/delete binary strings + + ok = couch_config:set(<<"foo">>, <<"bar">>, <<"baz">>, false), + etap:is( + couch_config:get(<<"foo">>, <<"bar">>), + <<"baz">>, + "Can get and set with binary section and key values." + ), + ok = couch_config:delete(<<"foo">>, <<"bar">>, false), + etap:is( + couch_config:get(<<"foo">>, <<"bar">>), + "", + "Deleting with binary section/key pairs sets the value to \"\"" + ), + + ok. diff --git a/test/etap/081-config-override.1.ini b/test/etap/081-config-override.1.ini new file mode 100644 index 00000000..f11da1f3 --- /dev/null +++ b/test/etap/081-config-override.1.ini @@ -0,0 +1,5 @@ +[couchdb] +max_dbs_open=10 + +[httpd] +port=4895 diff --git a/test/etap/081-config-override.2.ini b/test/etap/081-config-override.2.ini new file mode 100644 index 00000000..bb67b629 --- /dev/null +++ b/test/etap/081-config-override.2.ini @@ -0,0 +1,5 @@ +[httpd] +port = 80 + +[fizbang] +unicode = normalized \ No newline at end of file diff --git a/test/etap/081-config-override.t b/test/etap/081-config-override.t new file mode 100755 index 00000000..1d66b58e --- /dev/null +++ b/test/etap/081-config-override.t @@ -0,0 +1,200 @@ +#!/usr/bin/env escript +%% -*- erlang -*- + +default_config() -> + "etc/couchdb/default_dev.ini". + +local_config_1() -> + "test/etap/081-config-override.1.ini". + +local_config_2() -> + "test/etap/081-config-override.2.ini". + +local_config_write() -> + "test/etap/temp.081". + +% Run tests and wait for the config gen_server to shutdown. +run_tests(IniFiles, Tests) -> + {ok, Pid} = couch_config:start_link(IniFiles), + erlang:monitor(process, Pid), + Tests(), + couch_config:stop(), + receive + {'DOWN', _, _, Pid, _} -> ok; + _Other -> etap:diag("OTHER: ~p~n", [_Other]) + after + 1000 -> throw({timeout_error, config_stop}) + end. + +main(_) -> + code:add_pathz("src/couchdb"), + etap:plan(17), + + 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() -> + + CheckStartStop = fun() -> ok end, + run_tests([default_config()], CheckStartStop), + + CheckDefaults = fun() -> + etap:is( + couch_config:get("couchdb", "max_dbs_open"), + "100", + "{couchdb, max_dbs_open} is 100 by defualt." + ), + + etap:is( + couch_config:get("httpd","port"), + "5984", + "{httpd, port} is 5984 by default" + ), + + etap:is( + couch_config:get("fizbang", "unicode"), + undefined, + "{fizbang, unicode} is undefined by default" + ) + end, + + run_tests([default_config()], CheckDefaults), + + + % Check that subsequent files override values appropriately + + CheckOverride = fun() -> + etap:is( + couch_config:get("couchdb", "max_dbs_open"), + "10", + "{couchdb, max_dbs_open} was overriden with the value 10" + ), + + etap:is( + couch_config:get("httpd", "port"), + "4895", + "{httpd, port} was overriden with the value 4895" + ) + end, + + run_tests([default_config(), local_config_1()], CheckOverride), + + + % Check that overrides can create new sections + + CheckOverride2 = fun() -> + etap:is( + couch_config:get("httpd", "port"), + "80", + "{httpd, port} is overriden with the value 80" + ), + + etap:is( + couch_config:get("fizbang", "unicode"), + "normalized", + "{fizbang, unicode} was created by override INI file" + ) + end, + + run_tests([default_config(), local_config_2()], CheckOverride2), + + + % Check that values can be overriden multiple times + + CheckOverride3 = fun() -> + etap:is( + couch_config:get("httpd", "port"), + "80", + "{httpd, port} value was taken from the last specified INI file." + ) + end, + + run_tests( + [default_config(), local_config_1(), local_config_2()], + CheckOverride3 + ), + + % Check persistence to last file. + + % Empty the file in case it exists. + {ok, Fd} = file:open(local_config_write(), write), + ok = file:truncate(Fd), + ok = file:close(Fd), + + % Open and write a value + CheckCanWrite = fun() -> + etap:is( + couch_config:get("httpd", "port"), + "5984", + "{httpd, port} is still 5984 by default" + ), + + etap:is( + couch_config:set("httpd", "port", "8080"), + ok, + "Writing {httpd, port} is kosher." + ), + + etap:is( + couch_config:get("httpd", "port"), + "8080", + "{httpd, port} was updated to 8080 successfully." + ), + + etap:is( + couch_config:delete("httpd", "bind_address"), + ok, + "Deleting {httpd, bind_address} succeeds" + ), + + etap:is( + couch_config:get("httpd", "bind_address"), + "", + "{httpd, bind_address} was actually deleted." + ) + end, + + run_tests([default_config(), local_config_write()], CheckCanWrite), + + % Open and check where we don't expect persistence. + + CheckDidntWrite = fun() -> + etap:is( + couch_config:get("httpd", "port"), + "5984", + "{httpd, port} was not persisted to the primary INI file." + ), + + etap:is( + couch_config:get("httpd", "bind_address"), + "127.0.0.1", + "{httpd, bind_address} was not deleted form the primary INI file." + ) + end, + + run_tests([default_config()], CheckDidntWrite), + + % Open and check we have only the persistence we expect. + CheckDidWrite = fun() -> + etap:is( + couch_config:get("httpd", "port"), + "8080", + "{httpd, port} is still 8080 after reopening the config." + ), + + etap:is( + couch_config:get("httpd", "bind_address"), + "", + "{httpd, bind_address} is still \"\" after reopening." + ) + end, + + run_tests([local_config_write()], CheckDidWrite), + + ok. diff --git a/test/etap/082-config-register.t b/test/etap/082-config-register.t new file mode 100755 index 00000000..9f454984 --- /dev/null +++ b/test/etap/082-config-register.t @@ -0,0 +1,75 @@ +#!/usr/bin/env escript +%% -*- erlang -*- + +default_config() -> + "etc/couchdb/default_dev.ini". + +main(_) -> + code:add_pathz("src/couchdb"), + 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() -> + couch_config:start_link([default_config()]), + + etap:is( + couch_config:get("httpd", "port"), + "5984", + "{httpd, port} is 5984 by default." + ), + + ok = couch_config:set("httpd", "port", "4895", false), + + etap:is( + couch_config:get("httpd", "port"), + "4895", + "{httpd, port} changed to 4895" + ), + + SentinelFunc = fun() -> + % Ping/Pong to make sure we wait for this + % process to die + receive {ping, From} -> From ! pong end + end, + SentinelPid = spawn(SentinelFunc), + + couch_config:register( + fun("httpd", "port", Value) -> + etap:is(Value, "8080", "Registered function got notification.") + end, + SentinelPid + ), + + ok = couch_config:set("httpd", "port", "8080", false), + + % Implicitly checking that we *don't* call the function + etap:is( + couch_config:get("httpd", "bind_address"), + "127.0.0.1", + "{httpd, bind_address} is not '0.0.0.0'" + ), + ok = couch_config:set("httpd", "bind_address", "0.0.0.0", false), + + % Ping-Pong kill process + SentinelPid ! {ping, self()}, + receive + _Any -> ok + after 1000 -> + throw({timeout_error, registered_pid}) + end, + + ok = couch_config:set("httpd", "port", "80", false), + etap:is( + couch_config:get("httpd", "port"), + "80", + "Implicitly test that the function got de-registered" + ), + + ok. \ No newline at end of file diff --git a/test/etap/083-config-no-files.t b/test/etap/083-config-no-files.t new file mode 100755 index 00000000..2e4d8e71 --- /dev/null +++ b/test/etap/083-config-no-files.t @@ -0,0 +1,43 @@ +#!/usr/bin/env escript +%% -*- erlang -*- + +default_config() -> + "etc/couchdb/default_dev.ini". + +main(_) -> + code:add_pathz("src/couchdb"), + etap:plan(3), + 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() -> + couch_config:start_link([]), + + etap:fun_is( + fun(KVPairs) -> length(KVPairs) == 0 end, + couch_config:all(), + "No INI files specified returns 0 key/value pairs." + ), + + ok = couch_config:set("httpd", "port", "80", false), + + etap:is( + couch_config:get("httpd", "port"), + "80", + "Created a new non-persisted k/v pair." + ), + + ok = couch_config:set("httpd", "bind_address", "127.0.0.1"), + etap:is( + couch_config:get("httpd", "bind_address"), + "127.0.0.1", + "Asking for a persistent key/value pair doesn't choke." + ), + + ok. \ No newline at end of file -- cgit v1.2.3