summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorPaul Joseph Davis <davisp@apache.org>2009-06-24 05:51:41 +0000
committerPaul Joseph Davis <davisp@apache.org>2009-06-24 05:51:41 +0000
commit8a198316eb603850342f8a97bad56e6eaccd1e2f (patch)
treef0da1482557cfc17fff6bcf57c6cca796bde13ad /test
parente05e90e517a4ee6c5a710bf6b289a956b1363cd9 (diff)
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
Diffstat (limited to 'test')
-rwxr-xr-xtest/etap/031-doc-to-json.t2
-rwxr-xr-x[-rw-r--r--]test/etap/040-util.t0
-rwxr-xr-x[-rw-r--r--]test/etap/050-stream.t2
-rwxr-xr-x[-rw-r--r--]test/etap/060-kt-merging.t0
-rwxr-xr-x[-rw-r--r--]test/etap/061-kt-missing-leaves.t0
-rwxr-xr-x[-rw-r--r--]test/etap/062-kt-remove-leaves.t0
-rwxr-xr-x[-rw-r--r--]test/etap/063-kt-get-leaves.t0
-rwxr-xr-x[-rw-r--r--]test/etap/064-kt-counting.t0
-rwxr-xr-x[-rw-r--r--]test/etap/065-kt-stemming.t0
-rwxr-xr-x[-rw-r--r--]test/etap/070-couch-db.t0
-rwxr-xr-xtest/etap/080-config-get-set.t116
-rw-r--r--test/etap/081-config-override.1.ini5
-rw-r--r--test/etap/081-config-override.2.ini5
-rwxr-xr-xtest/etap/081-config-override.t200
-rwxr-xr-xtest/etap/082-config-register.t75
-rwxr-xr-xtest/etap/083-config-no-files.t43
16 files changed, 446 insertions, 2 deletions
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
index a6b7df33..a6b7df33 100644..100755
--- a/test/etap/040-util.t
+++ b/test/etap/040-util.t
diff --git a/test/etap/050-stream.t b/test/etap/050-stream.t
index 41aa9754..dab2d50c 100644..100755
--- 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
index 004e004f..004e004f 100644..100755
--- a/test/etap/060-kt-merging.t
+++ b/test/etap/060-kt-merging.t
diff --git a/test/etap/061-kt-missing-leaves.t b/test/etap/061-kt-missing-leaves.t
index c5ee1222..c5ee1222 100644..100755
--- a/test/etap/061-kt-missing-leaves.t
+++ b/test/etap/061-kt-missing-leaves.t
diff --git a/test/etap/062-kt-remove-leaves.t b/test/etap/062-kt-remove-leaves.t
index 566efa06..566efa06 100644..100755
--- a/test/etap/062-kt-remove-leaves.t
+++ b/test/etap/062-kt-remove-leaves.t
diff --git a/test/etap/063-kt-get-leaves.t b/test/etap/063-kt-get-leaves.t
index 9e366ff8..9e366ff8 100644..100755
--- a/test/etap/063-kt-get-leaves.t
+++ b/test/etap/063-kt-get-leaves.t
diff --git a/test/etap/064-kt-counting.t b/test/etap/064-kt-counting.t
index dd00cedd..dd00cedd 100644..100755
--- a/test/etap/064-kt-counting.t
+++ b/test/etap/064-kt-counting.t
diff --git a/test/etap/065-kt-stemming.t b/test/etap/065-kt-stemming.t
index 0de69482..0de69482 100644..100755
--- a/test/etap/065-kt-stemming.t
+++ b/test/etap/065-kt-stemming.t
diff --git a/test/etap/070-couch-db.t b/test/etap/070-couch-db.t
index da1f28ab..da1f28ab 100644..100755
--- a/test/etap/070-couch-db.t
+++ b/test/etap/070-couch-db.t
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