blob: 01f8b4c23c53ecb8aaa32ffb562a22a9edc09e21 [file] [log] [blame]
#!/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.
default_config() ->
test_util:build_file("etc/couchdb/default_dev.ini").
local_config_1() ->
test_util:source_file("test/etap/081-config-override.1.ini").
local_config_2() ->
test_util:source_file("test/etap/081-config-override.2.ini").
local_config_write() ->
test_util:build_file("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(_) ->
test_util:init_code_path(),
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"),
undefined,
"{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"),
undefined,
"{httpd, bind_address} is still \"\" after reopening."
)
end,
run_tests([local_config_write()], CheckDidWrite),
ok.